Mostrando las entradas con la etiqueta PeopleCode. Mostrar todas las entradas
Mostrando las entradas con la etiqueta PeopleCode. 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.


viernes, 6 de febrero de 2015

PeopleCode - Manipuar valores de XLAT

Los valores de XLAT que se asocian al campo son definidos como parte de las propiedades del mismo campo, pero que pasa si esos valores son variables? o provienen incluso en ocasiones de tablas diferentes a donde están los valores de XLAT (PSXLATITEM)? Quizá de entrada se pensaría en cambiar el XLAT por un prompt, pero no queremos que el comportamiento sea como de un prompt, sino como un LISTBOX ?

Aquí un código que te ayudará a resolver eso:

/****************************************/

Local Rowset &XLAT, &RS;

&FLD = GetRecord(Record.MI_RECORD_EN_LA_PAGINA).GetField(Field.MI_CAMPO_CON_XLAT);

&FLD.ClearDropDownList();

/* EN LA SIGUIENTE LINEA PODRÍA USARSE CUALQUIER OTRO RECORD, EN ESTE EJEMPLO ESTOY UTILIZANDO LA MISMA TABLA DE XLAT CON CONDICIONES ESPECIFICAS */

&XLAT = CreateRowset(Record.PSXLATITEM);
&XLAT.Fill("WHERE FILL.FIELDNAME = 'MANAGER_LEVEL' AND FILL.EFF_STATUS = 'A' AND FILL.FIELDVALUE <= 5 AND FILL.EFFDT =(SELECT MAX(ED.EFFDT) FROM SYSADM.PSXLATITEM ED WHERE ED.FIELDNAME = FILL.FIELDNAME AND ED.EFF_STATUS = FILL.EFF_STATUS AND ED.EFFDT <= SYSDATE )");

For &i = 1 To &XLAT.ActiveRowCount
 /* es importante destacar que se deben asociar 2 valores: 1 -> el que servirá como clave y 2-> el que lleva la descripción */
   &id = &XLAT(&i).PSXLATITEM.FIELDVALUE.Value;
   &descr = &XLAT(&i).PSXLATITEM.XLATSHORTNAME.Value;
   &FLD.ADDDROPDOWNITEM(&id, &descr);

End-For;

/*****************************************/

PeopleCode - Envío de Correos con imágenes visibles

Para enviar correos con imágenes dentro del cuerpo del mensaje para que sean visibles dentro del mensaje, les tengo estas dos soluciones:

1. Utilizando encode64

He visto que esta funciona con correos como hotmail, gmail, etc... Las imágenes deben de haber sido cargadas previamente en alguna URL definida (podría ser algún FTP, dentro de tu red), o en su defecto especificar la ruta donde se encuentran.

/********************************************/

Local string &MAIL_CC, &MAIL_TO, &MAIL_BCC, &MAIL_SUBJECT, &MAIL_TITLES;
Local string &MAIL_TEXT, &MAIL_FILES, &MAIL_FROM, &REPLYTO, &SENDER, &MAIL_SEP;
Local string &CONTTYPE, &strSQL, &email, &App_name, &Vac_title;
Local number &MAIL_FLAGS, &RET;

&strHTML = "<b> Estimado socio: </b>";
&strHTML=  &strHTML | " Le mando estas imágenes: "  | Char(13) | " <mi_imagen> ";

 &MAIL_FLAGS = 0;
&MAIL_TO = "destinatario1@hotmail.com; destinatario2@gmail.com";
&MAIL_SUBJECT = "Asunto"; 
&MAIL_TEXT = "<html><body>" | &strHTML | "</body></html>"; 

Local File &F1;
Local string &base64string;

&ImgName = "FirmaCia.jpg";

/* aquí se trae la imagen desde tu URL a un directorio temporal donde esta tu Application Server*/
&ok = GetAttachment(URL.MI_FTP, &ImgName, GetEnv("TMP") | "/" | &ImgName);

