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

lunes, 26 de marzo de 2018

PeopleTools - Navegador de Archivos en el Application Server

Más de una vez, he requerido de generar archivos de trace o revisar cargas que haya realizado en el servidor de aplicación (Application Server) o incluso revisar si mis archivos fueron creados correctamente.

Para no tener que depender del sysadmin, y estar solicitando que ten envíen archivos o revisar si se crearon correctamente o etc.. etc.. hice esta página para poder accesar y descargar o revisar los archivos que necesito del servidor de aplicación.

Alguna vez recuerdo haber encontrado uno pero ya por más que lo busqué ... quedó perdido en algún lugar. Así que mejor generé el mío y que ahora comparto aquí.


Tan solo necesité crear
- 1 Menú
- 1 Componente
- 1 Página
- 1 Registro (tabla) y 1 Registro Derivado
- Algunas líneas de PeopleCode y listo ....

Ahora voy explicando

Este es mi record derived


El capo FILE_PATH_NAME lo utilizo para guardar y mostrar la ruta actual en la que se encuentra, es básica ya que es la que ocupo para saber dónde buscar los archivos.

El campo URL lo utilizo para especificar el nombre de la URL de algún sitio de FTP que tenga disponible. Cuando descargo los archivos no los puedo abrir directamente desde su ubicación, eso debido a temas de seguridad. Quizá en un ambiente windows pudiera funcionar con el protocolo FILE:// , pero para Linux no me funcionó.

Así que la utilizo para copiar temporalmente el archivo y desde ahí es donde llamo el VIEWATTACHMENT.

El campo VARIABLE_ENV, es un Drop List Box y tiene translates con algunas variables de ambiente (las que pude recordar.. jejeje) ustedes podrán agregar las que requieran. Lo utilizo para cambiar el FILE_PATH_NAME a ubicaciones ya predefinidas.

Después, mi Record principal


El campo ID_SEQ_ITEM lo utilizo para numerar los archivos ... al final ya no le encontré gran utilidad, pero si a ustedes les sirve lo pueden volver a mostrar.

ATTACHSYSFILENAME lo utilizo para guardar la ruta completa y nombre de archivo, es de ahí donde tomo la información para abrir los archivos

ATTACHUSERFILE es el campo que en realidad se muestra, es como que únicamente el nombre del archivo.

Ahora mi página:


Aquí están los campos que les comenté, solo hay un Rowset, que trabaja con el Record (que si bien es una tabla, pero núnca guarda datos)

El ATTACHUSERFILE es un botón de tipo Link

La distribución de la página:



El activate de mi Página


Que sirve para inicializar los valores y la primera vista de archivos

Mi componente:


Y sus propiedades



Si observan, el SearchRecord es el de INSTALLATION, que para lo único que me sirve es para entrar, para brincarme el search natural de People.

También tengo desactivados todos los botones del Toolbar.

Existe código en el PostBuild del componente:


Intento aquí definir el caracter para las rutas (Windows o Linux) pero está más preparado para Linux, para Windows habrá que hacer más ajustes.

El SavePostChange del Componente


Que para lo que sirve es volver a cargar los datos con la nueva ruta que se haya modificado. Esto lo hice así ya que lo que desencadena el cambiar de directorio es cuando se da clic en el nivel 1, pero estando parado sobre ese nivel no podría limpiarlo o volverlo a cargar, ya que PeopleTools no lo permite, así que cuando la dirección cambia, tan solo genero un DoSaveNow () y con este código en el SavePostChange toma el cambio en la Ruta actual y refresca el detalle.


El código en mi Record principal, solo tiene el evento de FieldChange y código en el FieldFormula

El código del FieldChange es el que tiene el control para cambiar de directorios o descargar los archivos


Uso algo de Java para poder definir si es una carpeta o no, y en base a eso cambio la ruta y refresco o descargo el archivo.


Aquí está la función que mando llamar de varios lados, que es la que llena el Rowset con el listado de los archivos.

El código en mi derived


Es el que actualiza mi ruta si se selecciona alguna de las variables de ambiente predefinidas.

Y bueno, así es como se ve la página
Dando clic en los links de abajo, se va navegando en los diferentes directorios y niveles. Para subir de nivel es el que tiene los dos puntos seguidos  ( /.. )

Y bueno, eso en general es todo. Está sencillo relativamente, creo que si se ponen creativos podrían hacer bastantes mejoras.

Aquí el proyecto para descargar

Sugiero precaución en su uso, y dar solo permisos a quienes tengan conocimiento técnico.

Si bien, así como está no puede borrar ningún arhivo o modificarlo, pero tiene el potencial para realizar muchas cosas.

Y bueno... espero les sirva.


jueves, 1 de marzo de 2018

