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

miércoles, 22 de octubre de 2025

Guardar PDF a ubicación física

 Generar el archivo pdf y guardarlo en el servidor lo resolvi de la siguiente Manera:


Creas un reporte con el nombre "GuardarPdf" que generas el pdf:

1-Debes setear la propiedad Main Program a "True" .-
2-Call protocol "Internal".-
3-Debes crear una variable que reciba el nombre del Pdf con la extensión donde se va a guardar el pdf.-
Ejemplo:
De forma local para guardar el archivo pones la ruta donde se guardará:

&NombreArchivo = 'C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\GxEscuelaJavaEnvironment\Reportes\Nombre.pdf'

para que te funcione en Red deberias de compartir la carpeta Reportes donde esta instalado tu aplicación, como ejemplo usamos la ip del servidor "192.168.2.188" entonces quedaria de la sguiente manera:

&NombreArchivo = "\\192.168.2.188\Reportes\Nombre.pdf"

4- en la Rules Agregas las siguientes Líneas:

parm(in:&pNombreReporte);

output_file(&pNombreReporte, "pdf");

5- creas un Wp "WpPruebaGuardarPdf" que le llamaria al reporte, agregas el evento:

Event Enter
&NombreArchivo = "C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\GxEscuelaJavaEnvironment\Reportes\Nombre.pdf"

GuardarPdf.Call(&NombreArchivo)

///Con esto abris el reporte generado
link('../Reportes/Nombre.pdf')
Endevent

domingo, 1 de febrero de 2015

Instalacion de Genexus 9.0 en Windows 7, 64 Bits

 En mi caso, al usar Gx9 en Win7 me daba problemas al tener la KB en una carpeta cuyo nombre incluyera espacios, por lo que te recomiendo que evites los espacios en las carpetas donde esté la KB

.NET Framework 3.5.1 viene preinstalado por defecto en Windows 7, pero está parcialmente "habilitado". Lo que tenés que hacer es ir a la parte de Programas del Panel de Control, y luego a la sección de Windows Features: http://windows.microsoft.com/en-US/windows7/Turn-Windows-features-on-or-off

Allí expandí el contenedor de Microsoft .NET Framework 3.5.1 y tildá todas las casillas.

Descarga de http://www.microsoft.com/download/en/details.aspx?id=17851&WT.mc_id=MSCOM_EN_US_DLC_DETAILS_121LSUS007996 Microsoft .Net Framework  4.0

Descarga de http://www.microsoft.com/download/en/details.aspx?id=15468 vjredist Microsoft Visual J# 2.0

Ejecutar la instalación de Genexus 9 en modo administrador, es decir botón derecho arriba del instalador / ejecutar como Administrador

Instalar Protection Server 6.7

 

jueves, 28 de febrero de 2013

Funciones de Texto - Genexus

Archivos ASCII Delimitados

Los archivos ASCII Delimitados son archivos de texto (modificables con prácticamente cualquier editor de textos) comunmente utilizados para transferir información entre diferentes aplicaciones.

Este tipo de archivos puede ser creado con cualquier DBMS (Oracle, SQL Server, FoxPro, etc.) y presenta las siguientes características:

a.     Cada línea del archivo representa una fila (o registro)
b.     Los campos de cada línea están separados por algún delimitador
c.     Los campos alfanuméricos (Character o Varchar en GeneXus) pueden estar o no delimitados por comillas (“).
d.     Los campos numéricos no contienen comas separadoras de miles y, el separador de decimales es el punto.

El siguiente, es un ejemplo de un archivo delimitado generado a partir de una tabla con los campos CodCli, NomCli, CedCli, NacCli:

1,"Martín Flores",1335789,1960-01-10
2,"Josefina Fernández",3254469,1991-10-12
3,"Alberto Sarmiento",2546689,1987-11-17
4,"Ignacio Martínez",526866,1989-12-11
5,"Manuel González",1523458,1959-07-15
6,"Dalmiro Schmit",2743357,1961-12-09
7,"Juan Beltrán",455310,1950-10-12

Con GeneXus es posible leer este tipo de archivos. Para ello se proveen un conjunto de funciones que permiten abrir el archivo, leer cada registro, copiar el contenido de cada campo a variables o atributos de GeneXus y cerrar el archivo. Por ejemplo, para leer el archivo del ejemplo, el código sería semejante al siguiente:

&i = dfropen( "clients.txt", 80, “,”)
do while dfrnext( ) = 0
    &i = dfrgnum( &CliCod)
    &i = dfrgtxt( &CliNom )
    &i = dfrgnum( &CliCId )
    &i = dfrgdate( &CliFecNac, “ymd”, “-“ )
enddo
&i = dfrclose( )

Como se ve en el ejemplo, no existe un esquema de descripción del registro (orden de los campos) del archivo ASCII delimitado. El orden de los campos está dado por la secuencia en que se llaman a las funciones dbrgnum, dbrgtxt o dbrgdate. Si la secuencia fuera incorrecta, los resultados son impredecibles.

También es posible grabar registros. Esto se realiza en forma análoga a la lectura, mediante el uso de funciones. Por ejemplo, para grabar el archivo del ejemplo anterior, el código GeneXus sería el siguiente:


&i = dfwopen( "clients.txt", ",", '"')
for each
     defined by CliNom
&i = dfwpnum( CliCod)
&i = dfwptxt( CliNom )
&i = dfwpnum( CliCId )
&i = dfwpdate( &CliFecNac, “ymd”, “-“ )
&I = dfwnext()
      endfor
&i = dfwclose( )

Lectura de archivos ASCII delimitados

La siguiente es la descripción detallada de las funciones que permiten acceder y procesar archivos ASCII delimitados.

