Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Obtener varios registros de Stored Procedure (https://www.clubdelphi.com/foros/showthread.php?t=24223)

Phacko 11-08-2005 23:49:37

Obtener varios registros de Stored Procedure
 
Que tal foreros????? ya habia pegado un mensaje en el foro SQL al cual no recibi alguna contestación a lo que creo que no fue clara mi solicitud, la pongo ahora por aqui tratando de ser un poco mas claro, espero no romper con las reglas del Club y si es así ofresco mis disculpas, ya he borrado el mens del foro SQL. Ya he tratado de varias formas y no he obtenido los resultados esperados.

Hace un par de días trate de ayudar a un compañero aui en el club que preguntaba sobre obtener registros de un Procedimiento Almacenado, diciendole que yo habia empleado una consulta simple y me habia funcionado:

Select * From Procedi_Almacenado

y así fue, sólo que cometi el error de no comentar que este codigo lo ejecute en en el editor de SQL en IBExpert mientras hacia pruebas a la base de datos hecha en FB, pero despues al llegar a Delphi(6) me tope con el problema de que al querer meter el contenido de un campo de la base de datos en un ComboBox no obtengo valor alguno, usando el siguiente codigo en el IBQuery:

Código Delphi [-]
MOdulo.IBQuery.Close;
Modulo.IBQuery.SQL.Clear;
Modulo.IBQuery.Add(Select * From Marcas);
Modulo.IBQuery.ExecSql; Tambien trate con: Modulo.IBQuery.Exec SQL;

Me dio error indicandome que empleara Open, cambie ExecSql por Open y ya no me dio error pero tampoco me dio valores.

Intente con:

Código Delphi [-]
Modulo.IBStoredProc1.Prepare;
try
Modulo.IBStoredProc1.ExecProc;
CBMarca.Items.Add(Modulo.IBStoredProc1.ParamByName('Marca').AsString);
finally
Modulo.IBSPProdMarca.UnPrepare;
end;

y solamente me entrega un valor que es justo lo que he leido, pero también lei que para obtener varios registros se emplea una consulta, como la mencionada arriba, con lo que no estoy segura si la he implementado bien y/o si se emplea algun componente aparte. En el modulo tengo un IBDataBase, un IBTransaction, un IBStoredProc y un IBQuery.

Este es el Procedimiento almacenado:
Código SQL [-]
CREATE PROCEDURE MARCAS 
 
RETURNS (MARCA VARCHAR(15)) AS
 
begin
 
for select distinct Marca
 
from productos
 
Into :Marca do
 
begin
If Marca is Null Then
Exit;
Suspend;
 
end
 
end




Les agradesco de antemano alguna idea o pista que me puedan proporcionar.
Gracias

cahp 12-08-2005 00:17:22

Hola,

te puede asegurar que :
Código SQL [-]
select *
from marcas
desde delphi con un ibquery y despues ibquery.open.

siendo marcas
Código SQL [-]
CREATE PROCEDURE MARCAS 
returns (MARCA VARCHAR(15))
AS 

begin
for
   select distinct Marca
   from productos
   into :Marca
do
   begin
      if (:Marca is null) then exit;
      suspend;
   end
end
funciona perfectamente, devuelve tantas lineas como hay distintas en la tabla productos.

Saludos.

rastafarey 12-08-2005 02:15:07

resp
 
Ese codigo esta perfecto tu problema debe ser otro.

Lo unico que puedo es decirte que tienes codigo redundante
Código SQL [-]
CREATE PROCEDURE MARCAS 
returns (MARCA VARCHAR(15))
AS 
begin
  for select distinct Marca
    from productos
    Where Marca is not Null
    into :Marca
  do
    suspend;
end
Aunque pienso que podrias hacer la consulta directamente ya que no veo el caso para el suo del procedimiento
Código SQL [-]
select distinct Marca
from productos
 Where Marca is not Null

Phacko 12-08-2005 18:16:26

Continúa el problema.....
 
Que tal???? primero que todo, gracias por su ayuda.

Iniciaré por decir que olvidé mencionar que uso pocedimientos almecenados porque la base de datos se va a emplear en red y aunque no son muchos clientes, decidi comenzar a trabajar en el servidor con ésto, de una vez por todas.

Bien, pues ya habia utilizado IBQuery.OPen y seguian vastos, ya que no me agrega ningun dato a la lista, Cambie el control ComboBox por un DBLookUpComboBox pero únicamente agrego un elemento a la lista, he intentado variando codigo pero nada, cuando no me da error no agrega elementos a la lista esta es la forma en la que llamo al procedimiento almacenado desde delphi ya sea mediante un boton o al activar la form:
Código Delphi [-]
  Modulo.IBQProdMarca.Open;
  CBMarca.Items.Add(Modulo.IBQProdMarca.ParamByName('marca').AsString);

y en el componente IBQProdMarca tengo el siguiente codigo:
Código SQL [-]
 Select *
From Marcas

el procedimiento almacenado aun es el anotado al inicio de este hilo, vuelvo a comentar que si ejecuto el Procedimiento almacenado con:
Código Delphi [-]
Modulo.IBSPProdMarca.ExecProc;
se agrega únicamente un elemento a la lista, pero si utilizo la consulta como la he indicado no agrega elemento alguno.

Sera necesario eliminar el componente IBStoredProc del modulo de datos? ya no se ni lo que digo.

Les agradesco de antemano su ayuda, Gracias.

Phacko 17-08-2005 19:24:05

El problema no es la consulta sino como agregar los datos....
 
Que tal??? de nuevo aqui.

El procedimiento almacenado funciona bien al igual que la consulta, lo verifique usando un DBGrid en el cual se muestran los resultados como se esperaba, el problema es que se necesita en un ComboBox, ya que se requiere seleccionar alguna de estas opciones que se obtienen de la base de datos y tambien se debe permitir agregar nuevos datos a la base, tecleados a travez del mismo ComboBox.

El codigo que utilizo para hacer la llamada y agregar los resultados de la consulta al ComboBox es el siguiente:
Código Delphi [-]
Modulo.IBQProdMarca.Open;
CBMarca.Items.Add(Modulo.IBQProdMarca.ParambyName('marca').AsString);

y da el error:
El proyecto a originado una excepción clase EDataBaseError con el mensaje "IBQProdMarca:Parameter 'marca' no encontrado......

lo da en la linea donde trato de llenar el ComboBox, cambie el codigo y nada, por lo que mi duda es, ¿como hacer referencia al valor que me retorna la consulta sobre el procedimiento almacenado para rellenar el ComboBox?

Gracias de antemano.

maeyanes 17-08-2005 19:33:51

Prueba con este código:

Código Delphi [-]
Modulo.IBQuery.Close;
Modulo.IBQuery.SQL.Clear;
Modulo.IBQuery.Add('Select * From Marcas');
Modulo.IBQuery.Open;
while not Modulo.IBQuery.Eof do
begin
  CBMarca.Items.Add(Modulo.IBQuery.FieldByName('Marca').AsString);
  Modulo.IBQuery.Next
end;
Modulo.IBQuery.Close

Saludos...

Phacko 19-08-2005 17:56:43

Perfecto....
 
Que tal???

Muchas gracias Marcos, todo a la perfección.

Reitero, gracias por tu ayuda.

Buen día.


La franja horaria es GMT +2. Ahora son las 20:52:12.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi