Manual Power Builder

July 6, 2017 | Author: Alberto Moreno Cueva | Category: Sql, Information Retrieval, Data Management Software, Technology, Computing
Share Embed Donate


Short Description

Descripción: guia de Power Builder un lenguaje orientado a objetos , espero que les sirva de utilidad para aquellas pers...

Description

-1-

POWERBUILDER 9.0

Ing. Alberto Moreno C. Universidad Nacional de Ingenieria

Power Builder 9.0

-2-

CONTENIDO Ø

Entorno del PowerBuilder

Ø

Propiedades de controles.

Ø

Funciones de cadena, numéricas y fechas.

Ø

Aplicación con Arreglos y Funciones de Usuario DFU.

Ø

Objeto DataWindow.

Ø

Aplicaciones con DataWindow Filter y Find.

Ø

Datawindow con Retrieval Arguments y Campos calculados.

Ø

Validaciones de campo y mantenimiento de una tabla.

Ø

Aplicación elaboración de un factura.

Ø

Estructura de datos y OpenWithParm.

Ø

Objetos de usuario, visuales y no visuales.

Ø

Gráficos uso del estilo Graph.

Ø

Animaciones.

Ø

DataWindow Dinamicos.

Ø

Enviar Correo.

Ø

Api s en Power

Ø

Control treeview

Ø

Trucos en Power.

Profesor

:Ing. Alberto Moreno C..

Prohibida cualquier copia sin permiso del autor Correo :[email protected] La frase debo hacer algo resuelve mas problemas que la frase hay que hacer algo

Power Builder 9.0

-3-

Que es Power Builder? Es una herramienta de desarrollo de aplicaciones gráficas, principalmente para el desarrollo de aplicaciones Cliente/Servidor de N capas. Antes de empezar a desarrollar cualquier aplicación se debe crear:

a) Un espacio de trabajo Workspace, que asignara la extensión ( *.pbw)

b) Una aplicación que esta ligado a una librería o biblioteca (*.pbl)

Power Builder 9.0

-4-

Template Application .- es cuando se abre una nueva aplicación pero con una plantilla de trabajo Existing Application .- Para abrir una aplicación que se encuentra en otra versión del power.

Power Builder 9.0

-5-

CAPITULO DE FUNCIONES Funciones del Control: CLEAR() Borra el contenido de un objeto Syntax objectname.Clear ( ) Controls DataWindow, EditMask, MultiLineEdit, SingleLineEdit, RichTextEdit, DropDownListBox, DropDownPictureListBox, OLE controls, and OLEStorage objects

DELETEITEM() Borra un item desde una lista de valores Syntax objectname.DeleteItem ( index ) Controls ListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controls Ejemplo: Esta sentencia borra el primer item seleccionado en Lb_productos

integer Xindex

// Variable de tipo entero

Xindex = lb_software.SelectedIndex() // Capturamos la posición del cursor en la lista lb_ software.DeleteItem(Xindex)

// Eliminamos el item seleccionado

ADDITEM() Adiciona nuevos items para una lista de valores Syntax objectname.AddItem ( item ) Controls ListBox and DropDownListBox controls Ejemplo: integer Xrow

Power Builder 9.0

// Variable de tipo entero

-6string s

// Variable de tipo cadena

s = "Insertar Item"

// Almacenamos un valor a la variable

Xrow = lb_software.AddItem(s) // Insertamos el valor de la variable (s) en el listbox FINDITEM() Busca un texto dentro de una lista de valores, retorna un valor 1 si no encuentra el dato a buscar. Syntax objectname.FindItem (text, index) Controls ListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controls Ejemplo Inserta en un control listbox el siguiente contenido:

integer XIndex XIndex = lb_software.FindItem("Power Builder", 1) En este ejemplo el valor de index será 6 INSERTITEM Inserta un item dentro de una lista de valores Syntax objectname.InsertItem (item, index) Controls ListBox and DropDownListBox controls

Power Builder 9.0

-7Respecto al ejemplo anterior: Lb_software.InsertItem( Apache ,6)

// inserta el item en la sexta posición, es decir en el item 6

SELECTEDTEXT Obtiene el texto seleccionado en un control editable Syntax editname.SelectedText ( ) Controls DataWindow, EditMask, MultiLineEdit, SingleLineEdit, RichTextEdit, DropDownListBox, and DropDownPictureListBox controls

ejemplo: inserta un dropdownpicturelistbox e ingresale como minumo 5 items, en un control, y en el evento que desees ingresa lo siguiente string Xubica Xubica = ddlb_software.SelectedText() SELECTITEM Encuentra y resalta un item dentro de una lista. Controls ListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controls Syntax a) objectname.SelectItem (item, index)

ejemplo: integer XIndex XIndex = lb_software.SelectItem("Power Builder", 2) // si encuentra el texto lo resalta y si no // el valor devuelto es 0

b) lobjectname.SelectItem (itemnumber) Resalta el item especificado en la lista, si el valor es cero no se selecciona ningún ítem Syntax objectname.SelectItem (itemnumber)

Power Builder 9.0

-8Controls ListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controls ejemplo ddlb_software.Selecitem(0)

// ningún ítem es seleccionado

lb_software.SelectItem(5)

// resalta el item 5

TOTALITEMS Determina el número total de items Syntax listcontrolname.TotalItems ( ) Controls ListBox, DropDownListBox, PictureListBox, DropDownPictureListBox, and ListView controls STATE Determina si un elemento de la lista esta resaltada. Syntax Listboxname.State ( index ) Controls ListBox and PictureListBox controls ejemplo:

integer XItemTotal, XItemCount XItemTotal = lb_software.TotalItems( ) // Verifica que items esta seleccionado FOR XItemCount = 1 to XItemTotal IF lb_software.State(XItemCount) = 1 THEN // Si esta seleccionado MessageBox("Selected Item", lb_software.text(XItemCount)) END IF NEXT SETSTATE Resalta un item dentro de una lista solo es aplicable cuando esta lista es de múltiple selección es decir propiedad Multiselect = TRUE

Power Builder 9.0

-9Syntax objectname.SetState (index, state) Controls ListBox and PictureListBox controls ejemplo

lb_software.SetState(6, TRUE)

Power Builder 9.0

-10-

FUNCIONES DE CADENA. ASC Obtiene el código ASCII correspondiente, de un carácter de tipo cadena. ejemplo : Asc(

)

// retorna 65

CHAR Retorna el carácter correspondiente al código ASCII String XS XS=Char(42) // retorna * FILL retorna una cadena con una longitud determinada del carácter especificado. ejemplo Fill(

,5)

// *****

LEFT Retorna un número especificado de caracteres comenzado por la izquierda Ejemplo: String Xcad Xcad = Left( Claudia ,3)

// Cla

LEFTTrim Retorna una copia de una cadena sin los espacios en blanco del lado izquierdo. Ejemplo: String Xcad Xcad = LeftTrim( LEN(Cad)

Claudia )

// Retorna Claudia

Retorna la longitud de una cadena

Ejemplo: String Xcad Xcad = Len( Claudia )

// Retorna 7

LOWER(Cad) Convierte toda la cadena a minúsculas Ejemplo: String Xcad Xcad = Lower( CLAUDIA )

// Retorna claudia

MATCH Determina si la cadena contiene un patrón particular de caracteres. Ejemplo:

Power Builder 9.0

-11Esta sentencia retorna TRUE si el texto contiene una letra Mayúscula: Match(sle_Id.Text, "[A-Z]") MID Extrae caracteres a partir de una Posición Ejemplo: String Xcad Xcad = Mid( Claudia ,4,2)

// retorna ud

POS retorna la posición donde comienza una cadena dentro de otra cadena . Ejemplo: Integer Xpos Xpos = Pos( Power Builder Bu ) // Retorna 7 REVERSE(Cad) Cambia el orden de los caracteres de una cadena. Ejemplo String Xrev Xrev = Reverse( Hola )

// aloH

RIGHT(CAD, n) devuelve caracteres a partir de la derecha Ejemplo: String Xcad Xcad = right( Claudia ,3)

// dia

SPACE(N) Inserta espacios en blanco Ejemplo: Cad=Space(5)

// devuelve

, cinco espacios en blanco.

TRIM(Cad) suprime blancos a ambos extremos de la cadena. Ejemplo: Cad= claudia

// devuelve claudia , cadena sin espacios en blanco a los

costados. UPPER(cad) Convierte toda la cadena a letras mayúsculas Ejemplo:

Power Builder 9.0

-12Cad= especialización

// devuelve ESPECIALIZACION.

FUNCIONES FECHA DAY Retorna el día de una fecha. Ejemplo: Dia = String(Day(2001-04-21)) // retorna 21, convertimos el dato de tipo númerico a cadena, con la funcion string. DAYNAME Retorna el nombre de día de la semana Ejemplo: Cad = DayName(2001-04-22)

// retorna Sunday.

DAYNUMBER Retorna el número de día de la semana Ejemplo: Cad = string(DayNumber(2001-04-22))

// Retorna 1

DAYAFTER Devuelve los días que hay entre dos fechas Ejemplo Cad = DayAfter(2001-04-22, 2001-04-18) // retorna -4 HOUR Retorna un entero que corresponde al número de horas, que se encuentre en un dato de tipo hora Ejemplo: Hour(19:12:42) // retorna 19. MINUTE retorna los minutos Ejemplo: Minute(19:42:13) // retorna 42. MONTH Retorna el número correspondiente al mes de una fecha Ejemplo: Month(2001-04-22)

// retorna 4

NOW devuelve la Hora del sistema

Power Builder 9.0

-13Ejemplo Hora = String(now(), HH:mm:ss ) // string(dato,tipo de salida del dato), en este caso es hora:minuto:segundo. RELATIVEDATE Retorna la fecha con respecto a un determinado número de día. Ejemplo: Date Fecha Fecha=Relativedate(today(), -25) // la fecha hace 25 días respecto a la fecha actual. SECOND Retorna el número de segundos. Ejemplo: Cad = string(Second(14:13:45)) // retorna 45 expresado en un dato de tipo cadena.

