none
For Each RRS feed

  • Pregunta

  • Buenas tardes al foro, estoy realizando el calculo de un saldo recorriendo un datatable, si bien es cierto si me da correcto pero el orden en que los muestra no es lo que esperaba...

    en la fila cero esta ok, pero a parir de la fila 1 en adelante me debe de restar  lo de amorefectuada (saldo - amorefectuado) he ir disminuyendo el saldo hasta quedar en cero.... Aca en la imagen me muestra la resta pero no resta los 2000 inicial en la fila cero, al final de la fila se aprecia como se sigue arrastrando el saldo

    Dim x As Integer = 0
            Dim fila As DataRow
            Dim efectuado_Mensual, amorefectuado, Saldo_Mensual, saldoreal, Acumuladoefectuadomensual, acumuladosaldomensual As Double
    
            importe = txtimporte.Text
            For Each fila In DT_Original.Rows
                amorefectuado = fila("amorefectuada")
    
                If x = 0 Then
                    fila("saldo") = importe
    
                End If
    
                If x >= 1 Then
                    Saldo_Mensual = importe
                    efectuado_Mensual = fila("amorefectuada")
                    acumuladosaldomensual = Saldo_Mensual
                    Acumuladoefectuadomensual += efectuado_Mensual
                    saldoreal = acumuladosaldomensual - Acumuladoefectuadomensual
                    fila("saldo") = saldoreal
    
                End If
                x += 1
    
            Next
    Espero me pueda ayudar.


    lutermick

    martes, 15 de abril de 2014 20:41

Respuestas

  • Sí, normal, me he pasado de listo y he volcado el importe, vuelvo a reponer la linea y subo la asignación de la row antes de hacer la resta del importe que queda.

    Dim x As Integer = 0
    Dim fila As DataRow
    Dim efectuado_Mensual, amorefectuado, Saldo_Mensual, saldoreal, Acumuladoefectuadomensual, acumuladosaldomensual As Double
    
    importe = txtimporte.Text
    For Each fila In DT_Original.Rows
    	amorefectuado = fila("amorefectuada")
    
    	If x >= 0 Then
    		fila("saldo") = importe
    		Saldo_Mensual = importe
    		efectuado_Mensual = fila("amorefectuada")
    		acumuladosaldomensual = Saldo_Mensual
    		Acumuladoefectuadomensual += efectuado_Mensual
    		fila("saldo") = saldoreal
    		saldoreal = acumuladosaldomensual - Acumuladoefectuadomensual
    	End If
    	x += 1
    
    Next

    De esta forma:

    -> Primero asignamos el valor a la fila.

    -> Luego disminuímos el valor real a utilizar en la siguiente vuelta del bucle.

    		fila("saldo") = saldoreal
    		saldoreal = acumuladosaldomensual - Acumuladoefectuadomensual

    A ver si ahora no me he equivocado, estoy codificando así al vuelo sin poder probar las modificaciones que te digo :P


    Ruben Fernandez - http://www.rfsouto.com

    • Marcado como respuesta EdgCode martes, 22 de abril de 2014 15:32
    martes, 22 de abril de 2014 15:27

Todas las respuestas

  • Hola, 

    If x = 0 Then
    	fila("saldo") = importe
    End If

    Para que te reste en la fila 0, tienes que escribirlo en esta condición.

    Saludos.


    Víctor del Valle - http://www.vrdelvalle.net

    martes, 22 de abril de 2014 8:07
  • Gracias por responder Victor,  la condición que me muestras ya la aplico en mi ejemplo inicial.

    lutermick

    martes, 22 de abril de 2014 13:28
  • Hola, lo que tienes que hacer es modificar el coódigo dentro de la condición para que te realice la resta en esa fila.

    ¿ese es tu problema, no?

    Saludos.


    Víctor del Valle - http://www.vrdelvalle.net

    martes, 22 de abril de 2014 13:35
  • Yo creo que desde el principio arrastras un error. Porque si la amortización inicial es de 2000 entonces el segundo saldo no debería ser de 1500? y por eso al final te quedan tus 2000 en la fila de la izquierda...

    Edito:

    amorefectuado = fila("amorefectuada")
    
    If x = 0 Then
    	fila("saldo") = importe
    
    End If
    
    If x >= 1 Then
    	Saldo_Mensual = importe
    	efectuado_Mensual = fila("amorefectuada")
    	acumuladosaldomensual = Saldo_Mensual
    	Acumuladoefectuadomensual += efectuado_Mensual
    	saldoreal = acumuladosaldomensual - Acumuladoefectuadomensual
    	fila("saldo") = saldoreal
    
    End If

    Lo que yo intento decir es que tu empiezas a reducir el valor a partir de la fila >= 1 y en la fila = 0 también deberías hacer la reducción del saldo real - amorefectuada. Salvo que establezcas una amortización inicial de cero (en el primer movimiento no amortizas ningún importe) que tal si probamos algo así?
    Dim x As Integer = 0
    Dim fila As DataRow
    Dim efectuado_Mensual, amorefectuado, Saldo_Mensual, saldoreal, Acumuladoefectuadomensual, acumuladosaldomensual As Double
    
    importe = txtimporte.Text
    For Each fila In DT_Original.Rows
    	amorefectuado = fila("amorefectuada")
    
    	If x >= 0 Then
    		fila("saldo") = importe
    		Saldo_Mensual = importe
    		efectuado_Mensual = fila("amorefectuada")
    		acumuladosaldomensual = Saldo_Mensual
    		Acumuladoefectuadomensual += efectuado_Mensual
    		saldoreal = acumuladosaldomensual - Acumuladoefectuadomensual
    		fila("saldo") = saldoreal
    	End If
    	x += 1
    
    Next
    Lo que he hecho ha sido quitar el x = 0 y aplicar siempre que x >= 0 todo el proceso de x>=1

    • Editado rf1souto martes, 22 de abril de 2014 13:55
    martes, 22 de abril de 2014 13:41
  • Gracias por responder con el ejemplo de  rf1souto se logro restar el 2000 de saldo, pero tengo un diseño a sacar , que es de color amarillo y lo de celeste me da segun el el ejemplo de  rf1souto.

    Cree dos variables mas en posición cero y posición 1 para hacer la resta 

                 For Each fila In DT_Original.Rows
                valor1 = DT_Original.Rows(0)(5)
                valor2 = DT_Original.Rows(1)(5)
                If x = 0 Then
                    fila("saldo") = importe


                End If



                If x = 1 Then
                    Saldo_Mensual = importe

                    fila("saldo") = Saldo_Mensual - valor1
                   

                End If

                
                x += 1

    con ese logro que me salga bien solo en la fila 0 y 1 queda asi, me falta la resta a partir del 1..

    3500 2000,00
    1500 194,44
    0,00 194,44
    0,00 194,44
    0,00 194,44
    0,00 194,44
    0,00 194,44
    0,00 194,44
    0,00 138,92


    lutermick


    • Editado EdgCode martes, 22 de abril de 2014 15:03 actualizacion
    martes, 22 de abril de 2014 15:01
  • Estás muy cerquita de la solución, ahora está claro lo que quieres, mi solución te encamina a medias. Sólo necesitas no restar antes de tiempo.

    Dim x As Integer = 0
    Dim fila As DataRow
    Dim efectuado_Mensual, amorefectuado, Saldo_Mensual, saldoreal, Acumuladoefectuadomensual, acumuladosaldomensual As Double
    
    importe = txtimporte.Text
    For Each fila In DT_Original.Rows
    	amorefectuado = fila("amorefectuada")
    
    	If x >= 0 Then
    		fila("saldo") = importe
    		Saldo_Mensual = importe
    		efectuado_Mensual = fila("amorefectuada")
    		acumuladosaldomensual = Saldo_Mensual
    		Acumuladoefectuadomensual += efectuado_Mensual
    		saldoreal = acumuladosaldomensual - Acumuladoefectuadomensual
    	End If
    	x += 1
    
    Next

    Eliminé esta línea: fila("saldo") = saldoreal

    y queda activa la primera que se me había colado antes:

    fila("saldo") = importe

    Esto te lo debería hacer bien.


    Ruben Fernandez - http://www.rfsouto.com

    martes, 22 de abril de 2014 15:06
  • Disculpa Ruben, he copiado tal cual tu ejemplo pero el saldo nuca resta..

    lutermick

    martes, 22 de abril de 2014 15:23
  • Sí, normal, me he pasado de listo y he volcado el importe, vuelvo a reponer la linea y subo la asignación de la row antes de hacer la resta del importe que queda.

    Dim x As Integer = 0
    Dim fila As DataRow
    Dim efectuado_Mensual, amorefectuado, Saldo_Mensual, saldoreal, Acumuladoefectuadomensual, acumuladosaldomensual As Double
    
    importe = txtimporte.Text
    For Each fila In DT_Original.Rows
    	amorefectuado = fila("amorefectuada")
    
    	If x >= 0 Then
    		fila("saldo") = importe
    		Saldo_Mensual = importe
    		efectuado_Mensual = fila("amorefectuada")
    		acumuladosaldomensual = Saldo_Mensual
    		Acumuladoefectuadomensual += efectuado_Mensual
    		fila("saldo") = saldoreal
    		saldoreal = acumuladosaldomensual - Acumuladoefectuadomensual
    	End If
    	x += 1
    
    Next

    De esta forma:

    -> Primero asignamos el valor a la fila.

    -> Luego disminuímos el valor real a utilizar en la siguiente vuelta del bucle.

    		fila("saldo") = saldoreal
    		saldoreal = acumuladosaldomensual - Acumuladoefectuadomensual

    A ver si ahora no me he equivocado, estoy codificando así al vuelo sin poder probar las modificaciones que te digo :P


    Ruben Fernandez - http://www.rfsouto.com

    • Marcado como respuesta EdgCode martes, 22 de abril de 2014 15:32
    martes, 22 de abril de 2014 15:27
  • Gracias Ruben, quedo asi

    0 2000,00
    1500 194,44
    1305,56 194,44
    1111,12 194,44
    916,68 194,44
    722,24 194,44
    527,8 194,44
    333,36 194,44
    138,92 138,92

    podria haber la ,manera de que la posicion cero quede con el valor del importe inicial osea 3500.


    lutermick

    martes, 22 de abril de 2014 15:39
  • Sí, tienes varias opciones (todas antes de darle valor a la row).

    - Asígnale a saldoreal el valor de importe si este es cero.

    - Si la fila es cero asígna el valor de importe

    Lo que te pasa es que en la línea cero ahora mismo la variable saldoreal es cero.


    Ruben Fernandez - http://www.rfsouto.com

    martes, 22 de abril de 2014 15:44
  • oK, gracias por todo ruben, recien estaba entendiendo el for each, me ayudastes un monton, mil gracias.

    lutermick

    martes, 22 de abril de 2014 15:54
  • Es un placer, lo que sea que necesites ya sabes donde estamos ;-) 


    Ruben Fernandez - http://www.rfsouto.com

    martes, 22 de abril de 2014 15:57