martes, 25 de septiembre de 2012

Convertir de Números a Letras usando SQL (Oracle)

Para obtener por SQL la conversión de números a letras podemos usar lo siguiente:

SELECT TO_CHAR ( TO_DATE ( TO_CHAR ( 2012, '99999999999') , 'J'),  'JSP') EN_LETRAS FROM dual;
De lo cual obtenemos:

EN_LETRAS                                                                 
---------------------------------------------------------------------------
TWO THOUSAND TWELVE
1 row selected

Bien, podemos obtener desde el número 1 hasta 5,373,484 y es por la restricción de las fechas julianas (como fecha máxima tenemos 31-Dic-9999)

Explicando el por que y cómo:

Si vamos separando las operaciones que realiza observamos:

1. La primera conversión
TO_CHAR ( 2012, '99999999999') tan solo pasa el número a cadena
2. La segunda operación TO_DATE ( TO_CHAR ( 2012, '99999999999') , 'J') es donde convierte la cadena obtenida en fecha juliana.
3. La tercera parte, donde volvemos esta fecha obtenida en cadena nuevamente, utilizamos la máscara ‘JSP’ en donde J hace referencia a la fecha Juliana, y SP lo lleva a letras (Spell)

Y listo!! Tienes el número en letras.

Espero les sea de utilidad

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