/* abrimos el archivo y convertimos */
&F1 = GetFile(GetEnv("TMP") | "/" | &ImgName, "R", %FilePath_Absolute);
If &F1.IsOpen Then
      &base64string = &F1.GetBase64StringFromBinary();
      &F1.Close();
      &MAIL_TEXT = Substitute(&MAIL_TEXT, "<mi_imagen>", "<img alt=" | Char(34) | "Embedded Image" | Char(34) | " src=" | Char(34) | "data:image/png;base64," | &base64string | Char(34) | "/>");
End-If;

&MAIL_FROM = "mi_correo@mi_dominio.com";
&MAIL_SEP = ";";
&SENDER = "mi_correo@mi_dominio.com";
&CONTTYPE = "Content-type: text/html; charset=utf8";

/* enviamos correo */
&RET = SendMail(&MAIL_FLAGS, &MAIL_TO, &MAIL_CC, &MAIL_BCC, &MAIL_SUBJECT, &MAIL_TEXT, &MAIL_FILES, &MAIL_TITLES, &MAIL_FROM, &MAIL_SEP, &CONTTYPE, &REPLYTO, &SENDER);
If &RET <> 0 Then
   MessageBox(0, "", 0, 0, "Código de retorno de error de SendMail=" | &RET);

End-If;

/********************************************/

2. Añadiendo la imagen como documento adjunto y utilizando dentro del HTML de tu mensaje, en el tag de imágen, en el SOURCE el CID con el nombre de tu imagen. Este me ha servido cuando el cliente de correo es como el OUTLOOK.


/********************************************/

Local string &MAIL_CC, &MAIL_TO, &MAIL_BCC, &MAIL_SUBJECT, &MAIL_TITLES;
Local string &MAIL_TEXT, &MAIL_FILES, &MAIL_FROM, &REPLYTO, &SENDER, &MAIL_SEP;
Local string &CONTTYPE, &strSQL, &email, &App_name, &Vac_title;
Local number &MAIL_FLAGS, &RET;

&strHTML = "<b> Estimado socio: </b>";
&strHTML=  &strHTML | " Le mando estas imágenes: "  | Char(13) | " <mi_imagen> ";

&MAIL_FLAGS = 0;
&MAIL_TO = "destinatario1@empresa1.com; destinatario2@empresa2.com";
&MAIL_SUBJECT = "Asunto"; 
&MAIL_TEXT = "<html><body>" | &strHTML | "</body></html>"; 

&MAIL_FILES = "";
&MAIL_TITLES = "";
&ImgName = "FirmaCia.jpg";

&FileUrl = GetEnv("TMP") | "/" | &ImgName;

/* traigo la imagen desde el FTP al server donde esta el Application Server*/
&ok = GetAttachment(URL.MI_FTP, &ImgName, &FileUrl);
  
&MAIL_FILES = &MAIL_FILES | &FileUrl | ";";
&MAIL_TITLES = &MAIL_TITLES | &ImgName | ";";
&MAIL_TEXT = Substitute(&MAIL_TEXT, "<mi_imagen>", "<img SRC=cid:" | &ImgName | " >");

&MAIL_FROM = "mi_correo@mi_dominio.com";
&MAIL_SEP = ";";
&SENDER = "mi_correo@mi_dominio.com";
&CONTTYPE = "Content-type: text/html; charset=utf8";

&RET = SendMail(&MAIL_FLAGS, &MAIL_TO, &MAIL_CC, &MAIL_BCC, &MAIL_SUBJECT, &MAIL_TEXT, &MAIL_FILES, &MAIL_TITLES, &MAIL_FROM, &MAIL_SEP, &CONTTYPE, &REPLYTO, &SENDER);
If &RET <> 0 Then
    MessageBox(0, "", 0, 0, "Código de retorno de error de SendMail=" | &RET);
End-If;

/********************************************/

Espero les sea de utilidad.



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