TODAY Retorna la Fecha y hora del sistema Ejemplo: Cad = string(today(), DD/MM/YY ) // retorna una cadena con la fecha del sistema en un formato de dd/mm/y yes decir , 12/04/03 YEAR Retorna el año de una fecha. Ejemplo Num = year(today())

Power Builder 9.0

-14-

FUNCIONES NUMÉRICAS ABS obtiene el valor absoluto de un número Ejemplo: Num= (abs(-34) // retorna 34 CEILING Obtiene el menor número entero que es menor o igual al número especificado Ejemplo: Donde Deci es una variable de tipo decimal Deci = String(Ceiling(-4.8)) // retorna 4 COS Obtiene el coseno de un ángulo el ángulo debe estar en radianes EXP El resultado de un número elevado a la potencia. Ejemplo: Deci = String(exp(1))

// 2.718

FACT Obtiene el factorial de un número Ejemplo: Num= Fact(4) // retorna 24 MAX Retorna el mayor de dos números Ejemplo: Num = Max(-4,-7) // retorna -4 MIN Menor entre dos números Ejemplo: Num = Min(4,7) // retorna 4 MOD Obtiene el residuo de dos números Ejemplo: Num = Mod(20,7) //retorna 6 PI (n) multiplica PI(3.1416 por un numero) Ejemplo: Deci = Pi(1) // devuelve 3.14159..... RAND(10) Obtiene un número entero aleatorio entre 1 y el número especificado

Power Builder 9.0

-15-

Ejemplo: Num = Rand(10) // devuelve un número comprendido entre el 1 a 10 RANDONMIZE(0) Randomize Regenera o inicializa el número aleatorio generador. Ejemplo: Randomize(0) ROUND Obtiene el número entero comprendido en un número decimal Ejemplo: Num = Round(3.598,0)

Power Builder 9.0

// devuelve 4

-16-

Aplicaciones

DFU (Funciones Defindas por el Usuario). Pueden ser a nivel de Ventana o a nivel de toda la aplicación Ejemplo: Ingresar un monto en soles y lo convierta a letras

Em_1 control de edicion

Mle_1 Contol de múltiple linea

por ejemplo si:

Num=345

Funciones a crear

Num

Num

Tipo int F_mil

F_centena

F_mill Letra

Letra Devuelve en letras: Trescientos cuarenta y cimco

Es más simple hacer la conversión trabajando con vectores

Paso 1.- Declarar a nivel de instancia (Pestaña Instancia) Declare Instancia String vec1[]={"Uno","dos","Tres","cuatro","cinco","seis","siete","ocho","nueve"} String vec2[]={"Once","doce","trece","catorce","quince","dieciseis", "diecisiete", & "dieciocho","diecinueve"} String vec3[]={"Diez","viente","trienta","cuarenta","cincuenta","sesenta", & "setenta","ochenta","noventa"} String vec4[]={"Ciento","Doscientos","trescientos","cuatroscientos","quinientos", & "seiscientos", "setecientos","ochocientos","novecientos"}

Power Builder 9.0

-17Paso 2.- Crear las funciones: NumLetras (a nivel de ventana) a) Clic en (Insert) del menú principal. b) Clic en (Function).

a a) b) c) d) e)

b

c

d

Tipo de acceso a la función. Tipo de dato de retorno. Nombre de la función. Tipo de datos que se va a referenciar, en este caso será un valor. Tipo de dato del valor.

En la ventana de código, tipeamos la siguiente estructura:

String cad1,cad2 Int c,res,d,uni c=num/100 res= mod(num,100) if c>0 Then if c=1 and res=0 then cad1="Cien" else cad1=vec4[c] end if choose case res case 1 to 9 cad2=vec1[res] case 11 to 19 cad2=vec2[res - 10] case 10, is >=20 d=res/10 uni=mod(res,10) if uni=0 then cad2=vec3[d] else cad2=vec3[d]+ " y "+ vec1[uni] end if end choose return cad1 + cad2

Power Builder 9.0

f

g

-18Funcion miles

Tipeamos el siguiente código: String cad1,cad2 Int res,mil mil=num/1000 res= mod(num,1000) if mil>0 then if mil=1 then cad1="Mil " else end if

Cad1=f_centena(mil)+" Mil"

if res>0 Then cad2=f_centena(res) end if return cad1 + " " + cad2

Procedemos a ejecutar la aplicacion y veremos los resultados.

Power Builder 9.0

-19-

FUNCIONES APLICADAS A CONTROL DATA WINDOWS Estructura de un Datawindows

Edit Control

Datawindows.- Es una carateristicas más importante del Power Builder. El DataWindows es la forma en que sus aplicaciones presentan los datos de la base de datos y quizas incluso datos no específicamente de una base de datos al usuario final; DataWindows pueden ser pantalla de consulta, formato de entrada de datos, reportes de impresión, etc.

Un objeto DataWindow debe ser insertado con una ventana regular, en todo diseño de un DataWindow forman parte dos objetos. 1.- DataWindow Object.- que es diseñado con el DataWindow Painter. 2.- DataWindow Control.- Es un control donde se insertará el DataWindows Object.

Power Builder 9.0

-20-

Funciones principales de un Datawindows

SetTransObject Hace que un control DataWindow use un objeto de transacción especificado por el programador. El objeto de transacción proporciona la información nesecesaria para comunicarse con la Base de Datos. Retorna -1 si ha ocurrido un error. Sintaxis Dwn. Settransobject(Transacción) Argument

Description

Dwn

El nombre del Control data window, con el cual se desea usar un objeto de transacción.

Transacción

Nombre del Objeto de transacción, por defecto es SQLCA.

Generalmente se establece el objeto de transacción en el evento Open de la ventana que contiene el control DataWindow. En resumen el SettransObject(SQLCA) asocia el objeto transación con el control DataWindow. Ejemplo: DwnSoftware.settransobject(SQLCA) InsertRow Inserta una fila en un DataWindow, Si alguna columna tiene valores por defecto, La fila es inicializada con estos valores, retorna el número de la fila que se ha añadido, retorna -1 si ha ocurrido un error. Sintaxis Dwn.InsertRow(fila) Argument

Descripcion

Dwn

El nombre del control DataWindow en el cual se desea insertar una fila.

Fila

Un entero Largo (long) que identifica la fila antes de la cual desea insertar una fila nueva. Si el valor es cero insertará al final de la tabla.

Ejemplo:

Power Builder 9.0

-21DwnSoftware.InsertRow(0) Retrieve() Recupera todas las filas de una tabla de la BDD en un control DataWindow, Si incluyen argumentos, estos son usados por los argumentos de recuperacion de la sentencia SQL SELECT del objeto DataWindow. Retorna el número de filas recuperadas, -1 si ocurre un error. Sintaxis Dwn.Retrieve({Arg1, Arg2,

})

Argument

Descripcion

Arg1, Arg2

Argumentos de recuperacion, de la tabla de BDD

Ejemplo: DwnSoftware.Retrieve( C001 ) SetRowFocusIndicator Especifica el indicador visual que identifica la fila actual en un control DataWindow. Sintaxis Dwn.SetRowFocusIndicator (Indicador) Indicador

El indicador visual para la fila actual, los valores validos son:

Off!

Sin indicador.

FocusRect! Un rectangulo de puntos alrededor de la fila. Hand!

Un dedo indice. El nombre de un Picture Control.

SelectRow Selecciona la fila especificada en el control de un DataWindows. Sintaxis Dwn.SelectRow (Fila, Boolean) Ejemplo: DwnSoftware.SelectRow(0,False)

// desactiva la fila anterior

DwnSoftware.SelectRow(15,true)

// resalta toda la fila 15

Power Builder 9.0

-22-

SetItem Establece el valor en una fila y columna especificada, un valor dentro del datawindow, retorna -1 si ocurre un error. Sintaxis DwnSoftware.Setitem (Fila, columna/campo, valor) Ejemplo: Dwn.SetItem(5, "sueldo",670)

En la fila 5, en el campo sueldo se asigna 670.

También en vez del nombre de campo, puede ser el número de campo de acuerdo como ha sido seleccionado en el objeto DataWindow. GetItemString Obtiene datos de tipo cadena de un buffer especificado de un control DataWindow.

Sintaxis Dwn.GetitemString (Fila, Columna) Ejemplo String cad Cad=DwnSoftware.GetItemString(3, "sfw_Nombre")

Extrae el dato que se encuentra en el campo sfw_nombre, en la fila 3, dependiendo del tipo de dato que se va extraer tenemos: Dwn.GetitemNumber (Fila, columna)

Cuando el campo es de manera general numérico, puede ser real o entero.

Dwn.GetitemDecimal (Fila, columna)

Cuando el dato a extraer es exclusivamente decimal o real.

Dwn.GetitemDate (Fila, columna)

Si el campo es de tipo fecha.

Dwn.GetitemTime (Fila, columna)

Si el campo es de tipo hora.

Dwn.GetitemDateTime (Fila, columna)

Cuando el campo es de tipo fecha y hora.

Ejemlo: Capturar en variables, sueldo del empleado, su edad y fecha de nacimiento del empleado, cuya posición se encuentre en la fila número 3.

Power Builder 9.0

-23-

Int edad Dec Sbas Date Fenac

Edad= DwnEmpleado.GetItemNumber(3,"emp_Edad") Sbas= DwnEmpleado.GetItemDecimal(3, "emp_Sbas") Fenac=DwnEmpleado.GetItemDate(3,"emp_Fenac")

Nombre del campos en la tabla. Gettext Obtiene el valor de un control de edicion en la fila y columna actuales, antes que este sea aceptado.

Sintaxis dwn.Gettext ()

