Ir al contenido


Foto

[RESUELTO] Crear parámetro por Código en Delphi


  • Por favor identifícate para responder
10 respuestas en este tema

#1 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 19 abril 2011 - 10:57

Que tal colegas, he querido crear un parámetro por código en un ZReadOnlyQuery y auqnue no me da error en la asignación y ejecución no me devuelve nada, aunque debería hacerlo, pues creando todo en modo diseño funciona  :


delphi
  1. var
  2.   nParam: TParam;
  3. begin
  4.   ZReadOnlyQuery2.Clear;
  5.   ZReadOnlyQuery2.SQL.Add('SELECT tUsUsuarios.CodUsuario,  tClOficinas.NomOficina, tUsUsuarios.NombreCompleto');
  6.   ZReadOnlyQuery2.SQL.Add('FROM  tUsUsuarios INNER JOIN');
  7.   ZReadOnlyQuery2.SQL.Add('      tClOficinas ON tUsUsuarios.CodOficina = tClOficinas.CodOficina');
  8.   ZReadOnlyQuery2.SQL.Add('WHERE CodUsuario =  :CodUsuario');
  9.  
  10.   //Crear parámetro
  11.   ZReadOnlyQuery2.Params:= TParams.Create();
  12.   nParam:= ZReadOnlyQuery2.Params.CreateParam(ftString,'CodUsuario',ptInput);
  13.   ZReadOnlyQuery2.Params.AddParam(nParam);
  14.  
  15.   ZReadOnlyQuery2.ParamByName('CodUsuario').Value := Edit1.Text;
  16.   ZReadOnlyQuery2.Open;
  17. .
  18. .


Agradecería su apoyo.
Saludos

  • 0

#2 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 19 abril 2011 - 11:09

Hola,

No tengo los componentes Zeos para comprobarlo pero me temo que la linea


delphi
  1. ZReadOnlyQuery2.Params:= TParams.Create();

no hace falta puesto que "lo normal" (insisto que no tengo Zeos) es que no tengas que crear la estructura Params sino que ésta ya venga creada en el componente, tú sólo tienes que crear el parámetro que quieres añadir.

Saludos


  • 0

#3 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 19 abril 2011 - 11:10

Además de lo que comenta Andres, podrías revisar que no estás colocando un espacio en blanco en la sexta y octava líneas, por lo tanto la sentencia podría quedar  "pegada".
Ensaya asi:



delphi
  1. var
  2.   nParam: TParam;
  3. begin
  4.   ZReadOnlyQuery2.Clear;
  5.   ZReadOnlyQuery2.SQL.Add('SELECT tUsUsuarios.CodUsuario,  tClOficinas.NomOficina, tUsUsuarios.NombreCompleto');
  6.   ZReadOnlyQuery2.SQL.Add(' FROM  tUsUsuarios INNER JOIN');
  7.   ZReadOnlyQuery2.SQL.Add('      tClOficinas ON tUsUsuarios.CodOficina = tClOficinas.CodOficina');
  8.   ZReadOnlyQuery2.SQL.Add(' WHERE CodUsuario =  :CodUsuario');
  9.  
  10.   //Crear parámetro
  11.  
  12.   ZReadOnlyQuery2.ParamByName('CodUsuario').Value := Edit1.Text;
  13.   ZReadOnlyQuery2.Open;
  14. .
  15. .


  • 0

#4 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 19 abril 2011 - 11:48

Gracias por sus comentarios, he modificado el código según sus sugerencia, pero no lo consigo aún, empiezo a pensar q es cosa de Zeos aunque tengo una de las últimas versiones, el código sin éxito es este:


delphi
  1.   ZReadOnlyQuery2.SQL.Clear;
  2.   ZReadOnlyQuery2.SQL.Add('SELECT tUsUsuarios.CodUsuario,  tClOficinas.NomOficina, tUsUsuarios.NombreCompleto ');
  3.   ZReadOnlyQuery2.SQL.Add('FROM  tUsUsuarios INNER JOIN tClOficinas ON tUsUsuarios.CodOficina = tClOficinas.CodOficina ');
  4.   ZReadOnlyQuery2.SQL.Add('WHERE CodUsuario =  :CodUsuario');
  5.   //Crear Parametro
  6.   //ZReadOnlyQuery2.Params:= TParams.Create();
  7.   nParam:= ZReadOnlyQuery2.Params.CreateParam(ftString,'CodUsuario',ptInput);
  8.   ZReadOnlyQuery2.Params.AddParam(nParam);
  9.   ZReadOnlyQuery2.ParamByName('CodUsuario').Value := Edit1.Text;


Saludos.
  • 0

#5 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 19 abril 2011 - 12:35

Saludos.

No comprendo la necesidad de crear un parámetro, donde ya lo habías definido en tu sentencia SQL.

Te invito a probar si tu sentencia devuelve registros sin pasarle parámetros, me refiero a esto: 


delphi
  1.   ZReadOnlyQuery2.Close;
  2.   ZReadOnlyQuery2.SQL.Clear;
  3.   ZReadOnlyQuery2.SQL.Add('SELECT tUsUsuarios.CodUsuario,  tClOficinas.NomOficina, tUsUsuarios.NombreCompleto ');
  4.   ZReadOnlyQuery2.SQL.Add('FROM  tUsUsuarios INNER JOIN tClOficinas ON tUsUsuarios.CodOficina = tClOficinas.CodOficina ');
  5.   ZReadOnlyQuery2.SQL.Add('WHERE CodUsuario =  ' + Edit1.Text);
  6.   ZReadOnlyQuery2.Open;



Si el campo CodUsuario fuese String:


delphi
  1.   ZReadOnlyQuery2.Close;
  2.   ZReadOnlyQuery2.SQL.Clear;
  3.   ZReadOnlyQuery2.SQL.Add('SELECT tUsUsuarios.CodUsuario,  tClOficinas.NomOficina, tUsUsuarios.NombreCompleto ');
  4.   ZReadOnlyQuery2.SQL.Add('FROM  tUsUsuarios INNER JOIN tClOficinas ON tUsUsuarios.CodOficina = tClOficinas.CodOficina ');
  5.   ZReadOnlyQuery2.SQL.Add('WHERE CodUsuario =  ' + QuotedStr(Edit1.Text));
  6.   ZReadOnlyQuery2.Open;



Prueba y nos avisas... (y)
  • 0

#6 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 19 abril 2011 - 12:59

No se porque lo creas, a mi asi me funciona




delphi
  1. ZReadOnlyQuery2.SQL.Clear;
  2.   ZReadOnlyQuery2.SQL.Add('SELECT tUsUsuarios.CodUsuario,  tClOficinas.NomOficina, tUsUsuarios.NombreCompleto ');
  3.   ZReadOnlyQuery2.SQL.Add('FROM  tUsUsuarios INNER JOIN tClOficinas ON tUsUsuarios.CodOficina = tClOficinas.CodOficina ');
  4.   ZReadOnlyQuery2.SQL.Add('WHERE CodUsuario =  :CodUsuario');
  5.   //Crear Parametro
  6.   ZReadOnlyQuery2.ParamByName('CodUsuario').AsXxxx := Edit1.Text;




  • 0

#7 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 19 abril 2011 - 01:32

No comprendo la necesidad de crear un parámetro, donde ya lo habías definido en tu sentencia SQL.

Q tal Rolphy, lo mismo pensé, pero me al colocar el query en tiempo de ejecución me manda un error al querer usarlo como parámetro pues como según entendí no existe el parámetro. Cómo bien mencionas me ha funcionado.

No se porque lo creas, a mi asi me funciona

Hola eduarcol, interesante, he visto que usaste en vez de value al momento de pasar el valor al parámetro AsString, mmm lo probaré.

Aunque este en un query pequeño en comparación del resto y quiero reutilizar el objeto, me obliga en determinados casos a cambiar el query y sus parámetros del mismo, pero al fin pude agregar el parámetro correctamente en tiempo de ejecución, y lo comparto a continuación:


delphi
  1. ZReadOnlyQuery2.Params.Clear;
  2. ZReadOnlyQuery2.Params.CreateParam(ftString,'CodUsuario',ptInput);
  3. ZReadOnlyQuery2.Params.AddParam(nParam);


Donde es necesario agregar: Params.Clear; y listo, al fin funcionó, agradezco su valiosa colaboración.
  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.301 mensajes
  • LocationArgentina

Escrito 27 abril 2011 - 08:57

Yo no uso Zeos pero me resulta raro que sea necesario crear el parámetro de forma explícita. Como lo han indicado los compañeros, los parámetros son creados de forma automática.

Además quisiera hacer una observación si me lo permiten: El uso de AddParam, y RemoveParam están desaconsejados, y en la misma medida también lo está CreateParam.
Se mantienen por cuestión de compatibilidad.

La ayuda (de D6) lo indica. la sentencia:



delphi
  1. ZReadOnlyQuery2.Params.CreateParam(ftString,'CodUsuario',ptInput);
  2. ZReadOnlyQuery2.Params.AddParam(nParam);



Lo que hace es agregar dos veces el parámetro en cuestión. CreateParam ya de por si lo crea y lo agrega.

Dices que te sale un error, ¿Podríamos saber textualmente cual es ese error? Eso nos podría ayudar a determinar verdaderamente la causa del problema. ¿Reúsas al mismo componente para ejecutar otras consultas? ¿Te aseguraste de cerrarlo apropiadamente? ¿No será que por casualidad habías creado los parámetros de forma persistente?

Me parece que hay que revisar bien que está pasando aquí. Si nos puedes aportar más información sobre tu caso...

Saludos,
  • 0

#9 fredycc

fredycc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 874 mensajes
  • LocationOaxaca, México

Escrito 28 abril 2011 - 07:27

Hola Delphius, como bien preguntas, el detalle es que  reutilizo el mismo componente para un par de consultas distintas , ya que si solo especificaba el sql, al querer asignar valores me indicaba que tal parámetro no existia, lo encontré en un manual de Zeos que creo baje de su sitio oficial, el ejemplo era:


delphi
  1. [color=#000081][size=2][font=couriernewpsmt]
  2. [LEFT]Var TheStream : TMemoryStream;[/LEFT]
  3.   Begin
  4.   TheStream := TMemoryStream.Create;
  5.   Try
  6.   Image1.Picture.Bitmap.Savetostream(TheStream);
  7.   With qryBlobInsert do Begin
  8.   Sql.Text := 'INSERT INTO EVENTS (EventNo,EVENT_PHOTO) ' +
  9.   'VALUES (100,:ThePicture)';
  10.   Params.Clear;
  11.   Params.CreateParam(ftBlob,'ThePicture', ptInput);
  12.   ParamByName('ThePicture').LoadfromStream(TheStream,ftBlob);
  13.   ExecSQL;
  14.   End;
  15.   Finally
  16.   TheStream.Free;
  17.   End;
  18.   End;[/font][/size][/color]


Saludos
  • 0

#10 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 28 abril 2011 - 08:31

Hola.

Hola Delphius, como bien preguntas, el detalle es que  reutilizo el mismo componente para un par de consultas distintas ,


En ese caso normalmente es mejor utilizar tantos componentes como consultas distintas tienes.

NOTA: Siempre puedes jugar con el control DataSource para que los controles dataaware se enlacen con la consulta utilizada en cada momento.
  • 0

#11 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.301 mensajes
  • LocationArgentina

Escrito 28 abril 2011 - 12:30

Hola fredycc,
Al decir cosas como:

al querer asignar valores me indicaba que tal parámetro no existia


Pero ello en realidad no nos aclara bien del todo cual es la causa real del problema. Más bien obscurece el panorama. Insisto en conocer el error exacto que te arroja, con nombres y apellidos...

Sabiendo que reutilizas, es muy posible que el error venga arrastrado de algún otro lado, una consulta anterior mal cerrada, un parámetro persistente... en fin, hay unas cuantas posibilidades y sin tener un conocimiento más profundo de lo que estás realizando lo veo un tanto complicado hallar una respuesta certera.

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.