Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Tablas planas
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-08-2014
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 tarco35.

Una opción que te puede servir es usar archivos de acceso aleatorio, por ejemplo:
Código Delphi [-]
type
 TRegGrafica = packed record
  Valores : array [0..64,0..1500] of Real;
  Numero_Valores : array [0..64] of Integer;
  NumeroLectura : LongInt;
 end;
 TFileRegGrafica = file of TRegGrafica;

var
  Reg: TRegGrafica;
  FileReg: TFileRegGrafica;
Este tipo de tratamiento, te permite acceder de forma directa, tanto en lectura como en escritura, a los registros en disco:
Código Delphi [-]
  Seek(FileReg, 15); // posicion 15
  Read(FileReg, Reg); // o Write(FileReg, Reg);

Es más, gracias a un pequeño truco con moldeos podes usar un arreglo de registros para acceder a bloques de registros en un sólo acceso a disco:
Código Delphi [-]
var
  VecRec: array[0..50] of TRegGrafica;
begin
  (* se supone que el arreglo tiene los datos *)

  // guarda 50 registros en un solo acceso a disco
  BlockWrite(file(FileReg), Reg, 49); 

  // lee los primeros 50 registros en un solo acceso a disco
  Seek(FileReg, 0);
  BlockRead(file(FileReg), Reg, 49);
Y dado que los accesos a disco son una de las taréas más lentas, brinda una gran ganancia de velocidad. Una vez cargado el arreglo podes manejar todo desde memoria.

Si tenes dificultad para implementarlo, comentame y te preparo/adjunto un código demo.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #2  
Antiguo 26-08-2014
tarco35 tarco35 is offline
Miembro
 
Registrado: sep 2003
Posts: 210
Poder: 23
tarco35 Va por buen camino
Thumbs up

Muchas gracias.... lo probare y si no me sale bien ya te pregunto

un saludo
Responder Con Cita
  #3  
Antiguo 03-09-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 23
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
tarco35,

Cita:
Empezado por ecfisa
...podes usar un arreglo de registros para acceder a bloques de registros en un sólo acceso a disco...


Revisa este código:
Código Delphi [-]
 unit Unit1;
 
 interface
 
 uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls;
 
 type
   TForm1 = class(TForm)
     ListBox1: TListBox;
     Button1: TButton;
     Button2: TButton;
     Button3: TButton;
     Button4: TButton;
     procedure FormCreate(Sender: TObject);
     procedure Button1Click(Sender: TObject);
     procedure Button2Click(Sender: TObject);
     procedure Button3Click(Sender: TObject);
     procedure Button4Click(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
   end;
 
   TData = record
      Name : Array[0..29] of Char;
      PIN : Integer;
      DateData : TDateTime;
   end;
 
 const
   CountReg = 1000;
 
 var
   Form1: TForm1;
   ArrayData : Array[0..CountReg-1] of TData;
   FileData : File of TData;
   FileName : String;
 
 implementation
 
 {$R *.dfm}
 
 // Inicializa la Aplicación
 procedure TForm1.FormCreate(Sender: TObject);
 begin
    Randomize;
    FileName := ExtractFilePath(Application.ExeName) + 'Data.txt';
 end;
 
 // Genera un Arreglo de Registros de 1000 Elementos
 procedure TForm1.Button1Click(Sender: TObject);
 var
    i : Integer;
 begin
    FillChar(ArrayData,Length(ArrayData),0);
    for i := 0 to CountReg - 1 do
    begin
       StrPCopy(ArrayData[i].Name,'Name-' + IntToStr(i));
       ArrayData[i].PIN := Random(1000);
       ArrayData[i].DateData := Now + Random(365);
    end;
 end;
 
 // Graba 1000 Registros en una Sola Operación de Acceso a Disco
 procedure TForm1.Button2Click(Sender: TObject);
 begin
    AssignFile(FileData, FileName);
    Rewrite(FileData);
    BlockWrite(FileData, ArrayData, CountReg);
    CloseFile(FileData);
 end;
 
 // Lee 1000 Registros en una Sola Operación de Acceso a Disco y los Muestra en un ListBox
 procedure TForm1.Button3Click(Sender: TObject);
 var
    i : Integer;
 begin
    FillChar(ArrayData,SizeOf(ArrayData),0);
    AssignFile(FileData, FileName);
    Reset(FileData);
    Seek(FileData, 0);
    BlockRead(FileData, ArrayData, CountReg);
    for i := 0 to CountReg - 1 do
    begin
       ListBox1.Items.Add(ArrayData[i].Name
                          + ' '
                          + IntToStr(ArrayData[i].PIN)
                          + ' '
                          + DateTimeToStr(ArrayData[i].DateData));
    end;
    CloseFile(FileData);
 end;
 
 // Clear el ListBox de Registros
 procedure TForm1.Button4Click(Sender: TObject);
 begin
    ListBox1.Clear;
 end;
 
 end.
El código anterior en Delphi 7 bajo Windows 7 Professional x32, permite leer y grabar bloques de registros de un archivo en una sola operación de acceso a disco.

Nota: Excelente técnica ecfisa

Espero sea útil

Nelson.
Responder Con Cita
  #4  
Antiguo 04-09-2014
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 nlsgarcia.

Es un resabio del viejo Turbo Pascal... , con Delphi ya podemos hacer:
Código Delphi [-]
...
const
  MAXDATA = 100;

type
  TReg = packed record
    dato: string[20];
    posi: integer;
  end;
  TFileReg = file of TReg;

var
  fr: TFileReg;
  rg: TReg;
  vr: array[0..MAXDATA] of TReg;
  FName: string;

// inicializar
procedure TForm1.FormCreate(Sender: TObject);
begin
  FName:= ExtractFilePath(Application.ExeName) + 'prueba.dat';
  AssignFile(fr, FName);
  try
    Reset(fr);
  except
    Rewrite(fr);
  end;
  CloseFile(fr);
  Randomize;
end;

// guardar
procedure TForm1.btnWriteClick(Sender: TObject);
var
  i: Integer;
begin
  // algunos datos...
  for i:= 0 to MAXDATA-1 do
  begin
    vr[i].dato:= Format('Registro %d',[i+1]);
    vr[i].posi:= i;
  end;

  // guardar 
  with TFileStream.Create(FName, fmOpenWrite) do
  try
    Position:= 0;
    Write(vr, MAXDATA * SizeOf(rg));
  finally
    Free;
  end;
end;

// leer
procedure TForm1.btnReadClick(Sender: TObject);
begin
  with TFileStream.Create(FName, fmOpenRead) do
  try
    Position:= 0;
    Read(vr, MAXDATA * SizeOf(rg));
  finally
    Free;
  end;
end;

// mostrar
procedure TForm1.btnShowClick(Sender: TObject);
var
  i: Integer;
begin
  with ListBox1.Items do
  begin
    Clear;
    for i:= 0 to MAXDATA-1 do
      Add(Format('%s %d',[vr[i].dato, vr[i].posi]));
  end;
end;
con el mismo resultado.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 05-09-2014
tarco35 tarco35 is offline
Miembro
 
Registrado: sep 2003
Posts: 210
Poder: 23
tarco35 Va por buen camino
Muchas gracias.... con esto y creando un fichero indice que me indique en que posición esta para poder hacer un acceso directamente a la posición de lo que quiero leer o modificar.
Pero si quiero añadir, como tendría que hacerlo?... un seek al final de fichero??? o como.

Gracias por su ayuda.
Responder Con Cita
  #6  
Antiguo 05-09-2014
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 tarco35.
Cita:
Empezado por tarco35 Ver Mensaje
...
Pero si quiero añadir, como tendría que hacerlo?... un seek al final de fichero??? o como.
Exáctamente, posicionándote al final del archivo.

Agregar un registro:
Código Delphi [-]
  Seek(FileReg, FileSize(FileReg));
  Write(FileReg, Reg);

Leer último registro:
Código Delphi [-]
  Seek(FileReg, FileSize(FileReg)-1);
  Read(FileReg, Reg);

Mostrar posición del registro actual:
Código Delphi [-]
  ShowMessage(Format('Posición actual en el archivo: %d', [FilePos(FileReg)]));

Saludos
__________________
Daniel Didriksen

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

Última edición por ecfisa fecha: 05-09-2014 a las 21:27:45.
Responder Con Cita
  #7  
Antiguo 06-09-2014
tarco35 tarco35 is offline
Miembro
 
Registrado: sep 2003
Posts: 210
Poder: 23
tarco35 Va por buen camino
gracias....
Responder Con Cita
Respuesta



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
Importar estructura de tablas paradox en Firebird Matorral Firebird e Interbase 2 23-12-2010 12:43:03
Copiar la estructura de paradox a mysql seoane MySQL 6 18-02-2008 23:25:33
Obtener estructura de Tablas Paradox Coco_jac Varios 6 09-02-2007 05:14:59
Copiar estructura Paradox ? Coco_jac Varios 5 07-12-2005 16:31:11
Comparar estructura tablas paradox Joana Tablas planas 0 14-05-2004 10:47:26


La franja horaria es GMT +2. Ahora son las 13:21:39.


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