Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ahorro de recursos (https://www.clubdelphi.com/foros/showthread.php?t=66189)

Raynel 05-02-2010 19:13:25

Ahorro de recursos
 
Saludos miembros del foro, tengo un problema al importar de un libro de excel a base de datos paradox. éste pone muy lento la máquina al punto que todo se congela. ¿No habrá una guía o algún tutorial de cómo ahorrar recursos al utilizar Delphi como lenguaje? Nota: el algoritmo de importación lo saqué de los foros. Gracias por las respuesta.

Casimiro Notevi 05-02-2010 19:27:24

¿qué algoritmo?

Al González 05-02-2010 19:33:57

Cita:

Empezado por Raynel (Mensaje 353094)
Saludos miembros del foro, tengo un problema al importar de un libro de excel a base de datos paradox. éste pone muy lento la máquina al punto que todo se congela. ¿No habrá una guía o algún tutorial de cómo ahorrar recursos al utilizar Delphi como lenguaje? Nota: el algoritmo de importación lo saqué de los foros. Gracias por las respuesta.

¿Podrías darnos una referencia de ese algoritmo y también un aproximación de cuántas filas y columnas tiene el documento original?

Es posible que convenga hacer el copiado con sentencias SQL Insert Into, pues si estás acumulando todos los registros en la memoria de un data set usando el método Insert / Append, puede consumir una cantidad de memoria considerable si la hoja de Excel contiene mucha información.

Saludos.

Al González. :)

roman 05-02-2010 19:36:02

Coincido con Casimiro; hay que ser más explícitos. Pero, en términos generales puedo comentarte que conozco dos formas de acceder a datos de Excel: con OLE o con ADO. Con OLE usas los componentes de la paleta Servers ysuel ser muy lento, sobre todo si son muchos datos. Con ADO accede a los datos como si estuvieran en una tabla de una base de datos y el proceso es mucho más rápido. Por si te sirve, aquí hay un ejemplo de cómo usar ADO para transferir datos de una hoja de excel a una tabla de paradox.

// Saludos

Raynel 05-02-2010 19:49:27

Bueno en realidad no es el algoritmo, pero ayuda el código; y si, usa funciones OLE. Pero en realidad sería estupendo alguna guía sobre el ahorro de recursos, cuándo aplicarlas y todo eso. El documento en excel posee más de 10000 filas (y en aumento) y 16 campos cada una.
Este es el código, disculpen el erróneo concepto de "algoritmo" para este ejemplo :rolleyes:.

Código Delphi [-]
begin
Button1.Enabled := False;     
xls := CreateOleObject('Excel.Application');     
xls.WorkBooks.Open( OpenDialog1.FileName );     
xls.Visible := false;     
fLoop := true;    
iFila := 2;     
while fLoop do     
begin       
if VarToStr( xls.WorkSheets[1].Cells[iFila,1].Value ) = '' then        
 fLoop := false      
 else 
begin        
 inc(iFila);         
Label1.Caption := 'Procesando ...';         
Label1.Update;        
end;    
 end;   
Total:=iFila;   
ProgressBar1.Max:=iFila;   
try     fLoop := true;    
 iFila := 2; // Fila donde está el primer dato a importar     
while fLoop do    
 begin      
 if VarToStr( xls.WorkSheets[1].Cells[iFila,1].Value ) = '' then        
 fLoop := false       
else       
begin       
Dia:=StrtoDate(VarToStr( xls.WorkSheets[1].Cells[iFila,1].Value));      
Loteria:=VarToStr( xls.WorkSheets[1].Cells[iFila,2].Value);       
Query1.Close;      
 Query1.SQL.Clear;       
Query1.SQL.Text:='SELECT * FROM Tabla WHERE (Campo1 = :C1) AND (Campo2 = :C2)';
Query1.SQL.Text:=Format(Consulta,[QuotedSTr(Loteria)]);       
Query1.ParamByName('C1').asString := Campo1;      
Query1.ParamByName('C2').asDate := Campo2;       
Query1.RequestLive := true;      
 Query1.Open;       
if Query1.IsEmpty then        
Begin         
 Query2.Close;         
 Query2.SQL.Clear;          
Query2.SQL.Text:='SELECT Campo3 FROM Tabla WHERE (Campo3 = :C3)';         
Query2.ParamByName('Lot').asString := Campo1;          
Query2.RequestLive := true;          
Query2.Open;         
if Query2.IsEmpty then            
 Begin              
Query2.Insert;              
Query2.FieldByName('Campo2').AsString:=C2;              
Query2.Post;             
end;         
Query1.Insert;
Query1.FieldByName('Campo0').AsInteger := Table1.RecordCount+1;
Query1.FieldByName('Campo1').AsDateTime := StrtoDate(VarToStr( xls.WorkSheets[1].Cells[iFila,1].Value));
Query1.FieldByName('Campo3').AsString := VarToStr( xls.WorkSheets[1].Cells[iFila,2].Value);         
triple:=VarToStr( xls.WorkSheets[1].Cells[iFila,3].Value);         
Query1.FieldByName('C4').AsString := completarceros(triple);        
 triple:=VarToStr( xls.WorkSheets[1].Cells[iFila,4].Value);         
Query1.FieldByName('C5').AsString :=completarceros(triple);         
triple:=VarToStr( xls.WorkSheets[1].Cells[iFila,5].Value);        
 Query1.FieldByName('C6').AsString :=completarceros(triple);        
 triple:=VarToStr( xls.WorkSheets[1].Cells[iFila,6].Value);         
Query1.FieldByName('C7').AsString :=completarceros(triple);         
triple:=VarToStr( xls.WorkSheets[1].Cells[iFila,7].Value);        
 Query1.FieldByName('C8').AsString :=completarceros(triple);         
triple:=VarToStr( xls.WorkSheets[1].Cells[iFila,8].Value);         
Query1.FieldByName('C9').AsString :=completarceros(triple);         
triple:=VarToStr( xls.WorkSheets[1].Cells[iFila,9].Value);         
Query1.FieldByName('C10').AsString :=completarceros(triple);         
triple:=VarToStr( xls.WorkSheets[1].Cells[iFila,10].Value);         
Query1.FieldByName('C11').AsString :=completarceros(triple);         
triple:=VarToStr( xls.WorkSheets[1].Cells[iFila,11].Value);        
 Query1.FieldByName('C12').AsString :=completarceros(triple);         
Query1.Post;       
 end;       
end;       
inc(iFila);       
Porc:=IFila*100/Total;      
 Label1.Caption := FloattoStr(Trunc(Porc))+'%';       
ProgressBar1.StepIt;       
Label1.Update;     
end    
finally     
xls.Quit    
end;

Raynel 05-02-2010 20:11:03

Cita:

Empezado por roman (Mensaje 353103)
Coincido con Casimiro; hay que ser más explícitos. Pero, en términos generales puedo comentarte que conozco dos formas de acceder a datos de Excel: con OLE o con ADO. Con OLE usas los componentes de la paleta Servers ysuel ser muy lento, sobre todo si son muchos datos. Con ADO accede a los datos como si estuvieran en una tabla de una base de datos y el proceso es mucho más rápido. Por si te sirve, aquí hay un ejemplo de cómo usar ADO para transferir datos de una hoja de excel a una tabla de paradox.

// Saludos

Busqué el enlace de Roman, excelente para lo que quiero, gracias por el interés en responder....


La franja horaria es GMT +2. Ahora son las 04:21:38.

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