Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: corlo en 3 Diciembre 2021, 00:44 am



Título: sumar list1
Publicado por: corlo en 3 Diciembre 2021, 00:44 am
Hola soy colro

necesito sumar el total contado y el total tarjeta de credito
 consigo sumar el total del list1
pongo el codigo

Código
  1.  
  2. Case 1  ' Leer fichero de facturación
  3.            FrmFile.Show 1
  4.            Dim h As Integer
  5.             Dim totalcontado As Integer
  6.                Dim totaltcredito As Integer
  7.                totalcontado = 0: totaltcredito = 0
  8.            If (Len(FrmFile.File) > 0) Then
  9.                If (LeerFacturacion(App.Path & "\" & FrmFile.File) = True) Then
  10.                    Call Activar(True)
  11.  
  12.                    For h = 0 To List1.ListCount - 1
  13.  
  14.                     If reg2.MetodoDePago = "0" Then
  15.                     totalcontado = totalcontado + Val(Split(List1.List(h), vbTab)(6))
  16.                    End If
  17.                    If reg2.MetodoDePago = "1" Then
  18.                    totaltcredito = totaltcredito + Val(Split(List1.List(h), vbTab)(6))
  19.                    End If
  20.                    Next h
  21.                    txttotal.Text = Format(totalcontado, "#,##0.00")
  22.                    Txttotal1.Text = Format(totaltcredito, "#,##0.00")
  23.  
  24.                Else
  25.                    Call Activar(False)
  26.                End If
  27.            End If
  28.  
  29.  
  30.  






Gracias


Título: Re: sumar list1
Publicado por: Serapis en 4 Diciembre 2021, 16:49 pm
Hay algunas discrepancias...

Primero los valores de precio y suma total admiten decimales, luego declarar a 'TotalContado' y 'TotalCredito' de tipo integer, limita la precisión del cálculo, es decir legalmente no se admitiría y comercialmente despidirían al programador...  :silbar:

Luego, estás sumando en base a un registro que has leído para una determinada factura (reg2), pero en realidad cada factura tiene su propio indicador. Es decir estás aplicando a toda la facturación del fichero el criterio de pago de un único registro, luego si ese registro fue 'pagado' al contado todo el listbox, sumará sus valores como si fueran pagos al contado (y pagos con tarjeta no sumará nada, luego 0), y viceversa..., si ese registro fuera pagado con tarjeta de crédito, todo el listado se suma como si fuera pagado con tarjeta de crédito (luego el pago al contado será 0).

Puedes elegir entre leer e ir sumando del fichero o con lo que aparece en el listado.
Si tiras del listado, debes leer cada línea, hacer el split, pero no a un string, mejor volcarlo a un registro...  

Nota que el orden de los campos, debe coincidir con el orden en que fueron serializados... para recordarlo, pongo aquí dicha función (si la modificaste,  lógicamente debes equipararla (la función FromString) con los cambios que hiciste).
Código
  1. Private Function SerializarRegistro(ByRef Registro As RegCompra, ByVal Separador As String) As String
  2.    With Registro
  3.        SerializarRegistro = CStr(.NumTicket) & Separador & .Producto & Separador & CStr(.Cantidad) & _
  4.                            Separador & CStr(.PrecioUnidad) & Separador & CStr(.SubTotal) & _
  5.                            Separador & GetMetodoPago(.MetodoDePago) & Separador & CStr(.FechaCompra)
  6.    End With
  7. End Function
  8.  
  9. Private function FromString(byRef Linea As String, optional ByRef Separador as String = vbTab) As RegCompra
  10.    dim campos() As string
  11.  
  12.    campos = Split(Linea, Separador)
  13.    With FromString
  14.        .NumTicket = CInt(campos(0))
  15.        .Producto = campos(1)
  16.        .Cantidad = CInt(campos(2))
  17.        .PrecioUnidad = CSng(campos(3))
  18.        .SubTotal = CSng(campos(4))
  19.        .MetodoDePago = SetMetodoPago(campos(5))  ' función que se añade debajo... ' CByte(campos(5))
  20.        .FechaCompra = CDate(campos(6))
  21.    end with
  22. end Function
  23.  

Igual que teníamos la función 'getMetodoPago, que traducía '0' ó '1' a un texto más descriptivo, ahora necesitamos la función inversa:
Código
  1. Private Function GetMetodoPago(ByVal Metodo As MetodosDePago) As String
  2.    If (Metodo = PAGO_AL_CONTRADO) Then
  3.        GetMetodoPago = "Contado     "
  4.    Else
  5.        GetMetodoPago = "T. Credito  "
  6.    End If
  7. End Function
  8.  
  9. Private Function SetMetodoPago(ByRef Metodo As String) As MetodosDePago
  10.    If (LCase$(Trim$(Metodo)) = "contado") Then
  11.        SetMetodoPago = PAGO_AL_CONTRADO
  12.    Else
  13.        SetMetodoPago = PAGO_CON_TCREDITO
  14.    End If
  15. End Function
  16.  
Lógicamente si dejaste como texto "0" ó "1", entonces bastaría una conversión:
 .MetodoDePago  = cbyte(campos(5))
en vez de la llamada a esta función

Ahora la suma debe modificar la lógica...
Reg2 es obtenido con cada línea, luego el valor 'metododepago' es actualizado justo con cada factura y por tanto se suma al total que procede...
Código
  1.    Dim totalcontado As Single  ' <-------- no olvides cambiarlo.
  2.    Dim totaltcredito As Single
  3. ' ...
  4. ' ...
  5. ' ...
  6.  
  7.            For h = 0 To List1.ListCount - 1
  8.                reg2 = FromString(List1.List(h), vbTab)
  9.  
  10.                If (reg2.MetodoDePago = PAGO_AL_CONTRADO) Then ' valor 0
  11.                    totalcontado = totalcontado + reg2.SubTotal    'Val(Split(List1.List(h), vbTab)(6))
  12.                Else 'If reg2.MetodoDePago = "1"  Then
  13.                    totaltcredito = (totaltcredito + reg2.SubTotal)    'Val(Split(List1.List(h), vbTab)(6))
  14.                End If
  15.            Next
  16. '...
  17.  

Por último, nota que en función de la complejidad de cada línea puede ser preferible leer del fichero de nuevo cada registro, o del listado dando formato a cada campo... ...como operabas desde el listado he modificado desde ahí.

Si un fichero fuera enormemente grande, lo más probable es que un listado contuviera solo una cantidad predefinida máxima de facturas (no todas las que un fichero tuviere, imagina 100.000 ó 1 millón), por lo que uno debe decidir si lo que suma es el total del fichero o solo el total del contenido en el listado. Piensa además que un listado puede estar filtrado (no solo por la cantidad de líneas que deba contener), sino por cosas como un rango de fecha, por ejemplo 'todas las compras de diciembre de 2021'... en fin es una lógica que hay que tener presente, no siempre sumar todo lo que el fichero contiene, si no sujeto a determinados criterios de filtro.


Título: Re: sumar list1
Publicado por: corlo en 4 Diciembre 2021, 18:51 pm
Hola Serapis


lo adaptado y funciona perfectamente

ahora si que consigo sumar el contado y el tageta de credito

tema solucionado Muchas Gracias