miércoles, 14 de septiembre de 2011

Archivos Planos con XML Publisher

En está nueva entrada vamos estudiar la forma de generar archivos planos utilizando XML Publisher y sin necesidad de crear objetos por el app designer ni de escribir código. 

Para poder poner en práctica la información que vamos a generar en está entrada,  es necesario tener conocimientos básicos de XML y del Gestor de Consultas de PEOPLESOFT. 

Las plantillas XML Publisher que nos permiten generar archivos planos son las plantillas eText. Estas plantillas son creadas en MS WORD y son formato RTF igual que las que se usan normalmente para generar los reportes en PDF. 

La diferencia de estás plantillas con las plantillas normales es la estructura que se debe definir.

Para el ejercicio de generación de plantillas eText de esta entrada vamos a utilizar la consulta conectada que creamos en la entrada anterior. 

Al igual que para una plantilla XML Publisher normal, lo primero que tenemos que tener para desarrollar nuestra plantilla es la estructura XML sobre la cual vamos a trabajar. Para nuestro ejemplo la estructura será la siguiente: Estructura XML. Está estructura se descarga desde la consulta conectada. .


Luego de definir la estructura XML definimos que tipo de plantilla vamos a generar.  Generalmente los archivos planos se pueden generar: de longitud fija o delimitados. 


Para definir una plantilla eText de longitud fija utilizamos el siguiente encabezado:



La propiedad <TEMPLATE TYPE> define que queremos un archivo plano de longitud fija o delimitado. Para un archivo plano delimitado la cabecera que se debe utilizar es la siguiente:


Luego de definir las  propiedades generales de la plantilla, se procede a definir los datos que se van a generar dentro del archivo plano. Para lo anterior debemos definir las siguientes propiedades. 

1. Definir el nivel dentro del XML del cual vamos a extraer la información. En nuestro caso el archivo plano debe tener un primer tipo de fila que contenga los datos del rol. Estos datos se deben tomar de la ruta ConnectedQuery/PE_CQ_ROLES. Con este dato definimos la propiedad <LEVEL> (Esto aplica tanto para los archivos delimitado como para los de longitud fija.)

Luego de definir el nivel se definen las propiedades de cada uno de los datos que se incluirán en el archivo y dentro del nivel que estamos configurando. Para un archivo de longitud fija se deben definir las siguientes propiedades:

<POSITION>Indica a partir de que posición se empezará a escribir el dato dentro de la fila que se está generando
<LENGTH>Indica la longitud que va a tener el campo dentro de la fila que se está generando
<FORMAT>Define el formato del campo. Las opciones son NUMBER, ALPHA y DATE
<PAD>Indica el carácter con el cual se debe rellenar el campo para completar la longitud total del campo.  Por ejemplo si queremos rellenar el campo con espacios a la derecha está propiedad debe ser R, ' ', si deseamos llenar el campo con ceros a la izquierda el valor debe ser L, '0'
<DATA>Indica el elemento xml del cual se extraerá la información. Dentro de este campo se pueden usar funciones como condicionales y funciones XPATH que permitan extraer información de niveles diferentes al que se está trabajando. 
<COMMENTS>Comentarios que no afectarán en nada la generación del archivo. 

En nuestro ejemplo para una plantilla de longitud fija está sección para los roles debe lucir de la siguiente forma:


Dentro de una plantilla delimitada la propiedades a definir para cada uno de los campos que  formaran una fila del archivo plano

<MAXIMUM LENGTH>Máxima longitud que podrá tener el campo
<FORMAT>Define el formato del campo. Las opciones son NUMBER, ALPHA y DATE
<DATA>Indica el elemento xml del cual se extraerá la información. Dentro de este campo se pueden usar funciones como condicionales y funciones XPATH que permitan extraer información de niveles diferentes al que se está trabajando. 
<COMMENTS>Comentarios que no afectarán en nada la generación del archivo. 


En nuestro ejemplo está sección para los roles debe lucir de la siguiente forma:


Longitud Fija







Delimitada





Cada vez que inicializamos una sección <LEVEL> debemos terminar esa sección con un <END LEVEL> en nuestro caso no hemos puesto aún el <END LEVEL> debido a que los roles tienen dos secciones hijas: Usuarios y Listas de Permiso,  entonces para lograr este comportamiento lo que hacemos es anidar otras secciones <LEVEL> antes de cerrar la que pertenece a los roles. 


Para anidar el <LEVEL> que nos mostrará los usuarios, debemos agregar una sección igual a la anterior pero en el campo <LEVEL> asociamos el nodo XML que pertenece a los usuarios,  y adicionalmente agregamos en <END LEVEL> ya que los usuarios no tienen ningún otro nivel anidado. La sección de usuarios quedaría de la siguiente forma: 


Longitud Fija






Delimitada






De la misma forma la sección para las listas de permisos quedaría asi:


Longitud







Delimitada





Listo, por último agregamos el <END LEVEL> de nuestra sección de roles y con esto finalizamos nuestra plantilla;




Longitud Fija







Delimitada




Las plantillas completas las podemos descargar de los siguientes enlaces: Longitud FijaDelimitada


2. El siguiente paso es crear la definición del informe. Podemos utilizar el mismo origen de datos que utilizamos en la entrada anterior. El tipo de plantilla que debemos seleccionar es eTexto. 


3. Por último podemos ejecutar nuestro reporte por la ruta Inicio > Herramientas de Informes > XML Publisher > Gestor de Informes de Consulta.  Al ejecutarlo debemos seleccionar en formato "Texto" para que genere nuestro archivo plano.  Este proceso tiene un bug al momento de ejecutar un reporte que genera un archivo plano mediante una plantilla eText.  

Para corregir este bug se debe reemplazar el siguiente código que se encuentra en en app engine PSXPQRYRPT en la sección MAIN en el paso ExecRpt:



&oRptDefn.ProcessReport(&TemplateId, &LanguageCd, &AsOfDate, &oRptDefn.GetOutDestFormatString(&OutDestFormat));

Por el siguiente: 

      /*INICIO CHGA #001 */
      If &oRptDefn.TemplateType = "ETX" Then
         REM         Local File &fileCSV;
         REM         &fileCSV = GetFile(&ReportName | String(&ProcessInstance) | ".txt", "w", "UTF-8", %FilePath_Relative);
         REM         &fileCSV.WriteString(&oRptDefn.ProcessETextReport(&TemplateId, %Language_User, %Date));
         &oRptDefn.ProcessReport(&TemplateId, &LanguageCd, &AsOfDate, "TXT");
      Else
         
         /*FIN CHGA #001 */
         &oRptDefn.ProcessReport(&TemplateId, &LanguageCd, &AsOfDate, &oRptDefn.GetOutDestFormatString(&OutDestFormat));
      End-If;


Y listo con esto hemos creado un archivo plano utilizando las herramientas que el XML Publisher nos suministra, sin necesidad de escribir código (Bueno casi. ). 

Espero que esta entrada les sea de utilidad y nos vemos en la siguiente. 

1 comentario:

  1. USTED ES UN MAESTRO DOCTOR, GRACIAS POR COMPARTIR ESTOS TUTOS !!! OJALA SIGA SUBIENDO MAS !!! SALUDOS !!!

    ResponderEliminar