Por ejemplo si este radio button se encuentra dentro del DataWindow, y al seleccionar una de estas opciones se desea saber su valor seleccionado basta emplear:

String Tmoneda Tmoneda = DwnSalario.Gettext() Setsort Especifica, el criterio de ordenamiento para un DataWindow, retorna 1 si tuvo éxito y -1 si se encontro un error. Sintaxis Dwn.SetSort (campo1 [A|D]) Ejemplo: DwnEmpleado.setsort() Dwn.Sort()

Power Builder 9.0

-24Ejecuta la clasificación con un previo criterio de selección Sintaxis Dwn.Sort () Ejemplo: DwnEmpleado.SetSort("emp_ape A, #2 D") // ordena apellido y sueldo asumiendo // que el #2 sea el campo sueldo. DwnEmpleado.Sort()

// Procede al ordenamiento.

GetRow Retorna el número de la fila actual de un DataWindow, como un valor Long, Retorna 0 si no hay fila activa y -1 si se ha producido un error grave. Sintaxis Dwn.GetRow ()

SetRow Establece la fila deseada, mueve el cursor a la fila especificada, pero no hace Scroll en el DataWindow. Sintaxis Dwn.SetRow (Fila)

ScrollToRow Hace un Scroll en un DataWindow, hasta alcanzar la fila especificada. ScrollToRow cambia la fila actual pero no la columna actual. Retorna 1 si hubo éxito, -1 en caso contrario. Scrolltorow no ilumina la fila a la cual se hace scroll. Sintaxis Dwn.ScrolltoRow(fila)

Si la fila toma un valor mayor que el número total de la fila, se hace scroll a la última fila. RowCount Obtiene el número de filas que se encuentran disponibles en un DataWindow Sintaxis Dwn.RowCount()

ScrollToRow Causa que el control se deslice a la fila especificada, cambiando la fila actual, a donde se le indique. Sintaxis Dwn.Scrolltorow(fila)

Power Builder 9.0

-25-

ScrollToPriorRow Se desliza a la fila previa, sin cambiar la columna activa Sintaxis Dwn.ScrollPriorRow(fila)

ScrollNextRow Se desliza a la siguiente fila. Sintaxis Dn.ScrollNextRow(fila)

DeleteRow Suprime la fila especificada del control DataWindow, se actualiza directamente la tabla enlazada al control. Sintaxis Dwn.DeleteRow(fila) Si la fila es igual a cero, elimina la fila activa donde se encuentra el puntero, cada vez que se emplee esta sentencia, se tiene que actualizar el DataWindow ejemplo: Dwn.deleteRow(8)

// elimina la fila número 8

Dwn.Update()

// actualiza la base de datos enlazada

DeletedCount Retorna el número de filas que hayan sido suprimidas desde el control DataWindow pero que todavia no hayan sido actualizadas en la tabla de la BDD asociada. Sintaxis Dwn.DeletedCount() Ejemplo: Long Nf Nf=Dwn.DeletedCount() Update Se envia a la base de datos todas las inserciones, eliminaciones y actualizaciones del control DataWindow, retorna 1 si tuvo éxito, -1 si ocurrio un error. Sintaxis Dwn.Update()

Power Builder 9.0

-26-

Utilización del Datawindows El objeto DataWindows en si no es de ninguna utilidad, si no se vincula con un DataWindow control. Este objeto, es visual y es posible de insertar directamente en una ventana; para que pueda ser utilizado por el usuario. Desarrollar la Siguiente aplicación.

Uso de filtros (Find

SetFIlter)

A

B

A

A.- Seleccionamos en el control sueldo el carácter de condición e ingresamos un valor numérico que representa al sueldo básico, luego presionamos clic en el boton Mostrar y tendremos los requeridos. B.- Se ingresa solo los primeros caracteres del nombre, si huviera algún registro que contenga dichos caracteres, deberá resaltar el primer registro tal como observamos en el ejemplo.

Power Builder 9.0

-27Pasos 1.- La BDD VENTA.DB puede estar en cualquier motor de Base de dato, para este caso se hace uso del AnyWhere del SYSBASE (entorno del PowerBuilder)

Estructura: Vendedor: Codv Char 4 Nomv varchar 30 Sbas Numeric 8,2 Factura Nfac char 6 Codv char 4 Impor Numeric 8,2 Tipov char 1

TABLAS Ingresar datos consistentes en las tablas creadas, como se muestra a continuación: FACTURA

VENDEDOR

Paso 2.- Diseñar el DataWindow - (File-New-DataWindow) - Se elige el estilo de Presentación: (Elegir el Tipo Tabular)

Power Builder 9.0

Null(no)

-28-

Presentación Composite Freeform Graph Grid Group Label

Rich Text

Tabular

Power Builder 9.0

Descripción Utiliza como presentación, un reporte previamente creado. La presentación es libre, cada campo se muestra en una línea distinta. Muy utilizado para el ingreso de datos. Diseña un gráfico dependiendo de una consulta, esta debe contener datos relacionados. Diseña una malla de datos en forma columnada, y cada columna con una justificación completa. Diseña listado por agrupación de campos. Muy utilizado para reportes de resumen de información. El diseño es de etiquetas, donde Ud. podrá elegir el tipo de etiqueta de las prediseñadas, en papel continuo o separado, y otras opciones. Permite definir una carta con combinación de campos del Origen de Datos fijado. Se pueden utilizar todas las características del formato de texto RTF. Presenta el Origen de Datos en forma columnada pero sin ajuste total. Permite una mayor libertad en el diseño.

-29-

Modos de trabajo: (Seleccione SQl Select)

El modo de trabajo define como se trabajara con el Origen de Datos. Existen 5 tipos de modos de trabajo. Modo Quick Select

Sql Select

Query

External

Stored Procedure

Power Builder 9.0

Descripción Nos presenta las tablas en forma gráfica, y solo permite las sentencias ordinarias de SQL (Sort y Criteria). La primera para sentencia sirve para poder ordenar por el campo específico y la segunda sentencia para indicar registros a mostrar dependiendo de un valor condicional (Ejemplo: 0 then //almacenamos en la variable busca la siguiente sentencia busca="Nomv like '" + trim(sle_1.text) + "%' " //contamos el número de filas del control DW nf=dw_1.rowcount() //realizamos la busqueda de la sentencia ya antes almacenada r=dw_1.find(busca,1,nf) // preguntamos si se ha obtenido un valor mayor a cero // si este fuera el caso entonces significa que ha encontrado // uno o varios valores en la busqueda (dependiendo de la sentencia) if r>0 then //marcamos y nos posicionamos en la fila encontrada dw_1.selectrow(0,false) dw_1.selectrow(r,true) dw_1.scrolltorow(r)

Power Builder 9.0

-35end if end if Paso 7.- Codificar en el control sle_1, evento modify(), lo siguiente STRING cad // la funcion Trim suprime los blancos cad = "Sbas " + trim(ddplb_1.text) + " " + trim(sle_2.text) dw_2.setfilter(cad) dw_2.filter() Paso 8.- Codificar en el cb_1, evento clicked(), lo siguiente int r r=dw_1.getrow() dw_1.selectrow(0,false) dw_1.selectrow(r,true) Script a Nivel de la Aplicación: // Profile Venta SQLCA.DBMS = "ODBC" SQLCA.AutoCommit = False SQLCA.DBParm = "Connectstring='DSN=venta'" //nos conectamos con la Base de Datos connect; //preguntamos si ha ocurrido un error en la conexión If Sqlca.Sqlcode0 then Messagebox ("Error de Conexión",Sqlca.SqlErrText) Halt else //abrimos la ventana 1 de nuestro proyecto open(ventana01) end if Esta conexión se puede traer desde el entorno de la BDD

Power Builder 9.0

-36-

Clic en el siguiente icono y obtendremos la siguiente

ventana

Clic en el boton Edit…. Clic en la siguiente pestaña Obtendremos la siguiente vista

Power Builder 9.0

-37-

Copie el contenido en la aplicación. Lugo proceda a ejecutar el programa

DataWindow Retrieval Arguments con Campos Calculados Aplicación. Mostrar las Facturas por cada vendedor, se ingresa por teclado el código del vendedor. Con las Tablas: Vendedor y Facturas, elaborar el siguiente DataWindow: Paso 1.- Seleccionar el tipo Tabular en el DataWindow. Paso 2.- Abrir las tablas Facturas y Vendedor, luego seleccione los campos que necesite en la consulta como se observa a continucación:

Paso 3.- Del menú de opciones seleccionar Design, luego seleccionar Retrieval Arguments.

Power Builder 9.0

-38-

Colocar la variable receptora, a través de esta variable ingresará un código y procederá há realizar la búsqueda en el DataWindow.

Nombre de la Variable

Tipo de dato que recibirála variable

Paso 4.- En la opción Where seleccionar el campo para realizar la condición con la variable definida anteriormente, la variable debe ser precedida por dos puntos(:Var) Observe el grafico Luego Pulse ctrl. + W

Power Builder 9.0

-39-

Paso 5.- El estilo Tabular mostrará 3 secciones de trabajo que son: 1. Header1 (cabecera). 2. Detail (detalle). 3. Summary (donde se muestran los campos totales).

1

2

3

Cada campo tiene un conjunto de propiedades que se muestran en la parte lateral derecha, dar forma a la presentación de la consulta moviendo las cabeceras y etiquetas de cada campo de la siguiente manera:

Power Builder 9.0

-40-

Para ver como esta saliendo el diseño puede comprobarlo mediante la opción Row del menú principal y seleccionando Retrieve, para ello le pedirá ingresar un código de vendedor. Paso 6.- Completar los campos de comisión, comisión total y pago total a través de las opciones del menú principal: Insert – submenu Control – opcion Compute Field.

Power Builder 9.0

-41Al seleccionar esta opción Computed Field , llevar el cursor en la posición donde desea colocar el calculo de la comisión (Detail), luego mostrara la ventana de Modify Expresión donde colocara la expresión para la comisión , para facilitar la edición de esta expresión haga un Clic en los campos mostrados en Columns. Codificar la siguiente sentencia, para determinar la comisión del empleado, si tipo de empleado es en tonces su comisión será del 8 %, de lo contrario será el 5%.

Paso 7.- Cambie de nombre en name (compute_1 nombre por defecto, por Comision)

Ampliar la sección resumen, para colocar el total del campo calculado comisión y pago total.

Power Builder 9.0

-42Para la suma del comisión marcar el campo calculado comisión, similar al Paso 6 Insert Control- Elegir Sum, entonces autómicamente mostrara el campo sumado en name colocar el nombre (Tcom).

Para el calculo pago total, de forma similar seleccionar el paso anterior seleccionar Insert-Control-Computed Field y editar la siguiente expresión.

Luego complete las etiquetas, para mostrar la objeto DataWindow final.

Grabarlo como Data01.

Power Builder 9.0

-43Paso 8.- Luego Inserte un formulario o ventana para colocar el DataWindow, la presentación final sera:

Grabar la ventana con el nombre de Ventana01 Paso 9.- Codificar los scripts: - En la ventana, evento open(), codifique lo siguiente: Dw_1.SettransObject(Sqlca) Sle_1.text = Sle_1.setfocus() - En el control sle_1, evento modify(), codifique lo siguiente: String Cad Cad=Trim(Sle_1.text) If Dw_1.Retrieve(Cad) =0 Then // Sino se recupera ninguna fila MessageBox( Error , Código no existe, verificar ,information!) End if

En la aplicación hacer la conexión con la BDD // Profile Venta SQLCA.DBMS = "ODBC" SQLCA.AutoCommit = False SQLCA.DBParm = "Connectstring='DSN=venta" connect;

Power Builder 9.0

-44If Sqlca.Sqlcode0 then Messagebox ("Error de Conexión",Sqlca.SqlErrText) Halt else open(ventana01) end if

Mantenimiento de una BDD Utilizar la tabla vendedor agregando los campos feing (fecha de ingreso) y grado (grado de estudios). Realizar también las validaciones correspondientes en cada campo: Paso 1.- crear una función a nivel de la aplicación (file-new-project-Function)

Power Builder 9.0

-45-

Paso 2.- Crear el DataWindow estilo FreeForm de la tabla vendedor y realizar las validaciones respectivas en cada campo, aunque es opcional dependiendo del proyecto que este elaborando.

Observe como se incorpora la función en el campo a nivel de columnas, specificaciones, si desea una área más amplia hacer doble click en Validation Expresión. Al campo grado editarlo como un combo:

1. 2. 3. 4.

Seleccione dicho campo y en propiedades seleccionar la pestaña EDIT. En tipos de estilos existen seis tipos, seleccione DropDownListBox. Marca el check Always Show Arrow, para que tenga el aspecto de un combo. Ingrese 3 valores en la grilla (code Table) como se muestra en el gráfico.

Power Builder 9.0

-46-

5. Ademas dar formato de fecha y formato monetario a los campos: fecha de ingreso y sueldo básico; en la misma propiedad Edit pero seleccionado EDIT MASK en Style Type.

Paso 3.- Diseñar el siguiente Formulario: Nombre de la Ventana: Ventana02

Power Builder 9.0

-47-

Nombre de la Ventana: Ventana03

Script Open for aplicación // Profile Venta SQLCA.DBMS = "ODBC" SQLCA.AutoCommit = False SQLCA.DBParm = "Connectstring='DSN=venta" connect; If Sqlca.Sqlcode0 then Messagebox ("Error de Conexión",Sqlca.SqlErrText) Halt else open(ventana02) end if

Script clicked for pb_pri Dw_1.Scrolltorow(1) Dw_1.Setfocus()

Power Builder 9.0

-48Script clicked for pb_ant Dw_1.ScrollPriorRow() Dw_1.Setfocus() Script clicked for pb_Sgte Dw_1.ScrollNextRow() Dw_1.Setfocus() Script clicked for pb_Ult long nf nf=dw_1.rowcount() dw_1.scrolltorow(nf) dw_1.setfocus() Script clicked for Cb_Nuevo Int Nf long nf nf=dw_1.insertrow(0) dw_1.scrolltorow(nf) dw_1.setfocus() dw_1.setcolumn("codv") cb_graba.enabled=true Script clicked for Cb_graba int res res=dw_1.update() if res=1 then commit using sqlca; //cd_recupera.enabled=false else rollback using sqlca; end if cb_recupera.triggerevent(clicked!) cb_graba.enabled=false End if Script clicked for Cb_Anula long nf nf=dw_1.getrow() if nf>0 then dw_1.deleterow(nf) dw_1.update() dw_1.scrolltorow(1) end if cb_recupera.triggerevent(clicked!) cb_anula.enabled=false Script clicked for Cb_Recupera Dw_1.Retrieve()

Power Builder 9.0

-49cb_graba.enabled=false cb_recupera.enabled=false Script clicked for Cb_Busca open(ventana03) Script clicked for Cb_Recupera dw_1.setfilter("") dw_1.filter() dw_1.setsort("#1 A") dw_1.sort() dw_1.retrieve() cb_graba.enabled=false Script clicked for Cb_Salir Halt

Paso 4.- En la ventana 03 codificar los siguientes script Script Load for Ventana03 sle_1.text="" sle_1.setfocus() Script Modify for sle_1 string cad long nf nf=ventana02.dw_1.getrow() cad="codv = '" + trim(sle_1.text) + "'" ventana02.dw_1.setfilter(cad) ventana02.dw_1.filter() if ventana02.dw_1.rowcount()=0 then ventana02.dw_1.setfilter("") ventana02.dw_1.filter() ventana02.dw_1.setsort("#1 A") ventana02.dw_1.sort( ) ventana02.dw_1.scrolltorow(nf) messagebox("Error","Código no existe" + string(nf)) else close(ventana03) ventana02.cb_graba.enabled=true ventana02.dw_1.setfocus() ventana02.dw_1.setcolumn(1) end if

Power Builder 9.0

-50-

Elaboracion de una factura

Tablas Básicas para la elaboración de la factura

Los Script para cada evento 1.- W_Factura Open dw_1.settransobject(sqlca) dw_fac.Settransobject(Sqlca) dw_1.retrieve(" ") Cb_Nueva Clicked int f select max(Nfac) into :xfac from fac_cab; if isnull(xfac) then

Power Builder 9.0

-51xfac=0 end if xfac++ dw_1.reset() f=dw_fac.insertrow(0) dw_fac.scrolltorow(f) dw_fac.setitem(f,1,string(xfac,"000000")) dw_fac.setitem(f,3,today()) dw_fac.setcolumn(2) dw_1.setfocus() A nivel de Dw_1 (detalle factura elaborar el siguiente evento)

En Event Id Seleccionar Pbm_dwnkey Dw_1

Tecla (Keycode Key,UnsignedLong Keyflags)

if keydown(keyf2!) then int f f=dw_1.insertrow(0) dw_1.scrolltorow(f) dw_1.setfocus() int m m=dw_1.getitemnumber(1,"maxitem") if isnull(m) then m=0 end if m++ dw_1.setitem(f,"item",m) dw_1.setitem(f,"nfac",string(xfac,"000000")) open(w_pro) end if Cb_Borrar Clicked //Borrar Item int fila fila=dw_1.getrow()

Power Builder 9.0

-52if fila>0 then dw_1.deleterow(fila) dw_1.update() end if Cb_Totaliza Clicked dec tot,igv,neto tot=dw_1.getitemnumber(1,"totgen") igv=tot*0.18 ; neto=tot+igv st_venta.text=string(tot,"##,###.00") st_igv.text=string(igv,"#,###.00") st_neto.text=string(neto,"###,###.00") Cb_Graba Clicked //Compleatar los campos para La tabla Fac_Cabe dw_fac.setitem(dw_fac.getrow(),"impor",dec(st_venta.text)) dw_fac.setitem(dw_fac.getrow(),"igv",dec(st_igv.text)) dw_fac.setitem(dw_fac.getrow(),"neto",dec(st_neto.text)) int r r=dw_fac.Update() if r=1 then commit; else Rollback; end if // Grabacion del detalle Factura r=dw_1.update() if r=1 then Commit; Else Rollback; End if // Actualizar La tabla Stock int Fila,xcan String Xcod For Fila=1 to Dw_1.Rowcount() Xcod=Dw_1.GetItemString(fila,"codpro") Xcan=Dw_1.GetItemNumber(Fila,"can") Update Fac_deta Set Stock = Stock - :Xcan Where Codpro= :Xcod; Next Commit; Dw_pro Activate ( en la ventana de consulta de productos) sle_1.setfocus() dw_1.retrieve() Dw_pro Open dw_1.settransobject(sqlca)

Power Builder 9.0

-53-

Dw_1

Tecla(Keycode Key, UnsignedLong KeyFlags)

int r dec precio if key=keyenter! then r=dw_1.getrow() cad=dw_1.getitemstring(r,1) precio=dw_1.getitemNUmber(r,"puni") W_factura.dw_1.setitem(W_factura.dw_1.getrow(),"codpro",cad) W_factura.dw_1.setitem(W_factura.dw_1.getrow(),"puni",precio) W_factura.dw_1.setcolumn(4) close(parent) end if if key=keyescape! then dw_1.setfilter("") dw_1.filter() sle_1.text="" sle_1.setfocus() end if Sle_1

Modified

string criterio criterio=" upper(Despro) Like '"+upper(sle_1.text)+"%'" dw_1.setfilter(criterio) dw_1.filter() dw_1.setfocus() dw_1.selectrow(1,true)

Power Builder 9.0

-54-

Aplicacion Considerando que tenemos el mantenimiento de la tabla cursos, al realizar un click en el boton Alumnos, se carga la ventana de alumnos, pero solo se mostrarán los datos de aquellos alumnos de dicho curso (Fila activa de la Tabla Cursos). Para la Ventana alumnos elaboramos: Un Objeto DataWindow Data Source SQL Select Style Tabular Nombre Dw_Notas Luego seleccione todos los campos a utilizar. Especificamos el argumento de recuperacion de curso.

Paso 1.- Del Menu de Design seleccione la Opcion Retrival Arguments. Paso 2.- En name seleccione cualquier nombre de variable de tipo igual al campo utilizado como argumento. Paso 3.- En la Ficha Where se debe especificar, la relacion entre el campo y la variable

Power Builder 9.0

-55Paso 4.- Luego especifique La creacion del Obejeto Estructura, utilizando (Structure painter) del Menu Principal(Power Bar) File – New – pestaña PB Object - Structure. En la venta de dialago, especifique: Codigo_Curso de tipo String Nombre_Curso de Tipo de string Se debe almacenar como S_curso Paso 5.- En la ventana alumnos (VenAlumnos) Declarar una variable de instancia String vi_codcur Paso 6.- Codificación de eventos para obtener la lista de los alumnos por curso. Se realiza a traves de un boton de la ventana Cursos VenCursos (Mantenimiento de cursos). La ventana VenAlumnos debe recibir el parametro (código del curso), que se envia desde la Ventana VenCursos. Paso 7 Script -Clicked for Cb_alumnos (W_cursos) long nf S_curso Origen //asignamos una variable llamada origen de tipo S_curso nf=dw_1.getrow() origen.codcur=dw_1.getitemstring(nf,"cur_cod") origen.nomcur=dw_1.getitemstring(nf,"cur_des") openwithparm (VenAlumnos,origen) paso 8 Script -Open for (VenAlumnos) S_curso Destino Destino=message.powerobjectparm vi_codcur=Destino.codcur this.title=vi_codcur + " - " + Destino.nomcur cb_graba.enabled=false dw_1.SETTRANSOBJECT(sqlca) dw_1.retrieve(vi_codcur) Dw_Alumnos.SetRowFocusIndicator(Hand!) if dw_1.rowcount()0 then dw_1.modify("alu_pro.color='0~t if(alu_pro>=11,RGB(0,0,255),RGB(255,0,0))'") Paso 9.- Codificacion de los botones de desplazamiento

Power Builder 9.0

-56Script clicked for pb_pri Dw_1.Scrolltorow(1) Dw_1.Setfocus() Script clicked for pb_ant Dw_1.ScrollPriorRow() Dw_1.Setfocus() Script clicked for pb_Sgte Dw_1.ScrollNextRow() Dw_1.Setfocus() Script clicked for pb_Ult Int nf Nf=dw_1.RowCount() Dw_1.Scrolltorow(Nf) Dw_1.Setfocus() Script clicked for Cb_Nuevo long nf nf=dw_1.insertrow(0) dw_1.scrolltorow(nf) dw_1.setitem(nf,"cur_cod",vi_codcur) dw_1.setitem(nf,"alu_nota1",0) dw_1.setitem(nf,"alu_nota2",0) dw_1.setitem(nf,"alu_nota3",0) dw_1.setitem(nf,"alu_nota4",0) dw_1.setitem(nf,"alu_pro",0) dw_1.setfocus() cb_graba.enabled=true Script clicked for Cb_graba long res res=dw_1.update() if res=1 then commit using sqlca; // cb_graba.enebled=false else rollback using sqlca; end if dw_1.retrieve(vi_codcur) dw_1.scrolltorow(1) Script clicked for Cb_Anula long nf nf=dw_1.getrow() if nf>0 then dw_1.deleterow(nf)

Power Builder 9.0

-57dw_1.scrolltorow(1) end if

Script clicked for Cb_Recupera dw_1.retrieve(vi_codcur) cb_graba.enabled=false Script RowFocusChanged For Dw_1 // evento que se activa cada vez que se enfoca un nuevo registro long nfilas,fact nfilas=dw_alumnos.Rowcount() fact= dw_alumnos.GetRow() st_mensaje1.text="Fila" +String(fact)+" de"+string(nfilas) Script ItemFocusChanged For Dw_alumnos // Este evento se dispara cada vez que nos situamos en un nuevo campo o columna int nc nc=dw_1.getcolumn() st_mensaje2.text="Columna " + string(nc) Script ItemChanged For Dw_1 /* se activa cada vez que realizamos cualquier cambio dentro de la ventana */ dec nota,n1,n2,n3,n4,pro dw_1.modify("alu_pro.color='0~t if(alu_pro>=11,RGB(0,0,255),RGB(255,0,0))'") if pos("alu_nota1,alu_nota2,alu_nota3,alu_nota4",dwo.name)>0 then // dwo.name es equivalente a GetColumnName() devuelve el nombre if isnumber(dw_1.gettext()) then //si no es numerico, mantiene el foco el el campo nota=dec(dw_1.gettext()) if nota20 then messagebox("Error","El dato debe estar en un rango de 0 a 20") return 1 end if if dw_1.accepttext()=1 then n1=dw_1.getitemnumber(row,"alu_nota1") // row equivale Getrow() n2=dw_1.getitemnumber(row,"alu_nota2") n3=dw_1.getitemnumber(row,"alu_nota3") n4=dw_1.getitemnumber(row,"alu_nota4") pro=(n1+n2+n3+n4)/4 dw_1.setitem(row,"alu_pro",pro) Cb_graba.enabled=true end if end if

Power Builder 9.0

-58Script ItemError For Dw_alumnos Return 1

PRIMERA PRÁCTICA CALIFICADA 1. Especificaciones de la aplicación Creadas las tablas con sysbase SQL Anywhere para almacenar las facturas de los clientes • • • •

Productos (Clave principal cod_Prod) Clientes (Clave principal Cod_Cli) Facturas (Clave Principal Num_Fact, Clave Foranea Codigo del Cliente) Deta_Factura (Clave Principal Num_fact,Cod_prod Clave Foranea Num_fact Clave Foranea Cod_Prod)

Relacione las tablas con sus respectivas Claves. Los registros para cada tabla se adjunta a este proyecto.

2.- La aplicación debe permitir realizar las operaciones: 2.1 Tener una ventana principal (VMain) con las siguientes opciones: 2.1.1 Mantenimiento de la Tabla Clientes (VManClientes) 2.1.2 Mantenimiento de la tabla Productos (VManProductos) 2.1.3 Consulta de Facturas.

3.- En la consulta de Facturas por Clientes, se debe tener una ventana con los siguientes controles DataWindow: (VConFacturas) 3.1 3.2 3.3

3.4 3.5

DW_Clientes (estilo Grid), donde solo debe mostrar los campos (Cod_cli,Nom_Cli,Tel,Ruc) Dw_Facturas (estilo Tabular), donde debe mostrar las columnas (Num_fact, Fecha, Subtotal, Igv, total). En esta última ventana debe solo extraer las facturas de un cliente seleccionado, Obteniendo al final un resumen (suma del campo total) para ver cual es su total general. La ventana (VConFacturas) tendra un boton Detalle donde permite visualizar en otra ventana( VFacDetalle) el detalle de la factura Ventana (VFacDetalle) debe mostrar todos los campos de la tabla detalle factura con el campo descripcion del producto (tabla producto).

Power Builder 9.0

-59Nota.- El diseño de la aplicación es a criterio del alumno. Su presentacion y estetica también se considera.

Aplicación Cuenta Corriente Esta aplicación permite generar un campo en este caso es el número de movimiento y actualizar el saldo en el archivo ahorro.

Power Builder 9.0

-60Script open for aplicación: // Profile conexion con sqlserver SQLCA.DBMS = "MSS Microsoft SQL Server 6.x" SQLCA.Database = "BDBANCO" SQLCA.ServerName ="(local)" SQLCA.LogId = "SA" SQLCA.AutoCommit = False SQLCA.DBParm = "" CONNECT; if sqlca.sqlcode0 then messagebox("Error de coneccion",sqlca.sqlerrtext) halt end if open(Venahorro) Script modified for Sle_1 int r,vnro,fila,xnro,nf string cad cad=trim(sle_1.text) dw_1.settransobject(sqlca) r=dw_1.retrieve(cad) if r0 then xnro=integer(dw_2.getitemstring(1,"maximo"))+1 else xnro=1 end if */ select count(numcta) into :xnro from movimiento where numcta=:cad; if sqlca.sqlcode=0 then xnro++ end if fila=dw_2.insertrow(0) dw_2.scrolltorow(fila) dw_2.setitem(fila,"numcta",cad) dw_2.setitem(fila,"nummov",xnro) dw_2.setcolumn(3) dw_2.setfocus() end if

Power Builder 9.0

-61Script Itemchanged for Dw_2 string nomcol int fila dec mon char tp fila=this.getrow() nomcol=this.getcolumnname() mon=this.getitemnumber(fila,"monto") choose case Lower(nomcol) case "tipoopr" //tp=trim(this.getitemstring(fila,"topr")) //valor obtenido en el datawindow tp=this.gettext() // valor que se da en el edit control nsal=dw_1.getitemnumber(dw_1.getrow(),"saldo") if upper(tp)="D" then nsal=nsal + mon else nsal=nsal - mon end if this.object.tsaldo.text=string(round(nsal,2)) end choose scrpt Clicked for Cb_graba int r string cad cad=dw_1.getitemstring(dw_1.getrow(),"numcta") // Actualizacion en el archivo ahorro //modo 1 //dw_1.setitem(1,"saldo",nsal) //dw_1.update() //modo 2 Update ahorro set saldo = :nsal where numcta=:cad; r=dw_2.update() if r=1 then commit; else rollback; end if // borrar el contenido de los control data window dw_2.reset() dw_1.reset()

Power Builder 9.0

-62-

SEGUNDA PRÁCTICA CALIFICADA Se requiere un programa para automátizar las ventas de pasajes aéreos, para ello se cuenta con las siguientes tablas: Base de datos Vuelos DB Tablas: Rutas

tipo

Long

Cod_rut Nom_rut Pago_cho

Char Varchar Numeric

Viajes

tipo

Nro_via Cod_rut Fsal_via Hsal_via Cos_via Nro_vac Cod_cho Flag

Char Char Date Time Numeric Numeric Char Char

Pasajeros

tipo

Nbol Nrovia Nom_pas Tipo Pago

Numeric Char Varchar Char Numeric

Chofer Cod_cho Nom_cho Sba_cho

tipo Long Char 4 Varchar 25 Numeric 6 1

4 15 6 1 Long 6 4

6 1 3 4 1 Long 5 6 25 1 6 1

Texto Codígo de ruta Nombre de ruta pago por viaje al chofer Texto Nro de Viaje Codigo de ruta Fecha de salida Hora de Salida Costo del Viaje Nro de vacantes Codigo del Chofer S(si) N(no) viaje realizado Texto Numero de Boleto Nro de Viaje Nombre del pasajero (E)studiante (A)dulto (N)iño

Texto Codigo del Chofer Nombre del chofer Sueldo basico

Realizar: 1.- Colocar las claves principales y foráneas para cada tabla, cuando relacione cada tabla conformar la opcion: • Delete any Dependent Rows (CASCADE), por ejmplo cuando se anule un registro en viaje anule a todos los pasajeros. 2.- La aplicación debe permitir realizar el manteniemiento para cada tabla

Power Builder 9.0

-633.- En el mantenimiento del archivo de viajes debe tener un botón de Pasajeros de tal modo que permita visualizar solo los pasajeros de ese viaje en otra ventana (adicion, anulacion y modificacion), en la adicion se trae el campo nro de viaje y costo de la ventana anterior(ambos de estilo tabular), el pasajero tendra un descuento de acuerdo al tipo : Estudiante Niño Adulto • • • •

30% 50% 0%

El nro de viaje se genera AA9999 los primeros 2 digitos año del sistema y los cuatro últimos digitos un correlativo. Para el DataWindow de viaje el campo codígo de ruta y codígo del chofer debe incorporarse un DataWindow para cada uno, para que su selección sea más explícita. El número de Boleto se genera a partir del 00001 de manera correlativa Luego de cada adicion de pasajeros las vacantes en ese viaje debe disminuirse en la unidad.

4.- Consulta de viajes por chofer, debe mostrarse en una ventana. La lista de Choferes, al seleccionar uno de ellos, deberá presentar los viajes realizados, al final debe aparecer su pago total

5.- Consulta de viajes por rutas. En esta ventana; al elegir una ruta (en un control DataWindow) debe mostrar todos los viajes programados (en otro control data) al seleccionar el viaje debe mostrar la relacion de pasajeros. 6.- Consulta de viajes por fecha, en esta ventana se debe ingresar dos fechas: fecha inicial y final en caso que solo se ingrese la fecha inicial se debe tomar hasta la última fecha de viaje, mostrando en un control DataWindow las siguientes columnas: NroViaje,Nombre de ruta , Nombre del pasajero y tipo

7.- Elabore un menú para relacionar cada opcion con las tareas pedidas. 8.- El diseño y presentación de cada ventana es de acuerdo a criterio del alumno. Nota Eeste trabajo es para 2 semanas de laboratorio, sera revisado cada avance. •

Trabajo en forma grupal, solo se tomara en cuenta a los alumnos regulares.

Power Builder 9.0

-64-

Objetos de Usuario Tema Custom Clases Visuales Por ejemplo se desea realizar el siguiente evento de usuario:

Paso 1.- En New seleccionar PB OBJECT

Seleccionar Custom Visual El cual va a mostrar una pantalla similar a la window estándar, para diseñar su plantilla: Realizar el siguiente diseño: tiene dos controles etiquetas, uno encima de otro, uno con fondo blanco y el otro con fondo azul, una tercera etiqueta para ver el porcentaje del proceso.

ST_2 Power Builder 9.0

ST_1

-65St_pg (para ver el porcentaje)

Codificación del uo_progreso Declare Instancia Int Ir_alfinal Functions Uf_iniciar(int vini) return none ir_alfinal=vini st_2.width=0 Functions Uf_avance(integer valor) return none Int porcen, ancho Real razon Ancho=st_1.width Razon=valor / ir_alfinal Porcen=round(razaon*100,0) St_pg.text= string(valor)+ de +string(ir_alfinal)+ + string(porcen)+

Power Builder 9.0

-66-

Clases Crear las siguientes clases de Objetos de usuarios 1.- Los Visuales a) Un Progres según se muestra en la figura

