Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Enviar parametros desde Delphi a Storage Procedures en BD Firebird (https://www.clubdelphi.com/foros/showthread.php?t=29077)

cuburu 11-01-2006 23:16:08

Enviar parametros desde Delphi a Storage Procedures en BD Firebird
 
Buen día.

DESCRIPCIÓN:
Tengo una base de datos que contiene múltiples tablas, algunas de éstas a su vez tienen dependencia de otras.

He creado varios procedimientos almacenados para ejecutar acciones desde ahi, como la inserción de la información a las tablas o el borrado de registros. Éstos procedimientos dependen de recibir ciertos valores para realizar las acciones según en base a ello.

He podido ejecutar procedimientos desde Delphi que he creado para armar algunas consultas en base a varias tablas pero sin enviar parametros de por medio.

Ahi es donde radica mi problema:

PROBLEMA:
Necesito ejecutar un procedimiento pero enviandole parametros de por medio.

Alguien sabe como hacerlo. Quizas mi duda sea muy simple pero agradecería la ayuda.

Gracias y espero su respuesta.

Estoy utilizando los componentes:

IBDatabase, IBDataset e IBTransaction para trabajar con la BD.

jachguate 12-01-2006 00:40:22

Cita:

Empezado por cuburu
Necesito ejecutar un procedimiento pero enviandole parametros de por medio.
...
Estoy utilizando los componentes:

IBDatabase, IBDataset e IBTransaction para trabajar con la BD.

Pues te hace falta usar un TIBStoredProc, asociarlo al procedimiento almacenado que te interesa ejecutar y los parámetros los asignas por médio de la propiedad Params de dicho componente.

Hasta luego.

;)

cuburu 12-01-2006 02:45:09

Más detallado
 
Como lo habia comentado, ya he podido ejecutar procedimientos almacenados en la BD ytilizando precisamente el componente TIBStoredProc. pero el problema radica en que no conozco como escribir la sentencia que hará tal situación.

Por ejemplo:

El procedimiento se llama InsertCliente(nomb, dir, tel, email) y para llamarlo solo lo selecciono en el componente TIBStoreProc y lo activo en tiempo de ejecución para que no marque problemas.

Pero para enviarle los parametros es ¿igual que cuando asigno valores a variables en un SQL normal? como pro ejemplo:

Código Delphi [-]
SQLEjemplo.SQL.Clear;
SQLEjemplo.SQL.ADD('SELECT * FROM clientes WHERE nombre = :NOMB');

SQLEjemplo.----.ParamByName('NOMB').AsString := 'Dato';

Perdón por escribirlo asi pero esque no tengo el Delphi a la mano en este momento.

Gracias de antemano.:)

jachguate 12-01-2006 03:28:38

Al soltar un TIBStoredProc en tu forma o módulo de datos, asocialo a una base de datos y una transacción, luego estableces su propiedad StoredProcName correctamente, y en la propiedad Params tenes los parámetros, tanto en tiempo de diseño como de ejecución.

Hasta luego.

;)

cuburu 12-01-2006 03:32:08

Duda sobre firebird embedded
 
No me afectaría el tener que desinstalar el firebird que ya tengo y tener que reinstalar el embedded a mi base de datos que estoy utilizando. :confused:

jachguate 12-01-2006 03:52:30

Cita:

Empezado por cuburu
No me afectaría el tener que desinstalar el firebird que ya tengo y tener que reinstalar el embedded a mi base de datos que estoy utilizando. :confused:

No entiendo a que viene esto... :confused:

Para darte tranquilidad te se decir que firebird ofrece el mismo comportamiento en el servidor embebido que en el servidor normal, con la diferencia que el embebido (por obvias razones) no tiene soporte para múltiples usuarios.

Saludos.

cuburu 13-01-2006 02:28:37

Perdón....
 
Parece ser que coloque el mensaje en el hilo equivocado, lo que necesitaba saber sobre el envío de paramentros a un procedimiento almacenado de la siguiente forma:

La sintaxis que se coloca para enviar los parametros a un procedimiento almacenado es la misma que cuando se le envia información a variables en SQL con delphi:

Ejemplo:

mi tabla se llama clientes.bgd por dar un ejemplo y tiene los campos nombre, direccion, telefono, email. El código para hacer una consulta seria ango así:

Código Delphi [-]
  SQLEjemplo.SQL.Clear;
  SQL.----.ParamByName('NOMB').AsString := 'Dato Nombre';
  SQL.----.ParamByName('MAIL').AsString := 'Dato EMail';

  SQLEjemplo.SQL.Add('SELECT * FROM clientes.bgd WHERE nombre = :NOMB AND email = :MAIL');

con esto se asignarían valores a los parametros de una consulta a una tabla.

Ahora, el procedimiento se llama consulta_cltes y los campos son nombre, direccion, telefono, email, los valores de entrada son NOMB y MAIL, igual que la consulta anterior.

¿como podría asignar los parametros deseados?

Gracias de antemano y perdón por la metida de pata pero es que es parte de lo que estoy investigando y me cuatrapie :p

Ricardojosep 13-01-2006 13:56:09

Hola cuburu

No te entendi muy bien. me confunde unas cositas como esto:

Cita:

mi tabla se llama clientes.bgd por dar un ejemplo y tiene los campos nombre, direccion, telefono, email. El código para hacer una consulta seria ango así:


SQLEjemplo.SQL.Clear;
SQL.----.ParamByName('NOMB').AsString := 'Dato Nombre';
SQL.----.ParamByName('MAIL').AsString := 'Dato EMail';

SQLEjemplo.SQL.Add('SELECT * FROM clientes.bgd WHERE nombre = :NOMB AND email = :MAIL');

con esto se asignarían valores a los parametros de una consulta a una tabla.

Ahora, el procedimiento se llama consulta_cltes y los campos son nombre, direccion, telefono, email, los valores de entrada son NOMB y MAIL, igual que la consulta anterior.

¿como podría asignar los parametros deseados?
Creo que el amigo jachguate, ya respondio tu pregunta.
Si lo que quieres es enviar parametros al SP, debes utilizar el componente TIBStoredProc, En tiempo de ejecucion debes poner algo como esto:
Código Delphi [-]
IBStoredProc1.ParamByName('IP').AsString := IPNum;
IBStoredProc1.ExecProc;

con la primera sentencia le asignas un valor al parametro y con la segunda ejecutas el SP
Si tienes algun parametro de salida, puedes visualizarlo con esto:

Código Delphi [-]
Salida := IBStoredProc1.FieldByName('Parametro_De_Salida').AsString;

cuburu 15-01-2006 05:21:40

Gracias.

Para que entiendan, lo que deseo es enviar una consulta filtrada basada en el nombre y apellidos de una persona.

el código del procedimiento almacenado es:

Código:

  CREATE PROCEDURE CONSPERSONAS (
    NOMBREI VARCHAR (40) CHARACTER SET WIN1252,
    APELLIDOSI VARCHAR (40) CHARACTER SET WIN1252)
RETURNS (
    NOMBREO VARCHAR (40) CHARACTER SET WIN1252,
    APELLIDOSO VARCHAR (40) CHARACTER SET WIN1252,
    EMAILO VARCHAR (100) CHARACTER SET WIN1252)
AS
BEGIN
  /*NOMBRE Y APELLIDOS*/
  if ( not (NOMBREI is null and APELLIDOSI is null) ) then
  begin
    select NOMBRE, APELLIDOS, EMAIL
    from personas
    where NOMBRE like '"%' || :NOMBREI || '%"' and
          APELLIDOS like '"%' || :APELLIDOSI || '%"'
    into :NOMBREO, :APELLIDOSO, :EMAILO;
   
    suspend;
  end
  else
  begin
    /*NOMBRE*/
    if (not NOMBREI is null) then
    begin
      select NOMBRE, APELLIDOS, EMAIL
      from personas
      where NOMBRE like '"%' || :NOMBREI || '%"'
      into :NOMBREO, :APELLIDOSO, :EMAILO;
     
      suspend;
    end /*Fin NOMBRE*/
    else
    begin
      /*APELLIDOS*/
      if (not APELLIDOSI is null) then
      begin
        select NOMBRE, APELLIDOS, EMAIL
        from personas
        where APELLIDOS like '"%' || :APELLIDOSI || '%"'
        into :NOMBREO, :APELLIDOSO, :EMAILO;
       
        suspend;
      end /*Fin APELLIDOS*/
      else
        exception SIN_DATOS;
    end
  end /*Fin NOMBRE Y APELLIDOS*/

