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)
-   -   Componentes ZQuery y ZTable [ZeosLib] (https://www.clubdelphi.com/foros/showthread.php?t=76084)

chueco 07-10-2011 18:59:36

Componentes ZQuery y ZTable [ZeosLib]
 
Buenas soy nuevo aqui, y mas nuevo utilizando Zeos. empeze a usar Zeos en Delphi XE, y queria saber como utilizar muchas tablas en un ZTable y muchas consultas en un ZQuery, sin tener que agregar un compoenente por cada cosa.-

por ejemplo este procedimiento lee de la tabla medicos y coloca la consulta en un listbox, en este caso mi Zquery tiene cargada la consulta 'Select nombre, apellido from medico'

Cita:

ZQuery1.Open;
While not zQuery1.eof do
begin
nombre := zQuery1.FieldByName('nombre').AsString+ ' '+zQuery1.FieldByName('apellido').AsString;
bsSkinListBox1.Items.Add(nombre);
zQuery1.Next;
end;
luego de este procedimiento quiero realizar otra consulta con otra tabla en los mismos componentes ya utilizados. Es posible eso,-

desde ya muchas gracias, saludos

Caral 07-10-2011 19:05:14

Hola
El zquery tiene la propiedad sql, esto no quiere decir que se tenga que usar solamente en la pantalla que sale, se puede usar por codigo.
El ztable tiene la propiedad tablename ahi es donde se coloca la tabla que se necesite usar.
OSEA, contestando a la pregunta: SI se pueden usar los mismos componentes para diferentes consultas.
Saludos

Casimiro Notevi 07-10-2011 19:17:12

Cierras el dataset, le asignas el sql que quieras y lo vuelves a abrir/ejecutar.

Sapt_86 07-10-2011 19:21:03

Hola Caral. Mira te mando un ejemplo de como lo utilizo en forma generica un zquery.


Código Delphi [-]
Function InsertarBD(Tabla : String; Campos : array of string):String;
Var         Sentencia : string;         
i : integer;       
Begin
Sentencia := 'INSERT INTO '+ Tabla +' VALUES(' + #39;
For i := 0 to length(campos) -1 do
Begin
If i = 0 then
Sentencia := Sentencia + Campos[i]
Else
Sentencia := Sentencia + #39 + ', ' + #39 + Campos[i];
End;
Sentencia := Sentencia + #39 + ')';
With LibreriaOperacional do
Begin
Consulta.Close;
Consulta.SQL.Text := sentencia;
Consulta.ExecSQL;
End;
result:=sentencia;
End;


No se, si es la mejor forma. Ademas esta funcion es solo para insertar valores de un vector, llamado campos. Con algunas modificaciones seguramente podras

Es funcion porque he utilizado los resultados string en este caso para guardar la consulta.

Espero que te sirva como guia. Saludos.

Caral 07-10-2011 19:26:47

Hola
Vamos a la pregunta bien planteada:
Se pueden usar los mismos componentes ?, como ?:
Supongamos que tenemos dos o varias TList y queremos usar el mismo zQuery para llenar todos:
Código Delphi [-]
ZQuery1.Sql.Text:= 'Select nombre, apellido from medico';
ZQuery1.Open;
 While not zQuery1.eof do
 begin
 bsSkinListBox1.Items.Add(nombre);  //primer listBox
 zQuery1.Next;
 end;
ZQuery1.Close;  // cierro
ZQuery1.Sql.Text:= 'Select Direccion, Telefono from medico';
ZQuery1.Open;
 While not zQuery1.eof do
 begin
 bsSkinListBox2.Items.Add(nombre); // segundo listBox
 zQuery1.Next;
 end;
////ETC;;;
En el caso de un ZTable, simplemente se cambie el nombre de la tabla en la propiedad TableName:
Código Delphi [-]
ZTable1.TableName:= 'Nada';
ZTable1.Open;
// hago lo que necesito hacer y:
ZTable1.Close;
ZTable1.TableName:= 'Otra';
ZTable1.Open;
Saludos

chueco 07-10-2011 19:27:17

gracias por sus respuestas, lo que intente fue esto y dio resultado;

Código:

ZTable1.TableName:='dsw.medico';
ZQuery1.SQL.Clear;
ZQuery1.SQL.Add('Select nombre, apellido  from medico');
ZQuery1.Open;

pero como podria yo tener precargada consultas que hagan referencia a diferentes tablas y poder recorrerlas a traves de la propiedad SQL. sin tener que andar borrando y cargando cada ves que quiera una nueva consulta.-
Cual es el metodo para iterar sobre SQL o algo por el estilo,-

Muchas gracias por sus respuestas, saludos...

Caral 07-10-2011 19:28:22

Hola
Gracias, contesta MI pregunta a la perfección.:)
Saludos