b) Un control para desplazamiento de paginas y de Impresión c) Colocando una caja de texto que permita adicionar o restar días a una fecha a través de Vscroll d) Colocando dos listBox , al desplazarse en uno de ellos que se encuentre sincronizado e) Pasando una cadena a una etiqueta que dicha cadena sea tipo Blink f) Colocando un cuadro texto que solo acepte letras y espacios en Blanco.

2.- No Visuales a) Una función que permita sumar una columna numérica, se pasa como valor el control DataWindow y el número de columna. b) Un evento que permita centrar una ventana, se pasa como valor una ventana. c) Una función que permita generar un código, se pasa como dato un control DataWindow, el valor inicial del código, el código puede empezar con una letra o número. d) Un evento que permita cambiar el color de una columna de un control DataWindow, pasar como dato el control DataWindow y el número de columna.

Power Builder 9.0

-67-

Capitulo de Graficos en Power Builder Es un estilo de un DataWindow, pero también se pueden efectuar gráficos a través del control graph.

Pasos para crear un grafico.

Power Builder 9.0

-68-

Aplicación Se tiene las Base de Datos (EMPRESA), que tiene las siguientes tablas:

Realizar el grafico como se muestra en la figura. Para ello Diseñar los siguientes DataWindow Datawindow Datag01 Datag02 Datag03

