jueves, 19 de abril de 2007

COMO EJECUTAR DESDE POWER BUILDER PROCEDIMIENTOS ALMACENADOS (STORED PROCEDURES) EN SQL SERVER

Power Builder castillodavid@gmail.com

Para ejecutar un procedimiento almacenado que nos devuelva un resultado realizaremos las siguientes operaciones:

1. Crear un procedimiento almacenado en SQL Server
2. Crear el código en Power Builder que despliegue el resultado del Stored Procedure

1. Crear un procedimiento almacenado en SQL Server
--En SQL Server Ejecutamos el siguiente codigo
--Creamos el procedimiento en SQl Server
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
Create Procedure PSuma
--recibimos dos parametros
@a int,
@b int
as
--declaramos lavariable que contendra el resultado
declare @c int
select @c = @a + @b
--devolvemos el resultado
select @c
GO
SET QUOTED_IDENTIFIER OFF
GO SET ANSI_NULLS ON
GO

2. Crear el código en Power Builder que despliegue el resultado del Stored Procedure
//------------------------------------------------------------------------
//En power Builder escribimos el siguiente código
//Codigo en Power Builder
//Declaramos dos variables de trabajo
int a,b,resultado
a = 3 b = 5

//declaramos el procedimiento almacenado
//Primero declaramos con un nombre lógico para el nombre del procedimiento almacenado
//enviamos los dos parámetros a y b
declare pb_Suma procedure for PSuma
@a = :a,
@b = :b;

//ejecutamos el procedimiento
execute pb_Suma;

//el resultado es devuelto en un cursor el cual es vaciado en la variable resultado
fetch pb_Suma into :resultado;

//cerramos el cursor
close pb_Suma;

//Asignamos el valor resultado en un sle
sle_1.text = string(resultado)

24 comentarios:

adario dijo...

Hola fijate que quiero executar un SP en sql 2005 desde power builder 105. Necesito que al presionar un botón, se ejecute el stored procedure. Lo único es que el stored procedure no tiene parametros, no los necesito, pero quiero que se ejecute al hacer click en el botón. Me podrías decir que Power Script debo colocar en el evento clicked de mi boton? No necesito mostrarlo en ningún sle_, solamente ejecutar las instrucciones del SP. Creoq ue sería algo sencillo para ti. Gracias

David Castillo dijo...

//Declatramos el procedimiento almacenado a ejecutarse
declare pb_Suma procedure for PSuma;

//ejecutamos el procedimiento
//si no es necesario ningun resultado esto solo ejecutara el procedimiento en sql server
execute pb_Suma;

Ana María dijo...

Hola, super tu ayuda con esto de la ejecución de procedimientos almacenados... pero me gustaria saber cómo hago si tengo mas de un valor de salida?

David Castillo dijo...

Para trabajar con procedimiento alamcenado que devuelme mas de un valor el resultado se debe ser capturado en power builder en un cursor en http://blogcastillodavid.blogspot.com/2008/06/como-ejecutar-desde-power-builder.html

Hay un ejemplo.

Unknown dijo...

ayudame indicando otra pagina donde pueda ver como capturar mas de un valor de unn stored procedure, el link que indicas ya no existe

David Castillo dijo...

Estimado Rafael que extraño que no podas entrar a la pagina porque esta se encuentra en el mismo blog. Sin embargo aqui tienes un ejemplo cuando tienes varias filas de retorno:
Para ejecutar un procedimiento almacenado que devuelve varios registros es necesario recibir los registros en un cursor.

Para este ejemplo utilizaremos la Base de Datos Northwind de SQL Server.

1. Primero creamos un procedimiento almacenado que desplegara los empleados cuyo titulo incluya la palabra 'representative'

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
-- Definimos el procedimiento almacenado
-- este procedimiento devuelve aquellos titulos que incluyan en el campo título el parametro enviado


CREATE Procedure Pemployees
--recibimos un parametro
@filtro varchar(10)

as
--declaramos la variable que contendra el resultado