dfropen
Abre un archivo de texto para su procesamiento. Es la primera función que hay que llamar para comenzar a leer un archivo de texto.

Sintáxis:
dfropen( [, [,  [, ]]])

Parámetros:

puede ser un atributo, variable o constante de tipo char. Su valor será considerado como el nombre del archivo a procesar. Puede o no contener especificaciones de directorio. Si no las tiene, será buscado en el directorio corriente.

puede ser un atributo, variable o constante de tipo numérico, opcional, que indica el tamaño máximo, en cantidad de caracteres, del registro a leer.  Véase que los archivos ASCII delimitados tienen registros (líneas) de largo variable. Si se especifica, el valor debe corresponder a la cantidad máxima de caracteres que puede tener una línea. El valor por defecto es 1024.

puede ser un atributo, variable o constante de tipo character, opcional, que indica cual es el caracter delimitador entre campos. Si se quiere especificar el caracter de tabulación como separador, el valor de este parámetro debe ser el string “\t”.

puede ser un atributo, variable o constante de tipo character, opcional, que indica cual es el caracter delimitador de los campos strings. Sólo el primer carácter del valor del parámetro es considerado. Su valor, puede ser cualquier carácter que no aparezca en los textos. Su valor por defecto es el “ (comillas).

Retorno:
Esta función puede retornar alguno de los siguientes valores:

0       Operación satisfactoria. El archivo fue abierto.
-1       Secuencia incorrecta. Ocurre cuando se llama más de una vez a esta función sin haber llamado antes a la función dfrclose. Si está activado el trace, se verá el mensaje ADF0005 indicando este error.
-2   Error de apertura. Ocurre cuando el archivo identificado por no ha podido abrirse. La causa puede ser identificada claramente habilitando el trace y buscando el mensaje con código ADF0001. Lo más común es que el archivo no exista.
-8       Memoria insuficiente. Ocurre cuando no es posible reservar un buffer de bytes.  Si está activado el trace, se verá el mensaje ADF0007 indicando este error.
dfrnext
Lee el siguiente registro (línea) del archivo de texto delimitado.

Sintáxis:
dfrnext()

Parámetros:
No tiene

Retorno:
Esta función puede retornar alguno de los siguientes valores:

0       Operación satisfactoria. El registro fue leído.
-1       Secuencia incorrecta. Ocurre cuando se llama a esta función antes de llamar a la función dfropen o la llamada a dfropen retornó un valor diferente de cero (error).
-3   Error de lectura. Ocurre cuando se ha producido un error al leer una línea del archivo ASCII delimitado. La causa puede ser identificada claramente habilitando el trace y buscando el mensaje con código ADF0002.
-4   Fin de datos.
dfrgnum
Lee un campo de tipo numérico de la línea actual (leída por dfrnext).

Sintáxis:
dfrgnum( )

Parámetros:
puede ser un atributo o variable de tipo numérico. En él, se almacenará el valor leído.

Retorno:
Esta función puede retornar alguno de los siguientes valores:

0       Operación satisfactoria. El campo fue leído.
-1       Secuencia incorrecta. Ocurre cuando se llama a esta función antes de llamar a la función dfrnext o la última llamada a dfrnext retornó un valor diferente de cero (error). Si el trace está habilitado, se verá el mensaje ADF0004 o ADF0006.
-5       Formato incorrecto. El número en el campo no tiene una forma correcta. La causa más común es que el campo que se pretende leer sea de otro tipo (character, date, etc.). Si el trace está habilitado, se verá el mensaje ADF0008.
dfrgtxt
Lee un campo de tipo character de la línea actual (leída por dfrnext) .

Sintáxis:
dfrgtxt( [, ])

Parámetros:
puede ser un atributo o variable de tipo character o varchar. En él, se almacenará el valor leído.

puede ser un atributo, variable o constante de tipo numérico, opcional, que indica la cantidad máxima de caracteres a leer. Su valor, si se especifica, no debe exceder el tamaño definido para . En caso de omitirse, se asume el tamaño definido para el atributo o variable . Si éste parámetro excede el tamaño de los resultados son impredecibles.

Retorno:
Esta función puede retornar alguno de los siguientes valores:

0       Operación satisfactoria. El campo fue leído.
-1       Secuencia incorrecta. Ocurre cuando se llama a esta función antes de llamar a la función dfrnext o la última llamada a dfrnext retornó un valor diferente de cero (error). Si el trace está habilitado, se verá el mensaje ADF0004 o ADF0006.
-5       Formato incorrecto. El string en el campo no tiene una forma correcta. La causa más común es que el campo que se pretende leer sea de otro tipo (number, date, etc.). Si el trace está habilitado, se verá el mensaje ADF0009.
-6       Overflow. Este es un warning que indica que el largo del string en el registro es mayor al máximo especificado (o asumido) en el parámetro . El valor leído es truncado a caracteres.
dfrgdate
Lee un campo de tipo date de la línea actual (leída por dfrnext). El valor de fecha leído no es ajustado de acuerto con la preference Year Limit.

Sintáxis:
dfrgdate( [, [, ]])

Parámetros:
puede ser un atributo o variable de tipo date. En él, se almacenará el valor leído.

puede ser un atributo, variable o constante de tipo character, opcional, con, al menos, tres caracteres. Indica el formato que tiene la fecha en el campo a leer. Cada carácter del campo puede valer “y”, “m” o “d”. Su combinación genera el formato. Por ejemplo si el string contiene los caracteres “ymd” la fecha del campo a leer se asume (y valida) en formato Año, Mes, Día. Si, por el contrario el string contiene los caracteres “dmy”, la fecha del campo a leer se asume en formato Día, Mes, Año. Es importate notar que los caracteres deben estar en minúscula. El valor por defecto es “ymd”.

