Varios segmentos gramaticalmente condicionantes (II)
Completamos con esta entrada lo iniciado [en la anterior] respecto a la implementación del modelo complejo (varias vi-condicionantes), pero esta vez en cuanto afecta a la fase B (DocAp) del modelo (1). He de reconocer que no me ha resultado fácil llegar a una solución que funcione, de ahí el tiempo transcurrido desde la entrada anterior a la publicación de la actual.
También debo decir que el script no me termina de convencer (creo que debería ser más sencillo), pero de momento tendrá que valer. Veamos el resultado; bueno, una parte, porque la otra son las funciones que contribuyen al correcto funcionamiento del script principal, pero esas quedan para que tú las analices desde el IDE del documento-soporte (2).
Sub NuevoInforme'Matrices y variables para el acceso a los datos de la hoja MatrizBaseDim oHojaM As Object, oCelM As ObjectDim sCelM As StringDim m As Integer, nM As IntegeroHojaM = ThisComponent.getSheets().getByName("MatrizBase")For m = 0 To 100oCelM = oHojaM.getCellRangeByName("B" & m+1)sCelM = oCelM.getString()If sCelM = "" ThennM = m-1Exit ForEnd IfNext'Matrices para contener los datos de los datos del modeloDim mModelSeg() As String, mModelCateg() As StringDim mModelViCond() As integerDim mPreguntasVi() As String'Dimensionado de las matrices de datos del modeloReDim mModelSeg(nM)ReDim mModelCateg(nM)ReDim mModelViCond(nM)ReDim mPreguntasVi(nM)'Carga de datos en las matrices de datos del modeloFor m = 0 To UBound(mModelSeg())oCelM = oHojaM.getCellRangeByName("A" & m+1)mModelSeg(m) = oCelM.getString()NextFor m = 0 To UBound(mModelCateg())oCelM = oHojaM.getCellRangeByName("B" & m+1)mModelCateg(m) = oCelM.getString()NextFor m = 0 To UBound(mModelViCond())oCelM = oHojaM.getCellRangeByName("C" & m+1)mModelViCond(m) = CInt(oCelM.getString())NextFor m = 0 To UBound(mPreguntasVi())oCelM = oHojaM.getCellRangeByName("D" & m+1)mPreguntasVi(m) = oCelM.getString()Next'Matrices y variables para el acceso a los datos de la hoja CondicGenDim oHojaG As Object, oCelG As ObjectDim sCelG As StringDim g As Integer, nG As IntegeroHojaG = ThisComponent.getSheets().getByName("CondicGen")For g = 0 To 100oCelG = oHojaG.getCellRangeByName("B" & g+1)sCelG = oCelG.getString()If sCelG = "" ThennG = g-1Exit ForEnd IfNext'Matrices para contener los datos de las vi-condDim mViPos() As IntegerDim mVIGen() As String'Dimensionado de las matrices vi-condReDim mViPos(nG)ReDim mVIGen(nG)'Carga de datos de las vi-condFor g = 0 To UBound(mViPos())oCelG = oHojaG.getCellRangeByName("B" & g+1)mViPos(g) = CInt(oCelG.getString())NextFor g = 0 To UBound(mViGen())oCelG = oHojaG.getCellRangeByName("D" & g+1)mViGen(g) = oCelG.getString()Next'========================================================'Desarrollo del DocAp'========================================================
'PASO 1. Actualizar datos de las vi'Matriz contenedora de datos DocApDim mDatosInfo(nM) As StringDim i As Integer'paso de datos de la matriz modelo a la matriz info. Las vi se resuelven mediante InputBox()For i = 0 To UBound(mDatosInfo())If mModelCateg(i) = "vi" ThenmDatosInfo(i) = InputBox(mPreguntasVi(i),"CUESTIONARIO", mModelSeg(i))ElsemDatosInfo(i) = mModelSeg(i)End IfNext'PASO 2. Identificar las vi-cond en la matriz de datos del informe y establecer su género gramaticalDim ii As IntegerDim InfovicondDato(nG) As String, InfovicondGen(nG) As StringFor i = 0 To UBound(mViPos())For ii = 0 To UBound(mDatosInfo())If ii = mViPos(i) ThenInfovicondDato(i) = mDatosInfo(ii)InfovicondGen(i) = GeneroNombre(InfovicondDato(i))End IfNextNext'PASO 3. Analizar si las vi-cond del modelo y las del informe son del mismo género o de diferenteDim mComparaViGen(nG) As BooleanFor i = 0 To UBound(mComparaViGen())If mVIGen(i) = InfovicondGen(i) ThenmComparaViGen(i) = TrueElsemComparaViGen(i) = FalseEnd IfNext'PASO 4. Acceder a los datos de la BDGeneroDim mGenM() As String, mGenF() As StringDim nGn As Integer 'Variable para redimensionar las matrices mGenM() y mGenF()'Accedo a la función que devuelve el valor de nGnnGn = nGenero'Redimensiono las matrices mGenM() y mGenF()ReDim mGenM(nGn)ReDim mGenF(nGn)'Captura de datos mGenM() mediante la función GenMasc()mGenM() = GenMasc(nGn)'Captura de datos mGenF() mediante la función GenFem()mGenF() = GenFem(nGn)'PASO 5. Modificar las matrices inicial y final a partir de la igualdad/diferencia de género entre las vi-cond modelo e informe.Dim mGenIni(nGn) As String, mGenFin(nGn) As StringDim sNuevoContenido As StringFor i = 0 To UBound(mComparaViGen())If mComparaViGen(i) = True ThenFor ii = 0 To UBound(mDatosInfo())If mModelCateg(ii) = "vg" ThenIf mViPos(i) = mModelViCond(ii) ThenmDatosInfo(ii) = mDatosInfo(ii)End IfEnd IfNextElseIf mComparaViGen(i) = False ThenmGenIni() = PosGenInicial(mGenM(), mGenF(),mViGen(i))mGenFin() = PosGenFinal(mGenM(), mGenF(),mViGen(i))For ii = 0 To UBound(mDatosInfo())If mModelCateg(ii) = "vg" ThenIf mViPos(i) = mModelViCond(ii) ThenFor iii = 0 To UBound(mGenIni())If mDatosInfo(ii) = mGenIni(iii) ThensNuevoContenido = mGenFin(iii)mDatosInfo(ii) = sNuevoContenidoEnd IfNextEnd IfEnd IfNextEnd IfNext'PASO 6 . Cambio del contenido de los segmentos vnDim NombreAlumno As StringFor i = 0 To UBound(mPreguntasVi())If mPreguntasVi(i) = "Alumno. Nombre" ThenNombreAlumno = mDatosInfo(i)End IfNextFor i = 0 To UBound(mDatosInfo())If mModelCateg(i) = "vn" ThenmDatosInfo(i) = NombreAlumnoEnd IfNext'========================================================='RESTO DEL SCRIPT'Recomponemos el texto a partir de la matriz mDatosInfo()Dim NuevoTexto As StringFor i = LBound(mDatosInfo()) To UBound (mDatosInfo())If i = 0 ThenNuevoTexto = mDatosInfo(i)ElseIf mModelCateg(i) = "sl" ThenNuevoTexto = (NuevoTexto & Chr(13) & Chr(13))ElseIf mModelCateg(i) = "sp" ThenNuevoTexto = (NuevoTexto & mDatosInfo(i))ElseNuevoTexto = (NuevoTexto & " " & mDatosInfo(i))End IfEnd IfNext'Escribimos el texto en un nuevo documento (Servicio Writer)Dim sRuta As StringDim mArg()Dim oDoc As Object, oDocum As ObjectsRuta = "private:factory/swriter"oDoc = StarDesktop.loadComponentFromURL(sRuta, "_default", 0, mArg() )oDocum= oDoc.TextoDocum.insertString(oDocum.getEnd(),NuevoTexto, False)End Sub
Se diferencian en este script tres partes, siendo la primera el acceso a los datos necesarios para el funcionamiento del script y la tercera la recomposición del texto del informe y su conversión en documento Writer. La segunda, la más definitoria de este procedimiento, está centrada en el procesamiento de los datos y su adaptación a la concordancia gramatical (de género) (vg) tal y como ésta queda definida en función de la pluralidad (y consecuente complejidad) de variables (vi) condicionantes.
Los comentario que acompañan al código del script describen satisfactoriamente (eso creo) las distintas fases del desarrollo del procedimiento, haciendo innecesario que esta cuestión sea tratada aquí de nuevo, pero no está de más una descripción general de éste, prestando especial atención a la segunda (y central) parte del mismo.
Opto (primera parte) por poner a disposición del script (para su procesamiento) los datos necesarios, los cuales han sido establecidos en la parte primera del modelo (fase 1 o preparatoria) y guardados en las hojas MatrizBase y CondicGen. Procedemos a recuperar esos datos en forma de matrices.
También son necesarios los datos contenidos en la BDGenero, por lo que (en la segunda parte del script) son recopilados en dos matrices (mGenM() y mGenF()) (3)
Pero una vez que los datos están disponibles, resulta que la complejidad derivada de la pluralidad de fuentes de condicionalidad (dos vi-cond en este caso) hace que el procedimiento que deriva de dicha condicionalidad resulte de una complejidad muy superior a la esperada, siendo muestra de ello la propia complejidad de la estructura que la aborda y que repito ahora de nuevo para mejor ilustrar lo que digo:
'PASO 5. Modificar las matrices inicial y final a partir de la igualdad/diferencia de género entre las vi-cond modelo e informe.Dim mGenIni(nGn) As String, mGenFin(nGn) As StringDim sNuevoContenido As StringFor i = 0 To UBound(mComparaViGen())If mComparaViGen(i) = True ThenFor ii = 0 To UBound(mDatosInfo())If mModelCateg(ii) = "vg" ThenIf mViPos(i) = mModelViCond(ii) ThenmDatosInfo(ii) = mDatosInfo(ii)End IfEnd IfNextElseIf mComparaViGen(i) = False ThenmGenIni() = PosGenInicial(mGenM(), mGenF(),mViGen(i))mGenFin() = PosGenFinal(mGenM(), mGenF(),mViGen(i))For ii = 0 To UBound(mDatosInfo())If mModelCateg(ii) = "vg" ThenIf mViPos(i) = mModelViCond(ii) ThenFor iii = 0 To UBound(mGenIni())If mDatosInfo(ii) = mGenIni(iii) ThensNuevoContenido = mGenFin(iii)mDatosInfo(ii) = sNuevoContenidoEnd IfNextEnd IfEnd IfNextEnd IfNext
- Primero cabe diferenciar entre el desarrollo del script en función de que las vi-cond sean o no el mismo género (vg. If mComparaViGen(i) = True Then)
- En segundo lugar genera una nueva diferenciación (bifurcación) el hecho de que la vi-cond del modelo sea de género femenino o de género masculino. Aunque este caso sólo afecta realmente a la opción negativa de la primera condición, implica además una alteración de la referencia de los contenidos de la BDGenero, lo que conlleva la creación de dos nuevas matrices y la modificación de su contenido en función de esta segunda condición (4)
- El núcleo del ajuste del contenido de las vg requiere establecer la comparación entre el contenido del segmento y el de la BDGenero, teniendo en cuenta una doble delimitación: que el segmento sea de tipo vg (If mModelCateg(ii) = "vg" Then) y que posea un índice numérico acorde con la vi-cond de referencia (If mViPos(i) = mModelViCond(ii) Then). Sólo en ese caso se desarrolla el procedimiento antes indicado, que se concreta de forma diferentes en función del cumplimiento de una u otra condición en el condicional primero (igual vs. diferencia de género de las vi-cond) (vg...
If mViPos(i) = mModelViCond(ii) Then -> mDatosInfo(ii) = mDatosInfo(ii)
...cuando ambas vi-cond (modelo - informe) son del mismo género (5).
- A la complejidad de estructura que deriva de los diferentes niveles de condicionalidad se añade la que conlleva el uso reiterado de la iteración que deriva de la estructura matricial de los datos y de la apuesta por la automatización del procedimiento que preside el desarrollo de este modelo, la cual, a su vez, precisa de ambas (iteración y matrices).
Para finalizar decir que, aunque esta prueba está superada satisfactoriamente para este caso (6), la prueba de fuego aun está pendiente: aplicar el modelo al abordaje de la automatización de un informe psicopedagógico.
Documento. El [siguiente documento] contiene (IDE) el código que concreta (de momento) la versión compleja de este modelo de automatización en sus dos fases, incluyendo los script principales y los secundarios (7).
NOTAS
(1) Hablamos pues de una modificación del script principal de esa segunda fase, esto es, del script NuevoInforme.
(2) Se trata de las funciones contenidas en el módulo Funciones. Como en muchos casos, su principal contribución consiste en aligerar líneas de código el script principal.
(3) De esto se ocupan dos de las funciones (GenMasc() y GenFem()). Esto permite liberar al código del script principal de especificar el procedimiento de acceso a la base de datos y a los datos mismos.
(4) Esta modificación requiere del recurso a dos funciones (PosGenInicial() y PosGenFinal()) que aligeran también (y significativamente) el contenido del script principal.
(5) Debo reconocer que esta obviedad me resultó difícil de comprender, ya que mi primera forma de enfocar esta cuestión reducía la pertinencia de este procedimiento a la condición False de esa comparación (la que se desarrolla en la segunda rama de la condicionalidad principal y finaliza con mDatosInfo(ii) = sNuevoContenido. Lógicamente esto provocaba que fracasara la aplicación del procedimiento general en cuanto no se cumplía (para los dos casos de las vi-cond) el criterio de diferencia de género.
(6) Esta afirmación no es del todo correcta, ya que no se resuelve satisfactoriamente según los objetivos del modelo la actualización de la vn. Pero dada la peculiaridad de este tipo de segmento y la necesidad de un procedimiento específico de abordaje, se puede considerar fundamentalmente cierta dicha afirmación.
(7) Aquí también son válidas las advertencias tantas veces formuladas sobre el control de la ubicación del documento y la actualización de la dirección correspondiente de (vg) sRuta = ConvertToUrl("C:/Users/TuNombreDeUsuario/Escritorio/Textos/BDGenero.ods"). Se debe añadir que son necesarios dos documentos situados en la misma ruta que el documento que soporta estos script: BDNombres y BDGenero. El segundo está disponible desde [esta entrada]; el primero deberás crearlo tú sobre Calc (doble columna nombre - género (f vs. m); ej. Antonio | m)

No hay comentarios:
Publicar un comentario
Comenta esta entrada