Mostrando entradas con la etiqueta Calc. Mostrar todas las entradas
Mostrando entradas con la etiqueta Calc. Mostrar todas las entradas

martes, 14 de mayo de 2024

Recursos. Evaluación.

Escala McCarthy (MSCA)

En 2010 elaboré este soporte basado en LO.Calc sobre la escala MSCA. El objetivo de este instrumento era la recopilación de los datos obtenidos en la aplicación de esta escala de uso frecuente en la evaluación del desarrollo psicomotor de los niños de E. Infantil.


Este recurso fue creado originalmente sobre MSO.Excel en el tercer trimestre del curso 2009/2010 y muy posteriormente transformado al formato LO.Calc. Presenta cierta complejidad debido a la complejidad de la prueba, aunque el uso de las funcionalidad Excel/Calc es muy básico: únicamente se hace uso de las posibilidades del soporte presenta para crear y organizar tablas, interrelacionar celdas, automatizar la realización de cálculos y crear gráficos de forma automática.


Comparándolo con el formato Word, el empleo de una Hc supone un avance en funcionalidad, pero se infrautilizan las posibilidades que ofrece este soporte y no aporta nada relevante al formato papel, salvo lo básico (favorecer la digitalización de los expedientes) y obliga a duplicar la escritura de los datos y resultados, ya que este soporte no está pensado para ser utilizado en el momento de la aplicación de la escala.

Documento

miércoles, 1 de mayo de 2024

OOo Basic. Datos

Matrices. Creación de  listas de elementos

Una de las tareas que hay que realizar para crear una colección de datos o matriz, es asignar contenido a sus elementos. Si la matriz contiene muchos elementos, esta tarea puede llevar cierto tiempo empleando el procedimiento básico de asignación. Como vimos en una [entrada anterior] la instrucción Array() ahorra tiempo y acorta sensiblemente el número de líneas de código, pero resulta un tanto tedioso crear un listado extenso.


En esta entrada te explico un procedimiento de trabajo que te ahorrará tiempo a la hora de crear estos listados, siempre y cuando su extensión sea lo suficientemente amplia como para que merezca la pena.