puede ser un atributo, variable o constante de tipo character, cuyo valor debe tener, al menos, un caracter. Indica cuál es el separador de los elementos de una fecha. Los valores comunmente utilizados son “/”, “-“ y “.”. El valor por defecto es “-”.

Retorno:
Esta función puede retornar alguno de los siguientes valores:

0       Operación satisfactoria. El campo fue leído.
-1       Secuencia incorrecta. Ocurre cuando se llama a esta función antes de llamar a la función dfrnext o la última llamada a dfrnext retornó un valor diferente de cero (error). Si el trace está habilitado, se verá el mensaje ADF0004 o ADF0006.
-5       Formato incorrecto. El string en el campo no tiene una forma correcta. La causa más común es que el campo que se pretende leer sea de otro tipo (number, date, etc.).
-7       Fecha no válida. El valor encontrado en el campo no corresponde a una fecha válida. Normalmente ocurre porque el formato () o el separador () no corresponde a los existentes en el archivo. Si el trace está habilitado, se verá el mensaje ADF0010.
-10El parámetro tiene un formato incorrecto. Si el trace está habilitado, se verá el mensaje ADF0012.
dfrclose
Cierra el archivo abierto por dfropen. Esta función debe ser llamada después de una llamada satisfactoria (sin error) a dfropen.

Sintáxis:
dfrclose()

Parámetros:
No tiene.

Retorno:
Esta función puede retornar alguno de los siguientes valores:

0       Operación satisfactoria. El archivo fue cerrado.
-1       Secuencia incorrecta. Ocurre cuando se llama a esta función antes de llamar a la función dfropen o la última llamada a dfropen retornó un valor diferente de cero (error).

Grabación de archivos ASCII delimitados

La siguiente es la descripción detallada de las funciones que permiten grabar archivos ASCII delimitados.

dfwopen
Abre un archivo de texto para su procesamiento. Es la primera función que hay que llamar para comenzar a leer un archivo de texto.

Sintáxis:
dfwopen( [,  [, ]]])

Parámetros:
puede ser un atributo, variable o constante de tipo char. Su valor será considerado como el nombre del archivo a procesar. Puede o no contener especificaciones de directorio. Si no las tiene, será creado en el directorio corriente.

puede ser un atributo, variable o constante de tipo character, opcional, que indica cual es el caracter delimitador entre campos. Si se quiere especificar el caracter de tabulación como separador, el valor de este parámetro debe ser el string “\t”.

puede ser un atributo, variable o constante de tipo character, opcional, que indica cual es el caracter delimitador de los campos strings. Sólo el primer carácter del valor del parámetro es considerado. Su valor, puede ser cualquier carácter que no aparezca en los textos. Su valor por defecto es el “ (comillas).

Retorno:
Esta función puede retornar alguno de los siguientes valores:

0       Operación satisfactoria. El archivo fue abierto.
-1       Secuencia incorrecta. Ocurre cuando se llama más de una vez a esta función sin haber llamado antes a la función dfwclose. Si está activado el trace, se verá el mensaje ADF0005 indicando este error.
-2   Error de apertura. Ocurre cuando el archivo identificado por no ha podido abrirse. La causa puede ser identificada claramente habilitando el trace y buscando el mensaje con código ADF0001. Lo más común es que el archivo no exista.
-8       Memoria insuficiente. Ocurre cuando no es posible reservar un buffer de bytes.  Si está activado el trace, se verá el mensaje ADF0007 indicando este error.
dfwnext
Graba el registro con los valores especificados por las llamadas anteriores a dfwptxt, dfwpnum, etc. en el archivo de texto delimitado.

Sintáxis:
dfwnext()

Parámetros:
No tiene

Retorno:
Esta función puede retornar alguno de los siguientes valores:

0       Operación satisfactoria. El registro fue leído.
-1       Secuencia incorrecta. Ocurre cuando se llama a esta función antes de llamar a la función dfwopen o la llamada a dfwopen retornó un valor diferente de cero (error).
-9   Error de grabación. Ocurre cuando se ha producido un error al grabar la línea en el archivo ASCII delimitado. La causa puede ser identificada claramente habilitando el trace y buscando el mensaje con código ADF0003.
dfwpnum
Graba un campo de tipo numérico en el registro actual del archivo ASCII delimitado.

Sintáxis:
dfwpnum( , )

Parámetros:
puede ser un atributo, variable o constante de tipo numérico. Su valor será el grabado en el campo correspondiente..

puede ser un atributo, variable o constante de tipo numérico, opcional, que indica la cantidad de decimales a especificar en el campo.

Retorno:
Esta función puede retornar alguno de los siguientes valores:

0       Operación satisfactoria. El campo fue grabado.
-1       Secuencia incorrecta. Ocurre cuando se llama a esta función antes de llamar a la función dfwopen o la última llamada a dfwopen retornó un valor diferente de cero (error). Si el trace está habilitado, se verá el mensaje ADF0004.
dfwptxt
Graba un campo de tipo character en el registro actual del archivo ASCII delimitado.

Sintáxis:
dfwptxt( [, ])

Parámetros:
puede ser un atributo, variable o constante de tipo character. Su valor será el grabado en el campo correspondiente..

puede ser un atributo, variable o constante de tipo numérico, opcional, que indica la cantidad máxima de caracteres a grabar. En caso de omitirse, se asume el tamaño definido para el parámetro .

Retorno:
Esta función puede retornar alguno de los siguientes valores:

0       Operación satisfactoria. El campo fue grabado.
-1       Secuencia incorrecta. Ocurre cuando se llama a esta función antes de llamar a la función dfwopen o la última llamada a dfwopen retornó un valor diferente de cero (error). Si el trace está habilitado, se verá el mensaje ADF0004.
dfwpdate
Graba un campo de tipo date en el registro actual del archivo ASCII delimitado. Si tiene el valor nulo de GeneXus, se grabará la fecha "00/00/0000".

Sintáxis:
dfwpdate( [, [, ]])

Parámetros:
puede ser un atributo o variable de tipo date. En él, se almacenará el valor leído. No puede ser una constante.

puede ser un atributo, variable o constante de tipo character, opcional, con, al menos, tres caracteres. Indica el formato que tiene la fecha en el campo a grabar. Cada carácter del campo puede valer “y”, “m” o “d”. Su combinación genera el formato. Por ejemplo si el string contiene los caracteres “ymd” la fecha del campo a grabar se asume en formato Año, Mes, Día. Si, por el contrario el string contiene los caracteres “dmy”, la fecha del campo a leer se asume en formato Día, Mes, Año. Es importate notar que los caracteres deben estar en minúscula. El valor por defecto es “ymd”.

es un parámetro de tipo caracteres opcional con, al menos, un caracter. Indica cuál es el separador de los elementos de una fecha. Los valores comunmente utilizados son “/”, “-“ y “.”. El valor por defecto es “-”.

Retorno:
Esta función puede retornar alguno de los siguientes valores:

0       Operación satisfactoria. El campo fue grabado.
-1       Secuencia incorrecta. Ocurre cuando se llama a esta función antes de llamar a la función dfwopen o la última llamada a dfwopen retornó un valor diferente de cero (error). Si el trace está habilitado, se verá el mensaje ADF0004.
-5       Formato incorrecto. El string en el campo no tiene una forma correcta. La causa más común es que el campo que se pretende leer sea de otro tipo (number, date, etc.).
-10El parámetro tiene un formato incorrecto. Si el trace está habilitado, se verá el mensaje ADF0012.
dfwclose
Cierra el archivo abierto por dfwopen. Esta función debe ser llamada después de una llamada satisfactoria (sin error) a dfwopen.

Sintáxis:
dfwclose()

Parámetros:
No tiene.

Retorno:
Esta función puede retornar alguno de los siguientes valores:

0       Operación satisfactoria. El archivo fue cerrado.
-1       Secuencia incorrecta. Ocurre cuando se llama a esta función antes de llamar a la función dfwopen o la última llamada a dfwopen retornó un valor diferente de cero (error).

Consideraciones sobre los archivos ASCII delimitados

Sólo puede estar abierto un archivo ASCII delimitado en un momento específico. La función dfropen retornará un error si se la llama más de una vez sin haber llamado previamente a dfrclose.

Es posible ignorar los campos del final de un registro al llamar a dfrnext cuando queden campos por leer. No es posible ‘saltearse’ campos. Si se quiere leer el campo número 5 es necesario leer los 4 anteriores.

Es posible leer registros con diferentes formatos como en el siguiente ejemplo:

&i = dfropen( "invoices.txt", 80, “,”)
do while dfrnext( ) = 0
    &i = dfrgtxt( &RecType)
    if &RecType = “H”
       &i = dfrgnum( &InvNum )
       &i = dfrgdate( &InvDat, “ymd”, “/“)
       ...
    else
       &i = dfrgnum( &PrdNum )
       &i = dfrgnum( &InvQty)
       ...
    endif
enddo
&i = dfrclose( )

viernes, 14 de septiembre de 2012

Calculo de Fecha Probable de Parto (FPP) mediante Regla de Naegele

La Regla de Naegele es un método estandarizado de calcular la fecha prevista de parto para una gestación normal. Se llamó así en honor de Franz Karl Naegele (1778-1851), el obstetra alemán que la desarrolló. Fuente: http://es.wikipedia.org/wiki/Naegele

//FPP = FUM + 1 año + 7 días - 3 meses

&NeageleSumaAnos = AddYr(&FUM, 1)  //Sumamos 1 año
&NeageleSumaDias = &NeageleSumaAnos + 7  //Sumamos 7 dias
&NeageleRestaMeses = AddMth(&NeageleSumaDias, -3)  //Restamos 3 meses
&FPP = &NeageleRestaMeses  //Resultado



FUM = Fecha de Ultima Menstruación
FPP = Fecha Probable de Parto

Todas estas variables son de tipo Date:
&FUM
&FPP
&NeageleSumaAnos
&NeageleSumaDias
&NeageleRestaMeses

viernes, 24 de agosto de 2012

Implementación del User Control GXScheduler para Agenda

La petición: Poder revisar las citas asignadas en un calendario

La Solución: Implementación del UC GXScheduler
  •  Creamos un WebPannel y desde el Toolbox, hacia el Web Form halamos el control

  

  • Conjuntamente con algunos otros controles se creará en el Folder View
  • En la siguiente dirección se obtiene una ayuda total para las propiedades que se puede tener, para modificarlas hay que dar clic en el user control insertado en el WebPannel, aca la direccion: http://wiki.gxtechnical.com/commwiki/servlet/hwiki?Scheduler+User+Control,
  • IMPORTANTISIMO: Generar el procedimiento SchedulerRequestHandler que es main, si esto me salio un error al momento de la carga.
  • Para este ejemplo utilice un Data Provider, en donde se saca variables de una websesion; quedo así y funcionó muy bien.
 SchedulerEvents
{
    &Usuario = &Sesion.Get('Usuario')
    &Sucursal = &Sesion.Get('Sucursal')
    Items
    {
        event
        where AttUsuario = &Usuario
        where AttSucursal = &Sucursal
        where AttFecha >= &dateFrom
        where AttFecha <= &dateTo
        {
            Id = AttHora.ToString()
            Name = AttNombre
            Notes = "Paciente: " + trim(AttNombre) + " Hora: " + trim(AttHora.ToString())       
            StartTime = ymDHMStoT(AttFecha.Year(), AttFecha.Month(), AttFecha.Day(), AttHora.Hour(), AttHora.Minute(), AttHora.Second())
            EndTime = ymDHMStoT(AttFecha.Year(), AttFecha.Month(), AttFecha.Day(), AttHora.Hour(), AttHora.Minute() + 10, AttHora.Second())
        }
    }
}

viernes, 26 de noviembre de 2010

Respaldo de Datos mysql

Los datos se almacenan en /var/lib/mysql, dentro de este directorio se encuentra las bases de datos que tengamos, vistas en carpetas, para respaldar:
1. Respaldo en caliente comprimido
1.1 Creamos una carpeta en donde se crearan los respaldos
# mkdir /home/respaldos
1.2 Ejecutamos
# tar -zcpf /home/respaldos/mysql.tar.gz /var/lib/mysql
Aqui tendremos un respaldo de todas las bases de datos
Para poder revisar ejecutamos lo siguiente para descomprimir el archivo mysql.tar.gz
# tar -zxvf mysql.tar.gz

2. Respaldo en caliente sql con mysqldump
2.1 ejecutamos la siguiente sentencia
# mysqldump -u root -pclave base_datos>/home/respaldos/nombre_respaldo.sql

3. Podemos lo anterior hacer mediante un comando .sh
3.1 Creamos bajo
# cd /etc/init.d
# nano respaldomysql.sh
3.2 Ingresamos las dos lineas en el archivo y guardamos
tar -zcpf /home/respaldos/mysql.tar.gz /var/lib/mysql
mysqldump -u root -pclave base_datos>/home/respaldos/nombre_respaldo.sql
3.3 Cambiamos los permisos
# chmod +x respaldomysql.sh
3.4 Lo ejecutamos con
# /etc/init.d/respaldomysql.sh

4. Ahora como la osciosidad de cada dia es mas grande que la del Lunes, podemos dejarlo como una tarea para se ejecute automaticamente utilizando cron
4.1 Ejecutamos
# crontab -e
4.2 Ponemos en el archivo
01 01 * * * /etc/init.d/respaldomysql.sh >/dev/null 2>/dev/null
4.3 Guardamos y esta listo

Los parametros de cron son:
Minutos (0 - 59)
Horas (0 - 23)
Dias del Mes (1 - 31)
Mes (1 - 12)
Dia de la semana (0 - 6; 0=Domingo)
path al script o programa que deseemos ejecutar
En el punto 4.2 por ejemplo se realizara el respaldo a la 01:01 de la mañana de todos los dias, semanas y meses

jueves, 11 de noviembre de 2010

Creacion del .war sin deployment wizard


Ademas del Deployment Wizard que nos ofrece Genexus, existe otras maneras para subir la aplicación a nuestro servidor, esta es una mas y consiste en crear el .war desde la carpeta webapps donde este la aplicación.
1. Aplicar el modelo en Genexus y con F5 revisar que todo este corriendo bien
2. Vamos a la carpeta del tomcat donde este alojada la aplicacion en el servidor local e ingresamos a webapps.
3. Clic derecho y la comprimimos para tenerla como .zip

4. Luego de que se realize la compresion tendremos un archivo similar a este

5. Renombramos la aplicación, el comando es rename, ejm
rename aplicacion.zip aplicacion.war
6. Aquí tengo un inconveniente y no me funciona si es que despliego este .war y es que en la raiz del .war me queda la carpeta y dentro de esta carpeta esta META-INF, static y WEB-INF, lo que hago es cortar los archivos de la carpeta y pegarlos en la raíz del .war.
7. Desplegamos el .war con el administrador de tomcat.
8. La aplicación esta lista

Tomar en consideración para los servidores en ambiente linux, el archivo PDFReport debe ser modificado cuando se tiene reportes pdf con tipos de letra únicos en windows como microsoft sans serif (aquí como ponerlos), este archivo se encuentra en /tomcat/webapps/aplicacion/WEB-INF.

También el archivo web.xml para modificar el tiempo de duración de sesión, esta en la misma ubicación que el anterior.


miércoles, 13 de octubre de 2010

Error 500 por fuente que no existe en linux

El mensaje:
javax.servlet.ServletException: java.lang.StringIndexOutOfBoundsException: String index out of range: -1  
at java.lang.String.charAt(String.java:687)  
at com.genexus.reports.PDFReportItext.GxDrawText(Unknown Source)  
at arlabsol_impl.privateExecute(arlabsol_impl.java:311)  
at arlabsol_impl.webExecute(arlabsol_impl.java:37)  
at com.genexus.webpanels.GXWebObjectBase.doExecute(Unknown Source)  
at arlabsol.doExecute(arlabsol.java:20)  
at com.genexus.webpanels.GXWebObjectStub.callExecute(Unknown Source)  
at com.genexus.webpanels.GXWebObjectStub.doGet(Unknown Source)  
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)  
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)  
at org.apache.catalina.servlets.InvokerServlet.serveRequest(InvokerServlet.java:402)
at org.apache.catalina.servlets.InvokerServlet.doGet(InvokerServlet.java:134)  
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)  
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)  
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)  
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)  
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)  
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)  
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)  
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)  
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)  
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)  
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)  
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)  
at java.lang.Thread.run(Thread.java:619)   
com.genexus.webpanels.GXWebObjectStub.callExecute(Unknown Source)  com.genexus.webpanels.GXWebObjectStub.doGet(Unknown Source)  javax.servlet.http.HttpServlet.service(HttpServlet.java:617)  javax.servlet.http.HttpServlet.service(HttpServlet.java:717)  org.apache.catalina.servlets.InvokerServlet.serveRequest(InvokerServlet.java:402)  org.apache.catalina.servlets.InvokerServlet.doGet(InvokerServlet.java:134)  javax.servlet.http.HttpServlet.service(HttpServlet.java:617)  javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
La Solución:
El problema fue por cuanto el reporte tiene el tipo de letra Microsoft Sans Serif, el  mismo que no es soportado por Linux, se solucionó el inconveniente, copiando la fuente desde windows (C:\windows\fonts\micross.ttf) hacia linux (/usr/share/fonts/windowsfonts/micross.ttf), luego de esto ahi que configurar el archivo PDFReport.ini que se encuentra bajo la carpeta de tomcat utilizada (.../webapps/nombre_sistema/WEB-INF/PDFReport.ini)

