Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-07-2011
pelikno pelikno is offline
Miembro
NULL
 
Registrado: oct 2010
Posts: 95
Poder: 16
pelikno Va por buen camino
Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);

var
  Fichero: File of byte;
  Buffer: array[0..21] of Char; // 22 bytes + 1
  Leidos: Integer;
  Str: string;
  b:byte;
  i:integer;
begin
i:=0;
  AssignFile(Fichero,'C:\Temp\SELE-SAL-CONSTA.tmp');
  Filemode:= fmOpenRead;
   Memory.Active:=true;
  {$I-}
    Reset(Fichero);// Reset(Fichero,1);
  {$I+}
  Timer1.Enabled:= true;
  if IOResult = 0 then
  begin

    while not  eof(Fichero) do
    begin
      FillChar(Buffer,Sizeof(Buffer),0);
      BlockRead(Fichero,Buffer,Sizeof(Buffer)-1,Leidos);
      read(fichero,b);
      if Leidos > 0 then
      begin
        Str:= String(PChar(@Buffer));
         i:=i+1;
         Label1.Caption:=inttostr(i);
        CargarGrilla(Str);
      end;
    end;
    Timer1.Enabled:=false;
    CloseFile(Fichero);
  end else
    ShowMessage('No puedo abrir el archivo');
end;

este es el codigo, el tema que tego que actualizar mi base con este txt, como me recomiendan que la cargue o donde, my base es sqlserver.
Gracias!!
Responder Con Cita
  #2  
Antiguo 07-07-2011
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 26
maeyanes Va por buen camino
Hola...

¿Es necesario que cargues la información en un grid?


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #3  
Antiguo 07-07-2011
pelikno pelikno is offline
Miembro
NULL
 
Registrado: oct 2010
Posts: 95
Poder: 16
pelikno Va por buen camino
Cita:
Empezado por maeyanes Ver Mensaje
Hola...

¿Es necesario que cargues la información en un grid?


Saludos...
No no solamente la ponia para ver como armaba el contenido ... y supongo que eso es lo que me tilda todo el sistema.
Responder Con Cita
  #4  
Antiguo 07-07-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola pelikno.

