Sei sulla pagina 1di 54

-1POWERBUILDER 9.0 Ing. Alberto Moreno C. Universidad Nacional de Ingenieria Power Builder 9.

0 -2CONTENIDO Entorno del PowerBuilder Propiedades de controles. Funciones de cadena, numricas y fechas. Aplicacin 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. Aplicacin elaboracin de un factura. Estructura de datos y OpenWithParm.

Objetos de usuario, visuales y no visuales. Grficos 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 :am_alberto@hotmail.com La frase debo hacer algo resuelve mas problemas que la frase hay que hacer algo Power Builder 9.0 -3Que es Power Builder? Es una herramienta de desarrollo de aplicaciones grficas, principalmente para el desarrollo de aplicaciones Cliente/Servidor de N capas. Antes de empezar a desarrollar cualquier aplicacin se debe crear: a) Un espacio de trabajo Workspace, que asignara la extensin ( *.pbw) b) Una aplicacin que esta ligado a una librera o biblioteca (*.pbl) Power Builder 9.0

-4Template Application .- es cuando se abre una nueva aplicacin pero con una plantilla de trabajo Existing Application .- Para abrir una aplicacin que se encuentra en otra versin del power. Power Builder 9.0 -5CAPITULO 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 posicin 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 posicin, 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 ningn tem Syntax objectname.SelectItem (itemnumber) Power Builder 9.0 -8Controls ListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controls ejemplo ddlb_software.Selecitem(0) // ningn tem es seleccionado lb_software.SelectItem(5) // resalta el item 5 TOTALITEMS Determina el nmero 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 mltiple seleccin 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 -10FUNCIONES DE CADENA. ASC Obtiene el cdigo ASCII correspondiente, de un carcter de tipo cadena. ejemplo : Asc( ) // retorna 65 CHAR Retorna el carcter correspondiente al cdigo ASCII String XS XS=Char(42) // retorna * FILL retorna una cadena con una longitud determinada del carcter especificado. ejemplo Fill( ,5) // ***** LEFT Retorna un nmero 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 minsculas Ejemplo: String Xcad Xcad = Lower( CLAUDIA ) // Retorna claudia MATCH Determina si la cadena contiene un patrn particular de caracteres. Ejemplo: Power Builder 9.0 -11Esta sentencia retorna TRUE si el texto contiene una letra Mayscula: Match(sle_Id.Text, "[A-Z]") MID Extrae caracteres a partir de una Posicin Ejemplo: String Xcad Xcad = Mid( Claudia ,4,2) // retorna ud POS retorna la posicin 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 maysculas Ejemplo: Power Builder 9.0 -12Cad= especializacin // devuelve ESPECIALIZACION. FUNCIONES FECHA DAY Retorna el da de una fecha. Ejemplo: Dia = String(Day(2001-04-21)) // retorna 21, convertimos el dato de tipo nmerico a cadena, con la funcion string. DAYNAME Retorna el nombre de da de la semana Ejemplo: Cad = DayName(2001-04-22) // retorna Sunday. DAYNUMBER Retorna el nmero de da de la semana Ejemplo: Cad = string(DayNumber(2001-04-22)) // Retorna 1 DAYAFTER Devuelve los das que hay entre dos fechas Ejemplo Cad = DayAfter(2001-04-22, 2001-04-18) // retorna -4 HOUR Retorna un entero que corresponde al nmero 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 nmero 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 nmero de da. Ejemplo: Date Fecha Fecha=Relativedate(today(), -25) // la fecha hace 25 das respecto a la fecha actual. SECOND Retorna el nmero 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 ao de una fecha. Ejemplo Num = year(today()) Power Builder 9.0 -14FUNCIONES NUMRICAS ABS obtiene el valor absoluto de un nmero Ejemplo: Num= (abs(-34) // retorna 34 CEILING Obtiene el menor nmero entero que es menor o igual al nmero 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 nmero elevado a la potencia. Ejemplo: Deci = String(exp(1)) // 2.718 FACT Obtiene el factorial de un nmero Ejemplo:

Num= Fact(4) // retorna 24 MAX Retorna el mayor de dos nmeros Ejemplo: Num = Max(-4,-7) // retorna -4 MIN Menor entre dos nmeros Ejemplo: Num = Min(4,7) // retorna 4 MOD Obtiene el residuo de dos nmeros 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 nmero entero aleatorio entre 1 y el nmero especificado Power Builder 9.0 -15Ejemplo: Num = Rand(10) // devuelve un nmero comprendido entre el 1 a 10 RANDONMIZE(0) Randomize Regenera o inicializa el nmero aleatorio generador. Ejemplo: Randomize(0) ROUND Obtiene el nmero entero comprendido en un nmero decimal Ejemplo: Num = Round(3.598,0) Power Builder 9.0 // devuelve 4 -16Aplicaciones DFU (Funciones Defindas por el Usuario). Pueden ser a nivel de Ventana o a nivel de toda la aplicacin Ejemplo: Ingresar un monto en soles y lo convierta a letras Em_1 control de edicion Mle_1 Contol de mltiple 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 ms simple hacer la conversin trabajando con vectores Paso 1.- Declarar a nivel de instancia (Pestaa 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 funcin. Tipo de dato de retorno. Nombre de la funcin. Tipo de datos que se va a referenciar, en este caso ser un valor.

Tipo de dato del valor. En la ventana de cdigo, 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 cdigo: 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 -19FUNCIONES APLICADAS A CONTROL DATA WINDOWS Estructura de un Datawindows Edit Control Datawindows.- Es una carateristicas ms 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 especficamente de una base de datos al usuario final; DataWindows pueden ser pantalla de consulta, formato de entrada de datos, reportes de impresin, etc. Un objeto DataWindow debe ser insertado con una ventana regular, en todo diseo de un DataWindow forman parte dos objetos. 1.- DataWindow Object.- que es diseado con el DataWindow Painter. 2.- DataWindow Control.- Es un control donde se insertar el DataWindows Object. Power Builder 9.0 -20Funciones principales de un Datawindows SetTransObject Hace que un control DataWindow use un objeto de transaccin especificado por el programador. El objeto de transaccin proporciona la informacin nesecesaria para comunicarse con la Base de Datos. Retorna -1 si ha ocurrido un error. Sintaxis Dwn. Settransobject(Transaccin) Argument Description Dwn El nombre del Control data window, con el cual se desea usar un objeto de transaccin. Transaccin Nombre del Objeto de transaccin, por defecto es SQLCA. Generalmente se establece el objeto de transaccin en el evento Open de la ventana que contiene el control DataWindow. En resumen el SettransObject(SQLCA) asocia el objeto transacin 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 nmero de la fila que se ha aadido, 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 nmero 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 -22SetItem 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. Tambin en vez del nombre de campo, puede ser el nmero 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 numrico, 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 posicin se encuentre en la fila nmero 3. Power Builder 9.0 -23Int 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 clasificacin con un previo criterio de seleccin 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 nmero 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 nmero total de la fila, se hace scroll a la ltima fila. RowCount Obtiene el nmero 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 -25ScrollToPriorRow 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 nmero 8 Dwn.Update() // actualiza la base de datos enlazada DeletedCount Retorna el nmero 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 -26Utilizacin 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 aplicacin. Uso de filtros (Find S etFIlter) A B A A.- Seleccionamos en el control sueldo el carcter de condicin e ingresamos un valor numrico que representa al sueldo bsico, luego presionamos clic en el boton Mostrar y tendremos los requeridos. B.- Se ingresa solo los primeros caracteres del nombre, si huviera algn 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 continuacin: FACTURA VENDEDOR Paso 2.- Disear el DataWindow - (File-New-DataWindow) - Se elige el estilo de Presentacin: (Elegir el Tipo Tabular) Power Builder 9.0 Null(no) -28Presentacin Composite Freeform Graph Grid Group Label Rich Text Tabular Power Builder 9.0 Descripcin Utiliza como presentacin, un reporte previamente creado. La presentacin es libre, cada campo se muestra en una lnea distinta. Muy utilizado para el ingreso de datos. Disea un grfico dependiendo de una consulta, esta debe contener datos relacionados. Disea una malla de datos en forma columnada, y cada

columna con una justificacin completa. Disea listado por agrupacin de campos. Muy utilizado para reportes de resumen de informacin. El diseo es de etiquetas, donde Ud. podr elegir el tipo de etiqueta de las prediseadas, en papel continuo o separado, y otras opciones. Permite definir una carta con combinacin de campos del Origen de Datos fijado. Se pueden utilizar todas las caractersticas del formato de texto RTF. Presenta el Origen de Datos en forma columnada pero sin ajuste total. Permite una mayor libertad en el diseo. -29Modos 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 Descripcin Nos presenta las tablas en forma grfica, y solo permite las sentencias ordinarias de SQL (Sort y Criteria). La primera para sentencia sirve para poder ordenar por el campo especfico 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 nmero 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 Aplicacin: // 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 conexin If Sqlca.Sqlcode0 then Messagebox ("Error de Conexin",Sqlca.SqlErrText) Halt else //abrimos la ventana 1 de nuestro proyecto open(ventana01) end if Esta conexin se puede traer desde el entorno de la BDD Power Builder 9.0 -36Clic en el siguiente icono y obtendremos la siguiente ventana Clic en el boton Edit. Clic en la siguiente pestaa Obtendremos la siguiente vista Power Builder 9.0 -37-

