miércoles, 4 de enero de 2017

Colorear los registros de una datawindow

Para colorear los registros de una datawindow alternadamente (por ejemplo, pares con un color, impares con otro) modificamos la clausula de expression del background en el detalle de la datawindow.
Lo que modificaremos será el color del fondo de cada detalle. Para esto seleccionamos el cuadro resaltado de la imagen para modificar la clausula.

Al principio el contenido del recuadro estará vacío, lo que significa que el fondo de cada detalle estará coloreado del color seleccionado (generalmente blanco). El código que debes introducir en el recuadro es un número que represente el color.
En powerbuilder podemos utilizar la función RGB(red int, green int, blue int) para producir este código. Generalmente queremos asignar el color dependiendo de alguna condición. En este primer ejemplo, asignaremos el color alternadamente. Asignaremos un color para cuando la división del número de renglón entre dos sea exacta, y otro color para cuando no lo sea (pares e impares).
if ( mod(getrow(),2) = 0 , rgb(255,255,255), rgb(240,240,240) )

Podemos utilizar el mismo método para cualquier condición, por ejemplo, para asignar el color basados en el valor de una celda, o el valor de una operación.
if ( num_emp > 0 , rgb(255,0,0), rgb(255,255,255) )

Nota: Si los campos de cada detalle aparecen con un fondo diferente, debes seleccionar todos los campos y asignarles el color 'transparent', de esta manera serán transparentes, mostrandose al fondo sólo el color que queremos.

Agregar un Where a una datawindow

Para agregar una clausula where al script select de una datawindow, hacemos lo siguiente:

string ls_select, ls_where
long ll_ret
// Obtenemos el código select
ls_select = dw_emp.GetSqlSelect()
// Escribimos el where
ls_where = ' where emp > 1500 '
// Modificamos el sql select
ls_select = ls_select + ls_where
// Modificamos el sql de la datawindow
ll_ret = dw_emp.SetSQLSelect(ls_select)
La función SetSqlSelect() regresa 1 si todo salió bien, o -1 en su defecto.

Ver el código select de una datawindow

Para conocer el query Select que tiene una datawindow, siempre y cuando la datawindow haga una conexión a base de datos, haz lo siguiente:

string ls_select
// Obten el script Select
ls_select = dw_emp.GetSQLSelect()
MessageBox('', ls_select)

jueves, 5 de mayo de 2016

Tiempo de ejecución

Para conocer el tiempo que tarda en ejecutarse una parte de nuestro código, proceso o función, puedes hacer lo siguiente en tu aplicación:

long ll_inicio, ll_transcurrido
ll_inicio = CPU ( )
/*
**Tu código al que quieres tomar el tiempo
*/
ll_transcurrido = CPU ( ) - ll_inicio




miércoles, 4 de mayo de 2016

Empleos Powerbuilder en México

La intención de esta entrada es mantener una lista de empresas y consultorías en donde por lo menos alguna vez han publicado vacantes para desarrolladores Powerbuilder
La lista solo comprende la Ciudad de México por ahora, si alguno de ustedes tiene información de otra empresa con gusto las voy agregando.

