Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Zeos, Stored Procedure y Parametros (https://www.clubdelphi.com/foros/showthread.php?t=66131)

betto 03-02-2010 17:53:57

Zeos, Stored Procedure y Parametros
 
Hola, tengo un problemita con la ejecucion de un StoredProcedure desde un componente Zeos (TZStoredProc). Lo creo en tiempo de ejecucion:

SProc:= TZStoredProc.Create(self);
SProc.Connection := dm.Conecta;

y después le asigno valores:

Sproc.StoredProcName:= 'SP_EJECUTA_XXX_YYY_ZZZ';
Sproc.Active:= False;
Sproc.Params[1].AsString:= QuotedStr(gs_terminal);
Sproc.ExecProc;

pero Delphi me manda el siguiente error:
'List index out of bounds (1)'

y si coloco el nombre de mis paremetros como sigue:
Sproc.StoredProcName:= 'SP_EJECUTA_XXX_YYY_ZZZ';
Sproc.Active:= False;
Sproc.ParamByName('_TERMINAL').AsString:= QuotedStr(gs_terminal);
Sproc.ExecProc;
el error es el siguiente:

Parameter '_TERMINAL' not found.

Alguien puede decirme que hacer?

Les agradezco de antemano, Saludos...

rgstuamigo 03-02-2010 21:49:31

Pregunto
 
Y dónde estas creando el parámetro '_TERMINAL'?:confused:
Lo que esta diciendo es que el componente TZStoredProc no tiene ningun parámetro creado por lo que no se puede acceder a ninguno.;)
Quisas deberías crearlo en tiempo de ejecución algo asi:
Código Delphi [-]
procedure TForm1.Button3Click(Sender: TObject);
var SProc:TZStoredProc;
begin
SProc:= TZStoredProc.Create(Self);
  try
    SProc.Connection := dm.Conecta;
    Sproc.StoredProcName:= 'SP_EJECUTA_XXX_YYY_ZZZ';
    Sproc.Params.CreateParam(ftString,'_TERMINAL',ptInput);//creo un parámetro string de entrada
    Sproc.Active:= False;//esta lines es innecesaria ya que por defecto se crea con Active=False
    Sproc.Params[0].AsString:= QuotedStr(gs_terminal);//el primer parametro se encuentra en la
        // posición cero (0) y no en uno(1).;)
    Sproc.ExecProc;
   finally
   SProc.Free;//liberamos y destruimos para no tener fugas de  memoria
   end;
end;
Sin olvidar que cuando creas un objeto debes eliminarlo cuando ya no lo necesites para no tener memoria reservado sin estar ocupandose.;).
Por si acaso en lo personal ami no megusta usar el componente TZStoredProc en su lugar yo uso un TZQuery y en su propiedad SQL llamo a mi procedimiento almacenado; en tu caso sería mas o menos asi:
Código Delphi [-]
 procedure TForm1.Button4Click(Sender: TObject);
var MyQuery:TZQuery;
begin
   MyQuery:=TZQuery.Create(Application);
   try
     MyQuery.Connection:=dm.Conecta;

     //si nuestro procedimiento no tiene parametro de entrada entoces seria asi
     MyQuery.SQL.Text:='Call SP_EJECUTA_XXX_YYY_ZZZ();';
     // ó
     //si nuestro procedimiento tiene parametro de entrada entoces seria asi
     MyQuery.SQL.Text:='Call SP_EJECUTA_XXX_YYY_ZZZ(:Parametro1,:Parametro2);'; //Al poner dos puntos (:) Delphi 
      //crea los parámetros automáticamente ;)

     MyQuery.ParamByName('Parametro1').AsString:=Lo_que_Sea;
     ...
     ...
     MyQuery.Open;
   finally
    MyQuery.Free;
   end;

end;
Espero que te sea de utilidad.
Saludos...:)

betto 04-02-2010 23:55:12

Muchas gracias, lo intentare probar en cuanto tenga acceso a mi server nuevamente, te agradezco MUCHISIMO de antemano.

Saludos

sabroso 18-02-2017 03:45:30

Cita:

Empezado por rgstuamigo (Mensaje 352805)
Y dónde estas creando el parámetro '_TERMINAL'?:confused:
Lo que esta diciendo es que el componente TZStoredProc no tiene ningun parámetro creado por lo que no se puede acceder a ninguno.;)
Quisas deberías crearlo en tiempo de ejecución algo asi:
Código Delphi [-]
procedure TForm1.Button3Click(Sender: TObject);
var SProc:TZStoredProc;
begin
SProc:= TZStoredProc.Create(Self);
  try
    SProc.Connection := dm.Conecta;
    Sproc.StoredProcName:= 'SP_EJECUTA_XXX_YYY_ZZZ';
    Sproc.Params.CreateParam(ftString,'_TERMINAL',ptInput);//creo un parámetro string de entrada
    Sproc.Active:= False;//esta lines es innecesaria ya que por defecto se crea con Active=False
    Sproc.Params[0].AsString:= QuotedStr(gs_terminal);//el primer parametro se encuentra en la
        // posición cero (0) y no en uno(1).;)
    Sproc.ExecProc;
   finally
   SProc.Free;//liberamos y destruimos para no tener fugas de  memoria
   end;
end;
Sin olvidar que cuando creas un objeto debes eliminarlo cuando ya no lo necesites para no tener memoria reservado sin estar ocupandose.;).
Por si acaso en lo personal ami no megusta usar el componente TZStoredProc en su lugar yo uso un TZQuery y en su propiedad SQL llamo a mi procedimiento almacenado; en tu caso sería mas o menos asi:



Código Delphi [-]
 procedure TForm1.Button4Click(Sender: TObject);
var MyQuery:TZQuery;
begin
   MyQuery:=TZQuery.Create(Application);
   try
     MyQuery.Connection:=dm.Conecta;

     //si nuestro procedimiento no tiene parametro de entrada entoces seria asi
     MyQuery.SQL.Text:='Call SP_EJECUTA_XXX_YYY_ZZZ();';
     // ó
     //si nuestro procedimiento tiene parametro de entrada entoces seria asi
     MyQuery.SQL.Text:='Call SP_EJECUTA_XXX_YYY_ZZZ(:Parametro1,:Parametro2);'; //Al poner dos puntos (:) Delphi 
      //crea los parámetros automáticamente ;)

     MyQuery.ParamByName('Parametro1').AsString:=Lo_que_Sea;
     ...
     ...
     MyQuery.Open;
   finally
    MyQuery.Free;
   end;

end;
Espero que te sea de utilidad.
Saludos...:)




Y como seria el código a incluir en su la propiedad SQL para llamar al procedimiento almacenado?


La franja horaria es GMT +2. Ahora son las 08:52:44.

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