Caral 07-10-2011 19:43:37

Hola
Digamos que quieres tener algunas consultas preestablecidas y que quieres tomarlas cuando quieras.
Hagamos un ejercicio (JAMAS lo he hecho, solo se me ocurre):

Creamos un procedimiento que nos cargue los string de sql:

Código Delphi [-]
Procedure TForm1.SQLDatos;
var sql1, sql2, sql3 : String;
Begin
  sql1:= 'Select * From MiTabla1';
  sql2:= 'Select micampo1, micampo2 from mitabla2';
  sql3:= 'Select Loquesea From mi tabla3';
end;

Bien ahora lo uso:

Código Delphi [-]
ZQuery1.Sql.Text:= SQLDatos(sql1);
ZQuery1.Open;
 While not zQuery1.eof do
 begin
 bsSkinListBox1.Items.Add(nombre);  //primer listBox
 zQuery1.Next;
 end;
ZQuery1.Close;  // cierro
ZQuery1.Sql.Text:= SQLDatos(sql2);
ZQuery1.Open;
 While not zQuery1.eof do
 begin
 bsSkinListBox2.Items.Add(nombre); // segundo listBox
 zQuery1.Next;
 end;
Es posible que con una funcion camine mejor ya que estara buscando la variable, me imagino que por ahi va la cosa.
Solo opino, desde lo mas profundo de mi desconocimiento.:)
Saludos

Caral 07-10-2011 20:16:01

Hola
Bien, despues de probar la chapuza que hice lo he probado y esta es la correcta forma de hacerlo:
Se sigue con casi lo mismo, pero ahora pondremos las variables fuera del procedimiento como globales:
Código Delphi [-]
var
  Form1: TForm1;
  sql1, sql2, sql3 : String;

Ahora el procedimiento SIN las variables:
Código Delphi [-]
Procedure TForm1.SQLDatos;
Begin
  sql1:= 'Select * From Alumnos';
  sql2:= 'Select Nombre, Apellido from Alumnos';
  sql3:= 'Select telefono From mi Alumnos';
end;

Ahora lo llamamos:
Código Delphi [-]
SQLDatos; //llamamos al procedimiento
ZQuery1.Sql.Text:= sql1;  //primera consulta sql
ZQuery1.Open;
 While not zQuery1.eof do
 begin
 bsSkinListBox1.Items.Add(ZQuery1.Fields[0].Text + ZQuery1.Fields[1].Text + etc..);  //primer listBox
 zQuery1.Next;
 end;
ZQuery1.Close;  // cierro
ZQuery1.Sql.Text:= sql2; //segunda consulta sql
ZQuery1.Open;
 While not zQuery1.eof do
 begin
 bsSkinListBox2.Items.Add(ZQuery1.Fields[0].Text + ZQuery1.Fields[1].Text); // segundo listBox
 zQuery1.Next;
 end;
Bien, ahora si estoy seguro de que funciona, ya lo probé.
Saludos


La franja horaria es GMT +2. Ahora son las 21:10:50.

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