select employeeid, lastname,firstname,title
from employees
where title like '%'+@filtro+'%'

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

2. En Power Builder desplegaremos el resultado en el control List (LB_1)

//Codigo en Power Builder
//Declaramos las variables de trabajo
int employeeid
string lastname
string firstname

//Declaramos la variable que enviara el parametro
string filtro
filtro = 'representative'

//declaramos el procedimiento almacenado
//Primero declaramos con un nombre lógico del procedimiento almacenado
//y enviamos el parametro

declare pb_Employees procedure for PEmployees
@filtro = :filtro;

//ejecutamos el procedimiento
execute pb_Employees;

//el resultado es devuelto en un cursor el cual es vaciado en el cursor resultado
fetch pb_Employees into :Employeeid, :lastname, :firstname, :title;

//Una vez cargado el cursor con n registros lo recorremos
//Mientras no sea fin del cursor
DO WHILE sqlca.sqlcode = 0
//Adicionamos a un lb_1 los registros recorridos
lb_1.additem( string(Employeeid) + ' ' + lastname + ' ' + firstname + ' ' + title)

// Colocamos los valores de la siguiente fila a las variables de trabajo
fetch pb_Employees into :Employeeid, :lastname, :firstname, :title;
LOOP

//cerramos el cursor
close pb_Employees;

Corina dijo...

Hola, me gustaria que me expliques este pa., me lo paso un amigo pero no m lo pudo explicar, y si podrias decirme como lo ejecuto en pb mucho mejor gracias
CREATE PROCEDURE aaa
@curso varchar(50),
@codesc varchar (10),
@fechita datetime AS

SELECT C.cod_curso, C.desc_curso

FROM CURSO C

WHERE C.desc_curso LIKE @curso +'%'
and C.cod_escuela LIKE @codesc
GO

David Castillo dijo...

Hola carol



Este procedimiento almacenado llamado AAA
CREATE PROCEDURE aaa
@curso varchar(50),
@codesc varchar (10),
@fechita datetime AS

SELECT C.cod_curso, C.desc_curso

FROM CURSO C

WHERE C.desc_curso LIKE @curso +'%'
and C.cod_escuela LIKE @codesc
GO


Recibe tres parametros
1. curso que es un varchar de (50) asumo que sera el curso
2. codesc con varchar de 10 (debe ser codigo de escuela
3. fechita un valor de tipo datetime este parametro no es utilizado en el pa;

Este procedimiento almacenado devuelve el todos los cursos que empiezan con el codigo curso y pertenecen a la escuela seleeccionada

para ejecutarlo desde Sql Server la linea debe ser:

aaa 'curso_a_buscar', 'codigo_escuela', '01/01/2008'

para ejecutar este procedimiento desde power builder debes escribir el siguiente codigo

//Codigo en Power Builder
//Declaramos las variables de trabajo
string curso
string codesc
date fechita

//declaramos el procedimiento almacenado
//Primero declaramos con un nombre lógico del procedimiento almacenado
//y enviamos el parametro

declare aaa procedure for aaa


//ejecutamos el procedimiento
execute aaa;

//el resultado es devuelto en un cursor el cual es vaciado en el cursor resultado
fetch aaa into :curso, :codesc;

//Una vez cargado el cursor con n registros lo recorremos
//Mientras no sea fin del cursor
DO WHILE sqlca.sqlcode = 0
//Adicionamos a un lb_1 los registros recorridos
lb_1.additem( curso + ' ' + codesc)

// Colocamos los valores de la siguiente fila a las variables de trabajo
fetch aaa into :curso, :codesc;
LOOP

//cerramos el cursor
close aaa;

Corina dijo...

Hola, quisiera que le des una chequeadita a mi pa. que he hecho es acerca de herencia persona a persona juridica, y tambien podrias indicarme como lo puedo llamar desde pb,ose creo dos dw uno para persona y otro para persona juridica, xq no m sale no me permite ingresar dx en persona juridica
CREATE procedure usp_personajuridica_insertar
@xcod_persona varchar(10),
@xtel_persona varchar(50),
@xemail_persona varchar(50),
@xdir_persona varchar(50),

@xrazsoc_personajuridica varchar(30),
@xruc_personajuridica varchar(11),
@xrepleg_personajuridica varchar(30)


as
insert into persona values (@xcod_persona,@xtel_persona,@xemail_persona,@xdir_persona)
insert into persona_juridica values (@xcod_persona,@xrazsoc_personajuridica,@xruc_personajuridica,@xrepleg_personajuridica)
GO

Corina dijo...

Hola, quisiera que le des una chequeadita a mi pa. que he hecho es acerca de herencia persona a persona juridica, y tambien podrias indicarme como lo puedo llamar desde pb,ose creo dos dw uno para persona y otro para persona juridica, xq no m sale no me permite ingresar dx en persona juridica
CREATE procedure usp_personajuridica_insertar
@xcod_persona varchar(10),
@xtel_persona varchar(50),
@xemail_persona varchar(50),
@xdir_persona varchar(50),

@xrazsoc_personajuridica varchar(30),
@xruc_personajuridica varchar(11),
@xrepleg_personajuridica varchar(30)


as
insert into persona values (@xcod_persona,@xtel_persona,@xemail_persona,@xdir_persona)
insert into persona_juridica values (@xcod_persona,@xrazsoc_personajuridica,@xruc_personajuridica,@xrepleg_personajuridica)
GO

darkmorfix dijo...

Hola David, necesito ejecuta un procedimiento almacenado en un datawindows, al ingresar un numero, por ejemplo de una prefactura(EJ:378) en un cuadro de texto, la idea es clickear un boton buscar y que me taiga los datos relacionados a ese numero de prefactura a la datawindows y ahi trabajarlos para que mas tarde poder crear la facturacion. de antemano muchas gracias.

darkmorfix dijo...

Esmidado David, despues de varios intentos, me empezo a entregar los datos en la datawindows gracias por la ayuda prestada.Consulta? ¿Puedo trabajar la informacion de la datawindows?, en la datawindows me muestra la prefactura(378), Ej: esta me trae 6 filas con distintos valores todos relacionados a la misma prefactura, En la columna Total Factura(total_f), contiene todos los valores, cada fila tiene una valor distinto, lo que quiero es sumar todos esos valores(total_f) y el resultado multiplicarlo por el valor de la columna exento, para que me muestre los valores Afecto y exento que contiene la factura.mo se si sera dificil hacer esto, pero de todos modos muchas gracias por la ayuda prestada

Gerardo Emmanuel dijo...

ingresa a :
es.geocities.com/gds_system
y ve a la seccion tutoriales de hecho que te ayudara

Unknown dijo...

SELECT "departamento"."depto_nombre",
"empleado"."emp_apellido",
"empleado"."emp_nombre",
"empleado"."emp_depto_id",
"empleado"."emp_id"
FROM "departamento",
"empleado"
WHERE ( "empleado"."emp_depto_id" = "departamento"."depto_id" ) and
( ( "empleado"."emp_nombre" = :nombre ) OR
( "empleado"."emp_apellido" = :apellido ) )
ORDER BY "empleado"."emp_apellido" ASC


muchachos tengo este codigo,,y necesito que al preguntar por el nombre o el apellido, pueda usar el like como normalmente se hace asi like "% variable%", pero no he podido hacerlo...gracias

Unknown dijo...

bueno esto es en power builder,,,,gracias

David Castillo dijo...

Jhan

La consulta que escribes no tiene el paramnetro de Power ni de Sql server, aqui t envio el código en sql server

Que espero te sea util

Caso contrario por favor escribe si lo deseas en power builder y te dare el codigo requerido

Un gran saludo

declare @apellido nvarchar(25)
declare @nombre nvarchar(50)

set @nombre = 'abe'


SELECT "departamento"."depto_nombre",
"empleado"."emp_apellido",
"empleado"."emp_nombre",
"empleado"."emp_depto_id",
"empleado"."emp_id"
FROM "departamento",
"empleado"
WHERE ( "empleado"."emp_depto_id" = "departamento"."depto_id" ) and
( ( "empleado"."emp_nombre" like '%' + nombre + '%' ) OR
( "empleado"."emp_apellido" likr '%' +apellido+ '%' ) )
ORDER BY "empleado"."emp_apellido" ASC

Unknown dijo...

david:

agradezco el interes en ayudarme, el codigo lo necesito en power builder, ya que el complique que tengo es en el argumento :nombre y :apellido para poder utilizarlo con el like....de forma correcta es que la verdad no tengo claro el uso de las ' y " ademas del signo +....gracias,,,,

David Castillo dijo...

Jhan

Utliza la comilla simple para adicioanr el simbolo porcentaje y luego suma tu variable de trabajo.

El código es el siguiente:

SELECT "departamento"."depto_nombre",
"empleado"."emp_apellido",
"empleado"."emp_nombre",
"empleado"."emp_depto_id",
"empleado"."emp_id"
FROM "departamento",
"empleado"
WHERE ( "empleado"."emp_depto_id" = "departamento"."depto_id" ) and
(( dbo.Personal.apellidoPaterno like '%'+ :apellido + '%' ) OR
( dbo.Personal.nombres like '%'+ :nombre + '%' ))
ORDER BY "empleado"."emp_apellido" ASC

Como una sugerencia puedes realizar la consulta solo con una variable y una vez que veas su funcionamiento adicionas la segunda variable en el retrieve

es decir: el código seria el siguiente:

SELECT "departamento"."depto_nombre",
"empleado"."emp_apellido",
"empleado"."emp_nombre",
"empleado"."emp_depto_id",
"empleado"."emp_id"
FROM "departamento",
"empleado"
WHERE ( "empleado"."emp_depto_id" = "departamento"."depto_id" ) and
( dbo.Personal.apellidoPaterno like '%'+ :apellido + '%' )
ORDER BY "empleado"."emp_apellido" ASC

Unknown dijo...

jeje gracias,,,lo seguire molestando y si tenes documentacion sobre el power builder 9,,,seria un gran favor...estoy de novato en este lenguaje,,,,,,Exitos...

29917541 dijo...

Ejecuto un procedimiento almacenado desde power builder 9 y no me devuelve nada la variable de salida pero lo ejecuto desde la ventana de consulta y me fnciona perfecto no entiendo porque.

Codigo de store procedure

CREATE PROCEDURE dbo.sp_fecha_hora
@dt_fecha_hora datetime OUTPUT

AS
Select @dt_fecha_hora = getdate()
Select @dt_fecha_hora
return
GO



Codigo de ejecución desde power builder 9

declare sp_proc procedure for dbo.sp_fecha_hora
@dt_fecha_hora = :idt_fecha OUTPUT
using sqlca;
execute sp_proc;
IF SQLCA.SQLCode = -1 THEN
MessageBox("SQL error", SQLCA.SQLErrText)
END IF


Y no me da error no se que es lo que estoy haciendo malo me esta faltando.

Espero que me puedan ayudar.

Saludos.

Anónimo dijo...

Una pregunta:

Tengo PB 8.0 y realizo el mismo proceso, y cuando ejecuto el SP, aparece un cuando de dialogo que dice que el sp no ha sido ejecutado o no arrojó resultados. estoy usando Sql server 2008 y para el acceso a datos lo hago mediante ODBC. Cual puede ser el problema?????

manuel dijo...

hola buscando un blog de power . tengo un pequeño detalle tengo un sistema en power builder 9.0 con sql server 2000 ...el detalle es que manejo una sola base para varias empresas lo que sucede cuando una la empresa 1 envia la data para actualizar en la central no puedo visualizar compras pero si otras opciones y observo que si se afecta al stock ... gracias

David Castillo dijo...

Estimado Manuel, Mil perdones por la demora, por favor podrias ampliarme un poco el tema para que podamos solucionar este tema te lo agradeceria mucho

Unknown dijo...

Los parámetros son corridos sin identificar...