Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-07-2006
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Talcahuano - Chile
Posts: 2.291
Poder: 17
BlueSteel Va por buen camino
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
__________________
BlueSteel

Última edición por BlueSteel fecha: 04-07-2006 a las 01:14:52.
Responder Con Cita
  #2  
Antiguo 04-07-2006
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.419
Poder: 15
AGAG4 Va por buen camino
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....
Responder Con Cita
  #3  
Antiguo 04-07-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 22
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #4  
Antiguo 04-07-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 22
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 04-07-2006
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Talcahuano - Chile
Posts: 2.291
Poder: 17
BlueSteel Va por buen camino
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...

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
Responder Con Cita
  #6  
Antiguo 04-07-2006
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Talcahuano - Chile
Posts: 2.291
Poder: 17
BlueSteel Va por buen camino
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;
__________________
BlueSteel
Responder Con Cita
  #7  
Antiguo 05-07-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 22
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Store procedure php jorgito MySQL 1 06-06-2006 09:55:12
Store Procedure de N campos jzginez Firebird e Interbase 3 19-05-2006 21:14:01
Store Procedure en intebase jgutti Firebird e Interbase 2 12-05-2006 16:12:55
Store procedure en firebird ronimaxh Firebird e Interbase 4 19-04-2006 12:42:12
store procedure ronimaxh Firebird e Interbase 2 24-06-2003 21:20:22


La franja horaria es GMT +2. Ahora son las 13:52:48.


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