La lista es la siguiente.
Empresas
Bancomer (Coyoacan)
Comercial Mexicana
Price Shoes
Super Soya SA de CV
Telcel (Polanco)
Banorte (Santa Fe)
Universidad Ibero (Santa Fe)
Value Grupo Financiero (Santa Fe)
MicroInformática Gerencial (http://www.mig.com.mx)


Consultoras
ENKONTROL - www.enkontrol.com
Obelsys - www.obelsys.mx
Hunt IT - www.huntit.com.mx
GoNet Mexico - www.gonet.us/empleo
EISEI - eisei.net.mx
Knowledge Momentum knowledgemomentum.com

Hitss - www.globalhitss.com
Enlace Laboral - www.enlacelaboral.com
Application Hosting - www.applicationhosting.com.mx
En ocasiones Manpower publica vacantes.

Tambien les recomiendo establecer alertas en google, occ, computrabajo y jobomas que es de donde más he encontrado ofertas periodicamente, incluso durante todo el año.

viernes, 15 de enero de 2016

Verificar si existen registros duplicados

Aquí un truco en las datawindows que determina si existen registros duplicados en la datawindow. Lo que puede ser útil, por ejemplo, antes de actualizar en base de datos.
En el ejemplo de abajo, la llave primaria (única) es "user_id", entonces lo que se hace es ordenarlas por ésta llave, para posteriormente filtrarlas de manera que solo queden las líneas duplicadas.
Si el RowCount posterior al filtrado es mayor a cero, detectamos el o los duplicados, y sin necesidad de recorrer todos los registros.

// la datawindow o datastore en este caso es lds_bufer
// ahora usamos el ordenamiento y filtrado para solo dejar los duplicados
lds_buffer.SetSort ("user_id A")
lds_buffer.Sort()
lds_buffer.SetFilter ("user_id = user_id[-1]")
lds_buffer.Filter()

if lds_buffer.RowCount() > 0 then
    //Tenemos un duplicado, y avisamos al usuario.
    al_row = lds_buffer.GetItemNumber (1, "row_num")
    as_colname = "user_id"
    as_error = "Usuario duplicado."
    return -4
end if


//No hay duplicados, limpiamos el filtro y continuamos con nuestro proceso.
lds_buffer.SetFilter ("")
lds_buffer.Filter()

Explicación:

jueves, 14 de enero de 2016

Colores en Powerbuilder

La formula para combinar los valores de colores promarios en un número es:
    256*256*azul + 256*verde + rojo = número
donde el valor de cada color primario esta especificado como un valor entre 0 y 255. Por ejemplo, para especificar el cyan, sustituye 255 por azul, 255 por verde y 0 por rojo. El resultado sería 16776960.

En la tabla debajo se enlistan los valores de azul, verde y rojo que puedes usar en la formula para especificar otros colores.

Colores del Sistema
En las librerias PFC, hay un servicio de colores que te permite obtener los colores del sistema.
Para usarlo, se tiene que llamar a la estructura inv_datacolors.


long ll_selected_text

IF NOT IsValid(gnv_cst_app_object.inv_datacolors) THEN
   gnv_cst_app_object.of_SetDataColors(True)
END IF

ll_selected_text = gnv_cst_app_object.inv_datacolors.of_SelectedColor()
this.textcolor = ll_selected_text


Las funciones disponibles son:

    gnv_cst_app_object.inv_datacolors.of_SelectedColor( ) // Selected background
    gnv_cst_app_object.inv_datacolors.of_EnterableColor( ) // Window text
    gnv_cst_app_object.inv_datacolors.of_ReadOnlyColor( ) // Buttonface
    gnv_cst_app_object.inv_datacolors.of_SelectedTextColor // Selected Text Color

   
Para no tener que realizar la fórmula descrita al principio para obtener el valor y asignarlo a una variable, puedes simplemente utilizar la función rgb(rojo INT, verde INT, azul INT).
La función admite tres valores numéricos, que equivalen a los valores de rojo, verde y azul, en ese orden.
Por ejemplo:
    rgb(255,255,255) daría como resultado el blanco.
    rgb(255,0,0) daría como resultado el rojo,
    rgb(0,255,0) daría como resultado el verde,
    rgb(0,0,255) daría como resultado el azul y
    rgb(0,0,0) daría como resultado el negro.



Puedes utilizar la función RGB directamente en las propiedades de color de una datawindow:

 

O utilizarla al asignarle el valor a alguna constante de color de un objeto en la interfaz gráfica:


 












Por último, una lista de colores que te ayudaran:
BUTTONFACE =  78682240
WINDOW_BACKGROUND = 1087434968
WINDOW_TEXT = 33554592
APPLICATION_WORKSPACE = 268435456
TRANSPARENT = 553648127

BLACK = RGB(0, 0, 0)
WHITE = RGB(255, 255, 255)
LIGHT_GRAY = RGB(192, 192, 192)
DARK_GRAY = RGB(128, 128, 128)
RED = RGB(255, 0, 0)
DARK_RED = RGB(128, 0, 0)
GREEN = RGB(0, 255, 0)
DARK_GREEN = RGB(0, 128, 0)
BLUE = RGB(0, 0, 255)
DARK_BLUE = RGB(0, 0, 128)
MAGENTA = RGB(255, 0, 255)
DARK_MAGENTA = RGB(128, 0, 128)
CYAN = RGB(0, 255, 255)
DARK_CYAN = RGB(0, 128, 128)
YELLOW = RGB(255, 255, 0)
BROWN = RGB(128, 128, 0)