• Jueves 28 de Marzo de 2024, 13:55

Autor Tema:  Secuencial Indexado  (Leído 5207 veces)

grandzam

  • Miembro MUY activo
  • ***
  • Mensajes: 118
    • Ver Perfil
Secuencial Indexado
« en: Lunes 9 de Mayo de 2005, 01:10 »
0
Primeramente buenos dias...
Ahora mi problema es el siguiente:

Hice un sistema de cheques con archivos de texto (secuencial) con proceso BATCH, ahora, el profesor quiere que lo reutilicemos convirtiéndolo en secuencial indexado, el problema es que segun eso, quiere que el indice debe llevar un campo llave y un numero de bloque, entonces cuando encontremos la clave nos tenemos que ir directamente al bloque que nos indica el indice y entonces:

1. Para utilizar un factor de bloqueaje no podemos utilizar blockread ya que solo funciona para archivos sin tipo.
2. No sé como hacer para irme directamente al bloque que se me indica, como le hago para que si el indice me dice que la clave esta en el bloque 3, el arreglo tome directamente el bloque 3...

Por favor ayudenme....

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Secuencial Indexado
« Respuesta #1 en: Martes 10 de Mayo de 2005, 03:24 »
0
¿Si o si tienes que usar archivos sin tipo?
¿No puedes tener por ejemplo un archivo de tipo?
Código: Text
  1.  
  2.   MyFile: file of TType;
  3.  
  4.  
Para desplazarte en archivos con tipo puedes usar el Seek
Citar
procedure Seek(var F; N: Longint)

No se si a eso te refires, es que no entendi mucho lo que planteas. :lightsabre:

grandzam

  • Miembro MUY activo
  • ***
  • Mensajes: 118
    • Ver Perfil
Re: Secuencial Indexado
« Respuesta #2 en: Martes 10 de Mayo de 2005, 07:47 »
0
Bueno si, de hecho, el proceso BATCH es primero hacer capturas en un programa y me refiero a altas, bajas, modificaciones, etc, pero sin tocar al archivo maestro, luego en otro programa, se suben todos las altas al archivo maestro, luego, se toman las bajas y se busca la clave que se desea dar de baja y se elimina fisicamente del archivo maestro, esto se hace, primero, guardando todos los registros anteriores al que se va a eliminar en un archivo temporal, y todos los registros posteriores, luego se reescribe el archivo maestro y se pegan los dos archivos temporales... para modificar pues es casi lo mismo, solo que se modifica el campo que se desea y luego se saca el registro, se hace lo que en eliminacion y al final el registro se escribe al final del archivo maestro... y bueno ese es el PROCESO BATCH, ahora, mi problema era que, el el programa de actualizacion, tenía que crear un archivo indice en el que tuviera una clave y el número de bloque en el que estaba, osea, no directamente, si no que por ejemplo tenía:


03450731 y lo buscamos en el
Archivo indice

03450731  1
03450779  2
03450696  1

eso significaba que la primera y la tercer clave la tenía en el primer bloque, y la segunda en el segundo bloque... ahora, tenía que irme directamente a un bloque específico para buscar la clave solo en ese bloque, y ese era el problema, como irme a un bloque específico de un archivo... tenía primero, que cargar dicho bloque en memoria (en un arreglo) y ahi empezar a buscar la clave, he ahí el gran dilema, el primer programa no lo toque lo dejé como file of, pero en el segundo de actualizacion tuve que manejarlo como file para usar blockread, el cual lleva como parámetros, el archivo, el buffer, el numero de registros que se desean leer, y finalmente una variable que me regresa el número de registros que leyó... y ese era el gran problema porque en el arreglo o buffer me metía los registros que eran pero aparte e metía un chorro de basura, y me regresaba que habia leído 20040 y cosas asi, cuando debía leer 3 o 4 registros...

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Secuencial Indexado
« Respuesta #3 en: Martes 10 de Mayo de 2005, 22:39 »
0
Se ve que esta complicado.
Por lo general se suele usar un  file of TAlgo.

Considera este ejemplo:
Código: Text
  1.  
  2. type
  3.   TPersona = record
  4.     Nombre: string[64];
  5.     Edad: Byte;
  6.   end;
  7. var
  8.   F: file of TPersona;
  9.   Persona: TPersona;
  10.   Size: LongInt;
  11.   Pos: LongInt;
  12.  
  13. BEGIN
  14.   {Lee todo el archivo}
  15.   Size := FileSize(F);
  16.   while not EOF(F) do
  17.   begin
  18.     ReadLn(F, Persona);
  19.     Pos :=  FilePos(F);
  20.     WriteLn('Registro N: ', Pos, ' Nombre: ', Persona.Nombre, ' Edad: ', Persona.Edad);
  21.   end;
  22.  
  23.   {Se posiciona en la mitad del archivo y lee el registro}  
  24.   Seek(F, Size div 2);
  25.   ReadLn(F, Persona);
  26.   Pos :=  FilePos(F);
  27.   WriteLn('Registro N: ', Pos, ' Nombre: ', Persona.Nombre, ' Edad: ', Persona.Edad);
  28.  
  29.   {pide una posicion y va ahi y lee}
  30.   Write('Ingrese posicion: ');
  31.   ReadLn(Pos);
  32.   Seek(F, Size div 2);
  33.   ReadLn(F, Persona);
  34.   WriteLn('Registro N: ', Pos, ' Nombre: ', Persona.Nombre, ' Edad: ', Persona.Edad);
  35. END.
  36.  
  37.  

Como es un archivo con tipo, se puede posicionarse en cualquier lugar usando Seek y se puede saber la posicion actual usando FilePos y el tama;o con FileSize;

Estoy casi seguro que con archivos sin tipo no funciona eso.

 :( Creo que vas a tener que cambiar algo de tu codigo no?

PD> El ejemplo no es un codigo completo. Le falta asignacion del archivo entre otras cosas que estoy seguro que no vienen al caso.