END

Ya he realizado los pasos que me comentas, el código que he colocado es este:

Código Delphi [-]
  if btn_Conexion.Caption = '&Conectar' then
  begin
    DataBase_FB.Open;
    DataSet_FB.Open;
    btn_Conexion.Caption := '&Desconectar';

    DataSetProc_FB.Open;
    Proc_FB.ParamByName('NOMBREI').AsString := ed_Nombre.Text;
    Proc_FB.ParamByName('APELLIDOSI').AsString := ed_Apellidos.Text;
    Proc_FB.ExecProc;
  end
  else
  begin
    DataBase_FB.Close;
    DataSet_FB.Close;
    btn_Conexion.Caption := '&Conectar';

    DataSetProc_FB.Close;
  end

Como apenas comienzo a codificar procedimientos quizas esté mal en la sintaxis o algo por el estilo.

El error que me manda al abrir la conexión y ejecutar la consulta es este:

Cita:

Field "3" not found.
Espero que me puedan decir que es lo que está pasando, ya intente quitar datos, campos y nada. La tabla a consultar tiene la siguiente información de estructura:

TABLA: Personas

NOMBRE varchar(40)
APELLIDOS varchar(40)
TELEFONO varchar(20)
EMAIL varchar(100)

Desde ya les doy las gracias por anticipado. :confused:

cuburu 16-01-2006 18:36:48

Hola, soy yo de nuevo. He resuelto el problema, no como yo lo quisiera pero me ha funcionado hasta que encuentre una solución.

He utilizado un objeto IBQuery y realizado una consulta al procedimiento y listo. Digamos algo así:

Código Delphi [-]
  IBQuery1.SQL.Clear;
  IBQuery1.SQL.ADD('SELECT * FROM nombre del procedimiento(param1, param2, ..., paramx)');
  IBQuery.ParamByNAme('Param1').asString := ed_Nombre.Text;
  IBQuery.ParamByNAme('Param2').asString := ed_Apellidos.Text;
  ...

  IBQuery.Open;

Así es como lo he resuelto, pero me gustaría saber si alguien conoce otra forma utilizando el objeto IBStoreProc.

Nos leeremos luego...

jachguate 16-01-2006 20:24:54

En realidad esta me parece la forma mas adecuada de usar los procedimientos que devuelven un cursor..

Saludos.

Ricardojosep 16-01-2006 23:04:28

Hola cuburu,
Copie tu codigo y lo ejecute con una base que tengo en mi PC. Aqui te mando el codigo de nuevo con unas modificaciones, lo que te paso aqui funciona a la perfeccion.

Código Delphi [-]
if btn_Conexion.Caption = '&Conectar' then
  begin
    MDODatabase1.Open;
    btn_Conexion.Caption := '&Desconectar';

    MDOStoredProc1.ParamByName('IP').AsString := Edit1.Text;
    MDOStoredProc1.ExecProc;
    ShowMessage(IntToStr(MDOStoredProc1.Params.Items[0].Value));
  end
else
  begin
    MDODatabase1.Close;
    btn_Conexion.Caption := '&Conectar';
  End;

La unica diferencia es que saco los DataSets que tienes tu y bueno utilizo los MDO para conectarme.
Veras que muestro un mensaje, eso es para ver si me entregaba el valor nada mas.
En fin, espero que te sirva, no se cual puede ser tu error, pero el ejemplo que te envio funciona.

Suerte. Saludos!!!

cuburu 17-01-2006 23:00:48

Gracias Ricardojosep, Hare la prueba el fin de semana, debido a que me encuentro trabajando fuera y solo tengo chance de hacerlo en esos días.


La franja horaria es GMT +2. Ahora son las 11:07:45.

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