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)
-   -   llamar a un Store Procedure (https://www.clubdelphi.com/foros/showthread.php?t=33316)

BlueSteel 04-07-2006 00:01:12

llamar a un Store Procedure
 
Hola amigos..

quiero ejecutar un Store Procedure desde mi Formulario, para que me permite almancenar unos datos... bueno..

tengo declarado el IBStoreProc y su respectiva transaccion... la forma de ejecutarlo (que estoy usando) es esta.. pero no me resulta... alguien sabe como deberia ser...

Código Delphi [-]
     With IBSP_Edit Do
     Begin
     StoredProcName := 'AGREGAR_CARGO';
     For i:=0 to Asig_Costos.Costos_Paso.RowCount -1 Do
     Begin
          Params.Clear;
          Params[0].AsString := IntToStr(IBQ_Select['ORD_NUM']);
          Params[1].AsString := Asig_Costos.Costos_Paso.Cells[0,i];
          Params[2].AsFloat  := StrToFloat(Asig_Costos.Costos_Paso.Cells[2,i]);
          Params[3].AsString := Asig_Costos.Costos_Paso.Cells[3,i];
          Prepare;
          ExecProc;
     End
     End;
     IBT_SPEdit.Commit;

la idea de esto.. es que hay un StringGrid con varios datos.. y tengo que almacenar cada uno de ellos.. por eso lo estoy ejecutando así.. existe otra forma ??? antes lo habia echo a traves de codigo normal y me funcionaba (pero no utilizaba procedimientos Almacenados).. pero me tinca que la forma de llamar el StoreProcedure esta mala

AGAG4 04-07-2006 04:06:33

Checa Esto....
 
Cita:

Empezado por BlueSteel
Hola amigos..

quiero ejecutar un Store Procedure desde mi Formulario, para que me permite almancenar unos datos... bueno..

tengo declarado el IBStoreProc y su respectiva transaccion... la forma de ejecutarlo (que estoy usando) es esta.. pero no me resulta... alguien sabe como deberia ser...


Código Delphi [-]
With IBSP_Edit Do
Begin
StoredProcName := 'AGREGAR_CARGO';
For i:=0 to Asig_Costos.Costos_Paso.RowCount -1 Do
Begin
Params.Clear;
Params[0].AsString := IntToStr(IBQ_Select['ORD_NUM']);
Params[1].AsString := Asig_Costos.Costos_Paso.Cells[0,i];
Params[2].AsFloat := StrToFloat(Asig_Costos.Costos_Paso.Cells[2,i]);
Params[3].AsString := Asig_Costos.Costos_Paso.Cells[3,i];
Prepare;
ExecProc;
End
End;
IBT_SPEdit.Commit;





la idea de esto.. es que hay un StringGrid con varios datos.. y tengo que almacenar cada uno de ellos.. por eso lo estoy ejecutando así.. existe otra forma ??? antes lo habia echo a traves de codigo normal y me funcionaba (pero no utilizaba procedimientos Almacenados).. pero me tinca que la forma de llamar el StoreProcedure esta mala

A que te refieres con esto .... "pero no me resulta" ????
No te guarda los datos ????

En el caso de un StringGrid, es la forma màs correcta que he visto para almacenar datos si no usaràs algun ibDataset conectado a un dbGRID, no le veo algun problema, a no ser que alguien este en contra de mi opinion.



Saludos....

Lepe 04-07-2006 12:57:37

Lo primero de todo es ver qué tipo de SP es, si es de actualización o de selección (pon el código del SP).

En base a una u otra elección, hay que ejecutarlo de forma distinta.

Por regla general, si lleva la palabra Suspend dentro del SP, entonces es un SP de selección y por ende, hay que usarlo como una tabla más:

Código Delphi [-]
query1.Sql.Text := ' select * from SPDameNombre(32)';
query1.Open

Si es de actualización / ejecución, debes llamarlo tal y como lo estas haciendo.

Saludos

Lepe 04-07-2006 13:32:03

Código Delphi [-]
     With IBSP_Edit Do
     Begin
     StoredProcName := 'AGREGAR_CARGO';
     Prepare;
     For i:=0 to Asig_Costos.Costos_Paso.RowCount -1 Do
     Begin
          Params[0].AsString := IntToStr(IBQ_Select['ORD_NUM']);
          Params[1].AsString := Asig_Costos.Costos_Paso.Cells[0,i];
          Params[2].AsFloat  := StrToFloat(Asig_Costos.Costos_Paso.Cells[2,i]);
          Params[3].AsString := Asig_Costos.Costos_Paso.Cells[3,i];
          ExecProc;
     End
     End;
     IBT_SPEdit.Commit;

En principio debe funcionar. Aunque no sé el tema de transacciones, ya que solo veo el Commit pero no el inicio de transacción.

Saludos

BlueSteel 04-07-2006 18:23:20

mi store procedure es la siguiente
 
hasta el momento me da un error de 'List index out of bound (0)',, y no es un numero decimal válido..


esta es la SP que fue creada en IBExpert y cuando la ejecuta desde allí no tiene problemas.... (eso por que me muestra un formulario donde ingreso las variables... ).. quizas el error sea el de traspasar los datos en el formulario...
:confused:
Código Delphi [-]
SET TERM ^ ;
CREATE PROCEDURE AGREGAR_CARGO (
    VORD_NUMERO VARCHAR(5) CHARACTER SET NONE,
    VCEN_CODIGO VARCHAR(4) CHARACTER SET NONE,
    VCAR_MONTO FLOAT,
    VCAR_OBSERVACION BLOB SUB_TYPE 0 SEGMENT SIZE 80)
AS
begin
   begin
        Insert into "Cargos" ("Ord_Numero", "Cen_Codigo", "Car_Monto", "Car_Observacion")
        values (:vord_numero, :vcen_codigo, :vcar_monto, :vcar_observacion);
        when sqlcode -530 Do
             Exception no_cargos_new;
   end
   suspend;
end
^
SET TERM ; ^
GRANT INSERT ON "Cargos" TO PROCEDURE AGREGAR_CARGO;
GRANT EXECUTE ON PROCEDURE AGREGAR_CARGO TO ROOT;

BlueSteel 04-07-2006 18:27:02

Cita:

Empezado por AGAG4
A que te refieres con esto .... "pero no me resulta" ????
No te guarda los datos ????

En el caso de un StringGrid, es la forma màs correcta que he visto para almacenar datos si no usaràs algun ibDataset conectado a un dbGRID, no le veo algun problema, a no ser que alguien este en contra de mi opinion.
Saludos....

me refiero a que este proceso me deberia almacenar los datos en la tabla Cargos... pero no almacena nada.. y caundo empieza a ejecutarse el código me da error de 'List index out of bound (0)',, y no es un numero decimal válido..

este mismo codigo lo he ejecutado sin Store Procedure y utilizando componente IBQuery... y me funciona bien.. y la forma de almacenar es la sigueinte:
Código Delphi [-]
     // Proceso para Almacenar los Cargos
     For i:= 0 to Asig_Costos.Costos_Paso.RowCount-1 Do
     Begin
          IBQ_Edit.SQL.Clear;
          IBQ_Edit.SQL.Add('Insert Into "Cargos" ("Ord_Numero","Cen_Codigo","Car_Monto","Car_Observacion")');
          IBQ_Edit.SQL.Add('Values (:P1, :P2, :P3, :P4)');
          IBQ_Edit.Params[0].AsString := IntToStr(IBQ_Select['ORD_NUM']);
          IBQ_Edit.Params[1].AsString := Asig_Costos.Costos_Paso.Cells[0,i];
          IBQ_Edit.Params[2].AsFloat  := StrToFloat(Asig_Costos.Costos_Paso.Cells[2,i]);
          IBQ_Edit.Params[3].AsString := Asig_Costos.Costos_Paso.Cells[3,i];
          IBQ_Edit.ExecSQL;
     End;

Lepe 05-07-2006 10:01:40

Ese es un SP de Ejecución, es decir, elimina el "suspend", ya que cuando llega a esa linea, no tiene que devolver ningun registro.

Para el "no es un decimal válido", ¿le estas pasando al menos un decimal con el separador de decimales en un punto?. Si no lleva el punto porque la cantidad en cuestión no tiene decimales , puede venir el problema por ahi.

Por otra parte, para que más tarde no dé un error inexplicable, revisa este hilo sobre los Floats en Firebird.

Saludos


La franja horaria es GMT +2. Ahora son las 12:23: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