Tablas Departamento y Salarios Departamento y Salarios Empleado

Campos Nom_dept, Cod_emp Cod_emp,sueldo

Category

Values

Nom_dept

Count(Cod_emp)

Cod_emp

Sueldo

Todos

Data01 y Data02 son estilos graficos, mientras Data03 estilo freeform

Power Builder 9.0

Retrieval Arguments

Nom_dept Cod_emp

-69-

Aplicar las propiedades correpondientes a los mencionados DataWindows Al hacer Click en un empleado mostrará una ventana con sus datos personales, como se muestra en el ejemplo

Laura Moreno Lee

Power Builder 9.0

-70Script open for Aplicacion // Coneccion con la Base de Datos // Profile conexion con sqlserver SQLCA.DBMS = "MSS Microsoft SQL Server 6.x" SQLCA.Database = "Empresa" SQLCA.ServerName ="(local)" SQLCA.LogId = "SA" SQLCA.AutoCommit = False SQLCA.DBParm = "" connect; open(VenEstadistica1) Script open for ventana VenEstadistica1 dw_1.settransobject(sqlca) dw_2.settransobject(sqlca) dw_1.retrieve() Script Cliked for dw_1 (VenEstadistica1) GrObjectType ClickedObject string nomdept,nomgraf="gr_1" int v_series,v_categoria ClickedObject=This.ObjectAtPointer(nomgraf,v_series,v_categoria) if ClickedObject=Typedata! or ClickedObject=TypeCategory! then nomdept= this.CategoryName(nomgraf,v_categoria) string cad cad="EMPLEADOS EN "+nomdept dw_2.modify("gr_1.title='"+cad+"' ") dw_2.retrieve(nomdept) Else Messagebox(parent.title,"Click en departamento para ver empleados") end if

Script Cliked for dw_2 (VenEstadistica1) GrObjectType ClickedObject string nomgraf='gr_1' int v_series,v_categoria string id_emp ClickedObject=This.ObjectAtPointer(nomgraf,v_series,v_categoria)

Power Builder 9.0

-71if ClickedObject=Typedata! or ClickedObject=TypeCategory! then id_emp= this.CategoryName(nomgraf,v_categoria) openwithparm(venfichae,id_emp) Else Messagebox(parent.title,"Click en departamento para ver Detalle de empleado") end if Open for VenFichaEmp string cod dw_1.settransobject(sqlca) cod=message.stringparm dw_1.retrieve(cod) Script Cliked for cb_1 (VenFichaEmp) close(venfichae)

Aplicación Formularios MDI y Objetos de Usuario. En esta aplicación se ha utilizado Ventanas con herencia (inheret) donde la ventana w_sheet-dw es la ventana padre que contiene funciones definidas por el usuario Creación de Objetos de Usuario empleado para contener controles de tipo general que seran empleados, por las otras ventanas descendientes (w_alumnos y W_cursos); ademas se han elaborado las funciones de objeto usuario con la finalidad de generalizar las tareas de los eventos. 1.- Para crear un objeto usuario siga los pasos del profesor: a) b) c) 2.- Crear un menu (menu01) con todas las opciones descritas:

Power Builder 9.0