Gestor de Consultas (Query Manager) Usar un subquery como campo de selección


Usando las PeopleTools 8.53 ya no te permite agregar un campo proveniente de un subquery (recuerdo que en alguna versión anterior se podía ... pero quizá es ya estoy viejito y ya no me acuerdo... jajaja).

En específico, detecta la palabra FROM y no te  permite añadirlo.

Así que para lograr eso, seguir estos pasos:


1. Crear un objeto SQL desde el Designer. En este objeto tendrás tu subquery que quieres utilizar como campo en tu consulta, teniendo el cuidado de realizar las referencias adecuadas a tu query principal. Ejemplo (Objeto  SQL_TEST:
     

Estoy usando este texto:

(  SELECT 'HOLA' || A.EXCHNG_TO_CURRENCY %P(1)%TextIn(o)m dual )

Para los metadatos es importante respetar mayúsculas y minúsculas tal y cual está

 2. Creamos nuestra consulta desde el aplicativo (muy simple en mi caso, solo para el ejemplo)

3. Añadimos una expresión a la consulta (con la longitud y tipo necesario a tu resultado)


En esta expresión hago referencia al SQL que previamente construí (SQL_TEST). El texto es este:

%SQL(SQL_TEST,Fr )

Es indispensable que las letras  Fr se encuentren en mayúsuclas y minúsculas, tal y como está en el ejemplo.

En el objeto SQL que creamos, tiene estos metadatos:

%P(1)%TextIn(o)m

Lo que estamos esperando que haga es que sustituya el %P(1) por Fr el %TestIn(o) es fijo, insertará la letra "o" y la última m la pone al final, obteniendo la palabra: From

4. Esa expresión le damos al botón de "Usar como Campo"

5. Nuestros campos se deben de ver así:


6. Si vemos nuestro SQL observamos que ya se encuentra el subquery:


7. Listo!! Podemos ver el resultado








lunes, 9 de septiembre de 2013

PeopleSoft - Revisión de Permisos y Accesos

Yo sé que este query esta muuy largo... pero esta muy digerido. Te da por usuario, roles, listas de permisos, rutas en el portal (inglés y español), menú y componente al cuál se tiene acceso.


SELECT AD.ROLEUSER, AC.ROLENAME, AC.CLASSID, 
rtrim(ltrim(rtrim(ltrim(rtrim(ltrim(rtrim(ltrim(rtrim(ltrim(rtrim(ltrim(rtrim(ltrim( G.PORTAL_LABEL)) || ' > ' )) || rtrim(ltrim( F.PORTAL_LABEL)) || ' > ')) || rtrim(ltrim( E.PORTAL_LABEL )) || ' > ')) || rtrim(ltrim( D.PORTAL_LABEL)) || ' > ')) || rtrim(ltrim( C.PORTAL_LABEL)) || ' > ' )) || rtrim(ltrim( B.PORTAL_LABEL)) || ' > ')) || rtrim(ltrim( A.PORTAL_LABEL)) AS Ruta_Ingles, 
rtrim(ltrim(rtrim(ltrim(rtrim(ltrim(rtrim(ltrim(rtrim(ltrim(rtrim(ltrim(rtrim(ltrim(GL.PORTAL_LABEL)) || ' > ' )) || rtrim(ltrim(FL.PORTAL_LABEL)) || ' > ')) || rtrim(ltrim(EL.PORTAL_LABEL )) || ' > ')) || rtrim(ltrim(DL.PORTAL_LABEL)) || ' > ')) || rtrim(ltrim(CL.PORTAL_LABEL)) || ' > ' )) || rtrim(ltrim(BL.PORTAL_LABEL)) || ' > ')) || rtrim(ltrim(AL.PORTAL_LABEL)) AS Ruta_Español,
A.PORTAL_URI_SEG1 AS Menu, 
A.PORTAL_URI_SEG2 as Componente 
  FROM ((((((((
  (PSPRSMDEFN A LEFT OUTER JOIN PSPRSMDEFNLANG AL 
           ON A.PORTAL_NAME = AL.PORTAL_NAME 
                       AND A.PORTAL_REFTYPE = AL.PORTAL_REFTYPE 
  AND A.PORTAL_OBJNAME = AL.PORTAL_OBJNAME 
   ) LEFT OUTER JOIN  
   (PSPRSMDEFN B LEFT OUTER JOIN PSPRSMDEFNLANG BL 
        ON B.PORTAL_NAME = BL.PORTAL_NAME 
AND B.PORTAL_REFTYPE = BL.PORTAL_REFTYPE 
AND B.PORTAL_OBJNAME = BL.PORTAL_OBJNAME 
) ON  A.PORTAL_PRNTOBJNAME = B.PORTAL_OBJNAME AND (A.PORTAL_NAME = 'EMPLOYEE' AND A.PORTAL_NAME = B.PORTAL_NAME )
  ) LEFT OUTER JOIN 
  (  PSPRSMDEFN C LEFT OUTER JOIN PSPRSMDEFNLANG CL 
             ON C.PORTAL_NAME = CL.PORTAL_NAME 
AND C.PORTAL_REFTYPE = CL.PORTAL_REFTYPE 
AND C.PORTAL_OBJNAME = CL.PORTAL_OBJNAME 
) ON B.PORTAL_NAME = C.PORTAL_NAME 
AND B.PORTAL_REFTYPE = C.PORTAL_REFTYPE 
AND B.PORTAL_PRNTOBJNAME = C.PORTAL_OBJNAME 
AND B.PORTAL_NAME = C.PORTAL_NAME
) LEFT OUTER JOIN 
              (PSPRSMDEFN D LEFT OUTER JOIN  PSPRSMDEFNLANG DL 
            ON D.PORTAL_NAME    = DL.PORTAL_NAME 
                              AND D.PORTAL_REFTYPE = DL.PORTAL_REFTYPE 
                              AND D.PORTAL_OBJNAME = DL.PORTAL_OBJNAME 
   ) ON  C.PORTAL_NAME = D.PORTAL_NAME 
    AND C.PORTAL_REFTYPE = D.PORTAL_REFTYPE 
    AND C.PORTAL_PRNTOBJNAME = D.PORTAL_OBJNAME 
    AND C.PORTAL_NAME = D.PORTAL_NAME 
  ) LEFT OUTER JOIN 
   (PSPRSMDEFN E LEFT OUTER JOIN PSPRSMDEFNLANG EL 
            ON E.PORTAL_NAME = EL.PORTAL_NAME 
   AND E.PORTAL_REFTYPE = EL.PORTAL_REFTYPE 
   AND E.PORTAL_OBJNAME = EL.PORTAL_OBJNAME 
  ) ON D.PORTAL_NAME = E.PORTAL_NAME 
   AND D.PORTAL_REFTYPE = E.PORTAL_REFTYPE 
   AND D.PORTAL_PRNTOBJNAME = E.PORTAL_OBJNAME 
  ) LEFT OUTER JOIN 
    (  PSPRSMDEFN F LEFT OUTER JOIN PSPRSMDEFNLANG FL 
               ON F.PORTAL_NAME    = FL.PORTAL_NAME 
  AND F.PORTAL_REFTYPE = FL.PORTAL_REFTYPE 
  AND F.PORTAL_OBJNAME = FL.PORTAL_OBJNAME 
    ) ON  E.PORTAL_NAME = F.PORTAL_NAME 
     AND E.PORTAL_REFTYPE = F.PORTAL_REFTYPE 
  AND E.PORTAL_PRNTOBJNAME = F.PORTAL_OBJNAME 
  ) LEFT OUTER JOIN 
    (PSPRSMDEFN G LEFT OUTER JOIN PSPRSMDEFNLANG GL 
             ON G.PORTAL_NAME = GL.PORTAL_NAME 
                              AND G.PORTAL_REFTYPE = GL.PORTAL_REFTYPE 
                              AND G.PORTAL_OBJNAME = GL.PORTAL_OBJNAME 
   ) ON F.PORTAL_NAME = G.PORTAL_NAME 
    AND F.PORTAL_REFTYPE = G.PORTAL_REFTYPE 
    AND F.PORTAL_PRNTOBJNAME = G.PORTAL_OBJNAME 
  ) LEFT OUTER JOIN 
    (PSPRSMDEFN H LEFT OUTER JOIN PSPRSMDEFNLANG HL 
             ON H.PORTAL_NAME = HL.PORTAL_NAME 
    AND H.PORTAL_REFTYPE = HL.PORTAL_REFTYPE 
    AND H.PORTAL_OBJNAME = HL.PORTAL_OBJNAME 
   ) ON  G.PORTAL_NAME = H.PORTAL_NAME 
    AND G.PORTAL_REFTYPE = H.PORTAL_REFTYPE 
    AND G.PORTAL_PRNTOBJNAME = H.PORTAL_OBJNAME 
  ) LEFT OUTER JOIN 
    (PSPRSMDEFN I LEFT OUTER JOIN PSPRSMDEFNLANG IL 
             ON I.PORTAL_NAME    = IL.PORTAL_NAME 
    AND I.PORTAL_REFTYPE = IL.PORTAL_REFTYPE 
                              AND I.PORTAL_OBJNAME = IL.PORTAL_OBJNAME 
  ) ON  H.PORTAL_NAME = I.PORTAL_NAME 
   AND H.PORTAL_REFTYPE = I.PORTAL_REFTYPE 
   AND H.PORTAL_PRNTOBJNAME = I.PORTAL_OBJNAME 
), 
 PSPRSMPERM AB, 
 PSROLECLASS AC, 
 PSROLEUSER AD 
  where  B.PORTAL_REFTYPE  = 'F' 
     AND A.PORTAL_NAME     = AB.PORTAL_NAME 
     AND A.PORTAL_REFTYPE  = AB.PORTAL_REFTYPE 
     AND A.PORTAL_OBJNAME = AB.PORTAL_OBJNAME 
AND AC.CLASSID = AB.PORTAL_PERMNAME 
AND AC.ROLENAME = AD.ROLENAME 
AND A.PORTAL_URI_SEG2 <> ' ' 
 AND AD.ROLEUSER = 'VP1'
 order by 1,4,2,3


lunes, 17 de junio de 2013

Crear un PDF con PeopleCode desde un HTML

Aquí les dejo un ejemplo de cómo crear un PDF en línea, con PeopleCode a partir de una plantilla HTML

Local JavaObject &Document = CreateJavaObject("com.lowagie.text.Document");
Local JavaObject &pdfWriter = GetJavaClass("com.lowagie.text.pdf.PdfWriter").getInstance(&Document, CreateJavaObject("java.io.FileOutputStream", "/tmp/test.pdf", True));

&Document.open();

Local JavaObject &htmlWorker = CreateJavaObject("com.lowagie.text.html.simpleparser.HTMLWorker", &Document);

Local string &str;

&str = " <html> ";
&str = &str | " <head> ";
&str = &str | " <title></title> ";
&str = &str | " </head> ";
&str = &str | " <body> ";
&str = &str | " <p><b><font size='7'>Título</font></b></p> ";
&str = &str | " <p><b><font size='5'>Subtítulo</font></b></p> ";
&str = &str | " <p><b><font size='4'>Párrafo</font></b></p> ";
&str = &str | " <p>Texto de párrafo, texto de párrafo, texto de párrafo, texto de párrafo, texto  ";
&str = &str | " de párrafo, texto de párrafo, texto de párrafo, texto de párrafo, texto de  ";
&str = &str | " párrafo, texto de párrafo, texto de párrafo.</p> ";
&str = &str | " <table border='1' cellspacing='1' bgcolor='#FFFFCC' bordercolor='#0000FF' width='100%'> ";
&str = &str | " <tbody> ";
&str = &str | " <tr> ";
&str = &str | " <td width='10%'><b>Tabla</b></td> ";
&str = &str | " <td width='20%'><b>Head 1</b></td> ";
&str = &str | " <td width='50%'><b>Head 2</b></td> ";
&str = &str | " <td width='20%'><b>Head 3</b></td> ";
&str = &str | " </tr> ";
&str = &str | " <tr> ";
&str = &str | " <td width='10%'>&nbsp;</td> ";
&str = &str | " <td width='20%'>&nbsp;</td> ";
&str = &str | " <td width='50%'>&nbsp;</td> ";
&str = &str | " <td width='20%'>&nbsp;</td> ";
&str = &str | " </tr> ";
&str = &str | " </tbody> ";
&str = &str | " </table> ";
&str = &str | " <ul> ";
&str = &str | " <li>Elemnto 1</li> ";
&str = &str | " <li>Elemento 2</li> ";
&str = &str | " <li>Elemento 3</li> ";
&str = &str | " </ul> ";
&str = &str | " </body> ";
&str = &str | " </html> ";

Local JavaObject &SR = CreateJavaObject("java.io.StringReader", &str);

&htmlWorker.parse(&SR);

&Document.close();

&salida = PutAttachment(URL.MI_SITIO_FTP, "/midirectorio/test.pdf", "/tmp/test.pdf");

/* eliminamos el archivo en el AppSrv, del subdirectorio temporal */
Local JavaObject &f = CreateJavaObject("java.io.File", "/tmp/test.pdf");
&f.delete();

/* Muestra el archivo desde la ubicación de FTP */
&salida = ViewAttachment(URL.MI_SITIO_FTP, "/midirectorio/test.pdf", "test.pdf", True);

/* Eliminamos el archivo copiado después de haberlo mostrado*/
&salida = DeleteAttachment(URL.MI_SITIO_FTP, "/midirectorio/test.pdf");

NOTA:
Este tema esta relacionado con un tema previo que publiqué, con referencia al uso de las librerías iText.

jueves, 14 de febrero de 2013

PeopleCode: Imprimir toda una página

Imprimir toda una página es más fácil...

Agrega un botón a tu página, asócialo a un derived y un campo que sea de 25 caracteres como mínimo de tipo MIXED.

En las propiedades del botón en Destination le pones External Link y en el cuadro de external link (el que se habilita) le pones dinámico.

Después en el FieldDefault del campo asociado al botón le pones:

TuDerived.TuCampo.value = "javascript:window.print()"
Y listo....

Adicional y si requieres que no imprima el menú  e incluso el mismo botón que lo mandó a imprimir, tendrías que hacer:

En las propiedades del botón, en la pestaña de General, en donde dice "Page Field Name" le pones algún nombre específico, como: BOTON_IMPRIME

Luego, en tu página tienes que agregar un HTML de tipo constante, y en el rowinit le pones este código:

TuDerived.TuCampoHTML.value = "<style type=""text/css"">@media print {body { zoom:75%;} #PAGEBAR, .PSHEADERTOOLBARFRAME, #BOTON_IMPRIME { display: none }}</style>";
Con esto estás controlando el zoom al momento de imprimir y las secciones que no quieres que aparezcan. Puedes nombrar tantos campos de tu pantalla como quieras, para luego decirle que no aprezcan en la impresión, anteponiendo el "#" como en la línea de arriba: #BOTON_IMPRIME { display: none }

Tanto el botón como el HTML deben de estar al nivel 0

Espero les sea de utilidad.

lunes, 21 de enero de 2013

PeopleCode: Realizar filtros dentro de una página

Usualmente para realizar filtros en las páginas utilizamos los Search Records del componente, pero que pasa cuando necesitamos realizar un filtro cuando ya tenemos la página abierta.

Supongamos que dentro de la página tenemos algo como esto:


Y necesitamos que el grid de abajo (en nivel 1) se llene con los datos relacionados al filtro que realicemos.

Primero:
El campo del record (MI_REC_BUSQUEDA) por el que se realiza el filtro deberá tener un prompt:



En el evento FieldChange del campo EMPLID metemos este código:

      Local Rowset &grid;
      &grid = GetLevel0()(1).GetRowset(Scroll.TABLA_DEL_GRID);
      &Where = "WHERE EMPLID = '" | MI_REC_BUSQUEDA.EMPLID | "'";
      &total_lineas = &grid.Selectnew(Record.TABLA_DEL_GRID, &Where);

Con esto creamos el filtro y llenamos el grid de abajo, adicional tenemos el número total de registros devueltos.

Y listo…





martes, 25 de septiembre de 2012

Bloquear botones de Agregar y Eliminar de un Scroll por Peoplecode

Para quitar los botones de Agregar y Eliminar de un scroll en tiempo de ejecución, se puede usar este código:

Local Rowset &MyScroll;

&MyScroll =GetLevel0()(1).GetRowset(Scroll.REGISTRO_DE_SCROLL);

&MyScroll.InsertEnabled = False;

&MyScroll.DeleteEnabled = False;


Espero les sea de utilidad.

sábado, 22 de septiembre de 2012

Convertir de Números a Letras en PeopleCode

Aquí les dejo una función para convertir números a letras, utilizando PeopleCode. La función recibe la cantidad en número y devuelve en string la conversión.

Espero les sea de utilidad.


Function monto_en_letra(&monto) Returns string;
 
   For &i = 1 To Len(&monto)
      &caracter = Substring(&monto, &i, 1);
      Evaluate &caracter
      When "0"
         &nombre = "";
         Break;
      When "1"
         &nombre = "UNO";
         Break;
      When "2"
         &nombre = "DOS";
         Break;
      When "3"
         &nombre = "TRES";
         Break;
      When "4"
         &nombre = "CUATRO";
         Break;
      When "5"
         &nombre = "CINCO";
         Break;
      When "6"
         &nombre = "SEIS";
         Break;
      When "7"
         &nombre = "SIETE";
         Break;
      When "8"
         &nombre = "OCHO";
         Break;
      When "9"
         &nombre = "NUEVE";
         Break;
      End-Evaluate;
      &posicion = Len(&monto) + 1 - &i;
      Evaluate &posicion
      When 7
         &caracter_sigm = Substring(&monto, 1, 1);
         Evaluate &caracter
         When "1"
            &valor = "UN MILLÓN ";
            Break;
         When-Other
            &valor = &nombre | " MILLONES ";
            Break;
         End-Evaluate;
         Break;
      When 6
         Evaluate &caracter
         When "0"
            &valor = &valor | "";
            Break;
         When "1"
            &caracter_sig = Substring(&monto, 2, 2);
            If &caracter_sig = "00" Then
               &valor = &valor | "CIEN ";
            Else
               &valor = &valor | "CIENTO ";
            End-If;
            Break;
         When "5"
            &valor = &valor | "QUINIENTOS ";
             Break;
         When "7"
            &valor = &valor | "SETECIENTOS ";
            Break;
         When "9"
            &valor = &valor | "NOVECIENTOS ";
            Break;
         When-Other
            If &caracter_sigm <> 0 Then
               &valor = &valor | &nombre | "CIENTOS ";
            End-If;
            Break;
         End-Evaluate;
         Break;
      When 5
         &sig = 0;
         Evaluate &caracter
         When "0"
            &valor = &valor | "";
            Break;
         When "1"
            &caracter_sig = Substring(&monto, &i + 1, 1);
            &sig = 1;
             Evaluate &caracter_sig
            When "0"
               &valor = &valor | "DIEZ ";
               Break;
            When "1"
               &valor = &valor | "ONCE ";
                Break;
            When "2"
               &valor = &valor | "DOCE ";
               Break;
            When "3"
               &valor = &valor | "TRECE ";
               Break;
            When "4"
               &valor = &valor | "CATORCE ";
               Break;
            When "5"
               &valor = &valor | "QUINCE ";
               Break;
            When-Other
               &valor = &valor | "DIECI";
               Break;
             End-Evaluate;
            Break;
         When "2"
            &caracter_sig = Substring(&monto, &i + 1, 1);
            If &caracter_sig = "0" Then
               &valor = &valor | "VEINTE ";
            Else
               &valor = &valor | "VEINTI";
            End-If;
            Break;
        When "3"
            &caracter_sig = Substring(&monto, &i + 1, 1);
         
            If &caracter_sig = "0" Then
               &valor = &valor | "TREINTA ";
            Else
               &valor = &valor | "TREINTA Y ";
            End-If;
            Break;
          When "4"
            &caracter_sig = Substring(&monto, &i + 1, 1);
            If &caracter_sig = "0" Then
               &valor = &valor | "CUARENTA ";
            Else
               &valor = &valor | "CUARENTA Y ";
            End-If;
            Break;
        When "5"
            &caracter_sig = Substring(&monto, &i + 1, 1);
            If &caracter_sig = "0" Then
               &valor = &valor | "CINCUENTA ";
            Else
               &valor = &valor | "CINCUENTA Y ";
            End-If;
            Break;
         When "6"
            &caracter_sig = Substring(&monto, &i + 1, 1);
            If &caracter_sig = "0" Then
               &valor = &valor | "SESENTA ";
            Else
               &valor = &valor | "SESENTA Y ";
            End-If;
            Break;
         When "7"
            &caracter_sig = Substring(&monto, &i + 1, 1);
            If &caracter_sig = "0" Then
               &valor = &valor | "SETENTA ";
            Else
               &valor = &valor | "SETENTA Y ";
            End-If;
            Break;
         When "8"
            &caracter_sig = Substring(&monto, &i + 1, 1);
            If &caracter_sig = "0" Then
               &valor = &valor | "OCHENTA ";
            Else
               &valor = &valor | "OCHENTA Y ";
            End-If;
            Break;
         When "9"
            &caracter_sig = Substring(&monto, &i + 1, 1);
            If &caracter_sig = "0" Then
               &valor = &valor | "NOVENTA ";
            Else
               &valor = &valor | "NOVENTA Y ";
            End-If;
            Break;
         End-Evaluate;
         Break;
      When 4
         If &sig = 1 Then
            If Find(&caracter, "6789") > 0 Then
               &valor = &valor | &nombre | " ";
            Else
               &valor = &valor | "";
            End-If;
         Else
            Evaluate &caracter
            When "0"
               &valor = &valor | "";
               Break;
            When "1"
               If Len(&monto) = 4 Then
                  &valor = &valor | "";
               Else
                  &valor = &valor | "UN ";
               End-If;
               Break;
            When-Other
               &valor = &valor | &nombre | " ";
               Break;
            End-Evaluate;
         End-If;
         &valor = &valor | "MIL ";
         Break;
      When 3
         Evaluate &caracter
         When "0"
            &valor = &valor | "";
            Break;
         When "1"
            If &caracter_sig = "00" Then
               &valor = &valor | "CIEN ";
            Else
               &valor = &valor | "CIENTO ";
            End-If;
            Break;
         When "5"
            &valor = &valor | "QUINIENTOS ";
            Break;
         When "7"
            &valor = &valor | "SETECIENTOS ";
            Break;
         When "9"
            &valor = &valor | "NOVECIENTOS ";
            Break;
         When-Other
            &valor = &valor | &nombre | "CIENTOS ";
            Break;
         End-Evaluate;
         Break;
      When 2
         &sig = 0;
         Evaluate &caracter
         When "0"
            &valor = &valor | "";
            Break;
         When "1"
            &caracter_sig = Substring(&monto, &i + 1, 1);
            &sig = 1;
            Evaluate &caracter_sig
            When "0"
               &valor = &valor | "DIEZ ";
               Break;
            When "1"
               &valor = &valor | "ONCE ";
               Break;
            When "2"
               &valor = &valor | "DOCE ";
               Break;
            When "3"
               &valor = &valor | "TRECE ";
               Break;
            When "4"
               &valor = &valor | "CATORCE ";
               Break;
            When "5"
               &valor = &valor | "QUINCE ";
               Break;
             When-Other
               &valor = &valor | "DIECI";
               Break;
            End-Evaluate;
            Break;
         When "2"
            &caracter_sig = Substring(&monto, &i + 1, 1);
            If &caracter_sig = "0" Then
               &valor = &valor | "VEINTE ";
            Else
               &valor = &valor | "VEINTI";
            End-If;
            Break;
         When "3"
            &caracter_sig = Substring(&monto, &i + 1, 1);
            If &caracter_sig = "0" Then
               &valor = &valor | "TREINTA ";
            Else
               &valor = &valor | "TREINTA Y ";
            End-If;
            Break;
         When "4"
            &caracter_sig = Substring(&monto, &i + 1, 1);
            If &caracter_sig = "0" Then
               &valor = &valor | "CUARENTA ";
            Else
               &valor = &valor | "CUARENTA Y ";
            End-If;
            Break;
         When "5"
            &caracter_sig = Substring(&monto, &i + 1, 1);
            If &caracter_sig = "0" Then
               &valor = &valor | "CINCUENTA ";
            Else
               &valor = &valor | "CINCUENTA Y ";
            End-If;
            Break;
         When "6"
            &caracter_sig = Substring(&monto, &i + 1, 1);
              If &caracter_sig = "0" Then
               &valor = &valor | "SESENTA ";
            Else
              &valor = &valor | "SESENTA Y ";
            End-If;
            Break;
         When "7"
            &caracter_sig = Substring(&monto, &i + 1, 1);
            If &caracter_sig = "0" Then
               &valor = &valor | "SETENTA ";
            Else
               &valor = &valor | "SETENTA Y ";
            End-If;
            Break;
         When "8"
            &caracter_sig = Substring(&monto, &i + 1, 1);
           If &caracter_sig = "0" Then
               &valor = &valor | "OCHENTA ";
            Else
               &valor = &valor | "OCHENTA Y ";
            End-If;
            Break;
         When "9"
            &caracter_sig = Substring(&monto, &i + 1, 1);
            If &caracter_sig = "0" Then
               &valor = &valor | "NOVENTA ";
            Else
              &valor = &valor | "NOVENTA Y ";
            End-If;
            Break;
         End-Evaluate;
         Break;
      When 1
         If &sig = 1 Then
         
            If Find(&caracter, "6789") > 0 Then
               &valor = &valor | &nombre | " ";
            Else
               &valor = &valor | "";
            End-If;
         Else
            Evaluate &caracter
            When "0"
               &valor = &valor | "";
               Break;
            When "1"
               &valor = &valor | "UN ";
               Break;
            When-Other
               &valor = &valor | &nombre;
              Break;
            End-Evaluate;
         End-If;
         Break;
      End-Evaluate;
   End-For;

   If &valor = "UN" Then
      &valor = &valor | " PESO ";
   Else
      &valor = &valor | " PESOS ";
   End-If;

   Return &valor;
End-Function;

domingo, 16 de septiembre de 2012

Creación de archivos PDF con PeopleCode (online)

Dependiendo de la versión de PeopleTools hay diferentes herramientas para crear documentos PDF. Específicamente para este tema comento que estoy utilizando la versión de tools 8.44 y Java 4.1

Al ser en línea usamos java, y utilizamos iText, que nos da la funcionalidad que requerimos.

Desde esta ubicación pueden tanto descargar el ejecutable ( .jar) como el código fuente, si es que lo requieren. Viene la referencia de todas las clases, de forma que podemos revisar como usarlo.

Repito, según la versión de Java que estén utilizando es la versión de iText que deben utilizar, en este caso estoy utilizando la 2.0.8.

El archivo JAR lo deben ubicar a donde apunte PS_CLASSPATH, de estar vacía es necesario que la definan, de otra forma no funciona.

Dicho lo anterior, entramos en tema.


Los primeros pasos son:

/* Crea un objeto de tipo documento */
Local string &MyFile = "myfile.pdf";
Local JavaObject &Obj_Doc = CreateJavaObject("com.lowagie.text.Document");


/* Podemos desde un inicio cargar clases complementarias que vamos a usar */
Local JavaObject &Obj_Font = CreateJavaObject("com.lowagie.text.Font");
Local JavaObject &Element = GetJavaClass("com.lowagie.text.Element");

/* es importante obtener la ruta en donde deja los archivos para que posteriormente podemos tomar los mismos*/
&ambiente = GetEnv("PS_HOME");

/* Obtiene una instancia de PDF Writer */
Local JavaObject &obj_PDFoutput =
GetJavaClass("com.lowagie.text.pdf.PdfWriter").getInstance(&Obj_Doc, CreateJavaObject("java.io.FileOutputStream", &ambiente | "/" |
&MyFile, True));

/* y abrimos el documento para comenzar a escribir */
&Obj_Doc.open();


Bien, ya tenemos abierto el archivo y podemos comenzar a llenar el documento. Podemos agregar directamente texto e imágenes, pero con finalidad de darle una mejor presentación podemos utilizar tablas, para acomodar mejor la información en el documento.


/* Creación de una tabla */
/* El número de renglones no es necesario especificarlo, pero las columnas si */
Local JavaObject &Obj_Table = CreateJavaObject("com.lowagie.text.Table", 6)

/* creado el objeto tabla, se establecen propiedades */
&Obj_Table.setWidth(100);
&Obj_Table.setBorderWidth(0);
&Obj_Table.setDefaultCellBorderWidth(0);

/* creada la tabla, se deben de ir incluyendo las celdas*/
Local JavaObject &cell = CreateJavaObject("com.lowagie.text.Cell");

/* se especifican sus propiedades */
&cell.setBorderWidth(&border);
&cell.setHorizontalAlignment(&AlinearHorizontal);
&cell.setVerticalAlignment(&AlinearVertical);

/* En este punto es cuando se agrega a la celda aquello que se vaya a presentar */

/* ... agregando una imagen a la celda */
Local JavaObject &Obj_Img = GetJavaClass("com.lowagie.text.Image").getInstance(&URLImagen);
/* se establecen propiedades */
&Obj_Img.scaleAbsolute(50, 50);
/* se agrega a la celda */
&cell.addElement(&Obj_Img);

/* finalmente se agrega la celda a la tabla, incluso se puede especificar la posición exacta dentro de la tabla */
Local float &Row, &Column;
&Row=1;
&Column=3;
&Obj_Table.addCell(&cell, &Row, &Column);

/* … agregando texto a la celda, y especificando el COLSPAN */
/* primero creamos la fuente */
Local JavaObject &fuente = CreateJavaObject("com.lowagie.text.Font", 1);
&fuente.setSize(&TamanioFuente);
&fuente.setStyle("bold");
Local JavaObject &Obj_Parrafo = CreateJavaObject("com.lowagie.text.Paragraph", “Texto a Mostrar”, &fuente);

/* Creamos la celda */
Local JavaObject &cell = CreateJavaObject("com.lowagie.text.Cell");
&cell.setColspan(2);
&cell.setWidth(&Ancho);
&cell.setBorderWidth(&border);
&cell.setHorizontalAlignment(&AlinearHorizontal); /* 0,1,2 -> Izq, centro, derecha */
&cell.setVerticalAlignment(&AlinearVertical);
&cell.addElement(&Obj_ Parrafo);
/* agregamos a tabla */
&Obj_Table.addCell(&cell, &Row, &Colum);

/* Agregando una imagen directamente al documento */
Local JavaObject &Obj_Img = GetJavaClass("com.lowagie.text.Image").getInstance(&URLImagen);
&Obj_Img.scaleAbsolute(&Width, &Height);
&Obj_Doc.add(&Obj_Img);

/* Agregar texto directamente al documento */
Local JavaObject &fuente = CreateJavaObject("com.lowagie.text.Font", 12); /* desde aquí se puede especificar el tamaño o posteriormente */
&fuente.setSize(&TamanioFuente);
&fuente.setStyle("bold");
Local JavaObject &Obj_Parrafo = CreateJavaObject("com.lowagie.text.Paragraph", “Texto a Mostrar”, &fuente);
&Obj_Parrafo.setAlignment(&Alinear);
&Obj_Doc.add(&Obj_Parrafo);


/* Como último paso es cerrar el documento */
&Obj_Doc.close();

Listo, ya tenemos listo el documento, ahora tendríamos que moverlo, mostrarlo y/o guardarlo, mandarlo por correo, etc ... 

Aquí solo mostraré como moverlo a una ubicación de FTP y mostrar el archivo


/* Obtiene el archivo desde la ubicación donde esta el application server y lo manda a otra ubicación, en este caso de FTP */
&salida = PutAttachment(URL.MiURL, "/psmysite/" | &MyNewFile, &ambiente | "/" | &MyFile);


/* Muestra el archivo desde la ubicación de FTP */
&salida = ViewAttachment(URL.MiURL, "/psmysite/" | &MyNewFile, &MyNewFile, True);

/* Eliminamos el archivo copiado después de haberlo mostrado*/
&salida = DeleteAttachment(URL.MiURL, "/psmysite/" | &MyNewFile);



Translate