You are on page 1of 9

EJECUTAR PROCEDIMIENTO ALMACENADO EN POWERBUILDER

En el ejemplo mostrare como ejecutar un Procedimiento Almacenado de SQL Server desde PowerBuilder. Mostraremos tres escenarios distintos: 1. Cuando el Procedimientos Almacenado devuelve uno o ms parmetros de salida tambin llamado parmetro OUTPUT. 2. Cuando devuelve un conjunto de resultados producto de una sentencia select. 3. El tercero y ms simple, cuando el Procedimiento Almacenado no tiene parmetro alguno. Escenario 1: Cuando el Procedimiento Almacenado devuelve valor mediante variables OUTPUT. Primero definimos el cdigo del Procedimiento Almacenado, el cual su funcin es devolver el producto de la multiplicacin del valor de parmetro1 y el valor de PI que es 3.1416. Ojo, devemos definir el parametro de retorno como OUTPUT CREATE PROCEDURE usp_escenario1 @parametro1 INTEGER,@parametro2 DECIMAL(18,2) OUTPUT AS BEGIN SET @parametro2=@parametro1 * 3.1416 END En la cuadro siguiente el cdigo de PowerBuilder usado.

Integer Valor Decimal Resultado Valor=10 //Considerar que las variables que se pasen deben ser del mismo tipo //definido en el procedimiento almacenado DECLARE sp_procedure PROCEDURE FOR usp_escenario1 @parametro1 = :Valor, @parametro2 = :Resultado OUTPUT; //Ojo definir el parametro2 como OUTPUT. EXECUTE sp_procedure; //Ejecutamos con el nombre del Alias FETCH sp_procedure INTO :Resultado; //Recuperamos el resultado CLOSE sp_procedure; messagebox("",Resultado)

Escenario 2 y Escenario 3: Cuando devuelve un conjunto de resultados producto de una sentencia select y cuando el procedimiento no tiene parmetros, como dira mi abuela aqu matamos dos pjaros de un tiro, abordando los dos ltimos escenarios restantes. Para una mejor manipulacin de los resultados devueltos por un Procedimiento Almacenado es aconsejable realizarlo mediante un DataWindow, pero eso ser tema de otro artculo. Definimos el cdigo del Procedimiento Almacenado, el cual no pasamos ningn parmetro simplemente ejecutamos el procedimiento y recuperamos el conjunto de resultados. CREATE PROCEDURE usp_escenario2_3 AS BEGIN CREATE TABLE #cliente ( codigo int, nombre varchar(15) ) INSERT INTO #cliente VALUES(1,'PEPE') INSERT INTO #cliente VALUES(2,'JUAN') INSERT INTO #cliente VALUES(3,'MARIA') SELECT codigo,nombre FROM #cliente END

En la cuadro siguiente el cdigo de PowerBuilder usado.

Integer codigo String nombre //Considerar que las variables que se pasen deben ser del mismo tipo definido en //el procedimiento almacenado DECLARE sp_procedure PROCEDURE FOR usp_escenario2_3; EXECUTE sp_procedure; //Ejecutamos con el nombre del Alias FETCH sp_procedure INTO :codigo,:nombre; //Recuperamos el resultado DO WHILE sqlca.sqlcode = 0 Messagebox("Resultado",string(codigo)+" " +nombre) FETCH sp_procedure INTO :codigo,:nombre; LOOP CLOSE sp_procedure;

Qu es un DataWindowChild?
Un DataWindowChild es un DropDownDataWindow en un objeto DataWindow. Un DropDownDataWindow se comporta como un objeto Child (hijo) del DataWindow que lo contiene.

Los DataWindowChild son tiles por ejemplo para mostrar informacin de tablas maestras en forma de listado filtrar informacin de un campo. Cmo se crea un DataWindowChild? Veamos un ejemplo. Se tiene un campo cod_area, el cual al seleccionar muestra un listado de todas las reas de una empresa. En la imagen tenemos los datos de la tabla maestra que almacena las Areas.

Listado Tabla Area Se crea el objeto DataWindow que ser vinculado como Child y mostrar el listado de Areas. Este objeto se crea segn los datos de la tabla maestra Area. En este DataWindow solo debe mostrarse los campos que se desea visualizar. Guardamos el objeto con el nombre d_area.

Objeto DataWindow que se vinculara como Child Seleccionamos el campo cod_area en el cual se creara el vinculo y nos desplazamos a la pestaa Edit de la ventana de propiedades, en la opcin Style Type seleccionamos la opcin DropDownDW, en la misma pestaa nos desplazamos hacia abajo y buscamos la opcin DataWindow, hacemos clic y seleccionamos el DataWindow creado en el paso 2. En la opcin Display Column seleccionamos el campo des_area que viene a ser el nombre, en la opcin Data Column seleccionamos el campo cod_area que es el cdigo del area seleccionada.

Objeto DataWindow que contiene el Child

Objeto DataWindow que contiene el Child El listado final del campo cod_area seria como la imagen siguiente.

Vista Final

Alternar colores en cada Fila de un DataWindow A continuacin veremos como crear un DataWindow tipo Grid en donde los colores de cada fila se alternen, el objetivo es llegar a tener un DataWindow que nos muestre un listado tipo Grid donde se alternen los colores. Este es un ejemplo de un DataWindow Grid con el listado de la tabla authors de la base de datos pubs en SQL Server 2000

Ejemplo de alternar colores

Pues bien para empezar crearemos dos funciones: f_dw_get_objects, f_registros_colores El cdigo de cada funcin a continuacin:

f_dw_get_objects El cdigo para que copie/pegue Nota: No olvidar definir los parmetros segn la imagen mostrada. //f_dw_get_objects //Esta funcin a sido creada por PowerBuilder asi que lo copiamos tal cual. //Esta funcion retorna todas las columnas contenidas en el DataWindow string obj_string, obj_holder int obj_count, start_pos=1, tab_pos, count = 0 obj_string = Describe(dw_arg,"datawindow.objects") tab_pos = Pos(obj_string,"~t",start_pos) DO WHILE tab_pos > 0

obj_holder = Mid(obj_string,start_pos,(tab_pos - start_pos)) IF (Describe(dw_arg,obj_holder+".type") = obj_type or obj_type = "*") AND & (Describe(dw_arg,obj_holder+".band") = band or band = "*") THEN count = count + 1 obj_list[count] = obj_holder END IF start_pos = tab_pos + 1 tab_pos = Pos(obj_string,"~t",start_pos) LOOP obj_holder = Mid(obj_string,start_pos,Len(obj_string)) IF (Describe(dw_arg,obj_holder+".type") = obj_type or obj_type = "*") AND & (Describe(dw_arg,obj_holder+".band") = band or band = "*") THEN count = count + 1 obj_list[count] = obj_holder END IF Return count

f_registro_colores

El cdigo para que copie/pegue Nota: No olvidar definir los parmetros segn la imagen mostrada. //Esta funcion toma como parametro el DataWindow y alterna los colores string lista[] integer li_nn integer li_columnas long gl_color_registros

//Esta variable se puede declarar como global gl_color_registros=RGB(191,223,255) //El color que deseamos

li_columnas=f_dw_get_objects(adw_origen,lista,"column","*") for li_nn = 1 to li_columnas adw_origen.modify(lista[li_nn]+'.background.color="16777215~tif (mod(getrow(),2)=0,16777215,'+string(gl_color_registros) +')"') next Ahora en el DataWindow en su evento Constructor() poner el siguiente cdigo: //Evento constructor del DataWindow f_registros_colores(this)

You might also like