martes, 14 de septiembre de 2010

Desaparecen ventanas minimizadas

Ufff hoy tuve un inconveniente en una maquina ubuntu, cuando aplastaba el boton de minimizar, esta desaparecia y al mandar a correr nuevamente el programa, salia que ya se estaba ejecutando, la solucion:
  • Botón derecho del ratón sobre el panel.
  • "Añadir al panel".
  • Añades "Lista de ventanas".

viernes, 27 de agosto de 2010

Custom error pages in tomcat

No estas feliz con el error por defecto que sale en Tomcat ? Puedes definir tu propia pagina de error en el archivo web.xml. En el ejemplo que se ve a continuación, se define 2 paginas web: server_error.html y file_not_found.html que serán mostradas cuando el servidor encuentre el error 500 o el 400 respectivamente.

viernes, 30 de julio de 2010

Clasificacion Internacional Uniforme de Ocupaciones

Esta informacion la he buscado mucho y parece ser que es la que mas se apega a mi caso en donde necesito saber la ocupacion de los Personajes que actuan en las tablas, necesitando asi una organizacion de los empleos en funcion a las tareas.

http://www.ilo.org/public/spanish/bureau/stat/isco/index.htm

jueves, 29 de julio de 2010

Creacion de un Data View en EV1 hacia SQL Server 2000

Ambiente: Ev1, web, java, mysql

  1. Vamos para Preferentes y creamos un Data Store nuevo para SQL Server, en las propiedades ponemos:
    1. Access technology to set = JDBC
    2. JDBC driver = jTDS Driver
    3. Database name = nombre_base_datos
    4. Server name = nombre_servidor o direccion_ip
    5. Si escogemos Use trusted conection = no, ingresamos el usuario y contraseña.
  2. Creamos la transacción que será la relación para el Data View
  3. Creamos el Data View
    1. En Composition definimos en la columna Internal Name los atributos de la transacción que creamos y en External Name los nombres de los campos de la tabla de origen.
    2. En Platforms agregamos SQL Server, en las propiedades en Name = nombre_tabla_origen
    3. En las propiedades del Dataview asociamos la tabla y escogemos el data store que creamos en el punto 1.

Cabe destacar que si se hace por Database Reverse Engineering es mucho mejor.

lunes, 26 de julio de 2010

Un ejemplo para Crear Data View

Fuente

GX 8.0 y SQL Server 7.0
Tene en cuenta que usamos SQL Server 7.0
Pasos a seguir para la creación de un Data View en GeneXus.
A continuación se describen pasos a seguir para lograr crear Data View en GeneXus.

En DISEÑO
1. Editar el Modelo y crear un Data Store (solamente va a permitir colocar el nombre del Data Store)
2. Crear la Transaction que luego será relacionada al Data View.
2.1. Es conveniente, pero no necesario, que los nombres de los Atributos de la Transaction sean propios de GeneXus.
2.2. Es necesario que a la Transaction se le definan las mismas claves que tiene la tabla origen.
3. Desde la definición de objetos crear el objeto Data View.
3.1. Nombrar el nuevo objeto con un nombre significativo.
3.2. En "Composition" agregar en la columna "Internal Name" los atributos de la Transacción creada en el punto anterior. En la columna "External Name"
colocar los mismos nombres de campo de la tabla origen.
3.3. En "Platform" buscar y agregar "SQL Server" y en la propiedad "Name"
colocar el nombre de la tabla origen.
3.4. En "Indices" agregar un índice con un nombre representativo. No se puede repetir el mismo nombre de índice para otros Data View.
3.4.1. En "Composition" colocar los atributos de la transacción que serán claves.
3.4.2. En "Platform" buscar y agregar "SQL Server" y en la propiedad "Name"
colocar el nombre del índice de la tabla origen.
4. Editar propiedades del Data View y en "Associated table" buscar y colocar el nombre de la Transacción creada (punto 2) y en "Data Store" buscar y colocar el Data Store creado (punto 1).

En PROTOTIPO
5. Al reorganizar la transacción debe decir que la misma está asociada al Data View creado en el punto 2. En caso contrario regresar a Diseño y verificar los pasos anteriores.
6. Editar el Modelo y buscar el Data Store creado en el diseño.
6.1. Colocar SQL Server. Editar las propiedades del Data Store, en "Access technology to set" seleccionar alguna de las opciones establecidas (iSeries Native / JDBC / ODBC), en "Database name" colocar el nombre de la base de datos origen y en "Server name" el nombre del servidor origen.
6.2. Si se decicide en "Use trusted connection" seleccuinar No entonces en "User id" colocar el nombre de usuario y en "User password" el password correspondiente.
6.3. Por último en "SQL server versión" seleccionar 7.0
7. Ir a "Build" y seleccionar "Create Database".
7.1. Antes de reorganizar verificar que la Transacción este asociada al Data View.