-722.1 Crear un menu02 heredado(inheret) del menu01 3.- Elaborar las siguientes Ventanas: 3.1 Ventana W_frame aquel que va a contener el menu01 y el objeto de Usuario Creado en el punto 1 3.2 Ventana W_sheet_dw ventana padre que contiene un control datawindow(dw_1) sin relacionar a ningun objeto datawindow 3.3 Ventana W_alumno heredado de la ventana (W_sheet_dw) y relacionarlo con el menu02 3.4 Ventana W_cursos heredado de la ventana (W_sheet_dw) y relacionarlo con el menu02 4.- Creacion de eventos: 4.1 Anivel de objeto de Usuario Variable Instancia Datawindow idw_udo 4.2 Funcion de Objeto de usuario Uf_setdw(datawindow dw_parm) idw_udo=dw_parm 4.3 Script Clicked for Cb1 idw_udo.scrolltorow(1) idw_udo.setfocus() 4.4 Script Clicked for Cb2 idw_udo.scrollnextrow() idw_udo.setfocus() 4.5 Script Clicked for Cb3 idw_udo.scrollPriorRow() idw_udo.setfocus() 4.6 Script Clicked for Cb4 int nf nf=idw_udo.rowcount() idw_udo.scrolltorow(nf) idw_udo.setfocus() 4.7 Script Clicked for Cb5 idw_udo.retrieve() idw_udo.triggerEvent(rowfocusChanged!) idw_udo.setfocus() 4.8 Script Clicked for Cb6 int nf nf=idw_udo.insertrow(0) idw_udo.scrolltorow(NF) idw_udo.setfocus()

Power Builder 9.0

-734.9 Script Clicked for Cb7 int r r=idw_udo.update() if r=1 then commit; else rollback; end if 5.- Eventos para la ventana W_frame Script Risize for w_frame int

nX, nY, nWidth, nHeight

/*nX = WorkSpaceX (this) nY = WorkSpaceY (this) */ nWidth = this.WorkSpaceWidth( ) nHeight = this.WorkSpaceHeight( ) nHeight = nHeight - (uo_1.y + uo_1.height) nHeight = nHeight - mdi_1.MicroHelpHeight mdi_1.Move (0, uo_1.y + uo_1.height) mdi_1.Resize (nWidth, nHeight + 4) 6.- Evento para la ventana W_sheet_dw declarar la Variable Instancia w_frame iw_frame integer i_row 6.1

Script activate for w_sheet_dw iw_frame.uo_1.uf_setdw(dw_1)

6.2 Script open for w_sheet_dw iw_frame=This.parentwindow() dw_1.settransobject(sqlca) 6.3 Script Ue_cascada for w_sheet_dw iw_frame.arrangeSheets(cascade!) 6.4

Script Ue_Horizontal for w_sheet_dw iw_frame.arrangeSheets(tile!)

6.5 Script Ue_totalw for w_sheet_dw iw_frame.arrangeSheets(layer!) 6.6 Script Ue_vertical for w_sheet_dw iw_frame.arrangeSheets(tilehorizontal!) 6.7 Script rowfocuschanged for dw_1

Power Builder 9.0

-74i_row=this.getrow() if i_row 0 THEN MessageBox("Caution", "SyntaxFromSQL caused these errors: " + ERRORS) RETURN END IF dw_1.Create( dwsyntax_str, ERRORS) IF Len(ERRORS) > 0 THEN MessageBox("Caution", "Create cause these errors: " + ERRORS) RETURN END IF dw_1.settransobject(sqlca) dw_1.retrieve()

Envio de e-m@il Si se tiene instalado el Outlook se debe de configurar

ddlb_destinatario Power Builder 9.0

-80-

sle_titulo

mle_text o

lb_archivos

Pb_1

Pb_1 Clicked string docname, named integer value value = GetFileOpenName("Selecione Fichero", docname, named, "DOC", & + "Text Files (*.TXT),*.TXT, All Files (*.*),*.*") IF value = 1 THEN lb_archivos.additem(docname) end if cb_1

Clicked

mailSession mailReturnCode mailMessage mailFileDescription string ls_filename string int boolean

mSes mRet mMsg mAttach[] ls_ret, ls_syntax, ls_name, ls_open_pathname, ls_attach_name='c:\pbl\error.psr' li_index, li_nret, li_nrecipients, li_nfile lb_noerrors

mSes = create mailSession mRet = mSes.mailLogon ( mailNewSession! )

Power Builder 9.0

-81If mRet mailReturnSuccess! Then MessageBox ("Mail Logon", 'Return Code mailReturnSuccess!' ) mSes.mailLogoff() return End If SetPointer(HourGlass!) mMsg.notetext = mle_texto.text // Mensaje a adjuntar ficheros a enviar long tt,hay hay=lb_archivos.totalitems() for tt=1 to hay mAttach[tt].FileType = mailAttach! mAttach[tt].PathName = lb_archivos.text(tt) mAttach[tt].FileName = lb_archivos.text(tt) mAttach[tt].Position = len(mMsg.notetext) - 1 mMsg.AttachmentFile = mAttach next mMsg.Recipient[1].name = ddlb_destinatario.text mMsg.Subject=sle_titulo.text SetPointer(HourGlass!) mRet = mSes.mailsend ( mMsg ) mSes.mailLogoff()

// destinatario // subject

APIS DE EN POWER Declaración de Funciones externas

Mostrar la Barra de estado

Ver el Nombre de la maquina Descripción Las funciones externas son escritas en diferentes lenguajes y almacenadas en librerias dinamicas con la extensión DLL, antes de utilizar estas funciones primero debe declararse definiendo su tipo. Global external functions Estos son disponibles en toda la aplicación Local external functions Estos son definidos a nivel de ventana u objeto de usuario External function syntax Usa la siguiente sintaxis:

Power Builder 9.0

-82{ access } FUNCTION returndatatype name ( { { REF } datatype1 arg1, ..., { REF } datatypen argn } ) LIBRARY "libname" ALIAS FOR "extname" Paso1.- Primero declarar las funciones externas ya sea a través del visor Apis o digitarlos directamente

cb_ocultar

Clicked

Long HBar // Esconder la barra de tareas HBar = FindWindowExA( 0, 0, "Shell_TrayWnd", ls_Null ) ShowWindow( HBar, 0 )

Ubicar la clase dentro de la DLL

Cb_Mostrar

Clicked

onstant Long SW_SHOW = 5 // Nombres del shell de Windows que deberiamos buscar String ls_Null Long HBar, ll_HDeskTop HBar = FindWindowExA( 0, 0, "Shell_TrayWnd", ls_Null ) ShowWindow( HBar, SW_SHOW ) // Muestra el escritorio ll_HDeskTop = FindWindowExA( 0, 0, "Progman", ls_Null ) ShowWindow( ll_HDeskTop, SW_SHOW )

Cb_maquina

Clicked

long ll_ret string ls_ComputerName ,ls_UserName ulong BufferLength = 250 ll_ret = GetComputerNameA(ls_ComputerName, BufferLength) messagebox("maquina",ls_ComputerName)

Power Builder 9.0

-83-

Control Trreview y procesos de arrastre Aplicación: Cambio de empleados en otro departament

Control Tv_1 Objetos a emplear: 1.-estructura (stremp)

2.-Datawindow estilo tabular datemp tablas:Departamento, empleado y salarios ( de la BDD empresa utilizado anteriormente) campos:Departamento(id_dep,,nom_dep), empleado(cod_emp,nom_emp,ape_emp) Retrieval argument id_dep (codigo del departamento)

Power Builder 9.0

-84-

Descripción de los eventos BeginDrag.-ocurre cuando el usuario presiona el boton izquierdo del mouse, sobre una etiqueta en el control treeview iniciándose el arrastre. DragWithin Ocurre cuando el usuario esta arrastrando con el control. DragDrop.- Ocurre cuando el usuario arrastra un objeto sobre el control y libera el boton del mouse y deja el objeto. Itempopulate.-Ocurre cuando un item delTreview llena los demas items hijos Occurs when the user presses the left mouse button on a label in the TreeView control and begins dragging. Ven01 open idsource=create Datastore idsource.dataobject="Datemp" idsource.settransobject(sqlca) triggerEvent("ue_populate") ven01

ue_populate()

TreeviewItem Vitem SetPointer(hourglass!) Vitem.Label="Marketing" Vitem.Data= "D001" vitem.PictureIndex=1 vitem.SelectedPictureIndex=7 Vitem.children=true tv_1.insertitemlast(0,vitem) Vitem.Label="logistica" Vitem.Data= "D002" vitem.PictureIndex=2 tv_1.insertitemlast(0,vitem) Vitem.Label="Ventas" Vitem.Data= "D003" vitem.PictureIndex=3 tv_1.insertitemlast(0,vitem) Vitem.Label="Contabilidad" Vitem.Data= "D004" vitem.PictureIndex=4 tv_1.insertitemlast(0,vitem) Vitem.Label="Administracion" Vitem.Data= "D005" vitem.PictureIndex=5 tv_1.insertitemlast(0,vitem)

Power Builder 9.0

-85tv_1 begindrag(long handle ) return long //Inicio del Arrastre TreeViewItem t_Source Getitem(Handle,T_source) ST_9.TEXT=STRING(T_Source.Level) if T_Source.Level2 then This.Drag(cancel!) Else //Almacena el Handle del item antes de comenzar el arrastre parent(departament) r_dragsource=handle r_dragparent=finditem(parentTreeItem!,handle) end if

tv_1

dragdrop(dragobject source, long handle) return long

int li_pend long li_newitem treeviewitem lt_target,lt_source,lt_parent,lt_new if getitem(r_droptarget,lt_target)=-1 then return if getitem(r_dragsource,lt_source)=-1 then return getitem(r_dragparent,lt_parent) if messagebox("Transferir empleado","Desea Transferir "+lt_source.label+" form "+lt_parent.label+& "~n hACIA "+ lt_target.label+"?",question!,yesno!)=2 then return li_pend=upperBound(vecEmp)+1 messagebox("lt_source",string(lt_source.data)) messagebox("lt_target",string(lt_target.data)) VecEmp[li_pend].vemp=lt_source.data VecEmp[li_pend].vdep=lt_target.data deleteitem(r_dragsource) //setnull(lt_source.itemhandle) li_newitem=insertitemSort(r_droptarget,lt_source) selectitem(li_newitem)

tv_1

dragwithin(dragobject source, long handle) return long

treeviewitem t_over long a,b if getitem(handle,t_over)=-1 then // si estamos en el primer nivel setDropHighlight(0) r_droptarget=0 return end if

