Manual Power Builder

Embed Size (px)

Citation preview

-1-Power Builder 9.0POWERBUILDER 9.0Ing. Alberto Moreno C.Universidad Nacional de Ingenieria-2-Power Builder 9.0CONTENIDO Entorno del PowerBuilder Propiedades de controles. Funciones de cadena, numricas y fechas. Aplicacin con Arreglos y Funciones de Usuario DFU. Objeto DataWindow. Aplicaciones con DataWindowFilter 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 :[email protected]"La frase debo hacer algo resuelve mas problemas que la frase hay que hacer algo-3-Power Builder 9.0Que es Power Builder?Es una herramienta de desarrollo de aplicaciones grficas, principalmente para eldesarrollo 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)-4-Power Builder 9.0TemplateApplication .- es cuando se abre una nueva aplicacinpero con una plantillade trabajoExistingApplication.-Paraabrirunaaplicacinqueseencuentraenotraversindelpower.-5-Power Builder 9.0CAPITULO DE FUNCIONESFunciones del Control:CLEAR()Borra el contenido de un objetoSyntaxobjectname.Clear ( )ControlsDataWindow, EditMask, MultiLineEdit, SingleLineEdit, RichTextEdit,DropDownListBox, DropDownPictureListBox, OLE controls, and OLEStorageobjectsDELETEITEM()Borra un item desde una lista de valoresSyntaxobjectname.DeleteItem ( index )ControlsListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controlsEjemplo:Esta sentencia borra el primer item seleccionado en Lb_productosinteger Xindex// Variable de tipo enteroXindex = lb_software.SelectedIndex()// Capturamos la posicin del cursor en lalistalb_ software.DeleteItem(Xindex) // Eliminamos el item seleccionadoADDITEM()Adiciona nuevos items para una lista de valoresSyntaxobjectname.AddItem ( item )ControlsListBox and DropDownListBox controlsEjemplo:integer Xrow // Variable de tipo entero-6-Power Builder 9.0string s // Variable de tipo cadenas = "Insertar Item"// Almacenamos un valor a la variableXrow = lb_software.AddItem(s) // Insertamos el valor de la variable (s) en ellistboxFINDITEM()Busca un texto dentro de una lista de valores, retorna un valor 1 si no encuentra el datoa buscar.Syntaxobjectname.FindItem (text, index)ControlsListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controlsEjemploInserta en un control listbox el siguiente contenido:integer XIndexXIndex = lb_software.FindItem("Power Builder", 1)En este ejemplo el valor de index ser 6INSERTITEMInserta un item dentro de una lista de valoresSyntaxobjectname.InsertItem (item, index)ControlsListBox and DropDownListBox controls-7-Power Builder 9.0Respecto al ejemplo anterior:Lb_software.InsertItem("Apache,6)// inserta el item en la sexta posicin, es decir en el item 6SELECTEDTEXTObtiene el texto seleccionado en un control editableSyntaxeditname.SelectedText ( )ControlsDataWindow, EditMask, MultiLineEdit, SingleLineEdit, RichTextEdit,DropDownListBox, and DropDownPictureListBox controlsejemplo: inserta un dropdownpicturelistbox e ingresale como minumo 5 items, en uncontrol, y en el evento que desees ingresa lo siguientestring XubicaXubica = ddlb_software.SelectedText()SELECTITEMEncuentra y resalta un item dentro de una lista.ControlsListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controlsSyntaxa)objectname.SelectItem (item, index)ejemplo:integer XIndexXIndex = lb_software.SelectItem("Power Builder", 2) // si encuentra el texto lo resalta y si no// el valor devuelto es 0b)lobjectname.SelectItem (itemnumber)Resalta el item especificado en la lista, si el valor es cero no se selecciona ningn temSyntaxobjectname.SelectItem (itemnumber)-8-Power Builder 9.0ControlsListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controlsejemplo ddlb_software.Selecitem(0)// ningn tem es seleccionado lb_software.SelectItem(5) // resalta el item 5TOTALITEMSDetermina el nmero total de itemsSyntaxlistcontrolname.TotalItems ( )ControlsListBox, DropDownListBox, PictureListBox, DropDownPictureListBox, and ListViewcontrolsSTATEDetermina si un elemento de la lista esta resaltada.SyntaxListboxname.State ( index )ControlsListBox and PictureListBox controlsejemplo:integer XItemTotal, XItemCountXItemTotal = lb_software.TotalItems( )//Verifica que items esta seleccionadoFOR XItemCount = 1 to XItemTotalIFlb_software.State(XItemCount) = 1 THEN// Si esta seleccionadoMessageBox("Selected Item", lb_software.text(XItemCount))END IFNEXTSETSTATEResalta un item dentro de una lista solo es aplicable cuando esta lista es de mltipleseleccin esdecir propiedad Multiselect = TRUE-9-Power Builder 9.0Syntaxobjectname.SetState (index, state)ControlsListBox and PictureListBox controlsejemplolb_software.SetState(6, TRUE)-10-Power Builder 9.0FUNCIONES DE CADENA.ASCObtiene el cdigo ASCII correspondiente, de un carcter de tipo cadena.ejemplo :Asc("A)// retorna 65CHARRetorna el carcter correspondiente al cdigo ASCIIStringXSXS=Char(42)// retorna*FILL retorna una cadena con una longitud determinada del carcter especificado.ejemploFill("*,5) //*****LEFTRetorna un nmero especificado de caracteres comenzado por la izquierdaEjemplo:String XcadXcad = Left("Claudia,3)//ClaLEFTTrim Retorna una copia de una cadena sin los espacios en blanco del ladoizquierdo.Ejemplo:String XcadXcad = LeftTrim(" Claudia)//Retorna "ClaudiaLEN(Cad) Retorna la longitud de una cadenaEjemplo:String XcadXcad = Len("Claudia)//Retorna 7LOWER(Cad) Convierte toda la cadena a minsculasEjemplo:String XcadXcad = Lower("CLAUDIA)//Retorna claudiaMATCH Determina si la cadena contiene un patrn particular de caracteres.Ejemplo:-11-Power Builder 9.0Esta sentencia retorna TRUE si el texto contiene una letra Mayscula:Match(sle_Id.Text, "[A-Z]")MID Extrae caracteres a partir de una PosicinEjemplo:String XcadXcad = Mid("Claudia,4,2)// retorna"udPOSretorna la posicin donde comienza una cadena dentro de otra cadena .Ejemplo:Integer XposXpos = Pos("Power Builder,Bu)//Retorna 7REVERSE(Cad) Cambia el orden de los caracteres de una cadena.EjemploString XrevXrev = Reverse("Hola)//aloHRIGHT(CAD, n) devuelve caracteres a partir de la derechaEjemplo:String XcadXcad = right("Claudia,3) //diaSPACE(N) Inserta espacios en blancoEjemplo:Cad=Space(5)// devuelve " , cinco espacios en blanco.TRIM(Cad)suprimeblancos a ambos extremos de la cadena.Ejemplo:Cad= claudia "// devuelve "claudia, cadena sin espacios en blanco a loscostados.UPPER(cad) Convierte toda la cadena a letras maysculasEjemplo:-12-Power Builder 9.0Cad= "especializacin// devuelve ESPECIALIZACION.FUNCIONES FECHADAY Retorna el da de una fecha.Ejemplo:Dia = String(Day(2001-04-21)) // retorna 21, convertimos el dato de tiponmerico a cadena, con la funcion string.DAYNAME Retorna el nombre de da de la semana Ejemplo:Cad = DayName(2001-04-22)//retorna Sunday.DAYNUMBERRetorna el nmero de da de la semanaEjemplo:Cad = string(DayNumber(2001-04-22)) // Retorna 1DAYAFTER Devuelve los das que hay entre dos fechasEjemploCad = DayAfter(2001-04-22, 2001-04-18) // retorna-4HOURRetorna un entero que corresponde al nmero de horas, que se encuentre en undato detipo horaEjemplo:Hour(19:12:42)//retorna 19.MINUTE retorna los minutosEjemplo:Minute(19:42:13)//retorna 42.MONTHRetorna el nmero correspondiente al mes de una fechaEjemplo:Month(2001-04-22)// retorna 4NOW devuelve laHora del sistema-13-Power Builder 9.0EjemploHora = String(now(),HH:mm:ss) // string(dato,tipo de salida del dato), en estecaso eshora:minuto:segundo.RELATIVEDATERetorna la fecha con respecto a un determinado nmero de da.Ejemplo:DateFechaFecha=Relativedate(today(), -25)// la fecha hace 25 das respecto a la fechaactual.SECOND Retorna el nmero de segundos.Ejemplo:Cad = string(Second(14:13:45)) // retorna 45 expresado en un dato de tipocadena.TODAY Retorna la Fecha y hora del sistemaEjemplo:Cad = string(today(),"DD/MM/YY)// retorna una cadena con la fecha del sistemaen un formato de dd/mm/y yes decir ,12/04/03YEAR Retorna el ao de una fecha.EjemploNum = year(today())-14-Power Builder 9.0FUNCIONESNUMRICASABS obtiene el valor absoluto de un nmeroEjemplo:Num= (abs(-34) // retorna 34CEILING Obtiene el menor nmero entero que es menor o igual al nmero especificadoEjemplo: Donde Deci es una variable de tipo decimalDeci = String(Ceiling(-4.8))//retorna 4COSObtiene el coseno de un nguloel ngulo debe estar en radianesEXP El resultado de un nmero elevado a la potencia.Ejemplo:Deci = String(exp(1))// 2.718FACTObtiene el factorial de un nmeroEjemplo:Num= Fact(4) // retorna 24MAX Retorna el mayor de dos nmerosEjemplo:Num = Max(-4,-7)//retorna -4MINMenor entre dos nmerosEjemplo:Num = Min(4,7)// retorna 4MODObtiene el residuo de dos nmerosEjemplo:Num = Mod(20,7)//retorna 6PI (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-15-Power Builder 9.0Ejemplo:Num = Rand(10)// devuelve un nmero comprendido entre el 1 a 10RANDONMIZE(0) Randomize Regenera o inicializa el nmero aleatorio generador.Ejemplo:Randomize(0)ROUND Obtiene el nmero entero comprendidoen un nmero decimalEjemplo:Num = Round(3.598,0)// devuelve 4-16-Power Builder 9.0AplicacionesDFU (Funciones Defindas por el Usuario).Pueden ser a nivel de Ventana o a nivel de toda la aplicacinEjemplo: Ingresar un monto en soles y lo convierta a letraspor ejemplo si:Funciones a crearEs ms simple hacer la conversin trabajando con vectoresPaso 1.- Declarar a nivel de instancia (Pestaa Instancia)Declare InstanciaString 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"}Em_1 control deedicionMle_1 Contol demltiple lineaF_centenaNum=345Devuelve en letras:Trescientos cuarenta y cimcoF_milF_millNumLetraNumTipo intLetra-17-Power Builder 9.0Paso 2.- Crear las funciones: NumLetras (a nivel de ventana)a)Clic en (Insert) del men principal.b)Clic en (Function).a)Tipo de acceso a la funcin.b)Tipo de dato de retorno.c)Nombre de la funcin.d)Tipo de datos que se va a referenciar, en este caso ser un valor.e)Tipo de dato del valor.En la ventana de cdigo, tipeamos la siguiente estructura:String cad1,cad2Int c,res,d,unic=num/100res= mod(num,100)if c>0 Thenif c=1 and res=0 thencad1="Cien"elsecad1=vec4[c]end ifchoose case rescase 1 to 9cad2=vec1[res]case 11 to 19cad2=vec2[res - 10]case 10, is >=20d=res/10uni=mod(res,10)if uni=0 thencad2=vec3[d]elsecad2=vec3[d]+ " y "+ vec1[uni]end ifend choosereturn cad1 + cad2b a c f d g-18-Power Builder 9.0Funcion milesTipeamos el siguiente cdigo:String cad1,cad2Int res,milmil=num/1000res= mod(num,1000)if mil>0 thenif mil=1 then cad1="Mil " elseCad1=f_centena(mil)+" Mil"end ifif res>0 Thencad2=f_centena(res)end ifreturn cad1 + " " + cad2Procedemos a ejecutar la aplicacion y veremos los resultados.-19-Power Builder 9.0FUNCIONES APLICADAS A CONTROL DATA WINDOWSEstructura de un DatawindowsDatawindows.- Es una carateristicas ms importante del Power Builder. El DataWindowseslaformaenquesusaplicacionespresentanlosdatosdelabasededatosyquizasinclusodatosnoespecficamentedeunabasededatosalusuariofinal;DataWindowspueden 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 unDataWindowforman 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.Edit Control-20-Power Builder 9.0Funciones principales de un DatawindowsSetTransObjectHacequeuncontrolDataWindowuseunobjetodetransaccinespecificadoporelprogramador.Elobjetodetransaccinproporcionalainformacinnesecesariaparacomunicarse con la Base de Datos. Retorna -1 si ha ocurrido un error.Sintaxis Dwn. Settransobject(Transaccin)ArgumentDescriptionDwn ElnombredelControldatawindow,conelcualsedeseausarunobjeto de transaccin.TransaccinNombre del Objeto de transaccin, por defecto es SQLCA.GeneralmenteseestableceelobjetodetransaccineneleventoOpendelaventanaque contiene el control DataWindow.EnresumenelSettransObject(SQLCA)asociaelobjetotransacinconelcontrolDataWindow.Ejemplo:DwnSoftware.settransobject(SQLCA)InsertRowInserta una fila en un DataWindow, Si alguna columna tiene valores por defecto, La fila esinicializada con estos valores, retorna el nmero de la fila que se ha aadido, retorna -1si ha ocurrido un error.Sintaxis Dwn.InsertRow(fila)ArgumentDescripcionDwn El nombre del control DataWindow en el cual se desea insertar unafila.Fila UnenteroLargo(long)queidentificalafilaantesdelacualdeseainsertarunafilanueva.Sielvaloresceroinsertaralfinaldelatabla.Ejemplo:-21-Power Builder 9.0DwnSoftware.InsertRow(0)Retrieve()Recuperatodaslas filas deunatabladelaBDD enuncontrolDataWindow,Siincluyenargumentos, estos son usados por los argumentos de recuperacion de la sentenciaSQLSELECT del objeto DataWindow. Retorna el nmero de filas recuperadas, -1 si ocurre unerror.Sintaxis Dwn.Retrieve({Arg1, Arg2,.})ArgumentDescripcionArg1, Arg2Argumentos de recuperacion, de la tabla de BDDEjemplo:DwnSoftware.Retrieve("C001)SetRowFocusIndicatorEspecifica el indicador visual que identifica la fila actual en un control DataWindow.Sintaxis Dwn.SetRowFocusIndicator (Indicador)IndicadorEl 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.SelectRowSelecciona la fila especificada en el control de un DataWindows.Sintaxis Dwn.SelectRow (Fila, Boolean)Ejemplo:DwnSoftware.SelectRow(0,False) // desactiva la fila anteriorDwnSoftware.SelectRow(15,true) // resalta toda la fila 15-22-Power Builder 9.0SetItemEstableceelvalorenunafilaycolumnaespecificada,unvalordentrodeldatawindow,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 sueldose asigna 670.Tambin en vez del nombre de campo, puede ser el nmero de campo de acuerdo comoha sidoseleccionado en el objeto DataWindow.GetItemStringObtiene datos de tipo cadena de un buffer especificado de un control DataWindow.Sintaxis Dwn.GetitemString (Fila, Columna)EjemploString cadCad=DwnSoftware.GetItemString(3, "sfw_Nombre")Extraeeldatoqueseencuentraenelcamposfw_nombre,enlafila3,dependiendodeltipo de dato que se va extraer tenemos:Dwn.GetitemNumber (Fila, columna) Cuandoel campo es de manera generalnumrico, puede ser real o entero.Dwn.GetitemDecimal (Fila, columna) Cuando el dato a extraer es exclusivamentedecimal 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 delempleado, cuya posicin se encuentre en la fila nmero 3.-23-Power Builder 9.0Int edadDec SbasDate FenacEdad= DwnEmpleado.GetItemNumber(3,"emp_Edad")Sbas= DwnEmpleado.GetItemDecimal(3, "emp_Sbas")Fenac=DwnEmpleado.GetItemDate(3,"emp_Fenac")Nombre del campos en la tabla.GettextObtiene el valor de un control de edicion en la fila y columna actuales, antes que este seaaceptado.Sintaxis dwn.Gettext ()PorejemplosiesteradiobuttonseencuentradentrodelDataWindow,yalseleccionaruna de estas opciones se desea saber su valor seleccionado bastaemplear:String TmonedaTmoneda = DwnSalario.Gettext()SetsortEspecifica, el criterio de ordenamiento para un DataWindow, retorna 1 si tuvo xito y -1 sise encontro un error.Sintaxis Dwn.SetSort (campo1 [A|D])Ejemplo:DwnEmpleado.setsort()Dwn.Sort()-24-Power Builder 9.0Ejecuta la clasificacin con un previo criterio de seleccinSintaxis 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.GetRowRetorna 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 ()SetRowEstablece la fila deseada, mueve el cursor a la fila especificada, pero no hace Scroll en elDataWindow.Sintaxis Dwn.SetRow (Fila)ScrollToRowHace 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 encaso 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.RowCountObtiene el nmero de filas que se encuentran disponibles en un DataWindowSintaxis Dwn.RowCount()ScrollToRowCausa que el control se deslice a la fila especificada, cambiando la fila actual, a donde sele indique.Sintaxis Dwn.Scrolltorow(fila)-25-Power Builder 9.0ScrollToPriorRowSe desliza a la fila previa, sin cambiar la columna activaSintaxis Dwn.ScrollPriorRow(fila)ScrollNextRowSe desliza a la siguiente fila.Sintaxis Dn.ScrollNextRow(fila)DeleteRowSuprimelafilaespecificadadelcontrolDataWindow,seactualizadirectamentelatablaenlazada al control.Sintaxis Dwn.DeleteRow(fila)Si la fila es igual a cero, elimina la fila activa donde se encuentra el puntero, cada vez quese emplee esta sentencia, se tiene que actualizar el DataWindow ejemplo:Dwn.deleteRow(8) // elimina la fila nmero 8Dwn.Update() // actualiza la base de datos enlazadaDeletedCountRetorna el nmero de filas que hayan sido suprimidas desde el control DataWindow peroque todavia no hayan sido actualizadas en la tabla de la BDD asociada.Sintaxis Dwn.DeletedCount()Ejemplo:Long NfNf=Dwn.DeletedCount()UpdateSeenviaalabasededatostodaslasinserciones,eliminacionesyactualizacionesdelcontrol DataWindow, retorna 1 si tuvo xito, -1 si ocurrio un error.Sintaxis Dwn.Update()-26-Power Builder 9.0Utilizacin del DatawindowsElobjetoDataWindowsensinoesdeningunautilidad,sinosevinculaconunDataWindowcontrol.Esteobjeto,esvisualyesposibledeinsertardirectamenteen una ventana; para que pueda ser utilizado por el usuario.Desarrollar la Siguiente aplicacin.Uso de filtros (Find SetFIlter)A.-Seleccionamosenelcontrolsueldoelcarcterdecondicineingresamos unvalornumricoquerepresentaalsueldobsico,luegopresionamosclicenelboton Mostrar y tendremos los requeridos.B.-Seingresasololosprimeroscaracteresdel nombre,sihuvieraalgnregistroquecontengadichoscaracteres,deberresaltarelprimerregistrotalcomoobservamos en el ejemplo.AAB-27-Power Builder 9.0Pasos1.- LaBDDVENTA.DBpuede estarencualquiermotordeBasededato,paraestecasosehaceusodelAnyWheredelSYSBASE(entornodelPowerBuilder)TABLASIngresar datos consistentes en las tablas creadas, como se muestra acontinuacin:FACTURA VENDEDORPaso 2.- Disear el DataWindow - (File-New-DataWindow)- Se elige el estilo de Presentacin: (Elegir el Tipo Tabular)Estructura:Vendedor:CodvChar 4Null(no)Nomv varchar30Sbas Numeric 8,2FacturaNfac char 6Codv char4ImporNumeric 8,2Tipov char 1-28-Power Builder 9.0Presentacin DescripcinComposite Utiliza como presentacin, un reporte previamente creado.Freeform Lapresentacineslibre,cadacamposemuestraenunalneadistinta. Muy utilizado para el ingreso de datos.Graph Diseaungrficodependiendodeunaconsulta,estadebecontener datos relacionados.Grid Diseaunamalladedatosenformacolumnada,ycadacolumna con una justificacin completa.Group Disealistadoporagrupacindecampos.Muyutilizadoparareportes de resumen de informacin.Label Eldiseoesdeetiquetas,dondeUd.podrelegireltipodeetiquetadelasprediseadas,enpapelcontinuooseparado,yotras opciones.Rich Text PermitedefinirunacartaconcombinacindecamposdelOrigendeDatosfijado.Sepuedenutilizartodaslascaractersticas del formato de texto RTF.Tabular PresentaelOrigendeDatosenformacolumnadaperosinajuste total. Permite una mayor libertad en el diseo.-29-Power Builder 9.0Modos de trabajo: (Seleccione SQl Select)El modo de trabajo define como se trabajara con el Origen de Datos. Existen 5 tipos demodos de trabajo.Modo DescripcinQuick Select Nospresentalastablasenformagrfica,ysolopermitelassentenciasordinariasdeSQL(SortyCriteria).Laprimeraparasentencia sirve para poder ordenar por el campo especfico y lasegunda sentencia para indicar registros a mostrar dependiendode un valor condicional (Ejemplo: 0 then//almacenamos en la variable busca la siguiente sentenciabusca="Nomv like '" + trim(sle_1.text) + "%' "//contamos el nmero de filas del control DWnf=dw_1.rowcount()//realizamos la busqueda de la sentencia ya antes almacenadar=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 encontradadw_1.selectrow(0,false)dw_1.selectrow(r,true)dw_1.scrolltorow(r)-35-Power Builder 9.0end ifend ifPaso 7.- Codificar en el control sle_1, evento modify(), lo siguienteSTRING cad// la funcion Trim suprime los blancoscad = "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 siguienteint rr=dw_1.getrow()dw_1.selectrow(0,false)dw_1.selectrow(r,true)Script a Nivel de la Aplicacin:// Profile VentaSQLCA.DBMS = "ODBC"SQLCA.AutoCommit = FalseSQLCA.DBParm = "Connectstring='DSN=venta'"//nos conectamos con la Base de Datosconnect;//preguntamos si ha ocurrido un error en la conexinIfSqlca.Sqlcode0 thenMessagebox ("Error de Conexin",Sqlca.SqlErrText)Haltelse//abrimos la ventana 1 de nuestro proyectoopen(ventana01)end ifEsta conexin se puede traer desde el entorno de la BDD-36-Power Builder 9.0Clic en elsiguiente iconoy obtendremosla siguienteventanaClic en elboton Edit.Clic en la siguiente pestaaObtendremos la siguiente vista-37-Power Builder 9.0Copie el contenido en la aplicacin.Lugo proceda a ejecutar el programaDataWindow Retrieval Arguments con Campos CalculadosAplicacin.Mostrar las Facturas por cada vendedor, se ingresa por teclado el cdigo del vendedor.Con lasTablas: 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 necesiteen la consulta como se observa a continucacin:Paso 3.-Del men de opciones seleccionar Design, luego seleccionar RetrievalArguments.-38-Power Builder 9.0Colocarla variable receptora, a travs de esta variable ingresar un cdigo yprocederh realizar la bsqueda en el DataWindow.Paso4.-EnlaopcinWhereseleccionarelcampopararealizarlacondicinconlavariable definida anteriormente, la variable debe ser precedida por dos puntos(:Var)Observe el graficoLuego Pulse ctrl. + WNombre de la VariableTipo de dato querecibirla variable-39-Power Builder 9.0Paso 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).Cadacampotieneunconjuntodepropiedadesquesemuestranenlapartelateralderecha,dar formaalapresentacindelaconsultamoviendolascabecerasyetiquetasde cada campo de la siguiente manera:1 2 3-40-Power Builder 9.0Paravercomoestasaliendoeldiseopuedecomprobarlomediantela opcin Row delmenprincipalyseleccionando Retrieve,paraellolepediringresaruncdigodevendedor.Paso 6.- Completar los campos de comisin, comisin total y pago total a travs de lasopciones del men principal: Insert submenu Control opcion Compute Field.-41-Power Builder 9.0Al seleccionar estaopcin Computed Field ,llevar elcursor enla posicin dondedeseacolocar el calculo de la comisin (Detail), luego mostrara la ventana de Modify Expresindonde colocara la expresin para la comisin , para facilitar la edicin de esta expresinhaga un Clic en los camposmostrados en Columns.Codificarlasiguientesentencia,paradeterminarlacomisindelempleado,sitipodeempleado es "A 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 pagototal.-42-Power Builder 9.0Para la suma del comisin marcar el campo calculado comisin, similar alPaso 6InsertControl-ElegirSum,entoncesautmicamentemostraraelcamposumadoen namecolocar el nombre (Tcom).Paraelcalculopagototal,deformasimilarseleccionarelpasoanteriorseleccionarInsert-Control-Computed Field y editar la siguiente expresin.Luego complete las etiquetas, para mostrar la objeto DataWindow final.Grabarlo como Data01.-43-Power Builder 9.0Paso8.-LuegoInserteunformulariooventanaparacolocarelDataWindow,lapresentacin final sera:Grabar la ventana con el nombre de Ventana01Paso 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:StringCadCad=Trim(Sle_1.text)IfDw_1.Retrieve(Cad) =0 Then // Sino se recupera ninguna filaMessageBox(" Error, "Cdigo no existe, verificar,information!)End ifEn la aplicacin hacer la conexin con la BDD// Profile VentaSQLCA.DBMS = "ODBC"SQLCA.AutoCommit = FalseSQLCA.DBParm = "Connectstring='DSN=venta"connect;-44-Power Builder 9.0IfSqlca.Sqlcode0 thenMessagebox ("Error de Conexin",Sqlca.SqlErrText)Haltelseopen(ventana01)end ifMantenimiento de una BDDUtilizar la tabla vendedor agregando los campos feing (fecha de ingreso) y grado (gradode estudios).Realizar tambin las validaciones correspondientes en cada campo:Paso 1.- crear una funcin a nivel de la aplicacin (file-new-project-Function)-45-Power Builder 9.0Paso2.-CrearelDataWindowestilo FreeFormdelatablavendedoryrealizarlasvalidacionesrespectivasencadacampo,aunqueesopcionaldependiendodelproyectoque este elaborando.Al campo grado editarlo como un combo:1.Seleccione dicho campo y en propiedades seleccionar la pestaa EDIT.2.En tipos de estilos existen seis tipos, seleccione DropDownListBox.3.Marca el check Always Show Arrow, para que tenga el aspecto de un combo.4.Ingrese 3 valores en la grilla (code Table) como se muestra en el grfico.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.-46-Power Builder 9.05.Ademas dar formato de fecha y formato monetario a los campos: fecha de ingresoysueldobsico;enlamismapropiedadEditperoseleccionado EDITMASKenStyle Type.Paso 3.- Disear el siguiente Formulario:Nombre de la Ventana: Ventana02-47-Power Builder 9.0Nombre de la Ventana: Ventana03Script Openfor aplicacin// Profile VentaSQLCA.DBMS = "ODBC"SQLCA.AutoCommit = FalseSQLCA.DBParm = "Connectstring='DSN=venta"connect;IfSqlca.Sqlcode0 thenMessagebox ("Error de Conexin",Sqlca.SqlErrText)Haltelseopen(ventana02)end ifScript clicked for pb_priDw_1.Scrolltorow(1)Dw_1.Setfocus()-48-Power Builder 9.0Script clicked for pb_antDw_1.ScrollPriorRow()Dw_1.Setfocus()Script clicked for pb_SgteDw_1.ScrollNextRow()Dw_1.Setfocus()Script clicked for pb_Ultlong nfnf=dw_1.rowcount()dw_1.scrolltorow(nf)dw_1.setfocus()Script clicked for Cb_NuevoInt Nflong nfnf=dw_1.insertrow(0)dw_1.scrolltorow(nf)dw_1.setfocus()dw_1.setcolumn("codv")cb_graba.enabled=trueScript clicked for Cb_grabaint resres=dw_1.update()if res=1 thencommit using sqlca;//cd_recupera.enabled=falseelserollback using sqlca;end ifcb_recupera.triggerevent(clicked!)cb_graba.enabled=falseEnd ifScript clicked for Cb_Anulalong nfnf=dw_1.getrow()if nf>0 thendw_1.deleterow(nf)dw_1.update()dw_1.scrolltorow(1)end ifcb_recupera.triggerevent(clicked!)cb_anula.enabled=falseScript clicked for Cb_RecuperaDw_1.Retrieve()-49-Power Builder 9.0cb_graba.enabled=falsecb_recupera.enabled=falseScript clicked for Cb_Buscaopen(ventana03)Script clicked for Cb_Recuperadw_1.setfilter("")dw_1.filter()dw_1.setsort("#1 A")dw_1.sort()dw_1.retrieve()cb_graba.enabled=falseScript clicked for Cb_SalirHaltPaso 4.-En la ventana 03 codificar los siguientes scriptScript Load for Ventana03sle_1.text=""sle_1.setfocus()Script Modify for sle_1string cadlong nfnf=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 thenventana02.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))elseclose(ventana03)ventana02.cb_graba.enabled=trueventana02.dw_1.setfocus()ventana02.dw_1.setcolumn(1)end if-50-Power Builder 9.0Elaboracion de una facturaTablas Bsicas para la elaboracin de la facturaLos Script para cada evento1.- W_Factura Opendw_1.settransobject(sqlca)dw_fac.Settransobject(Sqlca)dw_1.retrieve(" ")Cb_Nueva Clickedint fselect max(Nfac) into :xfac from fac_cab;if isnull(xfac) then-51-Power Builder 9.0xfac=0end ifxfac++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_dwnkeyDw_1Tecla (Keycode Key,UnsignedLong Keyflags)if keydown(keyf2!) thenint f f=dw_1.insertrow(0) dw_1.scrolltorow(f) dw_1.setfocus() int m m=dw_1.getitemnumber(1,"maxitem")if isnull(m) thenm=0end if m++ dw_1.setitem(f,"item",m) dw_1.setitem(f,"nfac",string(xfac,"000000")) open(w_pro)end ifCb_Borrar Clicked//Borrar Itemint filafila=dw_1.getrow()-52-Power Builder 9.0if fila>0 thendw_1.deleterow(fila)dw_1.update()end ifCb_Totaliza Clickeddec tot,igv,netotot=dw_1.getitemnumber(1,"totgen")igv=tot*0.18 ;neto=tot+igvst_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_Cabedw_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 rr=dw_fac.Update()if r=1 thencommit;elseRollback;end if// Grabacion del detalle Facturar=dw_1.update()if r=1 thenCommit;ElseRollback;End if// Actualizar La tabla Stockint Fila,xcanString XcodFor Fila=1 to Dw_1.Rowcount()Xcod=Dw_1.GetItemString(fila,"codpro")Xcan=Dw_1.GetItemNumber(Fila,"can")Update Fac_detaSet Stock = Stock - :XcanWhere Codpro= :Xcod;NextCommit;Dw_proActivate ( en la ventana de consulta de productos)sle_1.setfocus()dw_1.retrieve()Dw_pro Opendw_1.settransobject(sqlca)-53-Power Builder 9.0Dw_1Tecla(Keycode Key, UnsignedLongKeyFlags)int rdec precioif key=keyenter! thenr=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 ifif key=keyescape! then dw_1.setfilter("") dw_1.filter() sle_1.text="" sle_1.setfocus()end ifSle_1 Modifiedstring criteriocriterio=" upper(Despro)Like '"+upper(sle_1.text)+"%'"dw_1.setfilter(criterio)dw_1.filter()dw_1.setfocus()dw_1.selectrow(1,true)-54-Power Builder 9.0AplicacionConsiderando que tenemos el mantenimiento de la tabla cursos, al realizar un click en elbotonAlumnos,secargalaventanadealumnos,perosolosemostrarnlosdatosdeaquellos alumnos de dicho curso (Fila activa de la Tabla Cursos).Para la Ventana alumnos elaboramos:Un Objeto DataWindowData Source SQL SelectStyle TabularNombreDw_NotasLuego seleccione todos los campos a utilizar.Especificamos el argumento de recuperacion de curso.Paso 1.-Del Menu de Design seleccione la Opcion Retrival Arguments.Paso2.- Ennameseleccionecualquiernombredevariabledetipoigualalcampoutilizado como argumento.Paso3.- En la Ficha Where se debe especificar, la relacion entre el campo y la variable-55-Power Builder 9.0Paso4.- LuegoespecifiqueLacreaciondelObejetoEstructura,utilizando(Structurepainter) del Menu Principal(Power Bar)File New pestaa PB Object - Structure.En la venta de dialago, especifique: Codigo_Cursode tipo String Nombre_Curso de Tipo de stringSe debe almacenarcomo S_cursoPaso 5.- En la ventana alumnos (VenAlumnos)Declarar una variable de instanciaString vi_codcurPaso 6.- Codificacin de eventospara obtener la lista de los alumnos por curso.SerealizaatravesdeunbotondelaventanaCursosVenCursos(Mantenimientodecursos).La ventana VenAlumnos debe recibir el parametro (cdigo del curso), que se envia desdela Ventana VenCursos.Paso 7Script -Clicked for Cb_alumnos (W_cursos)long nfS_curso Origen//asignamos una variable llamada origen de tipo S_cursonf=dw_1.getrow()origen.codcur=dw_1.getitemstring(nf,"cur_cod")origen.nomcur=dw_1.getitemstring(nf,"cur_des") openwithparm (VenAlumnos,origen)paso 8Script -Open for(VenAlumnos)S_curso DestinoDestino=message.powerobjectparmvi_codcur=Destino.codcurthis.title=vi_codcur+ " - " + Destino.nomcurcb_graba.enabled=falsedw_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~tif(alu_pro>=11,RGB(0,0,255),RGB(255,0,0))'")Paso 9.- Codificacion de los botones de desplazamiento-56-Power Builder 9.0Script clicked for pb_priDw_1.Scrolltorow(1)Dw_1.Setfocus()Script clicked for pb_antDw_1.ScrollPriorRow()Dw_1.Setfocus()Script clicked for pb_SgteDw_1.ScrollNextRow()Dw_1.Setfocus()Script clicked for pb_UltInt nfNf=dw_1.RowCount()Dw_1.Scrolltorow(Nf)Dw_1.Setfocus()Script clicked for Cb_Nuevolong nfnf=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=trueScript clicked for Cb_grabalong resres=dw_1.update()if res=1 thencommit using sqlca;//cb_graba.enebled=falseelserollback using sqlca;end ifdw_1.retrieve(vi_codcur)dw_1.scrolltorow(1)Script clicked for Cb_Anulalong nfnf=dw_1.getrow()if nf>0 thendw_1.deleterow(nf)-57-Power Builder 9.0dw_1.scrolltorow(1)end ifScript clicked for Cb_Recuperadw_1.retrieve(vi_codcur)cb_graba.enabled=falseScript RowFocusChanged For Dw_1// evento que se activa cada vez que se enfoca un nuevo registrolong nfilas,factnfilas=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 columnaint ncnc=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,prodw_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)/4dw_1.setitem(row,"alu_pro",pro)Cb_graba.enabled=true end ifend if-58-Power Builder 9.0Script ItemError For Dw_alumnosReturn 1PRIMERA PRCTICA CALIFICADA1.Especificaciones de la aplicacinCreadas las tablas con sysbase SQL Anywhere para almacenar las facturas de losclientesProductos (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 lossiguientes controles DataWindow: (VConFacturas)3.1DW_Clientes (estilo Grid), donde solo debe mostrar los campos(Cod_cli,Nom_Cli,Tel,Ruc)3.2Dw_Facturas (estilo Tabular), donde debe mostrar las columnas (Num_fact,Fecha, Subtotal, Igv, total).3.3En esta ltima ventana debe solo extraer las facturas de un cliente seleccionado,Obteniendo al final un resumen (suma del campo total) paraver cual es su totalgeneral.3.4La ventana (VConFacturas) tendra un boton Detalle donde permite visualizar enotra ventana( VFacDetalle) el detalle de la factura3.5Ventana (VFacDetalle) debe mostrar todos los campos de la tabla detalle facturacon el campo descripcion del producto (tabla producto).-59-Power Builder 9.0Nota.- El diseo de la aplicacin es a criterio del alumno. Su presentacion y estetica tambin se considera.Aplicacin Cuenta CorrienteEstaaplicacinpermitegeneraruncampoenestecasoeselnmerodemovimientoyactualizar el saldo en el archivo ahorro.-60-Power Builder 9.0Script openfor aplicacin:// Profile conexion con sqlserverSQLCA.DBMS = "MSS Microsoft SQL Server 6.x"SQLCA.Database = "BDBANCO"SQLCA.ServerName ="(local)"SQLCA.LogId = "SA"SQLCA.AutoCommit = FalseSQLCA.DBParm = ""CONNECT; if sqlca.sqlcode0 thenmessagebox("Error de coneccion",sqlca.sqlerrtext)haltend ifopen(Venahorro)Script modified for Sle_1int r,vnro,fila,xnro,nfstring cadcad=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=1end if*/select count(numcta) into :xnrofrom movimientowhere numcta=:cad;if sqlca.sqlcode=0 thenxnro++end iffila=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-61-Power Builder 9.0Script Itemchanged for Dw_2string nomcolint filadec monchar tpfila=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 datawindowtp=this.gettext() // valor que se da en el edit controlnsal=dw_1.getitemnumber(dw_1.getrow(),"saldo")if upper(tp)="D" thennsal=nsal + monelsensal=nsal - monend ifthis.object.tsaldo.text=string(round(nsal,2))end choosescrpt Clicked for Cb_grabaint rstring cadcad=dw_1.getitemstring(dw_1.getrow(),"numcta")// Actualizacion en el archivo ahorro//modo 1//dw_1.setitem(1,"saldo",nsal)//dw_1.update()//modo 2Update ahorroset saldo = :nsalwhere numcta=:cad;r=dw_2.update()if r=1 thencommit;elserollback;end if// borrar el contenido de los control data windowdw_2.reset()dw_1.reset()-62-Power Builder 9.0SEGUNDA PRCTICA CALIFICADASe requiere un programa para automtizar las ventas de pasajes areos, para ello secuenta con las siguientes tablas:Base de datos Vuelos DBTablas:Rutas tipoLong TextoCod_rutChar4 Codgo de rutaNom_rut Varchar15Nombre de rutaPago_cho Numeric 61 pago por viaje al choferViajes tipoLong TextoNro_via Char6Nro de ViajeCod_rutChar4 Codigo de rutaFsal_via Date Fecha de salidaHsal_via Time Hora de SalidaCos_viaNumeric61Costo del ViajeNro_vacNumeric 3Nro de vacantesCod_cho Char 4 Codigo del ChoferFlagChar 1S(si)N(no) viaje realizadoPasajerostipoLong TextoNbol Numeric 5Numero de BoletoNroviaChar 6Nro de ViajeNom_pas Varchar25Nombre del pasajeroTipo Char 1(E)studiante (A)dulto (N)ioPagoNumeric 6 1Chofer tipoLong TextoCod_choChar 4Codigo del ChoferNom_cho Varchar25Nombre del choferSba_cho Numeric6 1Sueldo basicoRealizar:1.- Colocar las claves principales y forneas para cada tabla, cuando relacione cada tablaconformar la opcion:Delete any Dependent Rows (CASCADE), por ejmplo cuando se anule un registro enviaje anule a todos los pasajeros.2.- La aplicacin debe permitir realizar el manteniemiento para cada tabla-63-Power Builder 9.03.-EnelmantenimientodelarchivodeviajesdebetenerunbotndePasajerosdetalmodo que permita visualizar solo los pasajeros de ese viaje en otra ventana (adicion,anulacionymodificacion),enlaadicionsetraeelcamponrodeviajeycostodelaventana anterior(ambos de estilo tabular), el pasajero tendra un descuento de acuerdoal tipo :Estudiante30%Nio50%Adulto0%El nro de viaje se genera AA9999 los primeros 2 digitos ao del sistemay los cuatroltimos digitos un correlativo.ParaelDataWindowdeviajeelcampocodgoderutaycodgodelchoferdebeincorporarse un DataWindow para cada uno, para que su seleccin sea ms explcita.El nmero de Boleto se genera a partir del 00001 de manera correlativaLuego de cada adicion de pasajeros las vacantes en ese viaje debe disminuirse en launidad.4.- Consulta de viajes por chofer, debe mostrarse en una ventana.LalistadeChoferes,alseleccionarunodeellos,deberpresentarlosviajesrealizados, al final debe aparecer supago total5.-Consultadeviajesporrutas.Enestaventana;alelegirunaruta(enuncontrolDataWindow)debemostrartodoslosviajesprogramados(enotrocontroldata)alseleccionar el viaje debe mostrar la relacion de pasajeros.6.-Consultadeviajesporfecha,enestaventanasedebeingresardosfechas:fechainicial y final en caso que solo se ingrese la fecha inicial se debe tomar hasta la ltimafecha de viaje, mostrando en un control DataWindow las siguientes columnas:NroViaje,Nombre de ruta , Nombre del pasajero y tipo7.- 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.NotaEeste trabajo es para 2 semanas de laboratorio, sera revisado cada avance.Trabajo en forma grupal, solo se tomara en cuentaa los alumnos regulares.-64-Power Builder 9.0Objetos de UsuarioTema Custom Clases VisualesPor ejemplo se desea realizar el siguiente evento de usuario:Paso 1.- En New seleccionar PB OBJECTSeleccionar Custom VisualEl cual va a mostrar una pantalla similar a la window estndar, para disear su plantilla:Realizar el siguiente diseo: tiene dos controlesetiquetas,uno encima de otro, uno confondoblancoyelotroconfondoazul,unaterceraetiquetaparaverelporcentajedelproceso.ST_1 ST_2-65-Power Builder 9.0St_pg (para ver el porcentaje)Codificacin del uo_progresoDeclareInstancia IntIr_alfinalFunctions Uf_iniciar(int vini) return noneir_alfinal=vinist_2.width=0Functions Uf_avance(integer valor) return noneInt porcen, anchoReal razonAncho=st_1.widthRazon=valor / ir_alfinalPorcen=round(razaon*100,0)St_pg.text= string(valor)+ ' de ' +string(ir_alfinal)+ '-'+ string(porcen)+%-66-Power Builder 9.0ClasesCrear las siguientes clases de Objetos de usuarios1.- Los Visualesa)UnProgres segn se muestra en la figurab)Un control para desplazamiento de paginas y de Impresinc)Colocandounacajadetextoquepermitaadicionarorestardasaunafechaatravs de Vscrolld)ColocandodoslistBox,aldesplazarseenunodeellosqueseencuentresincronizadoe)Pasando una cadena a una etiqueta que dicha cadena seatipo Blinkf)Colocando un cuadro texto que solo acepte letras y espacios en Blanco.2.- No Visualesa)Unafuncinquepermitasumarunacolumnanumrica,sepasacomovalorelcontrol DataWindow y el nmero de columna.b)Un evento que permita centrar una ventana, se pasa como valor una ventana.c)Unafuncinquepermitageneraruncdigo,sepasacomodatouncontrolDataWindow, el valor inicialdel cdigo, el cdigo puede empezar con una letra onmero.d)UneventoquepermitacambiarelcolordeunacolumnadeuncontrolDataWindow, pasar como dato el control DataWindow y el nmero de columna.-67-Power Builder 9.0Capitulo de Graficos en Power BuilderEs un estilo de un DataWindow, pero tambin se pueden efectuar grficos a travs delcontrol graph.Pasos para crear un grafico.-68-Power Builder 9.0AplicacinSe 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 DataWindowDatawindow TablasCamposCategoryValuesRetrievalArgumentsDatag01Departamentoy SalariosNom_dept,Cod_empNom_deptCount(Cod_emp)Datag02Departamentoy SalariosCod_emp,sueldoCod_empSueldo Nom_deptDatag03EmpleadoTodos Cod_empData01 y Data02 son estilos graficos, mientras Data03 estilo freeform-69-Power Builder 9.0Aplicar las propiedades correpondientes a los mencionados DataWindowsAl hacer Click en un empleado mostrar una ventana con sus datos personales, como semuestra en el ejemploLauraMoreno Lee-70-Power Builder 9.0Script open for Aplicacion// Coneccion con la Base de Datos// Profile conexion con sqlserverSQLCA.DBMS = "MSS Microsoft SQL Server 6.x"SQLCA.Database = "Empresa"SQLCA.ServerName ="(local)"SQLCA.LogId = "SA"SQLCA.AutoCommit = FalseSQLCA.DBParm = ""connect;open(VenEstadistica1)Script open for ventana VenEstadistica1dw_1.settransobject(sqlca)dw_2.settransobject(sqlca)dw_1.retrieve()Script Cliked for dw_1 (VenEstadistica1)GrObjectType ClickedObjectstring nomdept,nomgraf="gr_1"int v_series,v_categoriaClickedObject=This.ObjectAtPointer(nomgraf,v_series,v_categoria)if ClickedObject=Typedata! or ClickedObject=TypeCategory! thennomdept= this.CategoryName(nomgraf,v_categoria)string cadcad="EMPLEADOS EN"+nomdeptdw_2.modify("gr_1.title='"+cad+"' ")dw_2.retrieve(nomdept)ElseMessagebox(parent.title,"Click en departamento para ver empleados")end ifScript Clikedfor dw_2 (VenEstadistica1)GrObjectType ClickedObjectstring nomgraf='gr_1'int v_series,v_categoriastring id_empClickedObject=This.ObjectAtPointer(nomgraf,v_series,v_categoria)-71-Power Builder 9.0if ClickedObject=Typedata! or ClickedObject=TypeCategory! thenid_emp= this.CategoryName(nomgraf,v_categoria)openwithparm(venfichae,id_emp)ElseMessagebox(parent.title,"Click en departamento para ver Detalle de empleado")end ifOpen for VenFichaEmpstring coddw_1.settransobject(sqlca)cod=message.stringparmdw_1.retrieve(cod)Script Clikedfor cb_1 (VenFichaEmp)close(venfichae)Aplicacin Formularios MDI y Objetos de Usuario.EnestaaplicacinsehautilizadoVentanasconherencia(inheret)dondelaventanaw_sheet-dw es la ventana padre que contiene funciones definidas por el usuarioCreacindeObjetosdeUsuarioempleadoparacontenercontrolesdetipogeneralqueseranempleados,porlasotrasventanasdescendientes(w_alumnosyW_cursos);ademas se han elaborado las funciones de objeto usuario con la finalidad degeneralizarlas 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:-72-Power Builder 9.02.1 Crear un menu02 heredado(inheret) del menu013.- Elaborar las siguientes Ventanas:3.1Ventana W_frame aquel que va a contener el menu01 y el objeto de UsuarioCreado en el punto 13.2Ventana W_sheet_dw ventana padre que contiene un control datawindow(dw_1)sin relacionar a ningun objeto datawindow3.3Ventana W_alumno heredado de la ventana (W_sheet_dw) y relacionarlo con elmenu023.4Ventana W_cursos heredado de la ventana (W_sheet_dw) y relacionarlo con elmenu024.- Creacion de eventos:4.1Anivel de objeto de UsuarioVariable InstanciaDatawindow idw_udo4.2Funcion de Objeto de usuarioUf_setdw(datawindow dw_parm)idw_udo=dw_parm4.3Script Clicked for Cb1idw_udo.scrolltorow(1)idw_udo.setfocus()4.4Script Clicked for Cb2idw_udo.scrollnextrow()idw_udo.setfocus()4.5Script Clicked for Cb3idw_udo.scrollPriorRow()idw_udo.setfocus()4.6Script Clicked for Cb4int nfnf=idw_udo.rowcount()idw_udo.scrolltorow(nf)idw_udo.setfocus()4.7Script Clicked for Cb5idw_udo.retrieve()idw_udo.triggerEvent(rowfocusChanged!)idw_udo.setfocus()4.8Script Clicked for Cb6int nfnf=idw_udo.insertrow(0)idw_udo.scrolltorow(NF)idw_udo.setfocus()-73-Power Builder 9.04.9Script Clicked for Cb7 int r r=idw_udo.update() if r=1 then commit; elserollback; end if5.- Eventos para la ventana W_frame Script Risize for w_frameintnX, 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.MicroHelpHeightmdi_1.Move (0, uo_1.y + uo_1.height)mdi_1.Resize (nWidth, nHeight + 4)6.- Evento para la ventana W_sheet_dwdeclarar la Variable Instanciaw_frame iw_frameinteger i_row6.1Script activate for w_sheet_dwiw_frame.uo_1.uf_setdw(dw_1)6.2Script open for w_sheet_dw iw_frame=This.parentwindow() dw_1.settransobject(sqlca)6.3Script Ue_cascadafor w_sheet_dw iw_frame.arrangeSheets(cascade!)6.4Script Ue_Horizontalfor w_sheet_dwiw_frame.arrangeSheets(tile!)6.5 Script Ue_totalwfor w_sheet_dwiw_frame.arrangeSheets(layer!)6.6 Script Ue_verticalfor w_sheet_dwiw_frame.arrangeSheets(tilehorizontal!)6.7 Script rowfocuschangedfor dw_1-74-Power Builder 9.0i_row=this.getrow()if i_row 0 THEN MessageBox("Caution","SyntaxFromSQL caused these errors: " + ERRORS) RETURNEND IFdw_1.Create( dwsyntax_str, ERRORS)IF Len(ERRORS) > 0 THEN MessageBox("Caution","Create cause these errors: " + ERRORS) RETURNEND IFdw_1.settransobject(sqlca)dw_1.retrieve()Envio de e-m@ilSi se tiene instalado el Outlook se debe de configurarddlb_destinatarioAlberto Moreno CuevaBayona Ramos-80-Power Builder 9.0Pb_1 Clickedstring docname, namedinteger valuevalue = GetFileOpenName("Selecione Fichero", docname, named, "DOC", &+ "Text Files (*.TXT),*.TXT, All Files (*.*),*.*")IF value = 1 THENlb_archivos.additem(docname)end ifcb_1 ClickedmailSessionmSesmailReturnCodemRetmailMessagemMsgmailFileDescriptionmAttach[]stringls_ret, ls_syntax, ls_name, ls_open_pathname,ls_filenamestringls_attach_name='c:\pbl\error.psr'intli_index, li_nret, li_nrecipients, li_nfilebooleanlb_noerrorsmSes = create mailSessionmRet = mSes.mailLogon ( mailNewSession! )sle_titulomle_textoPb_1lb_archivos-81-Power Builder 9.0If mRet mailReturnSuccess! ThenMessageBox ("Mail Logon", 'Return Code mailReturnSuccess!' )mSes.mailLogoff()returnEnd IfSetPointer(HourGlass!)mMsg.notetext = mle_texto.text// Mensaje a adjuntar ficheros a enviarlong tt,hayhay=lb_archivos.totalitems()for tt=1 to haymAttach[tt].FileType = mailAttach!mAttach[tt].PathName = lb_archivos.text(tt)mAttach[tt].FileName = lb_archivos.text(tt)mAttach[tt].Position = len(mMsg.notetext) - 1mMsg.AttachmentFile = mAttachnextmMsg.Recipient[1].name = ddlb_destinatario.text// destinatariomMsg.Subject=sle_titulo.text// subjectSetPointer(HourGlass!)mRet = mSes.mailsend ( mMsg )mSes.mailLogoff()APIS DE EN POWERDeclaracin de Funciones externasDescripcinLas funciones externas son escritas en diferentes lenguajes y almacenadas en librerias dinamicascon la extensin DLL, antes de utilizar estas funciones primero debe declararse definiendo su tipo.Global external functions Estos son disponibles en toda la aplicacinLocal external functionsEstos son definidos a nivel de ventanau objeto de usuarioExternal function syntax Usa la siguiente sintaxis:Mostrar la Barra deestadoVer el Nombre de la maquina-82-Power Builder 9.0{ access } FUNCTION returndatatype name ( { { REF } datatype1 arg1,..., { REF } datatypen argn } ) LIBRARY "libname"ALIAS FOR "extname"Paso1.- Primero declarar las funciones externasya sea a travs del visor Apis o digitarlosdirectamentecb_ocultarClickedLong HBar // Esconder la barra de tareasHBar = FindWindowExA( 0, 0, "Shell_TrayWnd", ls_Null )ShowWindow( HBar, 0 )Cb_MostrarClickedonstant Long SW_SHOW = 5// Nombres del shell de Windows que deberiamos buscarString ls_NullLong HBar, ll_HDeskTopHBar = FindWindowExA( 0, 0, "Shell_TrayWnd", ls_Null )ShowWindow( HBar, SW_SHOW )// Muestra el escritorioll_HDeskTop = FindWindowExA( 0, 0, "Progman", ls_Null )ShowWindow( ll_HDeskTop, SW_SHOW )Cb_maquinaClickedlong ll_retstring ls_ComputerName ,ls_UserNameulong BufferLength = 250ll_ret = GetComputerNameA(ls_ComputerName, BufferLength)messagebox("maquina",ls_ComputerName)Ubicar la clase dentro de la DLL-83-Power Builder 9.0Control Trreview yprocesos de arrastreAplicacin:Cambio de empleados enotro departamentObjetos a emplear:1.-estructura(stremp)2.-Datawindow estilo tabulardatemptablas: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)Control Tv_1-84-Power Builder 9.0Descripcin de los eventosBeginDrag.-ocurre cuando el usuario presiona el boton izquierdo del mouse, sobreuna 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 botondel mousey deja el objeto.Itempopulate.-Ocurre cuando un item delTreview llena los demas items hijosOccurs when the user presses the left mouse button on a label in the TreeView controland begins dragging.Ven01 openidsource=create Datastoreidsource.dataobject="Datemp"idsource.settransobject(sqlca)triggerEvent("ue_populate")ven01ue_populate()TreeviewItem VitemSetPointer(hourglass!)Vitem.Label="Marketing"Vitem.Data= "D001"vitem.PictureIndex=1vitem.SelectedPictureIndex=7Vitem.children=truetv_1.insertitemlast(0,vitem)Vitem.Label="logistica"Vitem.Data= "D002"vitem.PictureIndex=2tv_1.insertitemlast(0,vitem)Vitem.Label="Ventas"Vitem.Data= "D003"vitem.PictureIndex=3tv_1.insertitemlast(0,vitem)Vitem.Label="Contabilidad"Vitem.Data= "D004"vitem.PictureIndex=4tv_1.insertitemlast(0,vitem)Vitem.Label="Administracion"Vitem.Data= "D005"vitem.PictureIndex=5tv_1.insertitemlast(0,vitem)-85-Power Builder 9.0tv_1begindrag(long handle ) return long//Inicio del ArrastreTreeViewItem t_SourceGetitem(Handle,T_source)ST_9.TEXT=STRING(T_Source.Level)if T_Source.Level2 thenThis.Drag(cancel!)Else//Almacena el Handle del item antes de comenzar el arrastre parent(departament)r_dragsource=handler_dragparent=finditem(parentTreeItem!,handle)end iftv_1 dragdrop(dragobject source, long handle) return longintli_pendlong li_newitemtreeviewitem lt_target,lt_source,lt_parent,lt_newif getitem(r_droptarget,lt_target)=-1 then returnif getitem(r_dragsource,lt_source)=-1 then returngetitem(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 returnli_pend=upperBound(vecEmp)+1messagebox("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.datadeleteitem(r_dragsource)//setnull(lt_source.itemhandle)li_newitem=insertitemSort(r_droptarget,lt_source)selectitem(li_newitem)tv_1 dragwithin(dragobject source, long handle) return longtreeviewitem t_overlong a,bif getitem(handle,t_over)=-1 then // si estamos en el primer nivelsetDropHighlight(0) r_droptarget=0 returnend if-86-Power Builder 9.0if t_over.level=1 then// resalta el departamento que va ser arrastradoif handler_droptarget thensetDropHighlight(handle)r_droptarget=handleelsesetDropHighlight(0)r_droptarget=0end ifelser_droptarget=finditem(parenttreeItem!,handle)if r_droptargetr_dragparent thensetDropHighlight(r_droptarget)elsesetDropHighlight(0)r_droptarget=0end ifend iftv_1 itempopulate(long handle)int nf,cfTreeViewItem tvidep, tvempif getitem(Handle,tvidep)=-1 then returnsetPointer(hourglass!)idsource.reset()nf=idsource.retrieve(tvidep.data)tvemp.pictureIndex=6tvemp.selectedpictureIndex=6tvemp.children=falsefor cf=1 to nftvemp.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-87-Power Builder 9.0.Trucos en Power01 - Cambiar el color alternativamente en las filas de una datawindowParaquelasfilasdeunaDataWindowtenganelaspectodepapeldeimpresoraaade 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 unrectangulo o un campo de textoen blanco detrs de las columnas de detalle y poner la expresin anterior.02.- Ordenar una DropDown Datawindow pulsando la cabeceraUnacaractersticaquetienenlosDataWindowesquetepermitenordenarlascolumnaspulsandoenlacabeceradelacolumna.LafuncinSorttepermiteespecificar el nombre de la columna o el nmero de columna por la cual se ordenareldataWindow.Funcionaparalamayoradecolumnasytipodedatos,peronofunciona bien cuando la columna pertenece a una DropDown DataWindowEl problema es que la funcin Sort ordena los datos por detrs de la DataWindow nolos valores que el usuario est viendo en pantalla.Para solucionar esto puedes usar el comando LookUpDisplay.Estafuncindevuelvelavisualizacindelosdatosdelacolumna.Poniendoelnombredelacolumnadentrodeestafunciny usndolaparaordenarlosdatos,elusuario podr ver los datos ordenados.Por ejemplo:dw_1.SetSort( 'LookUpDisplay( dept_id )' )dw_1.Sort()03.- Ordenar un DataWindow pulsando en la cabeceraPorejemplo:Elnombredelacabeceradelacolumnatienequetenerelmismonombre 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-88-Power Builder 9.0Char lc_sort/* Chequea cuando el usuario hace click en la cabecera */IF Right(dwo.Name,2) = '_t' THENls_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")/*Chequeacuandoprviamenteseordenunacolumnayenlaquesehaceclickactualmenteeslamismaono.Sieslamisma,entoncessechequeaelordendeordenacindelordenamientoanterior(A-Ascendente,D-Descendente)ylocambia.Silascolumnasodenadasnosonlasmismas,lasordenaenordenascendente. */IF ls_column = LEFT(ls_old_sort, LEN(ls_old_sort) - 2) THENlc_sort = RIGHT(ls_old_sort, 1)IF lc_sort = 'A' THENlc_sort = 'D'ELSElc_sort = 'A'END IFdw_1.SetSort(ls_column+" "+lc_sort)ELSEdw_1.SetSort(ls_column+" A")END IFdw_1.Sort()END IF04.- Determinar el uso de memoria de una datawindowAmenudoesnecesariosabercuantamemoriaestausandounaDataWindowodatastore para prevenir un "out of memory" o para facilitar la depuracin.Cuandosesabelamemoriaqueseestusando,elprocesodedatosolarecuperacindelosmismos,puedeserdetenidacuandosellegueaunlmitemximo.ParadeteminarlacantidaddememoriavirtualqueestusandounaDataWindowodatastore, se usa el atributo Storage.Este puede ser invocado desde cualquiera de de los dos mtodos siguientes:Notacin DOT: dw_control.Object.DataWindow.StorageDescribe: 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 ventanaLlamar 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_parmlds_parm = Message.PowerObjectParm-89-Power Builder 9.0dw_1.DataObject = lds_parm.DataObjectlds_parm.ShareData(dw_1)Y en el evento CLOSE:dw_1.ShareDataOff()06.- Copiar datos de un Grid Datawindow al portapapeles de WindowsLos DataWindow grid tienen la capacidad nica de dejarte seleccionar un nmero deceldas en el DataWindow (o la totalidad de filas o de columnas de datos).Esteejemploilustracomoproporcionarsoportedecopiaparalosdatosseleccionados desde un DataWindow de tipo grid.Asumimosqueunnuevoelementodemenullamadom_SpecialCopyhasidoaadido bajo el menu m_Edit .Aadir elsiguientecdigoparadeterminarsiel elementoSpecialCopydeberserhabilitado.GraphicObject lg_ObjectDataWindow lg_DWstring ls_SelectedTextlg_Object = GetFocus ()CHOOSE CASE TypeOf (lg_Object)CASE DataWindow!lg_DW = lg_ObjectThis.m_SpecialCopy.Enabled = (lg_DW.dwDescribe ("datawindow.selected.data") '')END CHOOSE==============================Codificalosiguienteenm_SpecialCopyoenuneventodisparadoporm_SpecialCopy):graphicobject lg_Objectdatawindow lg_DWlg_Object = GetFocus ()CHOOSE CASE TypeOf (lg_Object)CASE DataWindow!lg_DW = lg_ObjectClipBoard (lg_DW.dwDescribe ("datawindow.selected.data"))END CHOOSE07.- Permitir al usuario aadir solo columnas clave nuevasA veces es deseable impedir a los usuarios que editencolumnas clave una vez quelas han creado. Esto sepuede hacer fcilmente usando expresiones de columna enel DataWindow.Aadeestaexpresinenelcampo "backgroundcolor"delacolumnaclave.Estocambiar 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:-90-Power Builder 9.0- Background Colourif(Describe("Datawindow.QueryMode")="yes"orisRowNew(),1090519039,ong(Describe("Datawindow.Color")))- Protectif ( Describe("Datawindow.QueryMode") = "yes" or isRowNew(), 0, 1)8.- Cargar un array con los nombres de cada columnas en una Datawindowint colNum, numColsstring colName[]numCols = Integer(dw_control.Describe("Datawindow.Column.Count"))FOR colNum = 1 TO numCols// Obtenemos el nombre de la columna con la funcin DescribecolName[colNum] = dw_control.Describe("#" + String(colNum) + ".name")NEXT9.- Saber que ficheros hay en un directorioPuedes usar las API's de Windows:FunctionulongGetWindowsDirectoryA(refstringdirtext,ulongtextlen)library"KERNEL32.DLL"ls_dir = space(lul_size)lul_rc = GetWindowsDirectoryA(ls_dir, lul_size)Lacualretornarunacadenaconteniendotodoslosficherosquehayenesedirectorio, 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 instaladasPor Ral GagnonEn este truco abriremos un listbox con una lista de las impresoras instaladas:string printers[]int rtn, i, nbPrintersrtn=RegistryKeys("HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Print\Printers", printers)nbPrinters = UpperBound(printers)FOR i = 1 TO nbPrinterslb_1.addItem(printers[i])NEXT11.- Detectar la versin de PowerBuilderstring ls_PBverenvironment envGetEnvironment(env)ls_PBver=string(env.pbmajorrevision)+'.'+string(env.pbminorrevision)+'.'+string(env.pbfixesrevision)-91-Power Builder 9.012.- Obtener el ltimo da del mesSecogeunafecha,seincrementaelmes,secambiaeldapor"01"yentoncesrestamos 1:int li_retdays,ld_previousMonthLastDay,li_month,li_yeardate ad_date, ld_newdatead_date= today()li_month = Month(ad_date)li_year = year(ad_date)IF li_month < 12 THENli_month ++ELSEli_month = 1li_year ++END IF// construimos una fecha nuevald_newdate = date(li_year,li_month,1)// extraemos el ltimo da del mes anteriorld_previousMonthLastDay = day(relativedate(ld_newdate, -1))13.- Realizar un "Mouse Over" sobre un componenteSupontequetienesunStaticTextsobreunaventana.Cuandoelpunterodelratnpasaporencima,elcolordeltextodelStaticTextcambiaacolorrojo.Cuandoelpuntero del ratn sale del Static Text, el color del texto es negro.[Evento mousemove de la ventana]// Simplemente para visualizar algost_1.text = string(xpos) + ", " + string(ypos)IF xpos >= st_1.X AND (xpos = st_1.y AND (ypos