En el código que adjuntas (#14), para recorrer 100000 registros realiza 100000 ciclos de lectura, que es muchisimo mejor que el primer código que leia caracter a caracter(#8), ya que en ese caso eran 100000 x 22 lecturas. Pero creo que se puede optimizar mucho más el código de lectura en bloque.

No tengo acceso a los datos y puede que tengas que cambiar la cantidad de caracteres por registro o algún detalle que se me escape por no tener el archivo origen o el formato requerido.
Código Delphi [-]
...
const
  NCHAR = 22;
  LEER_X = 20000 ;
  TOT_BUFFER = LEER_X * NCHAR;

procedure TForm1.btnACDSClick(Sender: TObject);
var
  F: file of Char;
  Buf: array[1..TOT_BUFFER] of Char;
  c, rl: Integer;
  T1,T2: TTime;
  Ciclos: Integer;
begin
  AssignFile(F, 'C:\Archivo.txt');
  try
    Reset(file(F), 1);
    ClientDataSet.CreateDataSet;
    ClientDataSet.Open;
    ClientDataSet.DisableControls;
    T1:= Time;
    Ciclos:= 1;
    repeat
      BlockRead(file(F), Buf, SizeOf(Buf), rl);
      c:= 0;
      while c < TOT_BUFFER do
      begin
        if c mod 100 = 0 Then 
          ClientDataSet.MergeChangeLog;
        ClientDataSet.Append;
        ClientDataSetCuit.AsString:= Buf[c+1]+Buf[c+2]+Buf[c+3]+
            Buf[c+4]+Buf[c+5]+Buf[c+6]+Buf[c+7]+Buf[c+8]+Buf[c+9]+
            Buf[c+10]+Buf[c+11];
        ClientDataSetD1.AsString:= Buf[c+12]+Buf[c+13];
        ClientDataSetD2.AsString:= Buf[c+14]+Buf[c+15];
        ClientDataSetD3.AsString:= Buf[c+16]+Buf[c+17];
        ClientDataSetD4.AsString:= Buf[c+18];
        ClientDataSetD5.AsString:= Buf[c+19];
        Inc(c, NCHAR);
        ClientDataSet.Post;
      end;
      Inc(Ciclos);
    until rl = 0;
    CloseFile(F);
    T2:= Time;
    Caption:= FormatDateTime('hh:mm:ss:dd',T2-T1)+'  realizando '+IntToStr(Ciclos)+' ciclos.';
    ClientDataSet.EnableControls;
  except
    ShowMessage('Archivo inexistente');
  end;
end;
En este caso, con 100000 registros sólo realiza 7 ciclos en 00:00:05:30 (en mi equipo).

Como no tengo ni conozco el RxMemoryData, usé un TClientDataSet para la prueba. Lo único que tenés que hacer es crear los campos persistentes en él respetando los nombres y el código debería funcionarte.
Cualquier dificultad te adjunto el ejemplo con el generador de datos.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 07-07-2011 a las 22:46:54.
Responder Con Cita
  #5  
Antiguo 08-07-2011
pelikno pelikno is offline
Miembro
NULL
 
Registrado: oct 2010
Posts: 95
Poder: 16
pelikno Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Hola pelikno.

En el código que adjuntas (#14), para recorrer 100000 registros realiza 100000 ciclos de lectura, que es muchisimo mejor que el primer código que leia caracter a caracter(#8), ya que en ese caso eran 100000 x 22 lecturas. Pero creo que se puede optimizar mucho más el código de lectura en bloque.

No tengo acceso a los datos y puede que tengas que cambiar la cantidad de caracteres por registro o algún detalle que se me escape por no tener el archivo origen o el formato requerido.
Código Delphi [-]... const NCHAR = 22; LEER_X = 20000 ; TOT_BUFFER = LEER_X * NCHAR; procedure TForm1.btnACDSClick(Sender: TObject); var F: file of Char; Buf: array[1..TOT_BUFFER] of Char; c, rl: Integer; T1,T2: TTime; Ciclos: Integer; begin AssignFile(F, 'C:\Archivo.txt'); try Reset(file(F), 1); ClientDataSet.CreateDataSet; ClientDataSet.Open; ClientDataSet.DisableControls; T1:= Time; Ciclos:= 1; repeat BlockRead(file(F), Buf, SizeOf(Buf), rl); c:= 0; while c < TOT_BUFFER do begin if c mod 100 = 0 Then ClientDataSet.MergeChangeLog; ClientDataSet.Append; ClientDataSetCuit.AsString:= Buf[c+1]+Buf[c+2]+Buf[c+3]+ Buf[c+4]+Buf[c+5]+Buf[c+6]+Buf[c+7]+Buf[c+8]+Buf[c+9]+ Buf[c+10]+Buf[c+11]; ClientDataSetD1.AsString:= Buf[c+12]+Buf[c+13]; ClientDataSetD2.AsString:= Buf[c+14]+Buf[c+15]; ClientDataSetD3.AsString:= Buf[c+16]+Buf[c+17]; ClientDataSetD4.AsString:= Buf[c+18]; ClientDataSetD5.AsString:= Buf[c+19]; Inc(c, NCHAR); ClientDataSet.Post; end; Inc(Ciclos); until rl = 0; CloseFile(F); T2:= Time; Caption:= FormatDateTime('hh:mm:ss:dd',T2-T1)+' realizando '+IntToStr(Ciclos)+' ciclos.'; ClientDataSet.EnableControls; except ShowMessage('Archivo inexistente'); end; end;

En este caso, con 100000 registros sólo realiza 7 ciclos en 00:00:05:30 (en mi equipo).

Como no tengo ni conozco el RxMemoryData, usé un TClientDataSet para la prueba. Lo único que tenés que hacer es crear los campos persistentes en él respetando los nombres y el código debería funcionarte.
Cualquier dificultad te adjunto el ejemplo con el generador de datos.

Saludos.
Muchas Graciasecfisa por tomarte el tiempo de hacer el codigo mañana lo pruebo y veo que pasa.
SALUDOS!!!
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
ayuda copiar datos de una tabla a otra Rofocale Varios 1 18-05-2011 03:39:40
Ayuda insertar cadena en otra ? Coco_jac Varios 4 14-12-2005 21:37:46
necesito ayuda para pasar registros a otra tabla ddd_ddd Conexión con bases de datos 2 09-09-2005 20:33:41
ayuda para enlazar con otra tabla Debian Conexión con bases de datos 1 24-03-2005 16:48:28
Como puedo tabajar de otra forma un DBGrid, Ayuda urgente danytorres Varios 7 18-07-2003 21:24:02


La franja horaria es GMT +2. Ahora son las 21:07:20.


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