Power Builder 9.0

-86if t_over.level=1 then // resalta el departamento que va ser arrastrado if handler_droptarget then setDropHighlight(handle) r_droptarget=handle else setDropHighlight(0) r_droptarget=0 end if else r_droptarget=finditem(parenttreeItem!,handle) if r_droptargetr_dragparent then setDropHighlight(r_droptarget) else setDropHighlight(0) r_droptarget=0 end if end if tv_1 itempopulate(long handle) int nf,cf TreeViewItem tvidep, tvemp if getitem(Handle,tvidep)=-1 then return setPointer(hourglass!) idsource.reset() nf=idsource.retrieve(tvidep.data) tvemp.pictureIndex=6 tvemp.selectedpictureIndex=6 tvemp.children=false for cf=1 to nf tvemp.label=idsource.object.empleado_nom_emp[cf] +","+idsource.object.empleado_ape_emp[cf] tvemp.data=idsource.object.empleado_cod_emp[cf] insertitemsort(handle,tvemp) next

Power Builder 9.0

-87-

.

Trucos en Power 01 - Cambiar el color alternativamente en las filas de una datawindow Para que las filas de una DataWindow tengan el aspecto de papel de impresora añade la siguiente expresión en el color de la banda de detalle. IF (Mod(GetRow(),2)=0, RGB(0,255,0), RGB(255,255,255)) Estos colores de fondo no aparecerán cuando se imprima el informe. Si quieres imprimir este efecto tienes que añadir un rectangulo o un campo de texto en blanco detrás de las columnas de detalle y poner la expresión anterior. 02.- Ordenar una DropDown Datawindow pulsando la cabecera Una característica que tienen los DataWindow es que te permiten ordenar las columnas pulsando en la cabecera de la columna. La función Sort te permite especificar el nombre de la columna o el número de columna por la cual se ordenará el dataWindow. Funciona para la mayoría de columnas y tipo de datos, pero no funciona bien cuando la columna pertenece a una DropDown DataWindow El problema es que la función Sort ordena los datos por detrás de la DataWindow no los valores que el usuario está viendo en pantalla. Para solucionar esto puedes usar el comando LookUpDisplay. Esta función devuelve la visualización de los datos de la columna. Poniendo el nombre de la columna dentro de esta función y usándola para ordenar los datos, el usuario podrá ver los datos ordenados. Por ejemplo: dw_1.SetSort( 'LookUpDisplay( dept_id )' ) dw_1.Sort() 03.- Ordenar un DataWindow pulsando en la cabecera Por ejemplo: El nombre de la cabecera de la columna tiene que tener el mismo nombre que en la base de datos y acabado en '_t' Nombre de la columna: 'emp_id' = Nombre de la cabecera: 'emp_id_t' Sólo se puede ordenar por una columna cada vez. String ls_old_sort, ls_column

Power Builder 9.0

-88Char lc_sort /* Chequea cuando el usuario hace click en la cabecera */ IF Right(dwo.Name,2) = '_t' THEN ls_column = LEFT(dwo.Name, LEN(String(dwo.Name)) - 2) /* Guarda la última ordenación, si hubiera alguna*/ ls_old_sort = dw_1.Describe("Datawindow.Table.sort") /* Chequea cuando préviamente se ordenó una columna y en la que se hace click actualmente es la misma o no. Si es la misma, entonces se chequea el orden de ordenación del ordenamiento anterior (A - Ascendente, D - Descendente) y lo cambia. Si las columnas odenadas no son las mismas, las ordena en orden ascendente. */ IF ls_column = LEFT(ls_old_sort, LEN(ls_old_sort) - 2) THEN lc_sort = RIGHT(ls_old_sort, 1) IF lc_sort = 'A' THEN lc_sort = 'D' ELSE lc_sort = 'A' END IF dw_1.SetSort(ls_column+" "+lc_sort) ELSE dw_1.SetSort(ls_column+" A") END IF dw_1.Sort() END IF 04.- Determinar el uso de memoria de una datawindow A menudo es necesario saber cuanta memoria esta usando una DataWindow o datastore para prevenir un "out of memory" o para facilitar la depuración. Cuando se sabe la memoria que se está usando, el proceso de datos o la recuperación de los mismos, puede ser detenida cuando se llegue a un límite máximo. Para deteminar la cantidad de memoria virtual que está usando una DataWindow o datastore, se usa el atributo Storage. Este puede ser invocado desde cualquiera de de los dos métodos siguientes: Notación DOT: dw_control.Object.DataWindow.Storage Describe: dw_control.Describe("DataWindow.Storage") En ambos caso devuelve una cadena con el valor utilizado en bytes. 05.- Pasar el contenido de una Datawindow a otra ventana Llamar a la segunda ventana pasándole como referencia la DataWindow: OpenWithParm( w_window, dw_1 ) Entonces en el evento OPEN de la ventana escribe: datastore lds_parm lds_parm = Message.PowerObjectParm

Power Builder 9.0

-89dw_1.DataObject = lds_parm.DataObject lds_parm.ShareData(dw_1) Y en el evento CLOSE: dw_1.ShareDataOff() 06.- Copiar datos de un Grid Datawindow al portapapeles de Windows Los DataWindow grid tienen la capacidad única de dejarte seleccionar un número de celdas en el DataWindow (o la totalidad de filas o de columnas de datos). Este ejemplo ilustra como proporcionar soporte de copia para los datos seleccionados desde un DataWindow de tipo grid. Asumimos que un nuevo elemento de menu llamado m_SpecialCopy ha sido añadido bajo el menu m_Edit . Añadir el siguiente código para determinar si el elemento Special Copy deberá ser habilitado. GraphicObject lg_Object DataWindow lg_DW string ls_SelectedText lg_Object = GetFocus () CHOOSE CASE TypeOf (lg_Object) CASE DataWindow! lg_DW = lg_Object This.m_SpecialCopy.Enabled = (lg_DW.dwDescribe ("datawindow.selected.data") '') END CHOOSE ============================== Codifica lo siguiente en m_SpecialCopy o en un evento disparado por m_SpecialCopy): graphicobject lg_Object datawindow lg_DW lg_Object = GetFocus () CHOOSE CASE TypeOf (lg_Object) CASE DataWindow! lg_DW = lg_Object ClipBoard (lg_DW.dwDescribe ("datawindow.selected.data")) END CHOOSE 07.- Permitir al usuario añadir solo columnas clave nuevas A veces es deseable impedir a los usuarios que editen columnas clave una vez que las han creado. Esto se puede hacer fácilmente usando expresiones de columna en el DataWindow. Añade esta expresión en el campo "background color" de la columna clave. Esto cambiará el color de la columna y mostrará que la columna no es editable: if ( IsRowNew(), 1090519039, Long(Describe("Datawindow.Color"))) Añade esta expresión en el campo "protect" de la columna clave: if ( isRowNew(), 0, 1) Si usas el modo consulta (query mode) utiliza esta expresión:

Power Builder 9.0

-90- Background Colour if ( Describe("Datawindow.QueryMode") = "yes" or isRowNew(), 1090519039, ong(Describe("Datawindow.Color"))) - Protect if ( Describe("Datawindow.QueryMode") = "yes" or isRowNew(), 0, 1) 8.- Cargar un array con los nombres de cada columnas en una Datawindow int colNum, numCols string colName[] numCols = Integer(dw_control.Describe("Datawindow.Column.Count")) FOR colNum = 1 TO numCols // Obtenemos el nombre de la columna con la función Describe colName[colNum] = dw_control.Describe("#" + String(colNum) + ".name") NEXT 9.- Saber que ficheros hay en un directorio Puedes usar las API's de Windows: Function ulong GetWindowsDirectoryA (ref string dirtext, ulong textlen) library "KERNEL32.DLL" ls_dir = space(lul_size) lul_rc = GetWindowsDirectoryA(ls_dir, lul_size) La cual retornará una cadena conteniendo todos los ficheros que hay en ese directorio, o también puedes usar la función DirList() listboxname.DirList ( filespec, filetype {, statictext } ) La cual mostrará un ListBox con los ficheros que coincidan con el criterio especificado. Si no quieres que el usuario vea estos ficheros, tienes que hacer el ListBox invisible. 10.- Obtener una lista de las impresoras instaladas Por Réal Gagnon En este truco abriremos un listbox con una lista de las impresoras instaladas: string printers[] int rtn, i, nbPrinters rtn = RegistryKeys("HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Print\Pri nters", printers) nbPrinters = UpperBound(printers) FOR i = 1 TO nbPrinters lb_1.addItem(printers[i]) NEXT 11.- Detectar la versión de PowerBuilder string ls_PBver environment env GetEnvironment(env) ls_PBver = string(env.pbmajorrevision) + '.' + string(env.pbminorrevision) + '.' + string(env.pbfixesrevision)

Power Builder 9.0

-9112.- Obtener el último día del mes Se coge una fecha, se incrementa el mes, se cambia el día por "01" y entonces restamos 1: int li_retdays,ld_previousMonthLastDay,li_month,li_year date ad_date, ld_newdate ad_date= today() li_month = Month(ad_date) li_year = year(ad_date) IF li_month < 12 THEN li_month ++ ELSE li_month = 1 li_year ++ END IF // construimos una fecha nueva ld_newdate = date(li_year,li_month,1) // extraemos el último día del mes anterior ld_previousMonthLastDay = day(relativedate(ld_newdate, -1)) 13.- Realizar un "Mouse Over" sobre un componente Suponte que tienes un Static Text sobre una ventana. Cuando el puntero del ratón pasa por encima, el color del texto del Static Text cambia a color rojo. Cuando el puntero del ratón sale del Static Text, el color del texto es negro. [Evento mousemove de la ventana] // Simplemente para visualizar algo st_1.text = string(xpos) + ", " + string(ypos) IF xpos >= st_1.X AND (xpos = st_1.y AND (ypos
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF