sumar list1

Iniciado por corlo, 3 Diciembre 2021, 00:44 AM

0 Miembros y 1 Visitante están viendo este tema.

corlo

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 (vb) [Seleccionar]


Case 1  ' Leer fichero de facturación
            FrmFile.Show 1
            Dim h As Integer
             Dim totalcontado As Integer
                Dim totaltcredito As Integer
                totalcontado = 0: totaltcredito = 0
            If (Len(FrmFile.File) > 0) Then
                If (LeerFacturacion(App.Path & "\" & FrmFile.File) = True) Then
                    Call Activar(True)
                   
                    For h = 0 To List1.ListCount - 1
                   
                     If reg2.MetodoDePago = "0" Then
                     totalcontado = totalcontado + Val(Split(List1.List(h), vbTab)(6))
                    End If
                    If reg2.MetodoDePago = "1" Then
                    totaltcredito = totaltcredito + Val(Split(List1.List(h), vbTab)(6))
                    End If
                    Next h
                    txttotal.Text = Format(totalcontado, "#,##0.00")
                    Txttotal1.Text = Format(totaltcredito, "#,##0.00")
                   
                Else
                    Call Activar(False)
                End If
            End If









Gracias

Serapis

#1
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 (vb) [Seleccionar]

Private Function SerializarRegistro(ByRef Registro As RegCompra, ByVal Separador As String) As String
   With Registro
       SerializarRegistro = CStr(.NumTicket) & Separador & .Producto & Separador & CStr(.Cantidad) & _
                           Separador & CStr(.PrecioUnidad) & Separador & CStr(.SubTotal) & _
                           Separador & GetMetodoPago(.MetodoDePago) & Separador & CStr(.FechaCompra)
   End With
End Function

Private function FromString(byRef Linea As String, optional ByRef Separador as String = vbTab) As RegCompra
   dim campos() As string
   
   campos = Split(Linea, Separador)
   With FromString
       .NumTicket = CInt(campos(0))
       .Producto = campos(1)
       .Cantidad = CInt(campos(2))
       .PrecioUnidad = CSng(campos(3))
       .SubTotal = CSng(campos(4))
       .MetodoDePago = SetMetodoPago(campos(5))  ' función que se añade debajo... ' CByte(campos(5))
       .FechaCompra = CDate(campos(6))
   end with
end Function


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 (vb) [Seleccionar]

Private Function GetMetodoPago(ByVal Metodo As MetodosDePago) As String
   If (Metodo = PAGO_AL_CONTRADO) Then
       GetMetodoPago = "Contado     "
   Else
       GetMetodoPago = "T. Credito  "
   End If
End Function

Private Function SetMetodoPago(ByRef Metodo As String) As MetodosDePago
   If (LCase$(Trim$(Metodo)) = "contado") Then
       SetMetodoPago = PAGO_AL_CONTRADO
   Else
       SetMetodoPago = PAGO_CON_TCREDITO
   End If
End Function

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 (vb) [Seleccionar]

   Dim totalcontado As Single  ' <-------- no olvides cambiarlo.
   Dim totaltcredito As Single
' ...
' ...
' ...

           For h = 0 To List1.ListCount - 1
               reg2 = FromString(List1.List(h), vbTab)
               
               If (reg2.MetodoDePago = PAGO_AL_CONTRADO) Then ' valor 0
                   totalcontado = totalcontado + reg2.SubTotal    'Val(Split(List1.List(h), vbTab)(6))
               Else 'If reg2.MetodoDePago = "1"  Then
                   totaltcredito = (totaltcredito + reg2.SubTotal)    'Val(Split(List1.List(h), vbTab)(6))
               End If
           Next
'...


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.

corlo

Hola Serapis


lo adaptado y funciona perfectamente

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

tema solucionado Muchas Gracias