viernes, 6 de junio de 2008

COMO EJECUTAR DESDE POWER BUILDER PROCEDIMIENTOS ALMACENADOS (STORED PROCEDURES) QUE DEVUELVEN VARIOS REGISTROS

David Castillo castillodavid@gmail.com

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;




16 comentarios:

Unknown dijo...

Hola, estoy usando PB11 ySql Server 2000. Tengo un problema al ejecutar un store procedure que tiene 3 parametros, pero uno de ellos es del tipo OUTPUT, me sale este mensaje:
SQLSTATE = 42000
Microsoft SQL Native Client
Cannot use the OUTPUT option when passing a constant to a stored procedure.

- Uso en el INI la forma de conexión a BD
DBMS = "SNC SQL Native Client(OLE DB)"

- Esta es la llamada en PB:
String ls_usuario = 'GCB01'
Integer li_retorno = 1

DECLARE lsp_servicio PROCEDURE FOR sp_servicio
@as_usuario = :ls_usuario,
@oi_retorno = :li_retorno OUTPUT USING SQLCA;

EXECUTE lsp_servicio;

Estoy haciendo algo mal o que deberia hacer. Gracias por la ayuda.

Unknown dijo...

Hola, luego hacer varias pruebas, la solución esta en colocar el owner a la declaración. Par el ejemplo que puse:

DECLARE lsp_servicio PROCEDURE FOR dbo.sp_servicio
@as_usuario = :ls_usuario,
@oi_retorno = :li_retorno OUTPUT USING SQLCA;

Y ahi si funcionó ok. Luego lo comente con unos amigos y el tema podría estar en que SNC esta mas orientado a SQL Server 2005, en el cual maneja esquemas, osea es obligatorio colocar el owner correcto, bueno faltaria conocer la teoria mas correcta.

Gracias.

darkmorfix dijo...

Hola David, ojala me puedas ayudar con este tema, tengo un problema similar al que tienen los otros compañeros, trato de ejecutar un procedimiento SQL en Power Builder 10.5, por medio de un boton(clicked)y no me resulta, ya que no me levanta el cursor, estoy haciendo algo malo,pero no se que es, por favor me puedes ayudar.-

este el codigo que estoy ocupando.

string nomempre
int grupo, prefactura
grupo=1
prefactura=378

declare pb_prefactura procedure for dbo.up_san_FInfPlat_p_s_cls

@grupo = :grupo,
@prefactura = :prefactura connect using SQLCA;

execute pb_prefactura;

fetch pb_prefactura into :nomempre;

sle_cod.text=string(nomempre)

fetch pb into :nomempre;
close pb_prefactura;

shahmat dijo...

Hola Juan, tengo una llamada a un sp de SQL Server, hice en PB un procedimiento análogo al de tu ejemplo pero sqlca.sqlcode viene con el valor -1, y el sqlca.sqlerrtext retorna "Cursor is not open".

shahmat dijo...

Perdón....

Hola David Castillo...

Unknown dijo...

Hola que tal? estoy haciendo una aplicacion con PB 10.5 y sql Server 2005, estos se conectan mediante un OLE, cuando creo el usuario y el login, e intento asignarle permisos, medianiante el execute inmediate sp_addrolemember 'login', 'sysadmin' me devuelve un error diciendo que ese SP no se puede ejecutar desde una transaccion o algo similar... q toy haciendo mal, porq ejecuto el mismo comando desde el SQL managment y funciona.. Gracias

Fabricio dijo...

Hola Que tal ... estoy usando PB 10.5 y sql 2005 pero al ejecutar la instruccion 'Sharedata' para compartir unos datawindows que tengo la plicacion se cae y me sale un error de visual estudio

shahmat dijo...

Fabricio, qué tal...

Cómo estas haciendo la instrucción?

Unknown dijo...

Estoy llamando el procedimiento desde powerbuiler a sql server y me sale el siguiente error.
Q podra ser???
procedure has not been execute or has results.

GRacias de antemano.
espero me puedan ayudar.

Unknown dijo...

really its nice post about PowerBuilder. Thanks for sharing this Information.

hozcarinho dijo...

Hola David, espero que puedas ayudarme con mi problema, tengo una aplicacion que estoy desarrollando en PB 7 y se conecta a una BD en SQL server 2005, mi aplicacion lo que hace es generar los archivos txt por medio de SP que manda llamar la funcion BCP, cuando ejecuto el SP desde el manager del SQL no tengo ningun problema el problema es cuando lo ejecuto desde PB ya que se queda trabada la aplicacion y me deja colgado el procedimiento en el SQL, espero que puedas ayudarme te lo agradeceria muchisimo, saludos!

shahmat dijo...

hozcariño. como estas invocando tu SP?

shahmat dijo...

intenta hacer un llamado con otra sintaxis:
DECLARE Guarda_EF PROCEDURE FOR sp_genera_archivoAyB (:is_referencia, :is_rectificacion) USING SQLCA;

Tienes parámetros de salida? si es si usa FETCH...

Hiciste debug a ver donde se cuelga?

hozcarinho dijo...

ya encontre la solucion a mi problema la forma en como estaba mandando llamar mi SP desde PB :D

Declare Genera_EF procedure for thd_genera_ExportFile

Execute Genera_EF;

Sustitui esto por la sentencia:

SQLCA.AutoCommit = true
string ls_query

ls_query = "EXEC thd_genera_ExportFile '"+is_referencia+"'"
EXECUTE IMMEDIATE :ls_query USING SQLCA;

SQLCA.AutoCommit = false

y listo jala sin ningun problema!!!!!!! muchas gracias por tu interes David, se agradece en verdad :D, saludos!

shahmat dijo...

Hola, mi nombre no es David, estoy de alguna forma colaborando con la ayuda brindada desde los foros. Pero de igual forma por nada. Gracias a ti también.

Unknown dijo...

Hola mi nombre es Rosa, estoy usaundo power builder 6.5 con sql server 2014 al hacer el llamado de un procedimiento me envia el siguiente error Cursor is not open

Despues del FETCH,

gracias