Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Servers (https://www.clubdelphi.com/foros/forumdisplay.php?f=9)
-   -   Exportar de Interbase a tabla Access (https://www.clubdelphi.com/foros/showthread.php?t=17686)

VRO 18-01-2005 12:57:11

Exportar de Interbase a tabla Access
 
Hola otra vez,
necesito algun ejemplillo ó manual donde encuentre como exportar datos de interbase a una tabla de Access, me gustaría hacerlo utilizando el Pallette Server de Delphi 6, pero si tengo que hacerlo con conexión ADO ó de alguna otra forma tampoco me importa.

Además me gustaría que la exportación me valiese para cualquier Access 97, 2000, XP.

Muchas gracias por su ayuda en este y en todos los casos anteriores.

Neftali [Germán.Estévez] 18-01-2005 13:04:37

Cita:

Empezado por VRO
...me gustaría hacerlo utilizando el Pallette Server de Delphi 6, pero si tengo que hacerlo con conexión ADO ó de alguna otra forma tampoco me importa.

Además me gustaría que la exportación me valiese para cualquier Access 97, 2000, XP.

Justo creo que te será más sencillo hacerlo vía ADO que hacerlo con la paleta SERVERS.
(1) Pon un form con lo necesario para las dos conexiones (ADO: ADOConnection + ADOTable) y similar para la de IB/FB.
(2) Se trata de ir leyendo de uno y escribiendo en otro.

En cuanto a la segunda cuestión, justo con ADO conseguirás la independencia de la versión de Access, cosa que no es seguro si utilizas la paleta Servers.

VRO 19-01-2005 19:16:40

Gracias por la ayuda, codigo mas sencillo ó rapido
 
Gracias Neftalí por tu rapida respuesta, así lo he hecho con conexión ADO para lo que he naufragado en la busqueda y he encontrado muchos hilos que tratan del tema, acontinuación cito el código utilizado por si ha alguien le sirve de ayuda, ya que he creado la base de datos directamente desde Delphi 6, lo cito porque esto sólo lo he encontrado en un hilo para facilitar la busqueda:

Primero comento lo que hace el codigo:

Crea la base de datos desde delphi con código, para ello,en el menú de Delphi voy a Projecti-> Importar TYpe Librery e importo la librería "Microsoft ADO ext. 2.1 for DLL and Security (versión 2.1)" después pulso "Create Unit " y pongo el código que después detallaré.
El código comprueba que esa base de datos no esté creada ya, si no está creada la crea , crea tambiñén la tabla y realiza el paso de datos.si la base da datos está creada ya, comprueba que la tabla no esté creada, si es así(no está creada) la crea y pasa lo datos, si está creada sólo pasa los datos (lo que viene acontinuación falta de hacer) sólo los datos que no estén ya introducidos.

Para haccer el codigo utilizo una conexion TADOConnection (llamada ADOConnect) y un query TADOQuery(llamado ADOQ) todo de la pestaña ADO de Delphi y un IBQuery de la pestaña Interbase (llamdo dlecturas).Os ruego que si se os ocurre una forma más rapida ó sencilla de hacer lo descrito con ADO me lo comuniqueis, por favor.
Código Delphi [-]

procedure TForm1.Exportardatos1Click(Sender: TObject);
const
  DATABASENAME='C:\Archivos de programa\agua\datos\exportar.mdb';
var
   catalog:_catalog;
        ConnectionString:String;
begin

   //Creamos el objeto catalogo
   Catalog:=CreateComObject(StringToGUID('ADOX.Catalog')) as _Catalog;
   //Cadena de conexión
   ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+ DATABASENAME;
   try
    //Create new Access database por primera vez
    Catalog.Create(ConnectionString);
    //Conectamos con la base de datos creada.
    datos.ADOConnect.ConnectionString:=ConnectionString+';Persist Security Info=False';
    datos.ADOConnect.Connected:=true;
    //Creamos la tabla texportar.
    datos.ADOQ.SQL.Clear;
    datos.ADOQ.SQL.Add('Create table texportar(contador int not null,fecha date not null,lectura float, consumo float, primary key(contador,fecha))');
    datos.ADOQ.Open;

    datos.dlecturas.First;
    while datos.dlecturas.Eof=false do
     begin
       datos.ADOQ.SQL.Clear;
       datos.ADOQ.SQL.Add('insert into texportar(contador,fecha,lectura,consumo)values('+ datos.dlecturas.fieldbyname('numero').text+','+FormatDateTime('dd/mm/yy',datos.dlecturas.fieldbyname('fecha').asFloat)+','+datos.dlecturas.fieldbyname('lectura').text+',  '+datos.dlecturas.fieldbyname('consumo').text+')');
       datos.ADOQ.Open;

       datos.dlecturas.Next;
     end;
   except
    on E:EOLEException do begin
    //Levantamos la excepcion, si existe la base da datos, creamos la tabla y
    //pasamos los datos
        if Trim(E.Message)='La base de datos ya existe' then
         begin
           datos.ADOConnect.ConnectionString:=ConnectionString+';Persist Security Info=False';
           datos.ADOConnect.connected:=true;
           try
             datos.ADOQ.SQL.Clear;
             datos.ADOQ.SQL.Add('Create table texportar(contador int not null,fecha date not null,lectura float,consumo float, primary key(contador,fecha))');
             datos.ADOQ.Open;

             datos.dlecturas.First;
             while datos.dlecturas.Eof=false do
              begin
               datos.ADOQ.SQL.Clear;
               datos.ADOQ.SQL.Add('insert into texportar(contador,fecha,lectura,consumo)values('+datos.dlecturas.fieldbyname('numero').text+','+For  matDateTime('mm/dd/yy',datos.dlecturas.fieldbyname('fecha').AsDateTime)+','+datos.dlecturas.fieldbyname('lectura').text  +','+datos.dlecturas.fieldbyname('consumo').text+')');
               datos.ADOQ.Open;

               datos.dlecturas.Next;
              end;
            except
             on E:EOLEException do begin
             //Volvamos a lanzar otra excepcion si ya existe la tabla, pasamos datos
               if Trim(E.Message)='La tabla ''texportar'' ya existe' then
                begin
                  datos.dlecturas.First;
                  while datos.dlecturas.Eof=false do
                   begin
                       datos.ADOQ.SQL.Clear;
                       datos.ADOQ.SQL.Add('insert into texportar(contador,fecha,lectura,consumo)values('+datos.dlecturas.fieldbyname('numero').text+','+For  matDateTime('mm/dd/yy',datos.dlecturas.fieldbyname('fecha').AsDateTime)+','+datos.dlecturas.fieldbyname('lectura').text  +','+datos.dlecturas.fieldbyname('consumo').text+')');
                       datos.ADOQ.Open;

                       datos.dlecturas.Next;
                   end;
                end
               else
                messageDLG('Error al crear la base de datos; Mensaje:'+ E.Message,mtError,[mbOk],0);
             end;
            end;
         end
    else
      messageDLG('Error al crear la base de datos; Mensaje:'+ E.Message,mtError,[mbOk],0);
   end;
  end;
end;

Nota: me he dado cuenta que cuando crea la tabla ó
mete datos da un error que dice:
"ADOQ:CommandTex does not return a result set."
Estoy investigando a ver porque da ese error ya que
creo haberlo visto resuleto en un hilo, no obstante si sabeis
porque es os ruego me lo comuniqueis.

Pues lo dicho espero que le sirva a alguien,aunque debe sufrir alguna modificación que cuando esté terminada añadiré a este hilo.

Gracias por todo

Neftali [Germán.Estévez] 20-01-2005 10:55:54

Yo te recomiendo que hagas las comprobaciones de existencuia tanto de la Base de Dats como de las tablas antes de ejecutar, en lugar de realizarlas en el tratamiento de excepciones; Con ésto conseguiras evitar código duplicado y más seguridad (por la comprobación del mensaje de las excepciones -eso no es muy seguro-).

Para la de la Base de Datos como es un archivo Access puedes usar FileExists y para la tabla el método GetTableNames del ADO Connection.

El código sería algo así:

Código Delphi [-]
 procedure TForm1.Button2Click(Sender: TObject);
 const
   DATABASENAME='C:\Archivos de programa\agua\datos\exportar.mdb';
 var
   TS:TStringList;
   Index:Integer;
 begin
 
   // Existe la Base de Datos?
   if FileExists(DATABASENAME) then begin
     // EXISTE
     // ...
   end
   else begin
     // NO EXISTE
     // ...
   end;
 
   // Crear la lista
   TS := TStringList.Create();
   TS.Sorted := True;
 
   // proteccion para liberar
   try
 
     // Recuperar nombres de tablas
     ADOConnection1.GetTableNames(TS, False);
 
     // Existe la tabla ?
     if TS.Find('texportar', Index) then begin
       // EXISTE
       //...
     end
     else begin
       // NO EXISTE
       //...
     end;
 
   finally
     TS.Free;
   end;  
 
 end;


La franja horaria es GMT +2. Ahora son las 13:37:56.

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