Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Listas enlazadas simples Ayuda! (https://www.clubdelphi.com/foros/showthread.php?t=75591)

juanch_mc 05-09-2011 06:59:49

Listas enlazadas simples Ayuda!
 
Buenas colegas!
Estoy teniendo problemas para idear un procedimiento, hace 2 días que vengo pensando como podría hacerlo, pero no he podido llegar a ningún resultado conciso. Si alguien me puede dar una mano se los agradecería muchisimo.

Paso a describir el problema: Necesito un procedimiento que recorra un registro denominado ME(metodo estructural) el cual a su vez esta compuesto de dos registros, uno de datos, y otro de control.
El registro de control guarda las posiciones: primero y ultimo (en una estructura de listas enlazadas.
El registro de datos guarda informacion sobre movimientos en cuentas bancarias, y se compone entre otros, por: numero de cuenta, fecha, haber, debe, saldo y enlace (del siguiente registro) siendo el saldo el resultado de: haber -(menos) debe.

En el ME (registro principal) se guardan muchos movimientos de cuentas, y lo que necesito hacer es recorrerlo por completo (de control.primero a control.ultimo) y listar el saldo de cada cuenta a una fecha Y ingresada por el usuario.

Por ejemplo: Movimientos de cuentas
Código:

Cuenta      fecha      haber    debe    saldo
00000        31/3      100          00            100
00011              31/3      000      100      -100
00000        2/4      000      50        50
00011        3/4      250      00        150

Si al procedimiento le ingreso la fecha 02/04, me deberia listar lo siguiente
Código:

Saldos a la fecha 02/04

  Cuenta      saldo
  00000          50
  00011        -100

Todo el recorrido lo debo realizar utilizando los enlaces de cada registro.

Hasta ahora lo que tengo en mente es:
Código Delphi [-]
  if (not estructura_vacia(me)) then
  begin
    seek(me.c,0);
    read(me.c,RC); //RC= registro control auxiliar
    pos:= RC.primero;
    saldo:=0;
    while(rd.enlace <> null);  // cuando el enlace es "null" se trata del ultimo
    begin
      seek(me.d,pos);
      read(me.d, RD); //RD= registro de datos auxiliar
      cuenta:=rd.cuenta;
      while (cuenta=rd.cuenta) do
      begin
         //...... y ahí me quedo....
Estoy trabado cuando tengo que comprobar si hay mas registros con el mismo numero de cuenta y que la fecha de operacion sea menor o igual a la que ingresa el usuario....

Desde ya muchas gracias!!!! :)

ecfisa 05-09-2011 10:18:20

Hola juanch_mc y bienvenido a los foros de Club Delphi.:)

No termino de entender como es la organización de los datos.
Sería bueno si nos pones el código con las definiciónes de me, md y rc, así como las relaciones que entre ellos debe existir y el lugar donde se almancenarán.
Por ejemplo, pareciera que me es un archivo tipado, ya que usas los procedimientos Seek y Read para posicionarte y leer respectivamente.

En definitiva, creo que tendrías que agregarnos más detalles para que podamos entender el problema con más claridad y así poder ayudarte.

Un saludo.

juanch_mc 05-09-2011 20:32:56

Código Delphi [-]
tiporegdat= record
              clave:tipo_clave;
              id_cuenta:string[10];
              fecha_oper:string[10];
              fecha_asiento:string[10];
              hora_asiento:string[13];
              tipo_op:string[2];
              descripcion:string[25];
              debe:real;
              haber:real;
              saldo:real;
              enlace:tipo_enlace;
             end;

tiporegdatX= record
              clave:tipo_clave;
              id_cuenta:string[10];
              fecha_oper:string[10];
              fecha_asiento:string[10];
              hora_asiento:string[13];
              tipo_op:string[2];
              descripcion:string[25];
              debe:real;
              haber:real;
              saldo:real;
              enlace:tipo_enlace;
             end;

tiporegcontrol= record
                  cont_operac:integer;
                  primero:tipo_pos;
                  ultimo:tipo_pos;
                  borrados:tipo_pos;
                end;

tiporegcontrolX= record
                  cont_operac:integer;
                  primero:tipo_pos;
                  ultimo:tipo_pos;
                  borrados:tipo_pos;
                end;

archdat= file of tiporegdat;
archcontrol= file of tiporegcontrol;
archdatx= file of tiporegdatx;
archcontrolx= file of tiporegcontrolx;

tipo_ME= record
           D:archdat;
           C:archcontrol;
         end;

tipo_MEAUX=record
              DX:archdatx;
              CX:archcontrolx;
            end;

Este es el procedimiento que tengo hasta ahora:

Código Delphi [-]
Procedure Saldos_afecha(var me:tipo_me; var meX:tipo_meaux; fecha:string);
var
  RD, RAUX, R_AUX_2:tiporegdat;
  RC:tiporegcontrol;
  RDAUX:tiporegdatx;
  pos:tipo_pos;
  saldo:real;
  cuenta:string;

  begin
     if (not estructura_vacia(me))
     then
        begin
          seek(me.C,0);
          read(me.C,RC);
          pos:=RC.primero;
          saldo:=0;
          while (pos<>null) do
          begin
              seek(me.D,pos);
              read(me.D,RD);
              if (RD.fecha_oper<=fecha)
              then
                begin
                  cuenta:=RD.id_cuenta;
                  seek(me.D,rd.enlace);
                  read(me.d,RAUX);
                  saldo:=saldo+(rd.haber-rd.debe);
                  if (rd.id_cuenta=RAUX.id_cuenta)
                  then
                    begin
                      while (RD.id_cuenta=RAUX.id_cuenta) do
                        if (RAUX.fecha_oper<=fecha)
                        then
                          begin
                            saldo:=saldo+(RAUX.haber-RAUX.debe);
                            seek(me.D,RAUX.enlace);
                            read(me.D,RAUX);
                          end;
                      RDAUX.id_cuenta:=RD.id_cuenta;
                      RDAUX.saldo:=saldo;
                      insertarX(meX,RDAUX);
                    end
                  else
                    begin
                      RDAUX.id_cuenta:=RD.id_cuenta;
                      RDAUX.saldo:=saldo;
                      insertarX(meX,RDAUX);
                      seek(me.D,RDAUX.enlace);
                      read(me.D,RD);
                    end;
                end //if (RD.fecha_oper<=fecha)
              else
                begin
                   seek(me.D,rd.enlace);
                   read(me.D,RD);
                end;
          end // del while (pos<>null) do
        end //del estructura vacia
     else
       showmessage('LA ESTRUCTURA ESTA VACIA');
  END;
Recién lo termino de tipear, tengo que probarlo, pero se los dejo a ver si alguien le encuentra algún error (seguro hay miles).

Espero que la info que agregue mas arriba sea de ayuda para entenderlo.

Muchas gracias!!!:):):):)


La franja horaria es GMT +2. Ahora son las 03:57:47.

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