Ir al contenido


Foto

Distribuir el monto aplicado a varias facturas...

Delphi Base de Datos

  • Por favor identifícate para responder
8 respuestas en este tema

#1 jorgebq77

jorgebq77

    Member

  • Miembros
  • PipPip
  • 11 mensajes

Escrito 31 julio 2022 - 09:19

Saludos amigos del foro,

 

Acabo de elaborar una pantalla de pagos de facturas para un punto de venta que me pidió un amigo cercano. Ya termine el método para aplicar el pago a varias facturas a la vez, pero NO ESTOY CONFORME con el código que hice para hacer dicha tarea. Por lo tanto, necesito que por favor me ayuden a elaborar un código mas optimizado ó mas entendible para distribuir el monto a pagar a varias facturas.

 

Si no saben o no entienden a que me refiero les dejo un link de un video en YouTube que expone exactamente lo que quiero hacer: https://www.youtube....h?v=ySPtVuV12lY  para hacer mas exacto adelanten el video hacia el minuto 1:50, si quieren verlo completo eso es opción de ustedes  ;)  ;)  ;)

 

El código que hice para aplicar el pago es este :


delphi
  1. //AQUI SE DISTRIBUYE EL MONTO APLICADO A TODAS LAS FACTURAS...
  2. procedure TForm1.EdMontoChange(Sender: TObject);
  3. var
  4. ConceptoPago, ConceptoAbono, ValorEncontrado : string;
  5. MontoApagar : Currency;
  6. begin
  7. MontoApagar := EdMonto.Value; //EN ESTE TEDIT LLAMADO "EdMonto" CAPTURO EL MONTO QUE SE APLICARA A LAS FACTURAS
  8. ConceptoPago := ''; //Estas variables las uso para armar el concepto de pago
  9. ConceptoAbono := '';
  10. EdConcepto.Text := ''; //EN ESTE TEDIT MUESTRO EL CONCEPTO DE PAGO
  11. ValorEncontrado := '';
  12.  
  13. TbFacturas.First;
  14. while not TbFacturas.Eof do
  15. begin
  16. TbFacturas.Edit;
  17. TbFacturas.FieldByName('MontoApagar').AsFloat := 0.00;
  18. if EdMonto.Value = TbFacturas.FieldByName('MontoPendiente').AsFloat then
  19. begin
  20. TbFacturas.FieldByName('MontoApagar').AsFloat := EdMonto.Value;
  21. ValorEncontrado := 'SI';
  22. ConceptoPago := 'Saldo Factura Nro. ' + IntToStr(TbFacturas.FieldByName('NroFactura').AsInteger);
  23. Break;
  24. end;
  25.  
  26. TbFacturas.Next;
  27. end;
  28.  
  29. if ValorEncontrado <> 'SI' then
  30. begin
  31. TbFacturas.First;
  32. while not TbFacturas.Eof do
  33. begin
  34. TbFacturas.Edit;
  35. TbFacturas.FieldByName('MontoApagar').AsFloat := 0.00;
  36. if MontoApagar < TbFacturas.FieldByName('MontoPendiente').AsFloat then
  37. begin
  38. TbFacturas.FieldByName('MontoApagar').AsFloat := MontoApagar;
  39.  
  40. if MontoApagar > 0 then
  41. ConceptoAbono := 'Abono Factura Nro. ' + IntToStr(TbFacturas.FieldByName('NroFactura').AsInteger);
  42.  
  43. MontoApagar := 0;
  44. end
  45. else
  46. begin
  47. TbFacturas.FieldByName('MontoApagar').AsFloat := TbFacturas.FieldByName('MontoPendiente').AsFloat;
  48. MontoApagar := MontoApagar - TbFacturas.FieldByName('MontoPendiente').AsFloat;
  49.  
  50. if ConceptoPago = '' then
  51. ConceptoPago := 'Saldo Factura Nro. ' + IntToStr(TbFacturas.FieldByName('NroFactura').AsInteger)
  52. else
  53. ConceptoPago := ConceptoPago + ', ' + IntToStr(TbFacturas.FieldByName('NroFactura').AsInteger)
  54. end;
  55.  
  56. TbFacturas.Next;
  57. end;
  58. end;
  59.  
  60. if (ConceptoPago <> '') and (ConceptoAbono <> '') then
  61. EdConcepto.Text := ConceptoPago + ', ' + ConceptoAbono
  62. else
  63. EdConcepto.Text := ConceptoPago + ConceptoAbono;
  64.  
  65. end;

La razón por la cual no quede conforme con el código que hice es por que tuve que emplear dos bucles para recorrer la tabla, (la lógica no me quedo bien) y emplee una variable auxiliar llamada "ValorEncontrado".

 

