Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-05-2012
IVAND IVAND is offline
Miembro
 
Registrado: May 2003
Ubicación: ECUADOR
Posts: 398
Poder: 16
IVAND Va por buen camino
Recorrer una Dataset hacia atras

Hola a todos

Estoy tratando de hacer algo q un cliente me pidio con un tema contable , les explico , tengo uno balance que obviamente tiene
codigo , nombre , debe ,haber y proviene este de un plan de cuentas , hasta aqui todo esta bien hay un SP que se encarga de sacar algo como esto

Código Delphi [-]
codigo     nombre           debe  haber saldo
1            Activo                 0       0        0
1.1         Activo corr           0       0        0
1.1.1      Caja                    0       0        0 
1.1.1.01  Caja General       120    30       90
2.          Pasivo                  0      0        0
2.1.       Pasivo corriente      0     0        0
2.1.1     Lo que sea           80   120     - 40

Pues bien , la idea es barrer desde abajo hasta arriba la tabla o el datased , y usar un bucle para recorrer todo el dato completo

La idea se resume a

con dataset.last me pongo en el ultimo registro , pero que ciclo uso para que el registro vaya desde abajo hasta arriba , la idea es ir acumulando los valores ejemplo la 2.1.1 acumulara 2.1 y esta en la 2 , seguira con la 1.1.1.01 que acumula a la 1.1.1 y esta 1.1 y esta 1

adjunto el proyecto a ver si me pueden dar la mano un abrazo

Pues no me deja adjuntar archivo

colocare parte del codigo
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  x,I, nume: Integer;
  J: string;
  Saldo: Real;
begin
//Recorremos de atras para adelante el bucle

rx.Last;

//for i := 0 to Rx.RecordCount - 1 do
  while rx.Eof do
  begin
    nume := Length(Trim(rx.fieldByname('codigo').value));
    saldo := Saldo + Rx.FieldByName('Saldo').Value;
    for X := Nume - 1 downto 1 do
    begin
       //Enceramos cuando llegamos al principio
      if x = 0 then
        Saldo := 0;
      J := Copy(Trim(rx.fieldByname('codigo').value), 1, X);
      if rx.Locate('codigo', j, []) then
      begin
        saldo := Saldo + Rx.FieldByName('Saldo').Value;
        Rx.Edit;
        Rx.FieldByName('Saldo').Value := saldo;
        rx.Post;
      end;
    end;
    next;
  end
end;
__________________
IVAND
Responder Con Cita
  #2  
Antiguo 14-05-2012
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: May 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Tienes que utilizar Bof en vez de Eof y además Prior.


Código Delphi [-]
While Not dmXXX.Bof do
begin
xxxxxx
Dmxx.Prior
end;
Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 15-05-2012
IVAND IVAND is offline
Miembro
 
Registrado: May 2003
Ubicación: ECUADOR
Posts: 398
Poder: 16
IVAND Va por buen camino
Gracias Marcos por tu respuesta, funciona perfecto , pero cuando el locate salta y encuentra el registro se sale del bucle , se puede guardar una posicion dentro de la busqueda y luego volver a esa posicion despues del locate ?

Código Delphi [-]
rx.Last;
While Not rx.Bof do
  begin
    nume := Length(Trim(rx.fieldByname('codigo').value));
    saldo := Saldo + Rx.FieldByName('Saldo').Value;
        rx1.insert;
        rx1.fieldbyname('codigo').value:=rx.fieldByname('codigo').value;
        rx1.post;

    for X := Nume - 1 downto 1 do   //Paso 2 
    begin
       //Enceramos cuando llegamos al principio
      if x = 0 then
        Saldo := 0;
      J := Copy(Trim(rx.fieldByname('codigo').value), 1, X);
      if rx.Locate('codigo', j, []) then
      begin
        saldo := Saldo + Rx.FieldByName('Saldo').Value;
        Rx.Edit;
        Rx.FieldByName('Saldo').Value := saldo;
        rx.Post;
      end;
    end;
    Rx.prior; //Tomaria un registro y subiria al proximo en el paso 2 y asi sucesivamente 
  end;


Gracias por sus comentarios
__________________
IVAND

Última edición por IVAND fecha: 15-05-2012 a las 06:17:23. Razón: Error al escribir sin probar
Responder Con Cita
  #4  
Antiguo 15-05-2012
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: May 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Para volver a una posición dentro de un Dataset puedes utilizar un BookMark.

Ejemplo de uso.

Código Delphi [-]
procedure TfrPVP.spbCambiarClick(Sender: TObject);
var
s1,s2:String;
begin
  Try
  s1:=DmPrix.IBDtsProveeCODIGO.Value;
  s2:=Copy(DmPrix.IBDtsPVPCODIGO.Value,4,7);
  DmPrix.IbDtsPVP.Edit;
  DmPrix.IBDtsPVPCODIGO.Value:=s1+s2;
  EdProvee.Text:=DmPrix.IBDtsProveeNOMBRE.Value;
  
  spbCambiar.Visible:=False;
  Donde:=DmPrix.IBDtsPVP.GetBookmark;
  Actualizar_Codigo_Proveedor();
  ShowMessage('Atención:El código de Proveedor se cambio con éxito.');
  Except
  ShowMessage('Atención: Se produjo un error al intentar cambiar el Código del Proveedor del producto.');
  end;
DmPrix.IBDtsPVP.Open;
DmPrix.IBDtsPVP.GotoBookmark(donde);
end;
Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #5  
Antiguo 15-05-2012
IVAND IVAND is offline
Miembro
 
Registrado: May 2003
Ubicación: ECUADOR
Posts: 398
Poder: 16
IVAND Va por buen camino
Gracias muy amable por tu tiempo

ya esta listo lo que queria gracias a todos
__________________
IVAND
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
Copiar el contenido de un DataSet a otro DataSet Javi2 Varios 61 24-11-2017 20:11:04
Delphi XE: Al comprar usa legalmente versiones hacia atras hasta D7 mamcx Noticias 6 10-09-2010 01:58:17
cronometro hacia atras kurono Varios 3 22-12-2008 18:05:47
Recorrer fichero txt y almacenarlo en un DataSet mamen .NET 2 24-04-2006 19:27:33
for contando hacia atras Duc OOP 7 20-07-2005 10:23:13


La franja horaria es GMT +2. Ahora son las 20:48:39.


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