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)
-   -   Ado Excel muchos datos (https://www.clubdelphi.com/foros/showthread.php?t=69773)

Delfino 08-09-2010 12:12:32

Ado Excel muchos datos
 
Estoy accediendo por medio de dos AdoQuery a dos hojas Excel y con una bucle recorriendo sus datos para automatizar un proceso. Cuando hay pocos datos funciona a la perfección, pero cuando pasan de las 5000 filas o menos la bucle es interminable. No da error pero se queda ahí pensando. Alguien sabría una solución? Saludos..

Neftali [Germán.Estévez] 08-09-2010 13:59:18

¿Exactamente cual es el código del bucle? ¿Qué haces para cada fila?
No me parece que 5000 filas sean un número demasiado grande.

Delfino 08-09-2010 14:16:51

Ahi va el codigo :
Código Delphi [-]
   adoXls1.First;
   while not adoXls1.Eof do
    begin
     if TryStrToInt(adoXls1.Fields[0].AsString, IntVal) = False  then
      Continue;
     adoXls2.First;
     while not adoXls2.Eof do
      begin
       if adoXls2.Fields[0].AsInteger = IntVal then
        begin
         cdsCommon1.Insert;
         cdsCommon1.Fields[1].AsString := adoXls1.Fields[0].AsString;
         cdsCommon1.Fields[0].AsInteger := adoXls2.Fields[0].AsInteger;
         cdsCommon1.Post;
         Break;
        end;
       adoXls2.Next;
      end;
     if adoXls2.Eof then
      begin
       cdsDiff1.Insert;
       cdsDiff1.Fields[1].AsString := adoXls1.Fields[0].AsString;
       cdsDiff1.Fields[0].AsInteger := adoXls2.Fields[0].AsInteger;;
       cdsDiff1.Post;
      end;
     Application.ProcessMessages;
     adoXls1.Next;
    end;
Lo q quiero es entre dos Excel y basado en un campo clave sacar los valores q tiene en comun y los q tiene uno pero el otro no tiene, no se si hay mejor manera :confused:

Neftali [Germán.Estévez] 08-09-2010 14:25:48

Cita:

Empezado por Delfino (Mensaje 375780)
Lo q quiero es entre dos Excel y basado en un campo clave sacar los valores q tiene en comun y los q tiene uno pero el otro no tiene, no se si hay mejor manera :confused:

Tal vez podrías utilizar un par de SQL's.
Haciendo la INNER JOIN de ambas por el campo clave deberías obtener sólo aquellos registros coincidentes.

Y una LEFT JOIN o RIGHT JOIN y luego preguntando por NULOS te permirta saber los que están en uno y en otro no.

Delfino 08-09-2010 14:35:53

Los joins donde irian? en una tercera AdoQuery?
Son dos archivos Excel independientes uno del otro..

Tienes algun ejemplo?

Neftali [Germán.Estévez] 08-09-2010 14:53:03

Cita:

Empezado por Delfino (Mensaje 375782)
Los joins donde irian? en una tercera AdoQuery?
Son dos archivos Excel independientes uno del otro..
Tienes algun ejemplo?

Mi idea era realizar una query con la JOIN sobre los dos excels que tienes ahora, utilizando hojas como tablas; El problema es que ningu he probado a realizarlo con libros distintos.

Se trataría de utilizar un Query que hiciera directamente la INNER entre las 2 hojas de los dos libros.

En SQL Server y ADO funciona esta nomenclatura:

Código SQL [-]
Select A.*, B.* from [BASEDATOS1].dbo.TTabla1 AS A
INNER JOIN [BASEDATOS2].dbo.TTabla2 AS B 
ON A.ID=B.ID

Se trataría de intentar hacer lo mismo, pero en este caso (Excel) las Hojas corresponden a las tablas y los libros a las Bases de Datos.

La teoría es esa, pero nunca lo he probado y no si el driver de Excel admite esa sintasix.

cloayza 08-09-2010 15:38:00

Yo creo que el problema esta aqui...

Código Delphi [-]

{Al hacer continue se quedara siempre en el mismo registro, ya que el puntero de registro no se ha movido...
Sugiero antes de continue realizar un adoXls1.Next}
if TryStrToInt(adoXls1.Fields[0].AsString, IntVal) = False  then
begin
      adoXls1.Next;
      Continue;
end;

Saludos cordiales...

Delfino 09-09-2010 21:15:23

Cita:

Empezado por cloayza (Mensaje 375785)
Yo creo que el problema esta aqui...

Efectivamente ahi estaba el problema. Corregido ahora todo el proceso se hace en menos de 15 segundos para mas de 20000 registros..

saldanaluis 22-03-2011 02:02:03

conexion a excel con ADO
 
Tengo la necesidad de tomar información de excel y vi este tema, pero no veo como se usa ADO para conectarse a excel.
¿que se pone en el ADOConnection?
¿con que se accede, TADOTable?

Gracias por sus respuestas.
:confused:

Neftali [Germán.Estévez] 22-03-2011 09:48:56

1 Archivos Adjunto(s)
Se hace de la misma forma en como te conectas a cualquier otra Base de Datos con ADO.
Te pongio una imagen para que veas los componentes. Lo único que cambia es la cadena de conexión.

Si buscas en los foros por "Excel ADO*" encontrarás muuuuchos temas al respecto.


La franja horaria es GMT +2. Ahora son las 16:12:44.

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