• No se han encontrado resultados

Manual Power Builder

N/A
N/A
Protected

Academic year: 2021

Share "Manual Power Builder"

Copied!
92
0
0

Texto completo

(1)

POWERBUILDER 9.0

Ing. Alberto Moreno C

.

Universidad Nacional de Ingenieria

(2)

CONTENIDO

Ø Entorno del PowerBuilder Ø Propiedades de controles.

Ø Funciones de cadena, numéricas y fechas.

Ø Aplicación con Arreglos y Funciones de Usuario DFU. Ø Objeto DataWindow.

Ø Aplicaciones con DataWindow Filter y Find.

Ø Datawindow con Retrieval Arguments y Campos calculados. Ø Validaciones de campo y mantenimiento de una tabla. Ø Aplicación elaboración de un factura.

Ø Estructura de datos y OpenWithParm. Ø Objetos de usuario, visuales y no visuales. Ø Gráficos uso del estilo Graph.

Ø Animaciones. Ø DataWindow Dinamicos. Ø Enviar Correo. Ø Api s en Power Ø Control treeview Ø Trucos en Power.

Profesor :Ing. Alberto Moreno C..

Prohibida cualquier copia sin permiso del autor Correo :[email protected]

(3)

Que es Power Builder?

Es una herramienta de desarrollo de aplicaciones gráficas, principalmente para el desarrollo de aplicaciones Cliente/Servidor de N capas.

Antes de empezar a desarrollar cualquier aplicación se debe crear:

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

(4)

Template Application .- es cuando se abre una nueva aplicación pero con una plantilla de trabajo

Existing Application .- Para abrir una aplicación que se encuentra en otra versión del power.

(5)

CAPITULO DE FUNCIONES

Funciones del Control:

CLEAR()

Borra el contenido de un objeto

Syntax

objectname.Clear ( )

Controls

DataWindow, EditMask, MultiLineEdit, SingleLineEdit, RichTextEdit,

DropDownListBox, DropDownPictureListBox, OLE controls, and OLEStorage objects

DELETEITEM()

Borra un item desde una lista de valores

Syntax

objectname.DeleteItem ( index )

Controls

ListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controls Ejemplo:

Esta sentencia borra el primer item seleccionado en Lb_productos

integer Xindex // Variable de tipo entero

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

lb_ software.DeleteItem(Xindex) // Eliminamos el item seleccionado

ADDITEM()

Adiciona nuevos items para una lista de valores

Syntax

objectname.AddItem ( item )

Controls

ListBox and DropDownListBox controls Ejemplo:

(6)

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

(7)

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

(8)

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

(9)

Syntax

objectname.SetState (index, state)

Controls

ListBox and PictureListBox controls ejemplo

(10)

FUNCIONES DE CADENA.

ASC Obtiene el código ASCII correspondiente, de un carácter de tipo cadena. ejemplo :

Asc( ) // retorna 65

CHAR Retorna el carácter correspondiente al código ASCII String XS

XS=Char(42) // retorna *

FILL retorna una cadena con una longitud determinada del carácter especificado. ejemplo

Fill( ,5) // *****

LEFT Retorna un número especificado de caracteres comenzado por la izquierda Ejemplo:

String Xcad

Xcad = Left( Claudia ,3) // Cla

LEFTTrim Retorna una copia de una cadena sin los espacios en blanco del lado izquierdo.

Ejemplo:

String Xcad

Xcad = LeftTrim( 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:

(11)

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:

(12)

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

(13)

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

(14)

FUNCIONES NUMÉRICAS

ABS obtiene el valor absoluto de un número Ejemplo:

Num= (abs(-34) // retorna 34

CEILING Obtiene el menor número entero que es menor o igual al número especificado Ejemplo: Donde Deci es una variable de tipo decimal

Deci = String(Ceiling(-4.8)) // retorna 4

COS Obtiene el coseno de un ángulo el ángulo debe estar en radianes EXP El resultado de un número elevado a la potencia.

Ejemplo:

Deci = String(exp(1)) // 2.718

FACT Obtiene el factorial de un número Ejemplo:

Num= Fact(4) // retorna 24

MAX Retorna el mayor de dos números Ejemplo:

Num = Max(-4,-7) // retorna -4

MIN Menor entre dos números Ejemplo:

Num = Min(4,7) // retorna 4

MOD Obtiene el residuo de dos números Ejemplo:

Num = Mod(20,7) //retorna 6

PI (n) multiplica PI(3.1416 por un numero) Ejemplo:

Deci = Pi(1) // devuelve 3.14159...

(15)

Ejemplo:

Num = Rand(10) // devuelve un número comprendido entre el 1 a 10

RANDONMIZE(0) Randomize Regenera o inicializa el número aleatorio generador. Ejemplo:

Randomize(0)

ROUNDObtiene el número entero comprendido en un número decimal Ejemplo:

(16)

Aplicaciones

DFU (Funciones Defindas por el Usuario).

Pueden ser a nivel de Ventana o a nivel de toda la aplicación Ejemplo: Ingresar un monto en soles y lo convierta a letras

por 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_centena

Num=345

Devuelve en letras:

Trescientos cuarenta y cimco

F_mil

F_mill

Num

Letra

Num

Tipo int Letra

(17)

Paso 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

(18)

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

(19)

FUNCIONES APLICADAS A CONTROL DATA WINDOWS

Estructura de un Datawindows

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

Un objeto DataWindow debe ser insertado con una ventana regular, en todo diseño de un DataWindow forman parte dos objetos.

1.- DataWindow Object.- que es diseñado con el DataWindow Painter.

2.- DataWindow Control.- Es un control donde se insertará el DataWindows Object.

Edit Control

(20)

Funciones principales de un Datawindows

SetTransObject

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

Sintaxis Dwn. Settransobject(Transacción) Argument Description

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

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

Generalmente se establece el objeto de transacción en el evento Open de la ventana que contiene el control DataWindow.

En resumen el SettransObject(SQLCA) asocia el objeto transación con el control DataWindow.

Ejemplo:

DwnSoftware.settransobject(SQLCA)

InsertRow

Inserta una fila en un DataWindow, Si alguna columna tiene valores por defecto, La fila es inicializada con estos valores, retorna el número de la fila que se ha añadido, retorna -1 si ha ocurrido un error.

Sintaxis Dwn.InsertRow(fila) Argument Descripcion

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

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

(21)

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

(22)

SetItem

Establece el valor en una fila y columna especificada, un valor dentro del datawindow, retorna -1 si ocurre un error.

Sintaxis DwnSoftware.Setitem (Fila, columna/campo, valor) Ejemplo:

Dwn.SetItem(5, "sueldo",670)

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

También en vez del nombre de campo, puede ser el número de campo de acuerdo como ha sido seleccionado en el objeto DataWindow.

GetItemString

Obtiene datos de tipo cadena de un buffer especificado de un control DataWindow.

Sintaxis Dwn.GetitemString (Fila, Columna) Ejemplo

String cad

Cad=DwnSoftware.GetItemString(3, "sfw_Nombre")

Extrae el dato que se encuentra en el campo sfw_nombre, en la fila 3, dependiendo del tipo de dato que se va extraer tenemos:

Dwn.GetitemNumber (Fila, columna) Cuando el campo es de manera general numérico, puede ser real o entero.

Dwn.GetitemDecimal (Fila, columna) Cuando el dato a extraer es exclusivamente decimal o real.

Dwn.GetitemDate (Fila, columna) Si el campo es de tipo fecha. Dwn.GetitemTime (Fila, columna) Si el campo es de tipo hora.

Dwn.GetitemDateTime (Fila, columna) Cuando el campo es de tipo fecha y hora.

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

(23)

Int edad Dec Sbas Date Fenac

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

Nombre del campos en la tabla.

Gettext

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

Sintaxis dwn.Gettext ()

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

String Tmoneda

Tmoneda = DwnSalario.Gettext()

Setsort

Especifica, el criterio de ordenamiento para un DataWindow, retorna 1 si tuvo éxito y -1 si se encontro un error.

Sintaxis Dwn.SetSort (campo1 [A|D]) Ejemplo:

DwnEmpleado.setsort()

(24)

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.

(25)

ScrollToPriorRow

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

ScrollNextRow

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

DeleteRow

Suprime la fila especificada del control DataWindow, se actualiza directamente la tabla enlazada al control.

Sintaxis Dwn.DeleteRow(fila)

Si la fila es igual a cero, elimina la fila activa donde se encuentra el puntero, cada vez que se emplee esta sentencia, se tiene que actualizar el DataWindow ejemplo:

Dwn.deleteRow(8) // elimina la fila número 8

Dwn.Update() // actualiza la base de datos enlazada

DeletedCount

Retorna el número de filas que hayan sido suprimidas desde el control DataWindow pero que todavia no hayan sido actualizadas en la tabla de la BDD asociada.

Sintaxis Dwn.DeletedCount() Ejemplo:

Long Nf

Nf=Dwn.DeletedCount()

Update

Se envia a la base de datos todas las inserciones, eliminaciones y actualizaciones del control DataWindow, retorna 1 si tuvo éxito, -1 si ocurrio un error.

(26)

Utilización del Datawindows

El objeto DataWindows en si no es de ninguna utilidad, si no se vincula con un DataWindow control. Este objeto, es visual y es posible de insertar directamente en una ventana; para que pueda ser utilizado por el usuario.

Desarrollar la Siguiente aplicación.

Uso de filtros (Find SetFIlter)

A.- 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

(27)

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

(28)

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.

(29)

Modos de trabajo: (Seleccione SQl Select)

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

Modo 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.

(30)

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:

(31)

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

(32)

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

(33)

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.

(34)

//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)

(35)

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

(36)

Clic en el siguiente icono y obtendremos la siguiente

ventana

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

(37)

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

DataWindow Retrieval Arguments con Campos Calculados

Aplicación.

Mostrar las Facturas por cada vendedor, se ingresa por teclado el código del vendedor. Con las Tablas: Vendedor y Facturas, elaborar el siguiente DataWindow:

Paso 1.- Seleccionar el tipo Tabular en el DataWindow.

Paso 2.- Abrir las tablas Facturas y Vendedor, luego seleccione los campos que necesite en la consulta como se observa a continucación:

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

(38)

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

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

(39)

Paso 5.- El estilo Tabular mostrará 3 secciones de trabajo que son: 1. Header1 (cabecera).

2. Detail (detalle).

3. Summary (donde se muestran los campos totales).

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:

(40)

Para ver como esta saliendo el diseño puede comprobarlo mediante la opción Row del menú principal y seleccionando Retrieve, para ello le pedirá ingresar un código de vendedor.

Paso 6.- Completar los campos de comisión, comisión total y pago total a través de las opciones del menú principal: Insert – submenu Control – opcion Compute Field.

(41)

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.

(42)

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.

(43)

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 Venta

SQLCA.DBMS = "ODBC" SQLCA.AutoCommit = False

SQLCA.DBParm = "Connectstring='DSN=venta" connect;

(44)

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:

(45)

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

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.

(46)

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

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

(47)

Nombre de la Ventana: Ventana03

Script Open for aplicación // Profile Venta SQLCA.DBMS = "ODBC" SQLCA.AutoCommit = False SQLCA.DBParm = "Connectstring='DSN=venta" connect; If Sqlca.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()

(48)

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()

(49)

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

(50)

Elaboracion de una factura

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

Los Script para cada evento 1.- W_Factura Open dw_1.settransobject(sqlca) dw_fac.Settransobject(Sqlca) dw_1.retrieve(" ") Cb_Nueva Clicked int f

select max(Nfac) into :xfac from fac_cab; if isnull(xfac) then

(51)

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()

(52)

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

(53)

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

criterio=" upper(Despro) Like '"+upper(sle_1.text)+"%'" dw_1.setfilter(criterio)

dw_1.filter() dw_1.setfocus() dw_1.selectrow(1,true)

(54)

Aplicacion

Considerando que tenemos el mantenimiento de la tabla cursos, al realizar un click en el boton Alumnos, se carga la ventana de alumnos, pero solo se mostrarán los datos de aquellos alumnos de dicho curso (Fila activa de la Tabla Cursos).

Para la Ventana alumnos elaboramos: Un Objeto DataWindow

Data Source SQL Select Style Tabular Nombre Dw_Notas

Luego seleccione todos los campos a utilizar.

Especificamos el argumento de recuperacion de curso.

Paso 1.- Del Menu de Design seleccione la Opcion Retrival Arguments.

Paso 2.- En name seleccione cualquier nombre de variable de tipo igual al campo utilizado como argumento.

(55)

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))'")

(56)

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

(57)

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

(58)

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).

(59)

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.

(60)

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

(61)

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()

(62)

SEGUNDA PRÁCTICA CALIFICADA

Se requiere un programa para automátizar las ventas de pasajes aéreos, para ello se cuenta con las siguientes tablas:

Base de datos Vuelos DB Tablas:

Rutas tipo Long 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.

(63)

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.

(64)

Objetos de Usuario

Tema Custom Clases Visuales

Por ejemplo se desea realizar el siguiente evento de usuario:

Paso 1.- En New seleccionar PB OBJECT

Seleccionar Custom Visual

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

ST_1

ST_2

(65)

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)

(66)

Clases

Crear las siguientes clases de Objetos de usuarios 1.- Los Visuales

a) Un Progres según se muestra en la figura

b) Un control para desplazamiento de paginas y de Impresión

c) Colocando una caja de texto que permita adicionar o restar días a una fecha a través de Vscroll

d) Colocando dos listBox , al desplazarse en uno de ellos que se encuentre sincronizado

e) Pasando una cadena a una etiqueta que dicha cadena sea tipo Blink f) Colocando un cuadro texto que solo acepte letras y espacios en Blanco.

2.- No Visuales

a) Una función que permita sumar una columna numérica, se pasa como valor el control DataWindow y el número de columna.

b) Un evento que permita centrar una ventana, se pasa como valor una ventana. c) Una función que permita generar un código, se pasa como dato un control

DataWindow, el valor inicial del código, el código puede empezar con una letra o número.

d) Un evento que permita cambiar el color de una columna de un control DataWindow, pasar como dato el control DataWindow y el número de columna.

(67)

Capitulo de Graficos en Power Builder

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

(68)

Aplicación

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

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

Datawindow 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

(69)

Aplicar las propiedades correpondientes a los mencionados DataWindows

Al hacer Click en un empleado mostrará una ventana con sus datos personales, como se muestra en el ejemplo

Laura

(70)

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

(71)

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)

(72)

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()

(73)

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

(74)

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

(75)

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.

(76)

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)

(77)

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

(78)

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:

(79)

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

(80)

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! )

sle_titulo

mle_text

o

Referencias

Documento similar

Utilice esta aplicación para configurar el dispositivo, definir opciones de las aplicaciones y añadir cuentas..

Mantenga pulsado el botón [Twin Piano] y utilice los botones [-] [+] para seleccionar el pedal cuya función desea cambiar.. :

Utilice esta aplicación para configurar el dispositivo, definir opciones de las aplicaciones y añadir cuentas..

Utilice los botones de flecha arriba/abajo para seleccionar su opción y pulse el botón para confirmar..

Presione los botones ▲ / ▼ para seleccionar el elemento y presione el botón en la lista de canales, después, seleccione el canal que desea editar y utilice los 4 botones de

(1) Utilice los botones ▲/▼ del menú SEGURIDAD para seleccionar CAMBIAR CONTRASEÑA SEGUR y pulse el botón ► para visualizar el cuadro ESCRIBIR NUEVA CONTRASEÑA.. (2)

Presione el botón de menú cuatro veces para seleccionar esta función2. Utilice los botones arriba y abajo para encender o apagar

(1) Utilice los botones ▲/▼ del menú SEGURIDAD para seleccionar CAMBIAR CONTRASEÑA SEGUR y pulse el botón ► para visualizar el cuadro ESCRIBIR NUEVA CONTRASEÑA.. (2)