Copie el contenido en la aplicacin. Lugo proceda a ejecutar el programa DataWindow Retrieval Arguments con Campos Calculados Aplicacin. Mostrar las Facturas por cada vendedor, se ingresa por teclado el cdigo 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 continucacin: Paso 3.- Del men de opciones seleccionar Design, luego seleccionar Retrieval Arguments. Power Builder 9.0 -38Colocar la variable receptora, a travs de esta variable ingresar un cdigo y proceder h realizar la bsqueda en el DataWindow. Nombre de la Variable Tipo de dato que recibirla variable Paso 4.- En la opcin Where seleccionar el campo para realizar la condicin 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 -39Paso 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 presentacin 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 diseo puede comprobarlo mediante la opcin Row del men principal y seleccionando Retrieve, para ello le pedir ingresar un cdigo de vendedor. Paso 6.- Completar los campos de comisin, comisin total y pago total a travs de las opciones del men principal: Insert submenu Control opcion Compute Field. Power Builder 9.0 -41Al seleccionar esta opcin Computed Field , llevar el cursor en la posicin donde desea colocar el calculo de la comisin (Detail), luego mostrara la ventana de Modify Expresin donde colocara la expresin para la comisin , para facilitar la edicin de esta expresin haga un Clic en los campos mostrados en Columns. Codificar la siguiente sentencia, para determinar la comisin del empleado, si tipo de empleado es en tonces su comisin 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 seccin resumen, para colocar el total del campo calculado comisin y pago total. Power Builder 9.0 -42Para la suma del comisin marcar el campo calculado comisin, similar al Paso 6 Insert Control- Elegir Sum, entonces autmicamente 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 expresin. 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 presentacin 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 , Cdigo no existe, verificar ,information!) End if En la aplicacin hacer la conexin 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 Conexin",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 tambin las validaciones correspondientes en cada campo: Paso 1.- crear una funcin a nivel de la aplicacin (file-new-project-Function) Power Builder 9.0 -45Paso 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 funcin en el campo a nivel de columnas, specificaciones, si desea una rea ms amplia hacer doble click en Validation Expresin. Al campo grado editarlo como un combo: 1. 2. 3. 4. Seleccione dicho campo y en propiedades seleccionar la pestaa 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 grfico. Power Builder 9.0 -465.

Ademas dar formato de fecha y formato monetario a los campos: fecha de ingreso y sueldo bsico; en la misma propiedad Edit pero seleccionado EDIT MASK en Style Type. Paso 3.- Disear el siguiente Formulario: Nombre de la Ventana: Ventana02 Power Builder 9.0 -47Nombre de la Ventana: Ventana03 Script Open for aplicacin // Profile Venta SQLCA.DBMS = "ODBC" SQLCA.AutoCommit = False SQLCA.DBParm = "Connectstring='DSN=venta" connect; If Sqlca.Sqlcode0 then Messagebox ("Error de Conexin",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","Cdigo 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 -50Elaboracion de una factura Tablas Bsicas para la elaboracin 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 -53Dw_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 -54Aplicacion 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 mostrarn 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 pestaa 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.- Codificacin 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 (cdigo 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 PRCTICA CALIFICADA 1. Especificaciones de la aplicacin 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 aplicacin 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 diseo de la aplicacin es a criterio del alumno. Su presentacion y estetica tambin se considera.

Aplicacin Cuenta Corriente Esta aplicacin permite generar un campo en este caso es el nmero de movimiento y actualizar el saldo en el archivo ahorro. Power Builder 9.0 -60Script open for aplicacin: // 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 -62SEGUNDA PRCTICA CALIFICADA Se requiere un programa para automtizar las ventas de pasajes areos, 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 61 Long 6 4 61 3 4 1 Long 5 6 25 1 61 Texto Codgo 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)io Texto Codigo del Chofer Nombre del chofer Sueldo basico Realizar: 1.- Colocar las claves principales y forneas 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 aplicacin debe permitir realizar el manteniemiento para cada tabla Power Builder 9.0 -633.- En el mantenimiento del archivo de viajes debe tener un botn 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 Nio Adulto 30% 50% 0% El nro de viaje se genera AA9999 los primeros 2 digitos ao del sistema y los cuatro ltimos digitos un correlativo. Para el DataWindow de viaje el campo codgo de ruta y codgo del chofer debe incorporarse un DataWindow para cada uno, para que su seleccin sea ms explcita. El nmero 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 diseo y presentacin 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 -64Objetos 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 estndar, para disear su plantilla: Realizar el siguiente diseo: 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) Codificacin 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 -66Clases Crear las siguientes clases de Objetos de usuarios 1.- Los Visuales a) Un Progres segn se muestra en la figura b) Un control para desplazamiento de paginas y de Impresin c) Colocando una caja de texto que permita adicionar o restar das a una fecha a travs 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 funcin que permita sumar una columna numrica, se pasa como valor el control DataWindow y el nmero de columna. b) Un evento que permita centrar una ventana, se pasa como valor una ventana. c) Una funcin que permita generar un cdigo, se pasa como dato un control DataWindow, el valor inicial del cdigo, el cdigo puede empezar con una letra o nmero. d) Un evento que permita cambiar el color de una columna de un control DataWindow, pasar como dato el control DataWindow y el nmero de columna. Power Builder 9.0 -67Capitulo de Graficos en Power Builder Es un estilo de un DataWindow, pero tambin se pueden efectuar grficos a travs del control graph. Pasos para crear un grafico. Power Builder 9.0 -68Aplicacin Se tiene las Base de Datos (EMPRESA), que tiene las siguientes tablas: Realizar el grafico como se muestra en la figura. Para ello Disear 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 -69Aplicar 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) Aplicacin Formularios MDI y Objetos de Usuario. En esta aplicacin se ha utilizado Ventanas con herencia (inheret) donde la ventana w_sheet-dw es la ventana padre que contiene funciones definidas por el usuario Creacin 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 -80sle_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 Declaracin de Funciones externas Mostrar la Barra de estado Ver el Nombre de la maquina Descripcin Las funciones externas son escritas en diferentes lenguajes y almacenadas en librerias dinamicas con la extensin DLL, antes de utilizar estas funciones primero debe declararse definiendo su tipo. Global external functions Estos son disponibles en toda la aplicacin 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 travs 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 -83Control Trreview y procesos de arrastre Aplicacin: 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

-84Descripcin de los eventos BeginDrag.-ocurre cuando el usuario presiona el boton izquierdo del mouse, sobre una etiqueta en el control treeview inicindose 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 aade la siguiente expresin 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 aparecern cuando se imprima el informe. Si quieres imprimir este efecto tienes que aadir un rectangulo o un campo de texto en blanco detrs de las columnas de detalle y poner la expresin anterior. 02.- Ordenar una DropDown Datawindow pulsando la cabecera Una caracterstica que tienen los DataWindow es que te permiten ordenar las columnas pulsando en la cabecera de la columna. La funcin Sort te permite especificar el nombre de la columna o el nmero de columna por la cual se ordenar el dataWindow. Funciona para la mayora de columnas y tipo de datos, pero no funciona bien cuando la columna pertenece a una DropDown DataWindow El problema es que la funcin Sort ordena los datos por detrs de la DataWindow no

los valores que el usuario est viendo en pantalla. Para solucionar esto puedes usar el comando LookUpDisplay. Esta funcin devuelve la visualizacin de los datos de la columna. Poniendo el nombre de la columna dentro de esta funcin y usndola 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' Slo 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 ordenacin, si hubiera alguna*/ ls_old_sort = dw_1.Describe("Datawindow.Table.sort") /* Chequea cuando prviamente 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 ordenacin 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 depuracin. Cuando se sabe la memoria que se est usando, el proceso de datos o la recuperacin de los mismos, puede ser detenida cuando se llegue a un lmite mximo. 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 mtodos siguientes: Notacin 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 pasndole 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 nmero 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 aadido bajo el menu m_Edit . Aadir el siguiente cdigo 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 aadir 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 fcilmente usando expresiones de columna en el DataWindow. Aade esta expresin 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"))) Aade esta expresin en el campo "protect" de la columna clave: if ( isRowNew(), 0, 1) Si usas el modo consulta (query mode) utiliza esta expresin: 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 funcin 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 tambin puedes usar la funcin 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 Ral 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 versin 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 da del mes Se coge una fecha, se incrementa el mes, se cambia el da 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 da 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 ratn pasa por encima, el color del texto del Static Text cambia a color rojo. Cuando el puntero del ratn 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 (