Por favor vean el video en el link que le puse y revisen el código que hice y ayúdenme a mejorarlo ya que me quedo muy largo y algo redundante.

 

Gracias por su atención.

 

Att: Jorge Abel

 

 

 

 

 

 

 

 


  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.460 mensajes
  • LocationMéxico

Escrito 01 agosto 2022 - 08:04

Buenos días jorgebq77
 
Así de primera vista creo que hay algunos detalle,

  • ¿Estás aplicando el montoapagar a todas las facturas o a una sola factura? 
  • El valor de montoaApagar lo inicializas en cero en ambos recorrido.

Tal vez esto se podría resolver con eventos en la base de datos en lugar de hacerlo en el código, me haré un tiempo para ver tu video porque si me parece un poco confuso el procedimiento.

 
Saludos


  • 0

#3 jorgebq77

jorgebq77

    Member

  • Miembros
  • PipPip
  • 11 mensajes

Escrito 01 agosto 2022 - 08:09

Respondiendo a tu pregunta amigo Egostar, el montoapagar se lo puedo aplicar a todas las facturas ó a una sola factura, eso esta a opción del usuario. Échale un vistazo al link del video y te darás cuenta de lo que quiero lograr.

 

Gracias por tu aporte amigo.


  • 1

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.460 mensajes
  • LocationMéxico

Escrito 02 agosto 2022 - 09:17

Ya he podido ver tu video, pero quiero saber si entendí bien.

 

Lo que quieres es que se haga el prorrateo del monto a pagar en los documentos del cliente hasta donde alcance?, 

 

Ahora, porque hiciste dos ciclos? Me gustaría entender tu proceso antes de considerar un cambio,.

 

Saludos


  • 0

#5 jorgebq77

jorgebq77

    Member

  • Miembros
  • PipPip
  • 11 mensajes

Escrito 02 agosto 2022 - 10:23

Exacto!!! eso es lo que quiero hacer, distribuir el monto a pagar ó "prorrateo" hasta donde alcance....

 

Hice dos ciclos, el primero es para verificar si el monto que digito alcanza para saldar la factura, el otro, es para manejar tanto el saldo de la factura como el abono... 

 

Creo que no es necesario hacer dos bucles para eso, es por eso que requiero de la ayuda para mejorar el código.


  • 1

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.460 mensajes
  • LocationMéxico

Escrito 02 agosto 2022 - 11:39

Hola.
 
Yo creo que no es necesario verificar si el monto alcanza y después manejar los saldos.
 
Asumimos que el monto a pagar puede o no alcanzar para pagar la primer factura, entonces, con seudocódigo....
 
 


delphi
  1. LABEL REGRESA
  2.   Si Monto_A_Pagar > Monto_Factura
  3.     Cancelamos Factura1 
  4.     Restamos MontoFactura del Monto_A-Pagar
  5.     GOTO REGRESA
  6.   en caso contrario
  7.     Restamos Monto_A-Pagar de MontoFactura
  8.   Salir

 
 
  Perdón no pude evitar el uso GOTO/LABEL :D :D :D
 
  Recordando el debate que se hizo hace unos días
     

post-12129-0-04745600-1659461785.png
 
Saludos

Archivos adjuntos


  • 0

#7 jorgebq77

jorgebq77

    Member

  • Miembros
  • PipPip
  • 11 mensajes

Escrito 02 agosto 2022 - 12:52

Ok... Aunque no soy muy partidario del uso del goto por el asunto del código espagueti pero intentare adaptar el seudocódigo, aunque no entiendo la linea nro. 3 donde dice "Cancelamos Factura1", no se cual código corresponde en esa linea...


  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.460 mensajes
  • LocationMéxico

Escrito 02 agosto 2022 - 01:14

Ok... Aunque no soy muy partidario del uso del goto por el asunto del código espagueti pero intentare adaptar el seudocódigo, aunque no entiendo la linea nro. 3 donde dice "Cancelamos Factura1", no se cual código corresponde en esa linea...

 

 

:D :D :D

 

No no, lo hice porque recordé el debate, pero lo haría con un bucle WHILE o REPEAT, depende cual te acomode mas.

Saludos


  • 0

#9 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.460 mensajes
  • LocationMéxico

Escrito 02 agosto 2022 - 01:15

Ok... Aunque no soy muy partidario del uso del goto por el asunto del código espagueti pero intentare adaptar el seudocódigo, aunque no entiendo la linea nro. 3 donde dice "Cancelamos Factura1", no se cual código corresponde en esa linea...

 

En cuanto a Cancelar Factura es dejarla como pagada, saldada o liquidada, no se como se diga en tu país.

 

Saludos


  • 0





Etiquetado también con una o más de estas palabras: Delphi, Base de Datos

IP.Board spam blocked by CleanTalk.