El Data View Generator lo he usado y me funciona.
Como soy un usuario principiante de GX, prefiero crear los Data View manualmente para tener un mayor control.

Nelson H. Castillo
Analista - Integrador de Sistemas

viernes, 14 de mayo de 2010

Instalacion de la libreria gxui

gxui Library Installation


Requirements:

  • ExtJS Library 2.1 or higher (Extjs 3.x is not supported yet)
  • GeneXus X Evolution 1

Steps:

  1. Download ExtJS 2.3 (older 2.x version will also work)
  2. Create a folder named Shared under %GX_PROGRAM_DIR%\UserControls\
  3. Extract ExtJS 2.1 in %GX_PROGRAM_DIR%\UserControls\Shared\. Please notice that the name of the folder inside the zip file is ext-2.1. After extracting the files, rename it to ext. To ensure that you correctly extracted the files, check that you have the following folder contents:
    • %GX_PROGRAM_DIR%\UserControls\Shared\ext\ext-all.js
    • %GX_PROGRAM_DIR%\UserControls\Shared\ext\adapter
    • %GX_PROGRAM_DIR%\UserControls\Shared\ext\resources
    • and some other files and folders...
  4. Install it directly from the Start Page or download gxui Library from here and extract it to %GX_PROGRAM_DIR%\UserControls\. To ensure that you correctly extracted the files, check that you have the following folder contents.
    %GX_PROGRAM_DIR%\UserControls\gxui\Grid
    %GX_PROGRAM_DIR%\UserControls\gxui\Layout
    and some other files and folders...
  5. Execute %GX_PROGRAM_DIR%\genexus.exe /install
  6. Execute %GX_PROGRAM_DIR%\genexus.exe as usual.

FAQ:

  • If you get the following error when starting GeneXus, please be sure that you followed from Step 1 to Step 3 of the above mentioned installation steps.

Image:gxuiInstallationError

  • Error: Invalid Render when dropping a control (eg: gxui.TabPanel) to the form.
    GeneXus X Users
    Exit GeneXus.
    Please replace the existing UserControlRenders.dll located in %GX_PROGRAM_DIR%\UserControls\gxui\ by the one included in %GX_PROGRAM_DIR%\UserControls\gxui\UserControlRendersGXX.zip.
    Start GX as usual.

    GeneXus X Evolution 1 Users
    The default dll included in gxui works for GX X Evolution 1.

There are some minor known issues you should check before starting to use the controls.

Fuente

martes, 26 de enero de 2010