Cuando tenemos que crear una matriz con los Id de un test que tiene 50 ítem, cada uno de los cuales se identifica mediante un Id. o cuando el test consta de varias pruebas (5 por ejemplo), cada una de las cuales tiene un número de ítem suficientemente grande, por ejemplo, entre 25 y 40 ítem con sus respectivos Id, en ambos casos (y en otros que se nos puedan dar) la asignación de los elementos a la(s) matriz(es) supone un considerable tiempo de trabajo, tanto si realizamos la asignación de forma directa (mDatos(0) = "Fe1"como si empleamos la instrucción Array() (1), así que merece la pena aplicar algún "truco" que simplifique la tarea.

La forma más sencilla de crear este tipo de Array es utilizar Calc (2):
  • Crear un documento Calc
  • Introducir el primer valor Id en la celda A1 (Id1)
  • Seleccionar esa celda y arrastrar hacia la derecha desde el borde inferior derecho hasta completar la serie (3)
  • Ejecutar la secuencia Archivo | Guardar como | Tipo | CSV (formato) | Guardar
  • En la ventana emergente clic en Usar formato Texto CSV
  • En la nueva ventana emergente seleccionar (o mantener las opciones siguientes:
    • Delimitador de campos -> [,]
    • Delimitador de cadena -> ["]
    • Guardar contenido de la celda como se muestra
    • Entrecomillar todas las celdas de texto
  • Aceptar
  • Archivo | Cerrar
  • Abrir el archivo CSV antes creado desde Blog de notas
  • Seleccionar todo el contenido (se mostrará como una línea de texto con los elementos entrecomillados y separados por comas)...
  • Y pegar en el script, entre el paréntesis de Array()
Aunque  este procedimiento pueda parecer algo lioso, esto se debe a la descripción pormenorizada de cada uno de sus pasos, pero es muy sencillo en realidad, especialmente porque los pasos a dar son sobradamente conocidos y practicados en el uso ordinario de cualquier servicio.

Involucra, eso sí, varias herramientas (Calc y Blog de notas fundamentalmente) obligatoriamente, ya que no podemos usar Writer para crear/exportar al formato CSV y necesitamos abrir el archivo CSV con Blog de notas porque nos permite acceder directamente al formato que nos interesa (elementos entrecomillados y separados por comas) por ser compatible con el que requieren las variables string en OOo Basic (4)

Este modo de alimentar nuestras matrices puede ser útil cuando el número de elementos es relativamente elevado, como ya dijimos, porque la escritura en Calc de la serie está prácticamente automatizada por la secuencia seleccionar->arrastrar, pero también lo es cuando disponemos de una base de datos de cierta envergadura y deseemos tenerla disponible como matriz o matrices para manejarla(s) directamente desde un script. En este segundo caso (quizá más interesante aun que el primero), la conversión a CSV agiliza enormemente el proceso, ya que evita el acceso a la base de datos (la hoja Calc), aunque incrementa peso del script (5).

Volviendo a las series simples que dieron origen a esta entrada, también podemos generarlas directamente mediante código sin necesidad de escribir el array ni asignar manualmente contenidos a la matriz.

Dado que nuestra intención es crear un Id como valor string, en el IDE creamos el script con una matriz tipo String (Dim mDatosId (49) As String) y una variable Integer (Dim i As Integer) que usaremos como contador. A continuación creamos el siguiente bucle:
For i= 0 To 49
mDatosId(i) = "Id" & CStr(i)
Next

Este bucle genera valores string que inician en Id0. Si lo que deseamos es que se inicie con el valor Id1 sólo tenemos que sustituir la expresión CStr(i) por CStr(i+1). De igual modo podemos crear una matriz con una serie numérica y/o cronológica (años), aunque necesitaremos cambiar el tipo de matriz a Integer, salvo que deseemos tratar los números como string. En caso contrario, también omitiremos la función de conversión y el string inicial (v.g., "Id" & CStr(i) -> 1900 +i, que permite crear una serie cronológica que inicia en 1900 y finalizar en 1949 para i=0 To 49)

Posiblemente esta última fórmula sea la más apropiada cuando deseamos crear una matriz de elementos cuasi-numéricos que guardan una relación de sucesión incremental (o decremental, que también es posible), pero no debemos despreciar las posibilidad que nos el uso combinado de Calc y Bloc de notas y la conversión del archivo a CVS. Nos va a ser especialmente útil cuando dispongamos de bases de datos Calc (o simplemente tablas) de cierta entidad.


NOTAS

(1) La instrucción Array() puede ser muy útil cuando el contenido del elemento es breve, como en el caso de un Id, un valor numérico, una palabra..., pero resulta engorroso cuanto el contenidos es un conjunto de frase (como el enunciado de los ítem). En todo caso lo que sí supone es un ahorro significativo de líneas de código. Que lo sea también de trabajo no está tan claro.

(2) Calc permite crear fácilmente listados y convertirlos al formato CSV. Para crear un listado en Writer necesitamos crear primero una tabla, pero su mayor limitación para nuestro objetivo es que no crear documentos CSV.

(3) Aunque tenemos la opción de crear una columna en lugar de una fila, para nuestro objetivo (crear un array), deberemos trabajar sobre la fila, según veremos en breve. De este modo se genera automáticamente una sucesión alfanumérica (Id1,Id2,Id3...). Cuando seleccionamos A1, el puntero se visualiza como una cruz al situarnos en el ángulo inferior derecho (cuadradito). A partir de ese momento, manteniendo pulsado el botón izquierdo del ratón, podremos "extender" la fila hasta completar la serie. Si nos detenemos antes de alcanzar el Id final, podremos retomar la creación de la serie desde el último ítem introducido, repitiendo el proceso descrito.

(4) En caso de valores numéricos, por ejemplo años sucesivos, CSV devuelve una fila de números separados por comas, pero no entrecomillados. Estos datos son adecuados para matrices tipo integer. Si deseamos tratar esas fechas como datos alfanuméricos, en Calc deberemos establecer la celda como de texto antes de escribir el primer elemento de la serie y mantener la opción Entrecomillar texto al transformar a CSV. En ese caso forzamos a que los números sean string y se presentarán entrecomillados al abrir el archivo desde Bloc de notas.

(5) El acceso directo a la base de datos es precisamente el modo alternativo al que se explica en la entrada en este punto de su desarrollo. Presenta ventajas, pero también inconvenientes. Optar por crear las matrices con su contenido explícito o crear un procedimiento de acceso a la base de datos desde código serán opciones que se deberán sopesar al crear el docap.

martes, 23 de enero de 2024

Usos. Datos.

Calc. Acceder a un rango de celdas.

Ya sabemos cómo acceder al contenido de una celda, y ahora aprenderemos a acceder al contenido de un conjunto o rango de celdas.



Para ello, y en primer lugar hay que recordar que tenemos que trabajar con matrices de datos en sustitución de variables individuales, ya que esto facilita el desarrollo de algoritmo. Igualmente, y por las mismas razones, tendremos  que utilizar ciclos, concretamente el ciclo For...Next.

Para ejemplificar el procedimiento, supondré una hoja en la que deseamos acceder a una colección de datos ubicados en una columna o rango unitario. Concretamente utilizaré como referencia el procedimiento de conversión en docap del soporte Calc de la prueba PLON-R Fonología.

Como ya sabemos por desarrollos anteriores, es posible (y necesario agilizar) el acceso al contenido de un conjunto de celdas (un rango) de modo que podamos pasar los datos de las mismas a una matriz de datos. Este procedimiento se resuelve de un modo relativamente simple:

  • Acedemos a la hoja -> 

oHojaFono = ThisComponent.getSheets().getByName("Fonologia")

  • Recorremos el intervalo o rango de celdas mediante un bucle For...Next 

For i=0 To 8

oCelda(i) = oHojaDatos.getCellRangeByName( "B" & i+1 )

sDatos(i) = oCelda(i).getString

Next

  • Simultaneando la "captura del contenido  en  una matriz de tipo objeto...

Dim oCelda(8) As Object  ->  oCelda(i) = oHojaDatos.getCellRangeByName( "B" & i+1 )

  • Con el paso de dicho contenido a otro matriz de tipo datos (string, por ejemplo)

 Dim sDatos(8) As String -> sDatos(i) = oCelda(i).getString

Ahora ya tenemos disponible (en sDatos()) todos los contenidos del rango del celdas comprendido (en este caso) entre la celda B1 a B9 de la hoja Fonología (en este caso) del libro activo (repito, en este caso,   PLONrFono_Docap.ods)

Para hacer más interesante y completa esta entrada, voy a suponer una segunda situación que también se dio en el proceso de conversión del soporte en docap antes indicado: ¿qué sucede si en un intervalo de datos tenemos contenidos que sí interesa capturar junto con otros que no?. UN procedimiento como el anterior nos obliga a capturar todos los datos, interesen o no, creando una matriz sobredimensionada y poco eficiente, y que puede contener mucho ruido (elementos no deseados) que después nos complicarán el tratamiento de estos mismos datos.

Esto sucede, por ejemplo, cuando un rango de datos se cumplimenta originariamente mediante un condicional SI(), dando lugar a un listado variable, que tanto puede tener ocupadas todas sus celdas como vacías. Esto condiciona, a su vez, que la matriz de datos receptora no pueda se dimensionada previamente sin incurrir en riesgos de sobre o infra dimensionamiento.

En estos casos, suponiendo resuelto el acceso al documento y a la hoja concreta,...

oHojaFono = ThisComponent.getSheets().getByName("Fonologia")

...la solución podría pasar por desarrollar la siguiente estrategia, que implica hacer uso de funciones OOo Basic asociadas al trabajo con matrices:

  • Dimensionamos la matriz de recorrido (tipo objeto al tamaño del rango de celdas

Dim oCelda(60) As Object

  •  Pero la matriz receptora a 0

Dim sError(0) As String

  •  Creamos dos variables contador, una (i) para recorrer mediante el bucle el total de las celdas y otra (a) para ajustar condicionalmente el tamaño y el índice de posicionamiento de la matriz receptora.

Dim i As Integer, a As Integer (iniciamos a = 0)

  • Iniciamos el bucle tomando como referencia el rango a recorrer, dimensionando adecuadamente el valor inicial y final del contador i y recorremos (igual que en el caso anterior) el conjunto de las celdas...

For i=0 To 60
oCelda(i) = oHojaFono.getCellRangeByName( "G" & i+4 )
  • ... pero el paso del contenido de estas celdas a la matriz receptora queda condicionado (If) al cumplimiento de un criterio  (en este caso que la celda contenga contenido)
  If oCelda(i).getString <> "" Then
  • ... y redimensionamos (ReDim) esa matriz receptora manteniendo el contenido previo (Preserve) utilizando como referencia el valor del contador a
ReDim Preserve sError(a)

  •  ... como paso previo para pasar los datos contenidos en la celda del rango que cumpla el criterio previamente establecido...

sError(a) = oCelda(i).getString

  •  ... y, en ese mismo supuesto (no fuera de él), incrementamos en 1 el valor del contador a y cerramos el condicional (y el ciclo)

a = a +1

End If 

 Next

El resultado que obtenemos en una matriz dimensionada de modo que se ajusta a los datos realmente útiles del rango recorrido, lo que facilita el acceso funcional a los mismos y, en su caso, su posterior tratamiento.

Para facilitar la comprensión del procedimiento, te dejo a continuación el script completo explicado por partes en los párrafos anteriores. Desde aquí lo puedes descargar como .txt:

Sub Main

Dim oHojaFono As Object

Dim oCelda(60) As Object

Dim sError(0) As String

Dim i As Integer, a As Integer

oHojaFono = ThisComponent.getSheets().getByName("Fonologia")

a = 0

For i=0 To 60

oCelda(i) = oHojaFono.getCellRangeByName( "G" & i+4 )

If oCelda(i).getString <> "" Then

ReDim Preserve sError(a)

sError(a) = oCelda(i).getString

a = a +1

End If

Next

For i = LBound(sError()) To UBound(sError())

MsgBox sError(i)

Next

End Sub

jueves, 28 de diciembre de 2023

Evaluación. Fonología

PLON-R. Fonología

Ampliando el contenido de la sección Evaluación y aprovechando para profundizar en el análisis del uso de las Hojas de cálculo como soportes para la evaluación, dedico esta entrada a analizar en profundidad un recurso desarrollado inicialmente en 2016, así como el proceso que devino en su concreción como tal recurso. 

La Prueba de Lenguaje Oral de Navarra-Revisada (PLON-R) es un recurso diseñado por Aguinaga, Armentia, Fraile, Olangua y Uriz con el objetivo de facilitar la evaluación del desarrollo del lenguaje oral en edades tempranas (de 3 a 6 años), concretamente para la detección de dificultades del desarrollo del lenguaje. 

Actualmente comercializa PLON-R la Editoral TEA con un coste de 206,32 € (IVA incluido) y actualmente incorpora, como novedad, un manual on-line (con un coste específico de 36,32 € (IVA incluido), aunque el sistema de aplicación sigue siendo en papel y la corrección manual.

Y digo actualmente porque PLON, que tuvo una primera versión así, sin R, es ya un test vetusto, incluso incorporando la R al nombre (1), pero la actual, por lo que sé, no difiere sustancialmente de la que se maneja aquí.

Por lo que se refiere a las creaciones de soportes documentales, en los materiales consultados constan soportes en versión doc, pdf, File Maker y Excel del sistema de registro, todos ellos creados en fechas próximas a 2016, aunque es posible que algunos de ellos sean anteriores. Los primeros dos formatos están pensados para ser utilizados en papel como modo de ahorro de recursos, pero los otros dos tienen objetivos más ambiciosos: facilitar el registro electrónico en primer lugar, pero también permitir el uso directo alternativo al papel y, en cierta medida también automatizar la corrección del test.

Al ser PLON un test complejo, se desarrollaron tres versiones (2) del sistema de registro: prueba completa, versiones por niveles de edad y versione por dimensión o nivel lingüístico. En esta entrada me voy a detener en el análisis del soporte Fonología.

Y quiero hacerlo en comparación con otra prueba de similar enfoque y metodología, el Registro Fonológico Inducido de Monfort y Juárez. No para hacer comparación entre ambos en cuanto pruebas (aunque algo al respeto diré), sino, sobre todo, para comparar el diseño de los soportes documentales de ambos.

Aunque bien pensado, me temo que la comparación no va a dar para mucho, pero puede ser suficiente para entender la evolución de estos soportes ahora sí con cierta perspectiva temporal, ya que las versiones básicas (doc y pdf) de PLON-R no difiere en nada de la versión (en este caso única) del soporte RFI, lo que nos permite situar a las primeras en una ubicación temporal ajustad en términos de funcionalidad: 2007 (3).

Lo que caracteriza a estas primeras versiones de adaptación y soportes es que su finalidad principal era la de ahorrar materiales que tenían un coste económico y no estaban tan inmediatamente disponibles como lo pueden estar ahora; si acaso podían tener el beneficio complementario de servir como recurso para digitalizar el expediente del alumnado, pero no parece que este haya sido una utilidad realmente aplicable, ya que no constan en los expedientes recursos de este tipo (4).

Por ello se puede concluir que en estas fases iniciales, no parece haber habido mucha conciencia de utilizar soportes digitales en el proceso de evaluación, aunque es posible que sí cierto interés por formas básicas de digitalización, entendidas en su formulación más simple: ahorro de documentos en papel e incremento de la portabilidad.

Es por ello que es siguiente paso lógico pudiera haber sido precisamente hacer efectiva esa digitalización, aun en contradicción con la reducción de la carga de trabajo, aunque es posible que ese fuera precisamente un motivo nada desdeñable para que no se generalizara esta "estrategia" (5).

Sólo cuando a la informatización se añade la lógica de la sustitución del papel durante la aplicación de la prueba es posible hablar de verdadero ahorro de trabajo, y eso sólo es posible cuando se crean soportes Hc o BD suficientemente funcionales y accesibles (6), proceso en el que realmente aun estamos inmersos, aunque pasos sí que se han dado al respecto... y significativos.

Cierto; significativos y no necesariamente basados en la creación de macros-script (7), pudiendo constatarse unas características y líneas de  evolución en parte ya indicadas en entradas anteriores, pero que expondré ahora con mayor detalle.

Empezando por el formulario de entrada de datos de identificación, lo que pudimos ver en el soporte PSL_2013, no dista nada de lo que podemos mostrar en PLONrFono_2016: un 'formulario' diseñado directamente sobre las celdas, si acaso enmarcado o coloreado, pero simple y llanamente 'dibujado' a modo de trampantojo para ser cumplimentado del mismo modo que la versión precedente en formato doc o en papel. De hecho una mera copia del original en papel.


A pesar de su simplicidad, o precisamente por ella, la funcionalidad en términos de uso directo durante la evaluación no se ve comprometida por tener que usar las celdas en lugar de controles de formulario (cosa que sí se da en la versión BD), pero tampoco se puede decir que esta fórmula permita avanzar en la automatización del procedimiento de trabajo, lo que constituiría el tercer objetivo y siguiente nivel de desarrollo en la implementación de estos soportes.

De hecho, lo único automatizado que hay en este 'formulario' el el cálculo de la edad del alumno, la cual se base en una serie de fórmulas y cálculos simples, que muestro parcialmente en la imagen que sigue y describo a continuación:



  • Asociadas a las celdas D6 y D7 (año de nacimiento y fecha actual, respectivamente), las fórmulas gemelas  =(AÑO(D6)*365)+(MES(D6)*30)+DIA(D6)=(AÑO(D5)*365)+(MES(D5)*30)+DIA(D5) permiten calcular el número de días que representan dichas fechas
  • Estos valores se ubican en las celdas I5 e I6. La diferencia entre ambas (I7) permite obtener la diferencia en días...
  • Los cuales se convierten en años al ser divididos entre 365 (=COCIENTE(I7;365)), con lo que en J7 obtenemos el dato años.
  • en I8, también mediante cálculos obtenemos el número de días que restan de la división anterior (=I7-(J7*365))
  • Y de nuevo una división (esta vez entre 31) nos convierte esos días en meses (=COCIENTE(I8;31)), dato que ubicamos en J8
  • Finalmente, mediante la función CONCATENAR(), construimos un texto que nos da en D7 la edad del sujeto en años y meses (=CONCATENAR(J7;":";J8))
Finalizada la primera fase, toca ahora desplazarse a la hoja Fonologia para aplicar el 'cuestionario' (8), para ello nos situamos en la celda E4 y escribimos 1 (acierto) o 0 (fallo) y nos desplazamos a la celda inferior mediante intro. Todo el proceso de corrección y puntuación que sigue se ejecuta de forma automática mediante  funciones propias, como...
  • La columna F (a partir de F4) que se cubre automáticamente mediante =SI(E4=1;D4;"Error"), pero que admite ser cumplimentada manualmente si la respuesta del alumno difiere en cuanto a error del que se presupone en el modelo o parece necesario recoger expresamente la producción del sujeto (9)
  • El cómputo de las celdas de la columna G en la que se contabilizan los aciertos por años de edad cronológico-evolutiva (vg, G24 para 3 años, =SUMA(E4:E24)
  • Los sumatorios de fonemas de la columna M (vg, M4, =E4+E5) y su calificación para análisis cualitativo en la columna N(vg N4, =SI(M5=2;"Adquirido";SI(M5=1;"En proceso";"No adquirido")))


Una vez que la prueba ha sido aplicada, regresamos a la hoja Portada para comprobar el resultado global y por edades. Éste se encuentra también automatizado y se ubica en el conjunto C12-G12, en cuyas celdas se valora con 1 (nivel alcanzado) o 0 (nivel deficitario o no alcanzado) mediante asociación con las celdas correspondientes de la hoja Fonologia (columna G) haciendo uso de la función SI(), como muestro para tres años (=SI($Fonologia.G24=21;1;0)).


Lo que no está automatizado en este soporte (que no docap, ya que no se hace uso de macros ni script) es la generación de un informe descriptivo y/o analítico. Además, también queda para la ejecución 'manual' cumplimentar los espacios B18:G20, B23:G26 y B29:G32 que se reservan para realizar anotaciones respecto a articulación espontánea, uso espontáneo del lenguaje y conducta global.

Este es el soporte creado en 2016. Como hemos podido comprobar en estas mismas fechas ya había creado soportes que incluían desarrollos que sería de esperar también estuvieran presentes en éste, pero que no lo están, aunque no existan razones que expliquen el motivo. La que ahora mismo me llama más la atención es la ausencia de un informe descriptivo como el que sí consta en otros soportes creados en esta misma época. Es posible que las dificultades para tratar colecciones de datos como las que constituyen los grupos de celdas  C12:F12, y de  mayor  complejidad aun, la columna N de Fonología, hiciera poco viable este tipo de desarrollo, ya que aun hoy en día supone todo un reto.

Abordemos o no ese reto (queda por ver), lo que sí hará ahora es dar por finalizada esta entrada, dejando pendiente para otra la actualización del soporte PLONrFono_2016 y su conversión en docap. De momento, y a continuación, te dejo acceso a éste y a otro más básico aun y en formato texto sobre RFI.

Documentos:

Estos documentos no sustituyen a los materiales originales. Ambos los requieren para poder ser empleados, especialmente los recursos gráficos, a los que sirven de apoyo.

Notas:

NOTA 1. Como dato, la portada que ilustra esta entrada corresponde a la publicación de 2005 por la editorial TEA, pero antes que esta hubo una edición anterior.

NOTA 2. Me refiero al soporte Excel, pero algo parecido podría decirse de las versiones File Maker.

NOTA 3. Cierto que de RFI constan documentos fechados con anterioridad (2004 e incluso 1999), pero éstas correspondería (en su caso) con versiones anteriores de PLON, por lo que ya no estaríamos hablando de esta prueba en sentido estricto, además de que no consta que existan documentos equivalentes de dicha versión del PLON y menos específicamente de su desglose por niveles o ámbitos estructurales del lenguaje.

NOTA 4. Dado que este análisis no está concluido, la afirmación anterior debe tomarse con reservas y ser considerada como provisional, aunque existen indicios de que no se alejará mucho de las conclusiones finales. En realidad, como hemos visto y comentado en una entrada anterior la presencia real de soportes documentales en cualquier formato (incluso en doc o pdf) el uso de materiales.

NOTA 5. De hecho esas formas básicas (soportes doc) suponen un aumento de trabajo, ya que se deben trasladar las anotaciones en papel al documento Word. Este doble trabajo ya es de por sí suficientemente disuasorio como para explicar la escasa presencia de documentos de este tipo o fase.

NOTA 6. Aunque el formato BD (recordemos, en File Maker) es igual de funcional o incluso más que los soportes en Hc, existen en ambos (y aun más en BD) problemas de accesibilidad y algunos no siempre resueltos satisfactoriamente de funcionalidad. Los primeros tienen que ver con las posibilidades de uso de medios informáticos adaptados al contexto de evaluación (en algunos test un ordenador de sobremesa no es precisamente una buena herramienta) y los segundo con el nivel de desarrollo del soporte, lo que equivale a decir, de habilidad de 'programación' del orientador.

NOTA 7. En realidad, la mayor parte de los soportes Hc creados en los años de mayor uso de estos medios (2014, 2015 y 2026), pero también a posteriori, apenas cuentan con macros o script, siendo predominante el uso de funciones integradas en Excel y posteriormente en Calc. Solo las herramientas creadas en File Maker hacen uso de macros, en realidad funciones cerradas, creadas en un lenguaje específico de macros que permiten automatizar ciertos procesos; pero estas funciones son equivalentes a un producto intermedio a una función propia y una macro de las que es posible crear en una hoja de cálculo. 

NOTA 8. La aplicación real requiere las láminas PLON-R o su sustitución por una presentación PPT o similar, pero eso queda a tu cargo.

NOTA 9. En el caso de pruebas de evaluación del lenguaje oral es recomendable hacer grabaciones de audio de las producciones del niño, al menos para asegurar y/o comprobar cuestiones concretas que puedan dar lugar a dudas. Personalmente recomiendo el programa Audacity, que puede estar actuando en segundo plano en el mismo ordenador a la vez que empleamos nuestro soporte Calc en primer plano.

miércoles, 27 de diciembre de 2023

Usos. Datos.

 Calc. Funciones propias (3). Números



Calc dispone de dos funciones para controlar si un dato es numérico o no lo es.  Estas funciones son ESNUMERO() y N(). La primera función devuelve VERDADERO si un dato es numérico y FALSO si no lo es.

Los datos numéricos que lo parecen, pero que no lo son, son los que resultan de escribir números como palabras, como, ñor ejemplo, cuando escribimos un numero dentro de una cadena ('"tengo 24 años"), pero también cuando utilizamos controles de formulario como Cuadro de texto para introducir datos numéricos y los asociamos a celdas.

Cuando usamos estos controles de formulario como forma de entrada de datos y asociamos la entrada a una celda, si en el cuadro de texto escribimos un texto no se produce ningún problema, pero si escribimos números, el resultado esperado puede no corresponderse con lo que obtenemos, presentando un comportamiento irregular.

  • Si aplicamos la función ESNUMERO() a esa celda, nos devolverá FALSO, 
  • pero si en otra celda recogemos el resultado de aplicar un operador aritmético al valor de la celda asociada al control, la función ESNUMERO() devuelve VERDADERO.
  • Ahora bien, si ese dato está incluido en un conjunto de datos, unos numéricos y otros string, y aplicamos funciones que suponen trabajar con el conjunto, como SUMA()PROMEDIO() y otras, ESNUMERO() devuelve VERDADERO, pero el cálculo excluye los valores no numéricos.

Lo que sucede en estos casos es que las citadas funciones (SUMA() y PROMEDIO()) realizan los cálculos respectivos sobre el conjunto de datos que sí son número sin tomar en cuenta los valores que se presentan como tales pero que no los son, como es el caso de los que proceden de los controles del formulario.

Si utilizamos controles de formulario como recurso de entrada de datos en sustitución de la entrada directa en celdas, y mediante funciones específicas trasladamos sistemáticamente estos valores a una tabla sobre la que realizamos cálculos, no es difícil imaginar el efecto que el comportamiento observado anteriormente va a tener en los resultados que obtengamos de tales cálculos. 

En estos caso, para evitar estos errores sugiero recurrir a multiplicar el valor original por 1 (D2*1), lo que convierte el dato en un número reconocido como tal por ESNUMERO() y por las funciones de cálculo del conjunto, como SUMA() y PROMEDIO().

Calc dispone de la función N(), que transforma un carácter en número, pero que puede ser que devuelva 0, convertido eso sí, en un valor numérico, tal y como revela ESNUMERO(), por lo que altera obviamente, nuestro cálculo.

viernes, 15 de diciembre de 2023

Usos.Datos.

Calc. Funciones propias (2). Concatenar  cadenas.

Las funciones de concatenación pertenecen al conjunto de funciones de texto.

- Función CONCATENAR(). Es la más antigua y simple de las funciones de concatenación de Calc. Permite combinar varios elementos de texto en uno único. Admite entrada directa o referencias a celdas y convierte valores numéricos a cadenas de texto. No admite conjunto de celdas como referencia.

-> Sintaxis: =CONCATENAR(Texto1;Texto2;...TextoN)

No maneja espaciado entre elementos (TextoX), así que es necesario implementar estos separadores en el diseño del texto o incluyendo referencias a cadenas vacías (" ")

Ej. 

=CONCATENAR(
B4;
" ";
B5;
" ";
B6;
            B9
) 

Da como resultado la cadena PPPP LLLL MMMM AAA, en función del contenido de las respectivas celdas. Obsérvese que la separación entre B4,B5 y B6 se establece mediante cadenas vacías intermedias. El espacio entre B6 y B9 se establece en el diseño de B6, dejando un espacio en blanco al final de la cadena.

- Función CONCAT(). Es posterior a CONCATENAR() e incluye la posibilidad de aceptar conjunto de celdas (rango) como parte constituyente de  los elementos concatenado.

-> Sintaxis: CONCAT(Texto1;Texto2;...TextoN) (La misma que CONCATENAR())

Presenta las mismas limitaciones que CONCATENAR() en el manejo de espacios entre cadenas, por lo que son válidas las mismas soluciones.

Dado que acepta intervalos de celdas como elementos, gestiona los posibles vacíos en el intervalo como omisión de dicho elemento (no deja huella de la celda vacía)

Ej. 

=CONCAT(
B4;
B5;
B6;
B$9:B$13
)

Da como resultado la cadena  PPPPLLLLMMMM  AAAAIIIIUUU en ausencia de separadores entre cadenas. Obsérvese que genera una separación entre los elementos (referencias) individuales y el grupo o intervalo. Dentro de este dos de las celdas están vacías siendo omitido este vacía en la cadena resultante.

- Función UNIRCADENAS(). Permite combinar varios elementos en uno sólo, acepta intervalos de celdas y los trata del mismo modo que CONCAT(), aunque a voluntad del usuario, y utiliza delimitadores para separar los elementos.

-> Sintaxis: =UNIRCADENAS(Delimitador;OmitirCadenasVacías;Texto1;Texto2;...TextoN)

Ej.

=UNIRCADENAS(
"--";              -> Delimitador entre componentes
1;                 -> 1 = V -> No se tomarán en cuenta las celdas vacías
1234;           -> Literal numérico
;                  -> Simula cadena vacía
"adbd";        -> Literal string
B10;            -> Referencia a celda individual (contenido CCCC)
B4:B6          -> Referencia a intervalo de celdas (Contenido PPPP()MMMMM.B5 vacía)
)

Da como resultado la cadena  1234--adbd--CCCC--PPPP--MMMM. Obsérvese que efectivamente se omite el espacio de la cadena vacía (la situada entre los literales numérico y string), así como la celda vacía B5. Si el valor del parámetro 2 (OmitirCadenasVacias fuera 0 (F), la cadena resultante sería la siguiente: 1234----adbd--CCCC--PPPP----MMMM. El separador -- permite apreciar claramente las diferencias.

Aunque UNIRCADENAS() nos ofrece mayor control sobre cómo se presenta la cadena resultante respecto a CONCAT() (y mucho más aun que CONCATENAR()), el resultado puede no ser del todo satisfactorio. Por este motivo es conveniente utilizar otras funciones de formateo de como la que indico en esta entrada, pero que aquí omito por no ser contenido de esta entrada.

jueves, 14 de diciembre de 2023

Usos. Datos.

Calc. Funciones propias (1). Condicionales


- Función SI() Especifica una prueba lógica que se desee efectuar.

Forma simple -> Estructura:

  • Prueba: Condición proposicional (Referencia/Literal + comparador + Ref/Lit)
  • Valor1 ENTONCES -> Contenido (vg. Dato/Cadena)
  • Valor 2 EN CASO CONTRARIO -> Contenido (Vg. Dato/Cadena)

Ej. (Siendo B3 = A y C3 = B)

=SI(
B3>C3; (proposición: Ref/Lit + Oper Relac. + Ref/Lit)
"CONDICIÓN = V, entonces -> A es mayor que B";
"CONDICION = F, entonces -> A es no es mayor  que B"
)

Forma compleja -> Estructura
  • Prueba: Expresión (Proposición 1 + Operador lógico + Proposición 2)
  • Valor1 ENTONCES -> Contenido: Secuencias textuales concatenadas o estructuras basadas en funciones
  • Valor 2 EN CASO CONTRARIO -> Contenido: Secuencias textuales concatenadas o estructuras basadas en funciones
Ej. (Siendo B3 = A, C3 = B, B4 = C y C4 = D)

=SI(
Y(B3>C3;B4<C4); (Expresión -> Prop1 + Opera. log. + Prop2)
"CONDICIÓN = V, entonces -> (Prop1=V) Y (Prop2=V)";
"CONDICION = F, entonces X es no es mayor que Y y A no es mayor que B"
)

- Función SI.CONJUNTO() Comprueba una o más condiciones (proposiciones relacionales) y devuelve un valor asociado a la primera condición que resulte ser verdadera.

Sobre la misma proposición. Permite identificar la condición que cumple la proposición cuando las opciones relacionales y de respuesta no son dicotómicas (vg. <,=,>)

-> Estructura (siendo Propos. 1 /1'/1''/1''' la misma proposición)

  • Proposición 1 = V -> Expresión A; 
  • Proposición 1 = F -> Proposición 1'
    • Proposición 1' = V -> Expresión B;
    • Proposición 1' = F -> Proposición 1''
      • Proposición 1'' = V -> Expresión C
      • Proposición 1'' = F -> Proposición 1'''....
        • .........

Ej. (Para Proposición (A + Operad. relacional + B) con tres opciones de valor (<,>,=)

=SI.CONJUNTO(
B8>C8;"A>B";
B8<C8;"A<B";
B8=C8;"A=B"
)

Sobre una serie de proposiciones diferentes. Permite identificar, dentro de una serie de proposiciones, la primera que cumple la condición (criterio comparativo) establecida. En este caso las opciones de respuesta deben ser dicotómicas para asegurar el correcto funcionamiento del procedimiento.

-> Estructura (Propos1 -> Propos 2 ->Propos 3... Siendo Proposiciones diferentes)

  • Proposición 1 = V -> Expresión A; 
  • Proposición 1 = F -> Proposición 2
    • Proposición 2 = V -> Expresión B;
    • Proposición 2 = F -> Proposición 3
      • Proposición 3 = V -> Expresión C
      • Proposición 3 = F -> Proposición 4....
      • ........

Ej. (Para criterio "Primera proposición que cumple el criterio A > B". El criterio comparativo debe resolverse como V/F y al menos una de las proposiciones es V, siendo el óptimo que lo sea sólo una)


=SI.CONJUNTO(
B8>C8;"A0>B0";
B9>C9;"A1>B1";
B10>C10;"A2>B2";
B11>C11;A3>B3;
B12>C12;"A4>B4";
B13>C13;"A5>B5"
)

Usos. Datos.

Calc. Cumplimentar documento.

Como dije en la entrada anterior, es posible crear soluciones (que no (aun) docap) basadas en el uso de funciones Calc. Comentaba en ella la conveniencia de ejemplificar la afirmación anterior explicando la construcción de un soporte de esas características y recientemente publiqué una entrada en OrientAsLO que cumple este objetivo, quedando pendiente (en ese momento) complementar dicha entrada con la que ahora desarrollo aquí.

En esa entrada de OrientAsLO expliqué el test de referencia (Test de Weepman) y la estructura del soporte, por lo que no me voy a detener aquí en esos detalles. Me centraré, eso sí, en explicar con cierto detalle el uso de las funciones SI() y CONCATENAR() empleadas en la construcción del sencillo informe con el que finaliza el soporte (pág. Info). 

A este mismo efecto podría haber servido el test Palabras mágicas, ya que también en él se utilizan los mismos recursos con la misma finalidad, pero al exponer el test Weepman matamos dos pájaros de un mismo tiro: aumentamos los recursos publicados en el blog, complementando desde una doble perspectiva la evaluación de la discriminación auditiva (1), y exponemos un procedimiento de trabajo cuyo conocimiento puede considerarse "rentable" en términos de frecuencia de uso.

De hecho se trata de explicitar precisamente lo que podemos considerar la "prehistoria" del desarrollo del nivel competencial que facilita en estos momentos la creación de docap (2): profundizar en el uso de los recursos disponibles en los servicios e incrementar el campo de ámbitos de uso de uno (la hoja de cálculo Calc)  que es sabido no forma parte de lo que normalmente se suele emplear por parte de los SEO.

Con todo, lo más importante ahora es que con esta entrada complemento lo expuesto en la precedente referida a la función CONCATENAR() y sus similares (CONCAT() UNIRCADENAS()), a la vez que también complementa lo tratado en otras entradas anteriores referidas al uso de la función SI() (3), por lo que ahora abordamos su uso conjunto, el cual se revela así con toda su capacidad de automatizar la creación de textos (informes) básicos sin recurrir (aun) al uso de script OOo Basic.

La función condicional SI() ya se emplea con profusión en la puntuación de los ítem del Test (4)...

  • =SI(D7=E7;1;0) (base para el análisis cuantitativo)

... y el registro de los pares de fonemas en los que se presentan errores...

  • =SI(F7=0;B7;" ") (como base para el análisis cualitativo)
No obstante, es en la creación del informe (hoja Info) donde me voy a centrar ahora, ya que es en ella donde se utilizan las funciones SI() y CONCATENAR() de forma combinada, pero también donde se aprecia el "primitivismo" y las limitaciones de estas primeras formulaciones de la automatización basada en funciones nativas de Calc: incluso en el marco de esta delimitación  se aprecia que la solución se desarrolla en los inicios de la profundización en el conocimiento de las posibilidades de la hoja de cálculo (5).

El mencionado informe está dividido en cinco bloques, correspondiendo el primero a la descripción del test, sin que se emplee en él ningún procedimiento de personalización, limitándose a la escritura directa de un breve texto genérico e introductorio.

El resto de los párrafos sí incluyen el uso combinado de las funciones (básicamente la condicional SI() junto con CONCATENAR() y alguna otra de carácter complementario (y secundario para lo que nos interesa ahora) (6). La estructura básica es la que sigue:

SI(Condición a valorar... (se refiere a la valoración global del rendimiento del sujeto)

... Entonces -> CONCATENAR() -> datos + cadenas + datos

... En caso contrario ("Else") -> CONCATENAR() -> datos + cadenas + datos )

... (donde datos se concreta como referencia a celdas que contienen los datos) y que se concreta como sigue:

=SI($Id.C14="presenta dudas";CONCATENAR($Id.B6;" obtiene un porcentaje de acierto del ";TRUNCAR($Id.C12;2);"%, por lo que puede considerarse que su rendimiento en tareas de discriminación auditiva es  ";$Id.C14);CONCATENAR($Id.B6;" obtiene un porcentaje de acierto del ";TRUNCAR($Id.C12;2);"%, por lo que puede considerarse que su rendimiento en tareas de discriminación auditiva es";$Id.C14))

El párrafo siguiente se crea únicamente mediante concatenación de string y datos y sirve de entrada para exponer los pares de fonemas afectados por error (párrafos 4º y 5º), que también se crean mediante la función concatenar.

Son estos dos párrafos donde mejor se aprecia el arcaísmo y las limitaciones de uso de las funciones Calc: en ellos habría sido mucho más pertinente utilizar la función CONCAT() o UNIRCADENAS(), que se suponen una ejemplificación de la concatenación de un conjunto de celdas (G7:G46), así como del tratamiento de las celdas vacías y/o de la separación entre ellas. 

Si utilizo estas dos funciones como alternativa a la más primitiva (CONCATENAR()) obtengo un resultado más satisfactorio y de forma más simple (7), pero no del todo satisfactoria. De hecho la función que mejor funciona es UNIRCADENAS(), pero tampoco de forma totalmente satisfactoria en cuanto al manejo de los espacios que deja la no presencia de contenido en determinadas celdas del conjunto (G7:G46) y/o del carácter de separación (el que mejor funciona es " ").

Es entonces cuando el uso de otras dos funciones de tipo texto ayuda a mejorar los resultados. Me refiero a la función ESPACIOS(), que elimina los espacios sobrantes, y la función SUSTITUIR(), que empleo para sustituir los espacios en blanco que utilizo originariamente como separador y que ESPACIOS() respeta por considerarlos espacio propio entre palabras (que son los únicos que no elimina). De este modo consigo un resultado que se ajusta perfectamente al objetivo: generar un listado de los pares de fonemas afectados por error, ajustado a la longitud de la lista resultante y diferenciándolos claramente unos de otros. Como ejemplo...

G-D | S/C | C-G | C-T | E-O | C-P | BR-GR | T/R | P/N | C-T

... que resulta de la combinación de las tres funciones (8): 

=SUSTITUIR(ESPACIOS(UNIRCADENAS(" ";1;$It.G7:G46));" ";" | ")

NOTAS

NOTA 1Con lo que proporcionamos dos recursos que se pueden considerar complementarios en cuanto a la forma de evaluar la discriminación auditiva, lo que permite desarrollar estrategias de evaluación que combinen ambos, si así se considera.

NOTA 2O lo que es lo mismo, la (semi)automatización de soportes documentales en base a OOo Basic.

NOTA 3Se trata de tres entradas aunque ahora sólo se enlace a la publicada en primer lugar. El resto están disponibles desde la página DATOS . Pdt. Añadir que en estas entradas no me limito a explicar el uso de las funciones condicionales de Calc. 

NOTA 4Hoja It(em), columnas F para puntuación y G para recopilación de errores.

NOTA 5El documento original fue creado hace más de 10 años sobre MSO-Excel y transformado recientemente a formato Calc sin revisión ni modificaciones, de ahí que se limite al uso de la función CONCATENAR() sin tener en cuenta otras opciones.

NOTA 6También incluyen la referencia a celdas de diferentes hojas, aunque este es un procedimiento básico y muy frecuente en el uso de Calc o de Excel.

NOTA 7De hecho no necesito crear dos párrafos, siendo ahora suficiente con uno.

NOTA 8. Te sugiero aplicar esta modificación al documento que puedes descargar desde este enlace