POWERBUILDER 9.0
Ing. Alberto Moreno C
.
Universidad Nacional de Ingenieria
CONTENIDO
Ø Entorno del PowerBuilder Ø Propiedades de controles.
Ø Funciones de cadena, numéricas y fechas.
Ø Aplicación con Arreglos y Funciones de Usuario DFU. Ø Objeto DataWindow.
Ø Aplicaciones con DataWindow Filter y Find.
Ø Datawindow con Retrieval Arguments y Campos calculados. Ø Validaciones de campo y mantenimiento de una tabla. Ø Aplicación elaboración de un factura.
Ø Estructura de datos y OpenWithParm. Ø Objetos de usuario, visuales y no visuales. Ø Gráficos uso del estilo Graph.
Ø Animaciones. Ø DataWindow Dinamicos. Ø Enviar Correo. Ø Api s en Power Ø Control treeview Ø Trucos en Power.
Profesor :Ing. Alberto Moreno C..
Prohibida cualquier copia sin permiso del autor Correo :[email protected]
Que es Power Builder?
Es una herramienta de desarrollo de aplicaciones gráficas, principalmente para el desarrollo de aplicaciones Cliente/Servidor de N capas.
Antes de empezar a desarrollar cualquier aplicación se debe crear:
a) Un espacio de trabajo Workspace, que asignara la extensión ( *.pbw)
Template Application .- es cuando se abre una nueva aplicación pero con una plantilla de trabajo
Existing Application .- Para abrir una aplicación que se encuentra en otra versión del power.
CAPITULO DE FUNCIONES
Funciones del Control:
CLEAR()
Borra el contenido de un objeto
Syntax
objectname.Clear ( )
Controls
DataWindow, EditMask, MultiLineEdit, SingleLineEdit, RichTextEdit,
DropDownListBox, DropDownPictureListBox, OLE controls, and OLEStorage objects
DELETEITEM()
Borra un item desde una lista de valores
Syntax
objectname.DeleteItem ( index )
Controls
ListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controls Ejemplo:
Esta sentencia borra el primer item seleccionado en Lb_productos
integer Xindex // Variable de tipo entero
Xindex = lb_software.SelectedIndex() // Capturamos la posición del cursor en la lista
lb_ software.DeleteItem(Xindex) // Eliminamos el item seleccionado
ADDITEM()
Adiciona nuevos items para una lista de valores
Syntax
objectname.AddItem ( item )
Controls
ListBox and DropDownListBox controls Ejemplo:
string 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
Respecto al ejemplo anterior:
Lb_software.InsertItem( Apache ,6) //inserta el item en la sexta posición, es decir en el item 6
SELECTEDTEXT
Obtiene el texto seleccionado en un control editable
Syntax
editname.SelectedText ( )
Controls
DataWindow, EditMask, MultiLineEdit, SingleLineEdit, RichTextEdit, DropDownListBox, and DropDownPictureListBox controls
ejemplo: inserta un dropdownpicturelistbox e ingresale como minumo 5 items, en un control, y en el evento que desees ingresa lo siguiente
string Xubica
Xubica = ddlb_software.SelectedText()
SELECTITEM
Encuentra y resalta un item dentro de una lista.
Controls
ListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controls
Syntax
a) objectname.SelectItem (item, index)
ejemplo: integer XIndex
XIndex = lb_software.SelectItem("Power Builder", 2) //si encuentra el texto lo resalta y si no // el valor devuelto es 0
b) lobjectname.SelectItem (itemnumber)
Resalta el item especificado en la lista, si el valor es cero no se selecciona ningún ítem
Syntax
Controls
ListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controls ejemplo
ddlb_software.Selecitem(0) // ningún ítem es seleccionado lb_software.SelectItem(5) // resalta el item 5
TOTALITEMS
Determina el número total de items
Syntax
listcontrolname.TotalItems ( )
Controls
ListBox, DropDownListBox, PictureListBox, DropDownPictureListBox, and ListView controls
STATE
Determina si un elemento de la lista esta resaltada.
Syntax
Listboxname.State ( index )
Controls
ListBox and PictureListBox controls ejemplo:
integer XItemTotal, XItemCount XItemTotal = lb_software.TotalItems( ) // Verifica que items esta seleccionado FOR XItemCount = 1 to XItemTotal
IF lb_software.State(XItemCount) = 1 THEN // Si esta seleccionado MessageBox("Selected Item", lb_software.text(XItemCount)) END IF
NEXT
SETSTATE
Resalta un item dentro de una lista solo es aplicable cuando esta lista es de múltiple selección es decir propiedad Multiselect = TRUE
Syntax
objectname.SetState (index, state)
Controls
ListBox and PictureListBox controls ejemplo
FUNCIONES DE CADENA.
ASC Obtiene el código ASCII correspondiente, de un carácter de tipo cadena. ejemplo :
Asc( ) // retorna 65
CHAR Retorna el carácter correspondiente al código ASCII String XS
XS=Char(42) // retorna *
FILL retorna una cadena con una longitud determinada del carácter especificado. ejemplo
Fill( ,5) // *****
LEFT Retorna un número especificado de caracteres comenzado por la izquierda Ejemplo:
String Xcad
Xcad = Left( Claudia ,3) // Cla
LEFTTrim Retorna una copia de una cadena sin los espacios en blanco del lado izquierdo.
Ejemplo:
String Xcad
Xcad = LeftTrim( Claudia ) // Retorna Claudia
LEN(Cad) Retorna la longitud de una cadena Ejemplo:
String Xcad
Xcad = Len( Claudia ) // Retorna 7
LOWER(Cad) Convierte toda la cadena a minúsculas Ejemplo:
String Xcad
Xcad = Lower( CLAUDIA ) // Retorna claudia
MATCH Determina si la cadena contiene un patrón particular de caracteres. Ejemplo:
Esta sentencia retorna TRUE si el texto contiene una letra Mayúscula: Match(sle_Id.Text, "[A-Z]")
MID Extrae caracteres a partir de una Posición Ejemplo:
String Xcad
Xcad = Mid( Claudia ,4,2) // retorna ud
POS retorna la posición donde comienza una cadena dentro de otra cadena . Ejemplo:
Integer Xpos
Xpos = Pos( Power Builder Bu ) // Retorna 7
REVERSE(Cad) Cambia el orden de los caracteres de una cadena. Ejemplo
String Xrev
Xrev = Reverse( Hola ) // aloH
RIGHT(CAD, n) devuelve caracteres a partir de la derecha Ejemplo:
String Xcad
Xcad = right( Claudia ,3) // dia
SPACE(N) Inserta espacios en blanco Ejemplo:
Cad=Space(5) // devuelve , cinco espacios en blanco.
TRIM(Cad) suprime blancos a ambos extremos de la cadena. Ejemplo:
Cad= claudia // devuelve claudia , cadena sin espacios en blanco a los costados.
UPPER(cad) Convierte toda la cadena a letras mayúsculas Ejemplo:
Cad= especialización // devuelve ESPECIALIZACION.
FUNCIONES FECHA
DAY Retorna el día de una fecha. Ejemplo:Dia = String(Day(2001-04-21)) // retorna 21, convertimos el dato de tipo númerico a
cadena, con la funcion string.
DAYNAME Retorna el nombre de día de la semana Ejemplo:
Cad = DayName(2001-04-22) // retorna Sunday.
DAYNUMBER Retorna el número de día de la semana Ejemplo:
Cad = string(DayNumber(2001-04-22)) // Retorna 1 DAYAFTER Devuelve los días que hay entre dos fechas Ejemplo
Cad = DayAfter(2001-04-22, 2001-04-18) // retorna -4
HOUR Retorna un entero que corresponde al número de horas, que se encuentre en un dato de
tipo hora Ejemplo:
Hour(19:12:42) // retorna 19.
MINUTE retorna los minutos Ejemplo:
Minute(19:42:13) // retorna 42.
MONTH Retorna el número correspondiente al mes de una fecha Ejemplo:
Month(2001-04-22) // retorna 4
Ejemplo
Hora = String(now(), HH:mm:ss ) // string(dato,tipo de salida del dato), en este caso es
hora:minuto:segundo.
RELATIVEDATE Retorna la fecha con respecto a un determinado número de día. Ejemplo:
Date Fecha
Fecha=Relativedate(today(), -25) // la fecha hace 25 días respecto a la fecha actual.
SECONDRetorna el número de segundos. Ejemplo:
Cad = string(Second(14:13:45)) // retorna 45 expresado en un dato de tipo cadena.
TODAY Retorna la Fecha y hora del sistema Ejemplo:
Cad = string(today(), DD/MM/YY ) // retorna una cadena con la fecha del sistema en un
formato de dd/mm/y yes decir , 12/04/03
YEAR Retorna el año de una fecha. Ejemplo
FUNCIONES NUMÉRICAS
ABS obtiene el valor absoluto de un número Ejemplo:
Num= (abs(-34) // retorna 34
CEILING Obtiene el menor número entero que es menor o igual al número especificado Ejemplo: Donde Deci es una variable de tipo decimal
Deci = String(Ceiling(-4.8)) // retorna 4
COS Obtiene el coseno de un ángulo el ángulo debe estar en radianes EXP El resultado de un número elevado a la potencia.
Ejemplo:
Deci = String(exp(1)) // 2.718
FACT Obtiene el factorial de un número Ejemplo:
Num= Fact(4) // retorna 24
MAX Retorna el mayor de dos números Ejemplo:
Num = Max(-4,-7) // retorna -4
MIN Menor entre dos números Ejemplo:
Num = Min(4,7) // retorna 4
MOD Obtiene el residuo de dos números Ejemplo:
Num = Mod(20,7) //retorna 6
PI (n) multiplica PI(3.1416 por un numero) Ejemplo:
Deci = Pi(1) // devuelve 3.14159...
Ejemplo:
Num = Rand(10) // devuelve un número comprendido entre el 1 a 10
RANDONMIZE(0) Randomize Regenera o inicializa el número aleatorio generador. Ejemplo:
Randomize(0)
ROUNDObtiene el número entero comprendido en un número decimal Ejemplo:
Aplicaciones
DFU (Funciones Defindas por el Usuario).
Pueden ser a nivel de Ventana o a nivel de toda la aplicación Ejemplo: Ingresar un monto en soles y lo convierta a letraspor ejemplo si:
Funciones a crear
Es más simple hacer la conversión trabajando con vectores
Paso 1.- Declarar a nivel de instancia (Pestaña Instancia) Declare Instancia
String vec1[]={"Uno","dos","Tres","cuatro","cinco","seis","siete","ocho","nueve"} String vec2[]={"Once","doce","trece","catorce","quince","dieciseis", "diecisiete", & "dieciocho","diecinueve"}
String vec3[]={"Diez","viente","trienta","cuarenta","cincuenta","sesenta", & "setenta","ochenta","noventa"}
String vec4[]={"Ciento","Doscientos","trescientos","cuatroscientos","quinientos", & "seiscientos", "setecientos","ochocientos","novecientos"} Em_1 control de edicion
Mle_1
Contol de múltiple linea F_centenaNum=345
Devuelve en letras:Trescientos cuarenta y cimco
F_mil
F_mill
Num
LetraNum
Tipo int LetraPaso 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 función. b) Tipo de dato de retorno. c) Nombre de la función.
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 código, tipeamos la siguiente estructura:
String cad1,cad2 Int c,res,d,uni c=num/100
res= mod(num,100) if c>0 Then
if c=1 and res=0 then cad1="Cien" else cad1=vec4[c] end if
choose case res case 1 to 9 cad2=vec1[res] case 11 to 19 cad2=vec2[res - 10] case 10, is >=20 d=res/10 uni=mod(res,10) if uni=0 then cad2=vec3[d] else cad2=vec3[d]+ " y "+ vec1[uni] end if end choose
return cad1 + cad2
b
Funcion miles
Tipeamos el siguiente código: String cad1,cad2
Int res,mil mil=num/1000 res= mod(num,1000) if mil>0 then
if mil=1 then cad1="Mil " else Cad1=f_centena(mil)+" Mil" end if
if res>0 Then
cad2=f_centena(res) end if
return cad1 + " " + cad2
FUNCIONES APLICADAS A CONTROL DATA WINDOWS
Estructura de un DatawindowsDatawindows.- Es una carateristicas más importante del Power Builder. El DataWindows es la forma en que sus aplicaciones presentan los datos de la base de datos y quizas incluso datos no específicamente de una base de datos al usuario final; DataWindows pueden ser pantalla de consulta, formato de entrada de datos, reportes de impresión, etc.
Un objeto DataWindow debe ser insertado con una ventana regular, en todo diseño de un DataWindow forman parte dos objetos.
1.- DataWindow Object.- que es diseñado con el DataWindow Painter.
2.- DataWindow Control.- Es un control donde se insertará el DataWindows Object.
Edit Control
Funciones principales de un Datawindows
SetTransObject
Hace que un control DataWindow use un objeto de transacción especificado por el programador. El objeto de transacción proporciona la información nesecesaria para comunicarse con la Base de Datos. Retorna -1 si ha ocurrido un error.
Sintaxis Dwn. Settransobject(Transacción) Argument Description
Dwn El nombre del Control data window, con el cual se desea usar un objeto de transacción.
Transacción Nombre del Objeto de transacción, por defecto es SQLCA.
Generalmente se establece el objeto de transacción en el evento Open de la ventana que contiene el control DataWindow.
En resumen el SettransObject(SQLCA) asocia el objeto transación con el control DataWindow.
Ejemplo:
DwnSoftware.settransobject(SQLCA)
InsertRow
Inserta una fila en un DataWindow, Si alguna columna tiene valores por defecto, La fila es inicializada con estos valores, retorna el número de la fila que se ha añadido, retorna -1 si ha ocurrido un error.
Sintaxis Dwn.InsertRow(fila) Argument Descripcion
Dwn El nombre del control DataWindow en el cual se desea insertar una fila.
Fila Un entero Largo (long) que identifica la fila antes de la cual desea insertar una fila nueva. Si el valor es cero insertará al final de la tabla.
DwnSoftware.InsertRow(0)
Retrieve()
Recupera todas las filas de una tabla de la BDD en un control DataWindow, Si incluyen argumentos, estos son usados por los argumentos de recuperacion de la sentencia SQL SELECT del objeto DataWindow. Retorna el número de filas recuperadas, -1 si ocurre un error.
Sintaxis Dwn.Retrieve({Arg1, Arg2, }) Argument Descripcion
Arg1, Arg2 Argumentos de recuperacion, de la tabla de BDD Ejemplo:
DwnSoftware.Retrieve( C001 )
SetRowFocusIndicator
Especifica el indicador visual que identifica la fila actual en un control DataWindow.
Sintaxis Dwn.SetRowFocusIndicator (Indicador)
Indicador El indicador visual para la fila actual, los valores validos son:
Off! Sin indicador.
FocusRect! Un rectangulo de puntos alrededor de la fila. Hand! Un dedo indice.
El nombre de un Picture Control.
SelectRow
Selecciona la fila especificada en el control de un DataWindows.
Sintaxis Dwn.SelectRow (Fila, Boolean) Ejemplo:
DwnSoftware.SelectRow(0,False) // desactiva la fila anterior DwnSoftware.SelectRow(15,true) // resalta toda la fila 15
SetItem
Establece el valor en una fila y columna especificada, un valor dentro del datawindow, retorna -1 si ocurre un error.
Sintaxis DwnSoftware.Setitem (Fila, columna/campo, valor) Ejemplo:
Dwn.SetItem(5, "sueldo",670)
En la fila 5, en el campo sueldo se asigna 670.
También en vez del nombre de campo, puede ser el número de campo de acuerdo como ha sido seleccionado en el objeto DataWindow.
GetItemString
Obtiene datos de tipo cadena de un buffer especificado de un control DataWindow.
Sintaxis Dwn.GetitemString (Fila, Columna) Ejemplo
String cad
Cad=DwnSoftware.GetItemString(3, "sfw_Nombre")
Extrae el dato que se encuentra en el campo sfw_nombre, en la fila 3, dependiendo del tipo de dato que se va extraer tenemos:
Dwn.GetitemNumber (Fila, columna) Cuando el campo es de manera general numérico, puede ser real o entero.
Dwn.GetitemDecimal (Fila, columna) Cuando el dato a extraer es exclusivamente decimal o real.
Dwn.GetitemDate (Fila, columna) Si el campo es de tipo fecha. Dwn.GetitemTime (Fila, columna) Si el campo es de tipo hora.
Dwn.GetitemDateTime (Fila, columna) Cuando el campo es de tipo fecha y hora.
Ejemlo: Capturar en variables, sueldo del empleado, su edad y fecha de nacimiento del empleado, cuya posición se encuentre en la fila número 3.
Int edad Dec Sbas Date Fenac
Edad= DwnEmpleado.GetItemNumber(3,"emp_Edad") Sbas= DwnEmpleado.GetItemDecimal(3, "emp_Sbas") Fenac=DwnEmpleado.GetItemDate(3,"emp_Fenac")
Nombre del campos en la tabla.
Gettext
Obtiene el valor de un control de edicion en la fila y columna actuales, antes que este sea aceptado.
Sintaxis dwn.Gettext ()
Por ejemplo si este radio button se encuentra dentro del DataWindow, y al seleccionar una de estas opciones se desea saber su valor seleccionado basta emplear:
String Tmoneda
Tmoneda = DwnSalario.Gettext()
Setsort
Especifica, el criterio de ordenamiento para un DataWindow, retorna 1 si tuvo éxito y -1 si se encontro un error.
Sintaxis Dwn.SetSort (campo1 [A|D]) Ejemplo:
DwnEmpleado.setsort()
Ejecuta la clasificación con un previo criterio de selección Sintaxis Dwn.Sort ()
Ejemplo:
DwnEmpleado.SetSort("emp_ape A, #2 D") // ordena apellido y sueldo asumiendo // que el #2 sea el campo sueldo. DwnEmpleado.Sort() // Procede al ordenamiento.
GetRow
Retorna el número de la fila actual de un DataWindow, como un valor Long, Retorna 0 si no hay fila activa y -1 si se ha producido un error grave. Sintaxis Dwn.GetRow ()
SetRow
Establece la fila deseada, mueve el cursor a la fila especificada, pero no hace Scroll en el DataWindow.
Sintaxis Dwn.SetRow (Fila)
ScrollToRow
Hace un Scroll en un DataWindow, hasta alcanzar la fila especificada.
ScrollToRow cambia la fila actual pero no la columna actual. Retorna 1 si hubo éxito, -1 en caso contrario. Scrolltorow no ilumina la fila a la cual se hace scroll.
Sintaxis Dwn.ScrolltoRow(fila)
Si la fila toma un valor mayor que el número total de la fila, se hace scroll a la última fila.
RowCount
Obtiene el número de filas que se encuentran disponibles en un DataWindow Sintaxis Dwn.RowCount()
ScrollToRow
Causa que el control se deslice a la fila especificada, cambiando la fila actual, a donde se le indique.
ScrollToPriorRow
Se desliza a la fila previa, sin cambiar la columna activa Sintaxis Dwn.ScrollPriorRow(fila)
ScrollNextRow
Se desliza a la siguiente fila. Sintaxis Dn.ScrollNextRow(fila)
DeleteRow
Suprime la fila especificada del control DataWindow, se actualiza directamente la tabla enlazada al control.
Sintaxis Dwn.DeleteRow(fila)
Si la fila es igual a cero, elimina la fila activa donde se encuentra el puntero, cada vez que se emplee esta sentencia, se tiene que actualizar el DataWindow ejemplo:
Dwn.deleteRow(8) // elimina la fila número 8
Dwn.Update() // actualiza la base de datos enlazada
DeletedCount
Retorna el número de filas que hayan sido suprimidas desde el control DataWindow pero que todavia no hayan sido actualizadas en la tabla de la BDD asociada.
Sintaxis Dwn.DeletedCount() Ejemplo:
Long Nf
Nf=Dwn.DeletedCount()
Update
Se envia a la base de datos todas las inserciones, eliminaciones y actualizaciones del control DataWindow, retorna 1 si tuvo éxito, -1 si ocurrio un error.
Utilización del Datawindows
El objeto DataWindows en si no es de ninguna utilidad, si no se vincula con un DataWindow control. Este objeto, es visual y es posible de insertar directamente en una ventana; para que pueda ser utilizado por el usuario.
Desarrollar la Siguiente aplicación.
Uso de filtros (Find SetFIlter)
A.- Seleccionamos en el control sueldo el carácter de condición e ingresamos un valor numérico que representa al sueldo básico, luego presionamos clic en el boton Mostrar y tendremos los requeridos.
B.- Se ingresa solo los primeros caracteres del nombre, si huviera algún registro que contenga dichos caracteres, deberá resaltar el primer registro tal como observamos en el ejemplo.
A
A
B
Pasos 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)
TABLAS
Ingresar datos consistentes en las tablas creadas, como se muestra a continuación:
FACTURA VENDEDOR
Paso 2.- Diseñar el DataWindow - (File-New-DataWindow)
- Se elige el estilo de Presentación: (Elegir el Tipo Tabular)
Estructura:
Vendedor:
Codv Char 4 Null(no)
Nomv varchar 30
Sbas Numeric 8,2
Factura
Nfac char 6
Codv char 4
Impor Numeric 8,2
Tipov char 1
Presentación Descripción
Composite Utiliza como presentación, un reporte previamente creado. Freeform La presentación es libre, cada campo se muestra en una línea
distinta. Muy utilizado para el ingreso de datos.
Graph Diseña un gráfico dependiendo de una consulta, esta debe contener datos relacionados.
Grid Diseña una malla de datos en forma columnada, y cada columna con una justificación completa.
Group Diseña listado por agrupación de campos. Muy utilizado para reportes de resumen de información.
Label El diseño es de etiquetas, donde Ud. podrá elegir el tipo de etiqueta de las prediseñadas, en papel continuo o separado, y otras opciones.
Rich Text Permite definir una carta con combinación de campos del Origen de Datos fijado. Se pueden utilizar todas las características del formato de texto RTF.
Tabular Presenta el Origen de Datos en forma columnada pero sin ajuste total. Permite una mayor libertad en el diseño.
Modos de trabajo: (Seleccione SQl Select)
El modo de trabajo define como se trabajara con el Origen de Datos. Existen 5 tipos de modos de trabajo.
Modo Descripción
Quick Select Nos presenta las tablas en forma gráfica, y solo permite las sentencias ordinarias de SQL (Sort y Criteria). La primera para sentencia sirve para poder ordenar por el campo específico y la segunda sentencia para indicar registros a mostrar dependiendo de un valor condicional (Ejemplo: <39)
Sql Select Presenta las tablas en forma gráfica, y permite trabajar con todas las características de Sql estándar (Sort, Group, Having, Compute y Where, entre otros)
Query El Origen de Datos es una consulta definida previamente en el Area de Trabajo Query; esta consulta queda almacenada como un objeto de PowerBuilder; Ud. debe seleccionar la consulta que desee utilizar como Origen de Datos de este DataWindows. External El Origen de Datos no esta relacionado con ninguna Tabla. Ud.
debe definir los campos que interactúan (nombre, tipo y tamaño) Utilice los botones Add para añadir un nuevo campo al final de los ya existentes, el botón Insert le permitirá insertar un campo entre otros y el botón Delete le permitirá eliminar el campo actual.
Stored Procedure
El Origen de Datos es un procedimiento que ha sido almacenado en la Base de Datos. Seleccione uno si lo ha creado, o créelo previamente.
Al seleccionar SQL SELECT mostrara la siguiente pantalla:
Seleccione las tablas a usar y precione el boton Open, de inmediato apareceran lasa tablas seleccionadas
Paso 3.- Seleccione la Tabla Vendedor
Luego Seleccione los campos de la Tabla como se muestra a continuación:
y al grabar mostrara la siguiente solicitud (control + W):
Presionamos Sí, para aceptar los cambios
Ud. Puede modificar el color de las columnas y estilo:
Teniendo opción a validar cada campo de ingreso o de salida a traves de sus propiedades.
Proceda a grabar el objeto DataWindow (almacene en la biblioteca creada y asignarle un comentario, para determinar cuando se debe de usar dicho DW), tendremos la siguiente
vista:
Color de fondo del DW Color del texto del DW
Color de las Cabeceras del DW Estilo de las cabecera del DW Estilo del texto del DW
Preview
Diseño
Propiedades
Una vez Grabado colocarlo en el formulario: (File-New-Project-Window) A traves de la caja de herramientas.
Controles DataWindows (dw_1, dw_2), como se observa acontinuación:
Dw_1
Dw_2
ddplb_1
Objeto DataWindow Control (Caja de Herramientas)
El Objeto DataWindow Control se selecciona del listado de objetos que se pueden insertar en una ventana, simplemente haga un clic sobre el siguiente icono . Luego haga un clic en la posición de la ventana, donde desea poner el DataWindow Control.
Paso 4.- En el control ddplb ingresamos los siguientes ítems:
Paso 5.- Codificar en el control ventana1, evento open(), lo siguiente //establece las conexiones con los Objetos DataWindows
dw_1.settransobject(sqlca) dw_2.settransobject(sqlca) //carga los datos en el buffer dw_1.retrieve()
dw_2.retrieve()
Nombre por defecto del Control
DataWindow.
Seleccionar el Objeto DataWindow,
previamente creado.
Propiedades complementarias al
control DataWindow.
//ordena el DataWindow por el campo nombre ascendentemente. dw_1.setsort ("#1 a")
dw_1.sort()
//establece las posiciones de orden, segun el TABULADOR sle_1.taborder=0 ddplb_1.taborder=1 sle_2.taborder=2 cb_1.taborder=3 dw_1.taborder=4 dw_2.taborder=5
//limpia las cajas de texto sle_1.text=""
sle_2.text=""
//establece el foco del cursor sle_1.setfocus()
//posiciona en el primer item del ddplb (combobox) ddplb_1.selectitem(1)
Paso 6.- Codificar en el control sle_1, evento modify(), lo siguiente //declaramos las siguientes variables
string busca int nf,r
//preguntamos si se ha escrito algúna letra en el control sle_1 If len(sle_1.text)>0 then
//almacenamos en la variable busca la siguiente sentencia busca="Nomv like '" + trim(sle_1.text) + "%' "
//contamos el número de filas del control DW nf=dw_1.rowcount()
//realizamos la busqueda de la sentencia ya antes almacenada r=dw_1.find(busca,1,nf)
// preguntamos si se ha obtenido un valor mayor a cero // si este fuera el caso entonces significa que ha encontrado
// uno o varios valores en la busqueda (dependiendo de la sentencia) if r>0 then
//marcamos y nos posicionamos en la fila encontrada dw_1.selectrow(0,false)
dw_1.selectrow(r,true) dw_1.scrolltorow(r)
end if end if
Paso 7.- Codificar en el control sle_1, evento modify(), lo siguiente STRING cad
// la funcion Trim suprime los blancos
cad = "Sbas " + trim(ddplb_1.text) + " " + trim(sle_2.text) dw_2.setfilter(cad)
dw_2.filter()
Paso 8.- Codificar en el cb_1, evento clicked(), lo siguiente int r
r=dw_1.getrow()
dw_1.selectrow(0,false) dw_1.selectrow(r,true)
Script a Nivel de la Aplicación: // Profile Venta
SQLCA.DBMS = "ODBC" SQLCA.AutoCommit = False
SQLCA.DBParm = "Connectstring='DSN=venta'" //nos conectamos con la Base de Datos
connect;
//preguntamos si ha ocurrido un error en la conexión If Sqlca.Sqlcode<>0 then
Messagebox ("Error de Conexión",Sqlca.SqlErrText) Halt
else
//abrimos la ventana 1 de nuestro proyecto open(ventana01)
end if
Clic en el siguiente icono y obtendremos la siguiente
ventana
Clic en el boton Edit…. Clic en la siguiente pestaña Obtendremos la siguiente vista
Copie el contenido en la aplicación. Lugo proceda a ejecutar el programa
DataWindow Retrieval Arguments con Campos Calculados
Aplicación.Mostrar las Facturas por cada vendedor, se ingresa por teclado el código del vendedor. Con las Tablas: Vendedor y Facturas, elaborar el siguiente DataWindow:
Paso 1.- Seleccionar el tipo Tabular en el DataWindow.
Paso 2.- Abrir las tablas Facturas y Vendedor, luego seleccione los campos que necesite en la consulta como se observa a continucación:
Paso 3.- Del menú de opciones seleccionar Design, luego seleccionar Retrieval Arguments.
Colocar la variable receptora, a través de esta variable ingresará un código y procederá há realizar la búsqueda en el DataWindow.
Paso 4.- En la opción Where seleccionar el campo para realizar la condición con la variable definida anteriormente, la variable debe ser precedida por dos puntos(:Var) Observe el grafico
Luego Pulse ctrl. + W
Paso 5.- El estilo Tabular mostrará 3 secciones de trabajo que son: 1. Header1 (cabecera).
2. Detail (detalle).
3. Summary (donde se muestran los campos totales).
Cada campo tiene un conjunto de propiedades que se muestran en la parte lateral derecha, dar forma a la presentación de la consulta moviendo las cabeceras y etiquetas de cada campo de la siguiente manera:
Para ver como esta saliendo el diseño puede comprobarlo mediante la opción Row del menú principal y seleccionando Retrieve, para ello le pedirá ingresar un código de vendedor.
Paso 6.- Completar los campos de comisión, comisión total y pago total a través de las opciones del menú principal: Insert – submenu Control – opcion Compute Field.
Al seleccionar esta opción Computed Field , llevar el cursor en la posición donde desea colocar el calculo de la comisión (Detail), luego mostrara la ventana de Modify Expresión donde colocara la expresión para la comisión , para facilitar la edición de esta expresión haga un Clic en los campos mostrados en Columns.
Codificar la siguiente sentencia, para determinar la comisión del empleado, si tipo de empleado es en tonces su comisión será del 8 %, de lo contrario será el 5%.
Paso 7.- Cambie de nombre en name (compute_1 nombre por defecto, por Comision)
Ampliar la sección resumen, para colocar el total del campo calculado comisión y pago total.
Para la suma del comisión marcar el campo calculado comisión, similar al Paso 6 Insert Control- Elegir Sum, entonces autómicamente mostrara el campo sumado en name colocar el nombre (Tcom).
Para el calculo pago total, de forma similar seleccionar el paso anterior seleccionar Insert-Control-Computed Field y editar la siguiente expresión.
Luego complete las etiquetas, para mostrar la objeto DataWindow final.
Paso 8.- Luego Inserte un formulario o ventana para colocar el DataWindow, la presentación final sera:
Grabar la ventana con el nombre de Ventana01 Paso 9.- Codificar los scripts:
- En la ventana, evento open(), codifique lo siguiente: Dw_1.SettransObject(Sqlca)
Sle_1.text = Sle_1.setfocus()
- En el control sle_1, evento modify(), codifique lo siguiente: String Cad
Cad=Trim(Sle_1.text)
If Dw_1.Retrieve(Cad) =0 Then // Sino se recupera ninguna fila MessageBox( Error , Código no existe, verificar ,information!) End if
En la aplicación hacer la conexión con la BDD
// Profile VentaSQLCA.DBMS = "ODBC" SQLCA.AutoCommit = False
SQLCA.DBParm = "Connectstring='DSN=venta" connect;
If Sqlca.Sqlcode<>0 then
Messagebox ("Error de Conexión",Sqlca.SqlErrText) Halt
else
open(ventana01) end if
Mantenimiento de una BDD
Utilizar la tabla vendedor agregando los campos feing (fecha de ingreso) y grado (grado de estudios).
Realizar también las validaciones correspondientes en cada campo:
Paso 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.
Al campo grado editarlo como un combo:
1. Seleccione dicho campo y en propiedades seleccionar la pestaña 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 gráfico.
Observe como se incorpora la función en el campo a nivel de columnas, specificaciones, si desea una área más amplia hacer doble click en Validation Expresión.
5. Ademas dar formato de fecha y formato monetario a los campos: fecha de ingreso y sueldo básico; en la misma propiedad Edit pero seleccionado EDIT MASK en Style Type.
Paso 3.- Diseñar el siguiente Formulario: Nombre de la Ventana: Ventana02
Nombre de la Ventana: Ventana03
Script Open for aplicación // Profile Venta SQLCA.DBMS = "ODBC" SQLCA.AutoCommit = False SQLCA.DBParm = "Connectstring='DSN=venta" connect; If Sqlca.Sqlcode<>0 then
Messagebox ("Error de Conexión",Sqlca.SqlErrText) Halt
else
open(ventana02) end if
Script clicked for pb_pri Dw_1.Scrolltorow(1) Dw_1.Setfocus()
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 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()
cb_graba.enabled=false cb_recupera.enabled=false Script clicked for Cb_Busca open(ventana03)
Script clicked for Cb_Recupera dw_1.setfilter("") dw_1.filter() dw_1.setsort("#1 A") dw_1.sort() dw_1.retrieve() cb_graba.enabled=false Script clicked for Cb_Salir Halt
Paso 4.- En la ventana 03 codificar los siguientes script Script Load for Ventana03
sle_1.text="" sle_1.setfocus()
Script Modify for sle_1 string cad long nf nf=ventana02.dw_1.getrow() cad="codv = '" + trim(sle_1.text) + "'" ventana02.dw_1.setfilter(cad) ventana02.dw_1.filter() if ventana02.dw_1.rowcount()=0 then ventana02.dw_1.setfilter("") ventana02.dw_1.filter() ventana02.dw_1.setsort("#1 A") ventana02.dw_1.sort( ) ventana02.dw_1.scrolltorow(nf)
messagebox("Error","Código no existe" + string(nf)) else close(ventana03) ventana02.cb_graba.enabled=true ventana02.dw_1.setfocus() ventana02.dw_1.setcolumn(1) end if
Elaboracion de una factura
Tablas Básicas para la elaboración de la factura
Los Script para cada evento 1.- W_Factura Open dw_1.settransobject(sqlca) dw_fac.Settransobject(Sqlca) dw_1.retrieve(" ") Cb_Nueva Clicked int f
select max(Nfac) into :xfac from fac_cab; if isnull(xfac) then
xfac=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()
if 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 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)
Aplicacion
Considerando que tenemos el mantenimiento de la tabla cursos, al realizar un click en el boton Alumnos, se carga la ventana de alumnos, pero solo se mostrarán los datos de aquellos alumnos de dicho curso (Fila activa de la Tabla Cursos).
Para la Ventana alumnos elaboramos: Un Objeto DataWindow
Data Source SQL Select Style Tabular Nombre Dw_Notas
Luego seleccione todos los campos a utilizar.
Especificamos el argumento de recuperacion de curso.
Paso 1.- Del Menu de Design seleccione la Opcion Retrival Arguments.
Paso 2.- En name seleccione cualquier nombre de variable de tipo igual al campo utilizado como argumento.
Paso 4.- Luego especifique La creacion del Obejeto Estructura, utilizando (Structure painter) del Menu Principal(Power Bar)
File – New – pestaña PB Object - Structure. En la venta de dialago, especifique:
Codigo_Curso de tipo String Nombre_Curso de Tipo de string Se debe almacenar como S_curso
Paso 5.- En la ventana alumnos (VenAlumnos) Declarar una variable de instancia String vi_codcur
Paso 6.- Codificación de eventos para obtener la lista de los alumnos por curso.
Se realiza a traves de un boton de la ventana Cursos VenCursos (Mantenimiento de cursos).
La ventana VenAlumnos debe recibir el parametro (código del curso), que se envia desde la Ventana VenCursos.
Paso 7
Script -Clicked for Cb_alumnos (W_cursos) long nf
S_curso Origen //asignamos una variable llamada origen de tipo S_curso nf=dw_1.getrow()
origen.codcur=dw_1.getitemstring(nf,"cur_cod") origen.nomcur=dw_1.getitemstring(nf,"cur_des") openwithparm (VenAlumnos,origen)
paso 8
Script -Open for (VenAlumnos) S_curso Destino Destino=message.powerobjectparm vi_codcur=Destino.codcur this.title=vi_codcur + " - " + Destino.nomcur cb_graba.enabled=false dw_1.SETTRANSOBJECT(sqlca) dw_1.retrieve(vi_codcur) Dw_Alumnos.SetRowFocusIndicator(Hand!)
if dw_1.rowcount()<>0 then dw_1.modify("alu_pro.color='0~t if(alu_pro>=11,RGB(0,0,255),RGB(255,0,0))'")
Script 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.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 nota<0 or nota>20 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
Script ItemError For Dw_alumnos Return 1
PRIMERA PRÁCTICA CALIFICADA
1. Especificaciones de la aplicación
Creadas las tablas con sysbase SQL Anywhere para almacenar las facturas de los clientes
• Productos (Clave principal cod_Prod) • Clientes (Clave principal Cod_Cli) • Facturas (Clave Principal Num_Fact,
Clave Foranea Codigo del Cliente) • Deta_Factura (Clave Principal Num_fact,Cod_prod Clave Foranea Num_fact
Clave Foranea Cod_Prod) Relacione las tablas con sus respectivas Claves.
Los registros para cada tabla se adjunta a este proyecto.
2.- La aplicación debe permitir realizar las operaciones:
2.1 Tener una ventana principal (VMain) con las siguientes opciones: 2.1.1 Mantenimiento de la Tabla Clientes (VManClientes)
2.1.2 Mantenimiento de la tabla Productos (VManProductos) 2.1.3 Consulta de Facturas.
3.- En la consulta de Facturas por Clientes, se debe tener una ventana con los siguientes controles DataWindow: (VConFacturas)
3.1 DW_Clientes (estilo Grid), donde solo debe mostrar los campos (Cod_cli,Nom_Cli,Tel,Ruc)
3.2 Dw_Facturas (estilo Tabular), donde debe mostrar las columnas (Num_fact, Fecha, Subtotal, Igv, total).
3.3 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.
3.4 La ventana (VConFacturas) tendra un boton Detalle donde permite visualizar en otra ventana( VFacDetalle) el detalle de la factura
3.5 Ventana (VFacDetalle) debe mostrar todos los campos de la tabla detalle factura con el campo descripcion del producto (tabla producto).
Nota.- El diseño de la aplicación es a criterio del alumno. Su presentacion y estetica también se considera.
Aplicación Cuenta Corriente
Esta aplicación permite generar un campo en este caso es el número de movimiento y actualizar el saldo en el archivo ahorro.
Script open for aplicación: // Profile conexion con sqlserver
SQLCA.DBMS = "MSS Microsoft SQL Server 6.x" SQLCA.Database = "BDBANCO" SQLCA.ServerName ="(local)" SQLCA.LogId = "SA" SQLCA.AutoCommit = False SQLCA.DBParm = "" CONNECT; if sqlca.sqlcode<>0 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 r<1 then
messagebox("Error","Nro de cuenta no existe") else nsal=dw_1.getitemnumber(r,"saldo") dw_2.settransobject(sqlca) dw_2.retrieve(cad) /* if nf>0 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
Script 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()
SEGUNDA PRÁCTICA CALIFICADA
Se requiere un programa para automátizar las ventas de pasajes aéreos, para ello se cuenta con las siguientes tablas:
Base de datos Vuelos DB Tablas:
Rutas tipo Long Texto
Cod_rut Char 4 Codígo de ruta Nom_rut Varchar 15 Nombre de ruta
Pago_cho Numeric 6 1 pago por viaje al chofer Viajes tipo Long Texto
Nro_via Char 6 Nro de Viaje Cod_rut Char 4 Codigo de ruta Fsal_via Date Fecha de salida Hsal_via Time Hora de Salida Cos_via Numeric 6 1 Costo del Viaje Nro_vac Numeric 3 Nro de vacantes Cod_cho Char 4 Codigo del Chofer
Flag Char 1 S(si) N(no) viaje realizado
Pasajeros tipo Long Texto
Nbol Numeric 5 Numero de Boleto Nrovia Char 6 Nro de Viaje
Nom_pas Varchar 25 Nombre del pasajero Tipo Char 1 (E)studiante (A)dulto (N)iño Pago Numeric 6 1
Chofer tipo Long Texto
Cod_cho Char 4 Codigo del Chofer Nom_cho Varchar 25 Nombre del chofer Sba_cho Numeric 6 1 Sueldo basico Realizar:
1.- Colocar las claves principales y foráneas para cada tabla, cuando relacione cada tabla conformar la opcion:
• Delete any Dependent Rows (CASCADE), por ejmplo cuando se anule un registro en viaje anule a todos los pasajeros.
3.- En el mantenimiento del archivo de viajes debe tener un botón de Pasajeros de tal modo que permita visualizar solo los pasajeros de ese viaje en otra ventana (adicion, anulacion y modificacion), en la adicion se trae el campo nro de viaje y costo de la ventana anterior(ambos de estilo tabular), el pasajero tendra un descuento de acuerdo al tipo :
Estudiante 30% Niño 50% Adulto 0%
• El nro de viaje se genera AA9999 los primeros 2 digitos año del sistema y los cuatro últimos digitos un correlativo.
• Para el DataWindow de viaje el campo codígo de ruta y codígo del chofer debe incorporarse un DataWindow para cada uno, para que su selección sea más explícita. • El número de Boleto se genera a partir del 00001 de manera correlativa
• Luego de cada adicion de pasajeros las vacantes en ese viaje debe disminuirse en la unidad.
4.- Consulta de viajes por chofer, debe mostrarse en una ventana.
La lista de Choferes, al seleccionar uno de ellos, deberá presentar los viajes realizados, al final debe aparecer su pago total
5.- Consulta de viajes por rutas. En esta ventana; al elegir una ruta (en un control DataWindow) debe mostrar todos los viajes programados (en otro control data) al seleccionar el viaje debe mostrar la relacion de pasajeros.
6.- Consulta de viajes por fecha, en esta ventana se debe ingresar dos fechas: fecha inicial y final en caso que solo se ingrese la fecha inicial se debe tomar hasta la última fecha de viaje, mostrando en un control DataWindow las siguientes columnas:
NroViaje,Nombre de ruta , Nombre del pasajero y tipo
7.- Elabore un menú para relacionar cada opcion con las tareas pedidas.
8.- El diseño y presentación de cada ventana es de acuerdo a criterio del alumno. Nota
Eeste trabajo es para 2 semanas de laboratorio, sera revisado cada avance. • Trabajo en forma grupal, solo se tomara en cuenta a los alumnos regulares.
Objetos de Usuario
Tema Custom Clases VisualesPor ejemplo se desea realizar el siguiente evento de usuario:
Paso 1.- En New seleccionar PB OBJECT
Seleccionar Custom Visual
El cual va a mostrar una pantalla similar a la window estándar, para diseñar su plantilla: Realizar el siguiente diseño: tiene dos controles etiquetas, uno encima de otro, uno con fondo blanco y el otro con fondo azul, una tercera etiqueta para ver el porcentaje del proceso.
ST_1
ST_2
St_pg (para ver el porcentaje)
Codificación del uo_progreso Declare Instancia
Int Ir_alfinal
Functions Uf_iniciar(int vini) return none ir_alfinal=vini
st_2.width=0
Functions Uf_avance(integer valor) return none Int porcen, ancho
Real razon
Ancho=st_1.width Razon=valor / ir_alfinal Porcen=round(razaon*100,0)
Clases
Crear las siguientes clases de Objetos de usuarios 1.- Los Visuales
a) Un Progres según se muestra en la figura
b) Un control para desplazamiento de paginas y de Impresión
c) Colocando una caja de texto que permita adicionar o restar días a una fecha a través de Vscroll
d) Colocando dos listBox , al desplazarse en uno de ellos que se encuentre sincronizado
e) Pasando una cadena a una etiqueta que dicha cadena sea tipo Blink f) Colocando un cuadro texto que solo acepte letras y espacios en Blanco.
2.- No Visuales
a) Una función que permita sumar una columna numérica, se pasa como valor el control DataWindow y el número de columna.
b) Un evento que permita centrar una ventana, se pasa como valor una ventana. c) Una función que permita generar un código, se pasa como dato un control
DataWindow, el valor inicial del código, el código puede empezar con una letra o número.
d) Un evento que permita cambiar el color de una columna de un control DataWindow, pasar como dato el control DataWindow y el número de columna.
Capitulo de Graficos en Power Builder
Es un estilo de un DataWindow, pero también se pueden efectuar gráficos a través del control graph.
Aplicación
Se tiene las Base de Datos (EMPRESA), que tiene las siguientes tablas:
Realizar el grafico como se muestra en la figura. Para ello Diseñar los siguientes DataWindow
Datawindow Tablas Campos Category Values Retrieval
Arguments Datag01 Departamento y Salarios Nom_dept, Cod_emp Nom_dept Count(Cod_emp) Datag02 Departamento y Salarios
Cod_emp,sueldo Cod_emp Sueldo Nom_dept
Datag03 Empleado Todos Cod_emp
Aplicar las propiedades correpondientes a los mencionados DataWindows
Al hacer Click en un empleado mostrará una ventana con sus datos personales, como se muestra en el ejemplo
Laura
Script 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
if ClickedObject=Typedata! or ClickedObject=TypeCategory! then id_emp= this.CategoryName(nomgraf,v_categoria)
openwithparm(venfichae,id_emp) Else
Messagebox(parent.title,"Click en departamento para ver Detalle de empleado") end if
Open for VenFichaEmp string cod
dw_1.settransobject(sqlca) cod=message.stringparm dw_1.retrieve(cod)
Script Cliked for cb_1 (VenFichaEmp) close(venfichae)
Aplicación Formularios MDI
y Objetos de Usuario.
En esta aplicación se ha utilizado Ventanas con herencia (inheret) donde la ventana w_sheet-dw es la ventana padre que contiene funciones definidas por el usuario
Creación de Objetos de Usuario empleado para contener controles de tipo general que seran empleados, por las otras ventanas descendientes (w_alumnos y W_cursos); ademas se han elaborado las funciones de objeto usuario con la finalidad de generalizar las tareas de los eventos.
1.- Para crear un objeto usuario siga los pasos del profesor: a)
b) c)
2.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()
4.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
i_row=this.getrow() if i_row<1 then return this.selectrow(0,false) this.selectrow(i_row,true) 7.- Eventos para el menu01
7.1 Script m_alumnos for dw_1 window lw_win
opensheet(lw_win,"w_alu",parentwindow,0,layered!) 7.2 Script m_cursos for dw_1
window lw_win
opensheet(lw_win,"w_cursos",parentwindow,0,layered!) 7.3 Script m_vertical for menu01
parentwindow.triggerEvent("ue_vertical") 7.4 Script m_horizontal for menu01
parentwindow.triggerEvent("ue_horizontal") 7.5 Script m_cascada for menu01
parentwindow.triggerEvent("ue_cascada") 7.6 Script m_totalw for menu01
parentwindow.triggerEvent("ue_totalw") 7.7 Script m_close for menu01
close(parentwindow) 7.8 Script m_salir for menu01
Halt
TERCERA PRÁCTICA CALIFICADA
Elaborar la BDD Matriculas DB, cuyas tablas son: ALUMNOS
Campo Tipo Descripción
Codal C(6) Código
NomAl C(15) Nombre
Ape C(15) Apellido
Femat Date Fecha de Matricula
CURSOS
Campo Tipo
Descripción
CodCur C(4) Cod.
Curso
NomCur C(15) Asignatura
NHrCur N
Nro
de
Horas
NOTAS
Campos Tipo Descripcion Codal C(6) Código Alumno Codcur C(4) Curso
Exp N Ex. Parcial
Exf N Ex . Final
Establecer los campos principales y las claves Foráneas Se Pide elaborar:
1) La Observación Mostrará aprobado (Azul) desaprobado (rojo), el examen final es de Peso Doble.
2) Hacer una consulta por apellido , para ello digitara solo los primeros caracteres de un apellido y en un DataWindow de tipo tabular mostrara a todos los alumnos que comienzan con esos caracteres
3) Consulta por curso, Se ingresara por teclado El código o Nombre de Curso luego en un DataWindow mostrara a todos los alumnos que llevaron dicho curso ordenado por promedio de manera descendente, los promedios menores a 11 mostrarlos con rojo de lo contrario con azul.
4) consulta por fechas, para ello se ingresara dos fechas por teclado la fecha inicial y la Fecha final, en caso de no ingresar la fecha final se tomara en cuenta hasta la fecha actual del sistema. Y mostrara en un DataWindow la relación de alumnos matriculados en ese rango.
5) Repita el Proceso 1 haciendo una consulta en Cascada, es decir en un formulario habrá dos DataWindow, en el primer DataWindow mostrara la relación de alumnos y en el segundo todos los cursos que ese alumno ha llevado con su promedio respectivo, de tal modo que al hacer un ClicK o cambiar la fila del DataWindow alumno cambiara automáticamente el segundo DataWindow.
6) Realice solo el mantenimiento de la tabla alumno, el código del alumno se va a generar a partir A00001
CUARTA PRÁCTICA CALIFICADA
De La BDD del Demo de Power Builder Considerar las siguientes Tablas y campos para cada una de llas:
Customer Clientes Sales_Order Orden dePedido
ID (N) Fname ( C ) Lname ( C ) Company_name ( C) State ( C)
Identificación del Clie Primer Nombre Ultimo Nombre Nombre _Compañía Rstado ID ( N) Cust_id ( N ) Order_Date ( D ) Region ( C ) Nro de Pedido
Identificación del Clie Fecha de pedido
Sales_Order_Items ( detalle del Orden) Product Producto ID ( N ) Line_Id (N) Prod_ID Quanty Ship_Date Nro de Pedido Nro de Item Codigo de Producto Cantidad Fecha de Envio ID ( N) Description Unit_Price Codigo de Prod. Descripción Precio Unitario
Las Tablas ya tienen datos consistentes: Realizar:
1) Seleccionando un año en un combo (1996 - 1999) muestre la cantidad de pedidos por Mes durante ese año , los meses deben ser Enero,febre,... (10 Puntos)
Clientes
Codigo Nombre y apellido Compañia Telefono
Orden de Pedido
Nro de Pedido Fecha de Pedido Region
Detalle del Pedido
Item Descripción del Producto Cantidad Precio Total Total por Pedido
Animaciones
Por ejemplo si se desea mostrar una papelera de reciclaje cuendo se elimina un registro o cuando se copia emplear controles ole.
Cb_graba Clicked ole_1.insertfile("c:\Iamgenes\filecopy.avi") ole_1.activation=activateongetfocus! ole_1.setfocus() Cb_anula Clicked ole_1.insertfile("c:\Imagenes\filedel.avi")
Control Ole , insert
control Avi
ole_1.activation=activateongetfocus! ole_1.setfocus()
int rs
OLEObject ole1
ole1 = create OLEObject
rs = ole1.SetAutomationTimeOut(10000)
.
DataWindow Dinamicos
Sin utilizar objetos datawindow se puede mostrar en un control dartawindow resultados de una instrucción SQL.
SyntaxFromSql Genera datawindow fuente, basado en instrucciones SQL. Syntax
transaction.SyntaxFromSQL (sqlselect, presentation, err) Argument Description
transaction Objeto de Transaccionn
sqlselect Una Cadena que contiene instrucciones SQL
presentation una cadena donde se define el estilo del datawindow mediante Style(Type=presentationstyle)
Los valores del estilo de presentación son: Grid, Form, Group(reporte), Graph, tabular err Una cadena donde se va a recepccionar . el mensaje de error en caso que lo hubiera.
Ejemplo:
La siguiente sentencia crea un Datawindow grid en dw_1 desde la fuente generada por la función SyntaxFromSQL Si ocurre un error, la cadena ERRORS podría contener cualquier mensaje de error que es generada, mostrando un mensaje al usuario. Observe que debe efectuarse a través del Objeto SQLCA:
Cb_Carga Clicked string ERRORS, sql_syntax
string presentation_str, dwsyntax_str sql_syntax = "SELECT * from empleado" presentation_str = "style(type=grid)"
dwsyntax_str = SQLCA.SyntaxFromSQL(sql_syntax, presentation_str, ERRORS) IF Len(ERRORS) > 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
Alberto
Moreno Cueva
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 mSes mailReturnCode mRet mailMessage mMsg mailFileDescription mAttach[]
string ls_ret, ls_syntax, ls_name, ls_open_pathname, ls_filename
string ls_attach_name='c:\pbl\error.psr'
int li_index, li_nret, li_nrecipients, li_nfile boolean lb_noerrors
mSes = create mailSession
mRet = mSes.mailLogon ( mailNewSession! )