Instalar Evolution

  1. Instalar Windows Installer 3.1 (si esta desactualizado)
  2. Instalar Microsoft .NET Framework 3.5 SP1
  3. Microsoft SQL Server 2005 Express Edition (http://msdn.microsoft.com/es-ec/library/bb972190.aspx#XSLTsection123121120120)
  4. Instalar Java
  5. Instalar Tomcat
  6. Instalar MySQL (MySQL)
  7. Genexus X Evolution 1 Beta 2

Instalacion de Genexus 9.0

  1. Instalar Dotnetfx
  2. Instalar vjredist
  3. Genexus 9.0
  4. Instalar Upgrades
  5. Visual FoxPro 8.0
  6. Instalar Java
  7. Instalar Tomcat
  8. Instalar SQL Server 2000
  9. Instalar MSDE
  10. Instalar SP SQL
  11. Instalar SP MSDE
  12. Poner a SQL Server autenticacion Mixta y la contraseña a sa
  13. Crear Usuario para el sistema local

jueves, 17 de diciembre de 2009

SMTP para gmail

Gracias a Leandro Minatel

&smtpsession.Host = 'smtp.gmail.com'
&smtpsession.Port = 465
&smtpsession.UserName = 'torrilux@gmail.com'
&smtpsession.Password = 'xxxxxxxxx'
&smtpsession.Authentication = 1
&smtpsession.Secure = 1
&message.Subject = 'Prueba '
&message.From.Address = 'torrilux@gmail.com'
&message.From.Name = 'Jose Torres'
&message.To.New( 'LeandroG' , 'leandrominatel@gmail.com' )
&message.CC.New( 'LeandroH' , 'leandrominatel@hotmail.com' )
&smtpsession.Login( )
&smtpsession.Send( &message )
msg( &smtpsession.ErrDescription )

miércoles, 2 de septiembre de 2009

jueves, 20 de agosto de 2009

Instalacion de Aplicacion para Java - MySQL - Genexus X

Instalación de la aplicación

1. Crear un nuevo Environment en Genexus



2. Presionamos F5 y nos mostrara la siguiente pantalla, presionamos en Edit conection




3. Ingresamos el IP del servidor, el usuario y contraseña que creamos al final de el capitulo MySQL, el nombre de la Base de Datos y damos clic en Create Database.



4. Damos clic en el mensaje y Ok para que nos guarde los cambios




5. Creamos las Tablas de la Base de Datos, especificar, generar y compilar todos los objetos.
6. Correr la aplicación localmente y revisar que me permita ingresar datos en la base del servidor
7. Una vez que la aplicación esta funcionando ir al Servlet Directory (en la carpeta Webapps del tomcat) y comprimir todo el contenido con extensión .zip (clic derecho, enviar a, Carpeta comprimida (en zip))
8. Cambiar la extensión a .war y colocar en el servidor linux (con la opción desplegar del tomcat o copiándolo manualmente a la carpeta webapps del servidor)

Como se cambia una extensión en Windows???

Abrimos la consola DOS, ingresamos a la carpeta en donde este el archivo (comando cd)

rename Archivo.old Archivo.new

Variable MySQL para case sensitive de tablas

http://dev.mysql.com/doc/refman/5.0/es/name-case-sensitivity.html

¿Como modificar el valor de la variable lower_case_table_names?


Los siguientes pasos se deben realizar con permisos suficientes, en mi caso fue directamente con root.

  1. Como la variable lower_case_table_names no es dinámica, no puede modificarse mientras MySQL esta funcionando por que debemos parar el servicio mysqld
    • $root>/sbin/service mysqld stop
  2. Después vamos al archivo my.cnf que en Mandriva 2008.1 está en /etc
    • $root>vi /etc/my.cnf
  3. En este archivo vamos a la sección [mysqld] y agregamos
    • lower_case_table_names = 1
  4. Guardamos el archivo y reiniciamos MySQL:
    • :wq
    • /sbin/service mysqld start
Con los pasos anteriores bastó para mí, si tienen alguna duda, espero poder ayudarlos.

Explicaciòn:

El modo en que se almacenan los nombres de tablas y bases de datos en disco y son usados en MySQL depende de la definición de la variable de sistema lower_case_table_names, la cual se puede asignar cuando se arranca mysqld. lower_case_table_names puede tomar uno de los valores siguientes:

Valor Significado
0 Los nombres de tablas y bases de datos se almacenan en disco usando los tipos de caracteres usados en en las sentencias CREATE TABLE o CREATE DATABASE. Las comparaciones de nombres son sensibles al tipo. Este es el valor en sistemas Unix. Si se fuerza este valor 0 con --lower-case-table-names=0 en un sistema de ficheros no sensible al tipo y se accede a nombres de tablas MyISAM usando diferentes tipos de caracteres, se puede producir corrupción de índices.
1 Los bombres de las tablas se almacenan en disco usando minúsculas y las comparaciones de nombres no son sensibles al tipo. MySQL convierte todos los nombres de tablas a minúsculas al almacenarlos y leerlos. Este comportamiento también se aplica a nombres de bases de datos desde MySQL 4.0.2, y a alias de tablas a partir de 4.1.1. Este es el valor por defecto en sistemas Windows y Mac OS X.
2 Los nombres de tablas y bases de datos se almacenan en disco usando el tipo de letra especificado en las sentencias CREATE TABLE o CREATE DATABASE, pero MySQL los convierte a minúscula al leerlos. Las comparaciones de nombres no son sensibles al tipo. Nota: esto funciona sólo en sistemas de ficheros que no sean sensibles al tipo. Los nombres de tablas InnoDB se almacenan en minúscylas, igual que si lower_case_table_names=1. Asignar lower_case_table_names a 2 se puede hacer desde MySQL 4.0.18.

Si sólo se está usando MySQL para una plataforma, generalmente no será necerasio modificar la variable lower_case_table_names variable. Sin embargo, se pueden presentar dificultades si se quieren transferir tablas entre plataformas que tengan sistemas de ficheros con distintas sensibilidades al tipo. Por ejemplo, en Unix, se pueden tener dos tablas diferentes llamadas my_table y MY_TABLE, pero en Windows estos nombres se consideran el mismo. Para impedir problemas de transferencia de datos debidos al tipo de letras usados en nombres de bases de datos o tablas, hay dos opciones:

  • Usar lower_case_table_names=1 en todos los sistemas. La desventaja principal con esta opción es que cuando se usa SHOW TABLES o SHOW DATABASES, no se ven los nombres en el tipo de letras original.
  • Usar lower_case_table_names=0 en Unix y lower_case_table_names=2 en Windows. Esto preserva el tipo de letras en nombres de bases de datos y tablas. La desventaja es que se dene asegurar que las consultas siempre se refieren a los nombres de bases de datos y tablas usando los tipos de caracteres correctos en Windows. Si se transfieren las consultas a Unix, donde el tipo de los caracteres es importante, no funcionarán si el tipo de letra es incorrecto.

Nota: antes de asignar 1 a lower_case_table_names en Unix, se deben convertir los viejos nombres de bases de datos y tablas a minúscula antes de reiniciar mysqld.


En Windows, se supone que hay un fichero llamado my.ini en el directorio c:\Windows, c:\WinNT o como se llame. Este es el fichero de configuración principal, aunque tambien puedes usar un my.cnf situado en c:\. MySQL primero busca el php.ini y luego el my.cnf, si encuentra los dos, los valores que hallas puesto en my.cnf sobreescriben los del php.ini. Curiosamente ahora no se en que casos resulta práctico usar los dos... De todas formas, lo mejor es usar solo uno de ellos.

En linux y similares, normalmente el fichero de configuración principal esta en /etc/my.cnf. Y si no me equivoco... también busca un posible my.cnf en el directorio de datos de MySQL. Y también busca ~/.my.cnf, el cual define opciones especificas del usuario, lo cual no esta nada mal. Como en Windows, los valores de los distintos ficheros de configuración sobreescriben los valores definidos anteriormente.

Creo que en la documentación de MySQl dice algo sobre el tema.... Si, algo dice:

http://www.mysql.com/doc/en/Name_case_sensitivity.html

Al parecer si inicias mysql con la opción -O lower_case_table_names=1 te convierte todas las mayusculas a minusculas. Es decir, si añades lo siguiente en tu my.cnf deberia funcionar:

[mysqld]
set-variable = lower_case_table_names=1

Aunque al parecer esto es solo para Linux y similares, en Windows y según la documentación esto es así por defecto. Aunque por probarlo no pasa nada...