Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Recorrer Una Tabla O Dbgrid Para Validar Datos (https://www.clubdelphi.com/foros/showthread.php?t=74911)

donpedro 18-07-2011 02:10:02

Recorrer Una Tabla O Dbgrid Para Validar Datos
 
Hola soy nuevo aqui en el foro, espero que me ayuden con una duda que tengo:

Estoy haciendo un sistema para un colegio en Delphi con MySql y estoy frenado con el modulo de facturacion, me explico:
Cuando inscribo un estudiante el sistema me le genera los cargos educativos automaticamente.....y cuando voy al modulo de facturacion y llamo a dicho estudiante me tira los 11 cargos en un dbgrid ejemplo:
cargoid-------------Descripcion------------Valor
001.......................Inscripcion.................1000
002.......................mes1.........................800
003.......................mes2.........................800

Dentro del formulario tengo un Edit llamado MONTOAPAGAR..entonces si el estudiante paga 1000 cuando le de a guardar me tiene que poner e valor del primer cargo en CERO. ahora, si el desea pagar 1600 cuando le de a guardar el sistema me tiene que poner el valor del primer cargo en CERO yel valor del segundo cargo en DOSCIENTOS..........NO SE SI ME DI A ENTENDER

osea si el monto a pagar es mayor que el valor del primer cargo que lo reste y que vaya al otro registro y reste dicho valor con el valor que quedo en la primera operacion.

Casimiro Noteví 18-07-2011 11:13:34

Estas cosas no se suelen hacer así, se tiene otra tabla con los pagos.
Por ejemplo:
alumno----fecha-----pago---
1_____01.01.2011__1600
1_____01.02.2011___500
2_____03.01.2011__1000
3_____06.02.2011__2000
1_____04.03.2011___250

Entonces haces una suma de lo que debe pagar el alumno y una suma de esta tabla con los pagos que ha hecho, la diferencia es lo que debe.

newtron 18-07-2011 11:48:45

Cita:

Empezado por Casimiro Notevi (Mensaje 406678)
Estas cosas no se suelen hacer así, se tiene otra tabla con los pagos.
Por ejemplo:
alumno----fecha-----pago---
1_____01.01.2011__1600
1_____01.02.2011___500
2_____03.01.2011__1000
3_____06.02.2011__2000
1_____04.03.2011___250

Entonces haces una suma de lo que debe pagar el alumno y una suma de esta tabla con los pagos que ha hecho, la diferencia es lo que debe.

Cierto pero hay veces que se quiere ir saldando por documentos para en un momento dado poder decirle al deudor qué documentos debe como información complementaria al saldo. Para eso aparte de la nueva tabla que comentas lo que haría sería crear un par de campos nuevos en la tabla original que mantuvieran el importe pagado sobre el documento y el importe pendiente.

Código:

cargoid-------------Descripcion------------Valor----Pagado-Pendiente
001.......................Inscripcion.................1000..............1000............0
002.......................mes1.........................800..................200........600
003.......................mes2.........................800......................0............0

Para esto cada documento de cargo tendría que tener un número distinto de los demás para poder mantener toda la información de forma coherente y el tema de estos acumulados actualizarlos mediante los triggers de la base de datos.

Saludos

Casimiro Noteví 18-07-2011 12:16:56

Por supuesto, era sólo por darle una idea a donpedro que hay que controlar todo ese asunto porque de la forma en que lo tiene pensado cada vez que alguien paga una factura ya no puede saber jamás cuánto pagó ni cuánto debía, ya que todo estará a cero.

donpedro 18-07-2011 14:24:58

Me Explico...
 
Entiendo lo que dicen..quiero confirmar que tengo dos tablas mas donde me guarda lo que va pagando junto con el numero de factura. Lo que me interesa saber es.....

Como puedo hacer para que cuando el estudiante pague 1600 me le ponga cero al primer cargo y siga verificando la siguiente fila y le vaya restando... porque Lo demas lo tengo.. tengo un campo pendiente y todo lo demas.

Casimiro Noteví 18-07-2011 14:29:19

De momento, amigo, revisa nuestra guía de estilo, no escribas todo en mayúsculas, eso en internet representa GRITAR.

donpedro 18-07-2011 15:10:55

me disculpo. ya lei la guia de estilo.

estoy utilizando el siguiente codigo pero no me ha dado resultado, porque la parte para cuando el monto que pague el estudiante sea mayor que el valor no se como manejarlo:
Código Delphi [-]
     var a,b,res,x:integer;
begin
     a:=strtoint(emontoapagar.text);
     b:=strtoint(dmdatos.aqfacturadvalor.asstring);

     dmdatos.aqfacturad.first;

//esto es para cuando el monto que va a pagar sea menor o igual al valor del primer cargo

      while not dmdatos.aqfacturad.eof do
begin
      if (b > 0) and (a < b) or (a = b) then
begin
      dmdatos.aqfacturad.edit;
      res:=b-a;
      dmdatos.aqfacturadvalor.asstring:=inttostr(res);
      dmdatos.aqfacturad.post;
break;
      dmdatos.aqfacturad.next;
end;

Caro 18-07-2011 16:52:19

Cita:

Empezado por donpedro (Mensaje 406701)
estoy utilizando el siguiente codigo pero no me ha dado resultado, porque la parte para cuando el monto que pague el estudiante sea mayor que el valor no se como manejarlo:


Hola donpedro, puedes hacer algo como esto:

Código Delphi [-]
var
 flg : boolean;
 a,b,res,x, Valor:integer;
begin
  a:=strtoint(emontoapagar.text);
  flg := False;
  With dmdatos do
  begin
   aqfacturad.first;
    While not aqfacturad.eof do
     begin
      b:=strtoint(aqfacturadvalor.asstring);
      if (a > b) then
       Valor := 0
      else
       if a>0 then
        begin
         Valor := b-a;
         flg := True;
        end;
      a := a-b;
      aqfacturad.edit;
      aqfacturadvalor.asstring:=Valor;
      aqfacturad.post;
      if Not flg then
       aqfacturad.next
      else
       break;
     end;
  end;

Saluditos

donpedro 18-07-2011 17:12:52

Cita:

Empezado por Caro (Mensaje 406714)
Hola donpedro, puedes hacer algo como esto:

Código Delphi [-]
var
 flg : boolean;
 a,b,res,x, Valor:integer;
begin
  a:=strtoint(emontoapagar.text);
  flg := False;
  With dmdatos do
  begin
   aqfacturad.first;
    While not aqfacturad.eof do
     begin
      b:=strtoint(aqfacturadvalor.asstring);
      if (a > b) then
       Valor := 0
      else
       if a>0 then
        begin
         Valor := b-a;
         flg := True;
        end;
      a := a-b;
      aqfacturad.edit;
      aqfacturadvalor.asstring:=Valor;
      aqfacturad.post;
      if Not flg then
       aqfacturad.next
      else
       break;
     end;
  end;

Saluditos

Muchas gracias caro gran parte de mi duda ese codigo lo resuelve, solo falta algo me explico.

si introduzco 1500 el me coloca el primer cargo en cero y el segundo en 300 ya que el resto los 500 que sobraron al siguiente cargo....ahora:

si vuelvo y busco al estudiante para realizar otro pago el sistema no reconoce que el primer cargo esta en cero y me da el siguiente error:

no se puede encontrar la fila para su actualizacion: algunos valores han cambiado desde la ultima vez que se leyo.

tendria que colocar una condicion para identificar que si b = 0 que vaya al siguiente registro.

Gracias, Dios te bendiga

Caro 18-07-2011 17:26:37

Cita:

Empezado por donpedro (Mensaje 406719)
tendria que colocar una condicion para identificar que si b = 0 que vaya al siguiente registro.

Hola de nuevo, si tendrías que colocar esa condición para que no tome los que ya tienen valor 0.

Código Delphi [-]
   aqfacturad.first;
   While not aqfacturad.eof do
    begin
     b:=strtoint(aqfacturadvalor.asstring);
     if b>0 then
     begin 
      if (a > b) then
       Valor := 0
      else
        .......................
        ......................... 
      a := a-b;
      aqfacturad.edit;
      aqfacturadvalor.asstring:=Valor;
      aqfacturad.post;
     end;
     if Not flg then
      aqfacturad.next
     else
      break;
    end;

otra forma para no hacer tantas condiciones, es hacer una consulta que te traiga los registros que sumen el monto a pagar sin tomar en cuenta los que tengan valor 0, así solo recorres esos registros haces el update y tendrias solo dos condiciones.

Saluditos

donpedro 18-07-2011 17:33:06

Mil gracias caro

tu ayuda fue de muy buena utilidad, espero tambien poder compartir parte de mis conocimientos para ayudar a otros, de la misma forma que me ayudaste.

Saluditos...


La franja horaria es GMT +2. Ahora son las 00:37:11.

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