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)
-   -   Acceder a tablas DBF con ADO (https://www.clubdelphi.com/foros/showthread.php?t=50391)

salvica 16-11-2007 00:19:59

Acceder a tablas DBF con ADO
 
Hola
Intento rellenar un informe desde cinco tablas .DBF (DBase IV) mediante un ZQuery de Zeos con la siguiente consulta:
Código Delphi [-]
{ activar la base de datos }
  with ZQuery do begin
     { desactivar la base de datos }
       Active := false;
       if bHAY_MYSQL then begin
          Connection := Form_Impresion.ZConnection_MYSQL;
       end else begin
          Connection := Form_Impresion.ZConnection_DBF;
       end;
     { confección de la Query de consulta }
       SQL.Clear;
       SQL.Add( 'SELECT tabla1.maximo, tabla1.cad_maximo,' );
       SQL.Add( '       tabla1.minimo, tabla1.cad_minimo,' );
     { datos de tabla2 }
       SQL.Add( '       tabla2.ayer,'   );
       SQL.Add( '       tabla2.hoy,'    );
       SQL.Add( '       tabla2.valor,'  );
       SQL.Add( '       tabla2.helado,' );
       SQL.Add( '       tabla2.roto,'   );
     { datos de tabla3 }
       SQL.Add( '       tabla3.xcien,'    );
       SQL.Add( '       tabla3.duracion,' );
     { datos de tabla4 }
       SQL.Add( '       tabla4.valor_06,' );
       SQL.Add( '       tabla4.valor_07,' );
       SQL.Add( '       tabla4.valor_12,' );
       SQL.Add( '       tabla4.valor_13,' );
       SQL.Add( '       tabla4.valor_18,' );
       SQL.Add( '       tabla4.valor_24,' );
     { datos de tabla5 }
       SQL.Add( '       tabla5.dif_00,' );
       SQL.Add( '       tabla5.dif_07 ' );
       SQL.Add( '  FROM tabla1' );
       SQL.Add( '  JOIN tabla2  ON tabla2.clave=tabla1.clave' );
       SQL.Add( '  JOIN tabla3  ON tabla3.clave=tabla1.clave' );
       SQL.Add( '  JOIN tabla4  ON tabla4.clave=tabla1.clave' );
       SQL.Add( '  JOIN tabla5  ON tabla5.clave=tabla1.clave' );
       SQL.Add( ' WHERE tabla1.clave="' + strClave + '"' );
       SQL.Add( ' ORDER BY tabla1.clave' );
     { abrir la tabla activa }
       try
         Active := true;
       except
         SQL.SaveToFile( 'ERROR_SQL.txt' );
       end;
     { las tablas quedan abiertas }
  end; { del with ZQuery do }
  with QuickRep1 do
       DataSet := ZQuery;
end;
Cuando la conexión (con un ZCOnnection) la realizo sobre un servidor MySql se ejecuta correctamente.

Cuando al ZConnection le asigno la cadena:
Código Delphi [-]
  with ZConnection_DBF do begin
       HostName := '';
       User     := '';
       Password := '';
       Protocol := 'ado';
       Port     := 0;
       Database := 'Provider=Microsoft.Jet.OLEDB.4.0;' +
                   'Data Source=C:\DATOS;' +
                   'Extended Properties=dBASE IV;' +
                   'User ID=Admin;' +
                   'Password=;';
  end;
al ejecutar la Query me dice: OleException with message 'Error de sintaxis en la clausula FROM'

¿Podeis decirme cual es el error o como de hace un JOIN con ADO?
Gracias adelantadas:
Salvica

Edito -> Delphi-7, MySql-5, Zeos 6.6.1-beta
Gracias

poliburro 16-11-2007 01:08:23

Un consejo, si piensas usar ADO, utiliza los componentes ADO, no utilices Zeos.

salvica 16-11-2007 01:36:18

Cita:

Empezado por poliburro (Mensaje 246509)
Un consejo, si piensas usar ADO, utiliza los componentes ADO, no utilices Zeos.

Gracias, pero la aplicación está hecha para MYSQL, lo que pasa es que hay algunos sitios que no pueden ponerlo y las tablas están en DBF
(y por portabilidad...)

De todas formas, para probar, he añadido un ADOConnection y un ADOQuery al proyecto. pero al ejecutar la Query anterior me tira el mismo error: Error de sintaxis en la clausula FROM por lo que, supongo, el problema viene de la construcción de la consulta.

Debo añadir que las tablas .DBF son "tablas sueltas", no hay ninguna estructura de Base de Datos como tal y que si la consulta la hago sobre una única tabla se resuelve perfectamente.

¿Alguien puede decirme como hacer una consulta múltiple (estilo JOIN) a dichas tablas y con qué objetos)?

Gracias
Salvica

salvica 21-11-2007 18:27:29

Al final lo hice importando las tablas a access y creando la consulta

- La conexión sigue con la misma (ZConnection) y la consulta en un ZQuery.
- Los campos del select son los mismos y el cambio es en el FROM que daba problemas:
Código Delphi [-]
{ en el FROM, tantos paréntesis como "tablas - 1" }
  SQL.Add( '  FROM (((tabla1 ' );
  SQL.Add( '          INNER JOIN tabla2 ON tabla1.CLAVE = tabla2.CLAVE) ' );
  SQL.Add( '          INNER JOIN tabla3 ON tabla1.CLAVE = tabla3.CLAVE) ' );
  SQL.Add( '          INNER JOIN tabla4 ON tabla1.CLAVE = tabla4.CLAVE) ' );
  SQL.Add( '          INNER JOIN tabla5 ON tabla1.CLAVE = tabla5.CLAVE' );
{ ¿porqué paréntesis en WHERE? }
  SQL.Add( ' WHERE (((tabla1.CLAVE)="'+FormatDateTime('yyyymmdd', zFECHA)+'"));' );
Gracias
Salvica


La franja horaria es GMT +2. Ahora son las 06:18:17.

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