Escolar Documentos
Profissional Documentos
Cultura Documentos
builder 10.5
EJEMPLOS DE
POWER BUILDER
10.5
Este documento contiene muchos ejemplos de script sobre el
manejo de aplicaciones y proyectos realizados a base de
power builder. Si le interesa aprender este lenguaje de
programacin este documento posee la mayora cdigos para
el desarrollo de sistemas informticos.
j = len(as_str)
IF NOT Mod(j, 2) = 1 THEN
ls_temp =
FOR i = 2 TO (j + 1) STEP 2
ls_encchar = Mid(as_str, i - 1, 1)
IF mid(CRYPT_KEY, Mod(i / 2, 10) + 1, 1) <> ls_encchar THEN
lb_ok = FALSE
EXIT
END IF
ls_encchar = Mid(as_str, i, 1)
ls_temp += string(char(255 - asc(ls_encchar)))
NEXT
END IF
IF lb_ok THEN ls_unasstr = ls_temp
RETURN ls_unasstr
ls_centenas[8] = 'ochocientos'
ls_centenas[9] = 'novecientos'
STRING cadena_total, cadena_entera, oracion, parte, caso_0, caso_1, caso_2,
concatena1, envio1, caso_3, caso_4, envio4, concatena4, envio3, &
caso_5, caso_6, concatena7, caso_7, envio6, caso_8, envio9, caso_9, concatena10,
caso_10, para10, valor9, caso_11, caso_12, dos_decimales
long deci_punto, li_i
double parte1, parte0, parte3, parte4, parte7, parte6, parte9, parte10
cadena_total = sle_1.text
deci_punto = pos(cadena_total,.)
cadena_entera = left(cadena_total,deci_punto - 1)
dos_decimales = right(cadena_total,2)
for li_i = li_i to len(cadena_entera) -1
parte = mid(cadena_entera,len(cadena_entera) - li_i, 1 )
choose case li_i
case 0
caso_0 = ls_unidades[(double(parte))]
parte0 = (double(parte))
oracion_hasta_aqui = ls_unidades[(double(parte))]
case 1
if ls_unidades[(double(parte))] = un or ls_unidades[(double(parte))] = dos then
envio1 = ls_unidades[(double(parte))]
parte1 = (double(parte))
concatena1 = string(parte1)+ string(parte0)
caso_1 = ls_unidades[(double(concatena1) ) ]
oracion_hasta_aqui = caso_1
else
caso_1 = ls_decenas[(double(parte))] + y
oracion_hasta_aqui = caso_1 + caso_0
end if
case 2
caso_2 = ls_centenas[(double(parte))]
if envio1 = un or envio1 = dos then
oracion_hasta_aqui = caso_2 + + caso_1
else
oracion_hasta_aqui = caso_2 + + caso_1 + caso_0
end if
case 3
parte3 = (double(parte))
envio3 = ls_unidades[(double(parte))]
if ls_unidades[(double(parte))] = un then
caso_3 = ls_valor1[1]
else
caso_3 = ls_unidades[(double(parte))] + ls_valor1[1]
end if
if envio1 = un or ls_unidades[(double(parte))] = dos then
oracion_hasta_aqui = caso_3 + + caso_2 + + caso_1
else
oracion_hasta_aqui = caso_3 + +caso_2 + + caso_1 + caso_0
end if
case 4
10
Equivale escribir
Cb_1.hide();
Cb_1.show();
Para la asignacin de la funcin Move(x,y);
Cb_1.x = 100;
Cb_1.Y = 200;
Equivale escribir
Cb_1.move(100,200);
Para la asignacin de la funcin resize ( widht, height );
Cb_1.widht = 450;
Cb_1.height = 500;
Equivale escribir
Cb_1.resize(450,500);
Para la asignacin de valores a las variables
b = b+1
equivale
b++
b=b-1
Equivale
b-b=b+3
equivale
b+=3
NOT b AND NOT c
equivale
NOT(b or c)
En caso de utilizar SQL.
String ls_apellidos, ls_nombres;
SELECT apaterno, nombre
INTO :ls_apellidos, :ls_nombres
FROM tpersonal WHERE dni=40284874;
sle_1.text = ls_apellidos;
sle_2.text= ls_nombres;
Equivale escribir:
SELECT apaterno, nombre
INTO :sle_1.text, :sle_2.text
FROM tpersonal WHERE dni=40284874;
Para la asignaciones de valores en el control datawindow
Dw_1.object.nombre[dw_1.getrow()] =RONY;
Equivale escribir
Dw_1.setitem(dw_1.getrow(),nombre,RONY);
//a diferencia del object, en esta sentencia puedo utilizar variables en la asignacin de
campos,
Ejemplo
titulo: campo_t
detalle : campo
String ls_band, ls_name
long ll_temp, i
ls_band = this.GetBandAtPointer()
ls_name = dwo.Name
ls_name = Left(ls_name, Len(ls_name) - 2)
// Verifico si dio el click en la cabecera
if mid(ls_band,1,pos(ls_band,~t) - 1) = 'header' then
// Verifico si es una columna
if this.describe(ls_name + .ID) '!' then
// Si es una columna pregunto ahora si tiene presionada la tecla de control
if pos(is_sort, is_pre_sort) = 0 then
if keydown( KeyControl! ) then
// En el caso de que tuviese presionada la tecla de control se siguen sumando las
columnas
// seleccionadas con click
if pos(is_sort, ls_name) = 0 then
if is_sort then is_sort += ,
is_sort += ls_name + A
else
if pos(is_sort, ,) = 0 then
is_sort =
else
if pos(is_sort, ls_name) = 1 then
is_sort = replace(is_sort, pos(is_sort, ls_name), len(ls_name) + 4, )
else
is_sort = replace(is_sort, pos(is_sort, ls_name) - 2, len(ls_name) + 4, )
end if
end if
end if
else
is_sort =
This.SetSort(is_pre_sort + ls_name + A)
This.Sort()
This.GroupCalc()
end if
end if
end if
end if
END IF
Esta solucin no la invent yo...es un dato de un amigo.
Espero que les sirva.
millsec uint
[evento clicked del boton]
str_systemtime lstr_systemtime
lstr_systemtime.year = 1999
lstr_systemtime.month = 1 // January = 1 and so on.
lstr_systemtime.dayweek = 0 // not used
lstr_systemtime.day = 3
lstr_systemtime.hour = 12
lstr_systemtime.min = 0
lstr_systemtime.sec = 0
lstr_systemtime.millsec = 0
SetLocalTime(lstr_systemtime)
28. Busqueda en un DW
Cdigo que permite hacer una busqueda en un DW tipo grid. Se ubica en la fila donde
esta el dato buscado.
El secreto esta en colocar los nombres de los titulos de las columnas del DW grid con el
mismo nombre del campo adcionandole _t
al final. Ejemplo: columna codigo, titulo codigo_t. En la propiedad text del titulo de la
columna colocas Cdigo. Esta palabra
ser la que se vea en la lista de campos a buscar
Espero sea claro.
///////////////////////////////////////////////////////////////////////////////////////////////////
// Nombre Programa :OPEN DE LA VENTANA DE BUSQUEDA
// Fecha / Autor :
ABAD
// Descripcin: CARGA LOS DATOS DE LAS COLUMNAS DEL DATAWINDOWS ACTUAL
//////////////////////////////////////////////////////////////////////////////////////////////////
// VARIABLES
integer li_columnas, li_i, li_pos
string ls_nombrecolumna, ls_name
//
//cargar las columnas del dw existente
li_columnas = integer(w_mantenimiento.dw_1.Object.DataWindow.Column.Count)
for li_i = 1 TO li_columnas
w_mantenimiento.dw_1.setcolumn(li_i)
ls_nombrecolumna = w_mantenimiento.dw_1.getcolumnname()
ls_name = w_mantenimiento.dw_1.DESCRIBE(ls_nombrecolumna+_t.text)
ls_name = ls_name +space(100)+*+ls_nombrecolumna
ddlb_1.Additem(ls_name)
NEXT
sle_1.setfocus()
dw_1.settransobject(sqlca)
si_fila = 0
EVENTO CLIC DEL BOTON BUSCAR
///////////////////////////////////////////////////////////////////////////////////////////////////
//
// Nombre Programa :BUSCAR DATOS EN EL DATAWINDOW POR COLUMNA AL
HACER CLIC EN ESTE BOTON
// Fecha / Autor :
ABAD
//
16
si_fila = 0
END IF
END IF
END IF
END IF
si_antselec = li_pos
EVENTO CLIC DEL BOTON SIGUIENTE
///////////////////////////////////////////////////////////////////////////////////////////////////
// Nombre Programa :BUSCAR DATOS EN EL DATAWINDOW POR COLUMNA AL
HACER CLIC EN ESTE BOTON
//
DESDE LA FILA ACTUAL
// Fecha / Autor :
ABAD
// Descripcin: SE UBICA EN LA FILA DEL DATO BUSCADO
//////////////////////////////////////////////////////////////////////////////////////////////////
si_fila = w_mantenimiento.dw_1.getrow()
IF si_fila = w_mantenimiento.dw_1.rowcount() THEN
si_fila = 0
END IF
cb_1.triggerevent(clicked!)
El control datawindow posee estas dos funciones para filtrar la informacin despus de la
recuperacin con la funcin retrieve(). En otras palabras las funciones de filtrado trabaja
en base a los datos ya ledos desde la base de datos; estas dos funciones van de la mano
y trabajan de la siguiente manera.
Setfilter :_Esta funcin posee la misma sintaxis despus de la clusula WHERE de los
comandos SQL.
Filter :_ ejecuta la sentencia almacenada en la funcion Setfilter.
Para este ejemplo se esta utilizando la siguiente tabla
|--------------------------|ttrabajador
|--------------------------|idtrabajador (CHAR(20)
|apaterno (CHAR(30)
|amateno (CHAR(30)
|nombres (CHAR(50)
|--------------------------y los siguientes controles en nuestra aplicacin
cb_filtrar
dw_trabajador
//----------------cb_filtrar------------------------------event clicked
//---------------------------------------------------------//declaramos las variables
string ls_setfilter;
//asignamos los parmetros de filtrado a la variable
ls_setfilter = apaterno=CHATA and nombres=RONY;
//utilizamos la funcion setfilter con los parametros de la variable ls_setfilter
dw_trabajador.setfilter(ls_setfilter);
//ejecutamos el filtrado
dw_trabajador.filter();
del
Control
Datawindow
con
la
funciones
//----------------cb_extrae----------------------------------------------event clicked
//-------------------------------------------------------------------------//declaramos las variables
integer li_row;
string ls_apaterno, ls_amaterno, ls_nombres;
// ubicamos el registro activo del control datawindow
li_row = dw_trabajador.getrow();
//recuperamos los datos desde el buffer del datawindow
ls_apaterno = dw_trabajador.getitemstring(li_row,apaterno); //recuperamos el apellido
paterno
ls_amaterno = dw_trabajador.getitemstring(li_row,amaterno); //recuperamos el apellido
materno
ls_nombres = dw_trabajador.getitemstring(li_row,nombres); //recuperamos los nombres
//visualizamos la informacin recuperada
messagebox(trabajador, ls_apaterno+ +ls_amaterno+, +ls_nombres );
end if;
//--------------------------------------------event dberror)
//------------------------------------------CHOOSE CASE SQLdbcode
CASE -195 //error por falta de datos
S_MSJ =S_MSJ+ - Verifique que todos los datos esten registrados+char(13)+char(13);
CASE -194 //cuando la tabla maestra no encuentra relacion al detalle
S_MSJ =S_MSJ+ - El ruc o Und/Costo no esta creado o no es
correcto+char(13)+char(13);
CASE -193 //cuando existen datos duplicados
S_MSJ =S_MSJ+ - La partida ingresada ya existe, verifique los datos
ingresados+char(13)+char(13);
CASE -198 //error cuando la tabla maestra no puede eliminar el detalle
S_MSJ =S_MSJ+ - Para eliminar este tratamiento contable Debe elimar sus relaciones,
Posiblemente ya se haya utilizado en algunos do*****entos si es asi NO SE PUEDE
ELIMINAR +char(13)+char(13);
CASE ELSE //para otros errores no previstos
S_MSJ =S_MSJ+ STRING (SQLDBCODE)+ +SQLERRTEXT;
END CHOOSE;
// retorna el codigo que suprime el error
RETURN 1;
Con la ayuda del llamado del API GetModuleFileNameA podemos ver el path. Para usar
este llamado de API desde PowerBuilder haga lo siguiente: Declarar la funcin externa:
FUNCTION int GetModuleFileNameA(ulong hinstModule, REF string lpszPath, ulong
cchPath) LIBRARY kernel32
[Powerscript]
string ls_Path
unsignedlong lul_handle
ls_Path = space(1024)
lul_handle = Handle(GetApplication())
GetModuleFilenameA(lul_handle, ls_Path, 1024)
MessageBox(Path de la aplicacin, ls_path)
Else
lb_1.DirList( raiz + *.ppp,16 )
End If
total = lb_1.TotalItems()
For i=1 to total
array[i] = mid(lb_1.Text(i), 2,(Len(lb_1.Text(i))-2))
Next
For j=1 to total
if array[j] .. Then
var.Children = True
var.Label = array[j]
var.PictureIndex = 1
var.SelectedPictureIndex = 2
st_1.Text = aux + var.label
posi = tv_1.InsertItemLast(pos,var)
//tv_1.ExpandAll(pos)
temp = var.Label
pos = posi
recursivo()
pos = tv_1.FindItem( ParentTreeItem!, pos )
If pos [-Directorio-] */
//con el siguiente codigo
Boolean flag = False
Int a=1,b
b = len(aux)-1
aux = Mid(aux,1,b)
b=1
Do While flag = False
If Pos ( aux, '' , b ) = 0 Then
flag = true
Else
a = Pos ( aux, '' , b )
b=a+1
End If
Loop
aux = Mid ( aux, 1 , a )
/* y listo ya tienen tu treeview con todas las carpetas del sistema ;D */
Saludos desde Ciudad Victoria, Tamaulipas, Mexico
Si quieren que les pase el PLB mandenme un mail para que se los envie :D
29
luego podemos crear una funcion para obtener el nombre de usario llamada f_user que
devuelve un string y escribimos lo siguiente
string ls_NullString, ls_UserName
long ll_largo
SetNull (ls_NullString)
ls_UserName = Space (256)
ll_largo = 256
WNetGetUser(ls_nullString, ls_UserName, ll_largo)
return trim (ls_UserName)
Luego creamos la funcion f_namehost que devuelve un string y escribimos lo siguiente
string ls_ComputerName
long ll_largo
ls_ComputerName = space (256)
ll_largo = 256
GetComputerName (ls_ComputerName, ll_largo)
return trim (ls_ComputerName)
Luego llamamos de cualquier parte de nuestro codigo a las funciones
string ls_namehost , ls_user
ls_namehost = f_namehost()
ls_user= f_user()
istr_choosecolor.lStructSize = 36
SetNull(istr_choosecolor.hwndOwner)
istr_choosecolor.flags = 3
istr_ChooseColor.rgbresult = 0
ChooseColorA ( istr_choosecolor )
this.modify(Datawindow.color='+ string(istr_ChooseColor.rgbresult)+')
* Al ejecutar y dar click derecho sobre la datawindow seleccionada cambiar el color de
fondo de ella.
* Hagan pruebas cambiando el valor de istr_choosecolor.flags
* Hago el alcanse que a partir de PowerBuilder 8, existe la funcion ChooseColor, similar a
esta solucin.
lb_Bool = FALSE
END IF
Nuevo script:
lb_Bool = dw_1.GetItemString( 1, column ) = AND
Saludos.
33
/*El argumento que se le pasa es la ltima fila a la que se le hizo click. Esta funcin usa
una varianle de instacia existente llamada il_ultimafila para hace el scrolling. El cdigo de
el evento es este:*/
integer li_i
this.SetReDraw ( FALSE )
IF il_ultimafila = 0 THEN
this.SelectRow ( al_fila, TRUE )
Return
END IF
IF il_ultimafila > al_fila THEN
FOR li_i = il_ultimafila to al_fila STEP -1
this.selectrow( li_i, TRUE)
NEXT
ELSE
FOR li_i = il_ultimafila to al_fila
this.selectrow( li_i, TRUE)
NEXT
END IF
this.SetReDraw ( TRUE )
4. Coloque el siguiente cdigo en el evento clicked del datawindow
/* Row es un argumento del evento clicked y contiene el nmero de fila al que se hizo
click. Si row = 0, entonces el usuario no hizo en en una fila*/
IF row = 0 THEN Return
IF KeyDown ( KeyShift! ) THEN
/* El evento ue_seleccionarfila se describe en el punto 2 y 3 anteriormente */
this.Event ue_seleccionarfila ( row )
ELSEIF KeyDown ( KeyControl! ) THEN
IF this.GetSelectedRow ( row - 1 ) = row THEN
this.SelectRow ( row, FALSE )
ELSE
this.SelectRow ( row, TRUE )
END IF
ELSE
this.SelectRow ( 0, FALSE )
this.SelectRow ( row, TRUE )
END IF
// Salva la fila a la que se hace click en la variable de instancia para usarla en
ue_seleccionarfila
il_ultimafila = row
34
Para poder colocar el texto en negrilla de los botones de texto realiza lo siguiente: Si
desea el texto en negrilla coloca
cb_1.weight = 700
Pero si lo desea normal coloca
cb_1.weight = 400
35