PDA

Ver la Versión Completa : Acceder a tablas DBF con ADO


salvica
16-11-2007, 00:19:59
Hola
Intento rellenar un informe desde cinco tablas .DBF (DBase IV) mediante un ZQuery de Zeos con la siguiente consulta:

{ 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:

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
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:

{ 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