• Lunes 23 de Diciembre de 2024, 04:46

Autor Tema:  Buble Extraño  (Leído 1999 veces)

franc

  • Miembro MUY activo
  • ***
  • Mensajes: 157
    • Ver Perfil
Buble Extraño
« en: Martes 25 de Julio de 2006, 18:08 »
0
Hola, tengo un datagrid con 6 columnas y las filas se rellenan segun la elección de un combobox. Mi problema es que cuando recorro el contenido del datagrid mediante un doble bucle:

Código: Text
  1.  
  2.             While (i < DataGridView1.Rows.Count)
  3.                 Dim j As Integer = 0
  4.                 While (j < DataGridView1.Columns.Count)
  5.  
  6.                              ( codigo ...... )
  7.  
  8.  
  9.                     j += 1
  10.                 End While
  11.                 i += 1
  12.             End While
  13.  
  14.  


distingo en que columna estamos mediante el siguiente if, veo que estamos en la culmna 4 y con ello quiero hacer unos calculos ( concretamente esta columna es la de "descuento" y lo que hago es calcular el TOTAL ( columna siguiente ) sobre una cantidad ( columna anterior ) y sobre el decuento ( columna actual ) )

Bueno en definitiva, cuando hago este calculo y asigno a la siguiente columna ( el total ) el valor actualizado con el descuento... resulta que hay un "bucle" muy raro que no se porque lo hace.


Código: Text
  1.  
  2. If j = 4 Then
  3.  
  4. Dim aux As Decimal = CType(DataGridView1.Item(j + 1, i).Value, Decimal) - CType((CType(DataGridView1.Item(j, i).Value, Decimal) / 100 * CType(DataGridView1.Item(j + 1, i).Value, Decimal)), Decimal)
  5.  
  6. MsgBox(aux, MsgBoxStyle.OkOnly)
  7.  
  8. DataGridView1.Item(j + 1, i).Value = CType(aux, String)
  9.  
  10. End If
  11.  
  12.  

Suponiendo que las cantidades que coge el datagrid fueran:

precio unitario···········descuento············total
______100__________10_____________0______

El if anterior hace que donde pone un 0 deberia poner un 90 ( por el descuento )
y lo que realmente pone es 0.0000000000000005

Imprimiendo las cantidades con el MsgBox que veis en el codigo anterior, veo que primero muestra 90,0 ( valor correcto ) luego 81,0 luego 72,900 luego 65,6100 etc... hasta llegar a 0.00000000000000005


he intentado hacer un exit sub pero realmente el programa no pasa de la asignacion... sino que este buble se hace en la misma asignacion.


¿ Alguien sabe que está pasando aquí ?

Gracias

senzao18

  • Miembro HIPER activo
  • ****
  • Mensajes: 553
    • Ver Perfil
Re: Buble Extraño
« Respuesta #1 en: Martes 25 de Julio de 2006, 18:58 »
0
Segun yo, tu codigo no tiene problemas los bucles estan bien, creo que tienes que hacer un debug para ver el contenido no los index.  Asi sabras si no te esta tomando alguna linea de mas.
---------------------------------------
Erick Aragon Zepeda
Dessarrollo de Aplicaciones .NET
http]
Blog de Articulos
Mi Blog
NoSolocodigo -->

franc

  • Miembro MUY activo
  • ***
  • Mensajes: 157
    • Ver Perfil
Re: Buble Extraño
« Respuesta #2 en: Martes 25 de Julio de 2006, 19:31 »
0
Hola, gracias por tu respuesta.


Ya sabia que no tenia problemas en los bucles, de hecho el problema está en la ultima asginacion

Código: Text
  1.  
  2. MsgBox(aux, MsgBoxStyle.OkOnly)
  3. DataGridView1.Item(j + 1, i).Value = CType(aux, String)
  4.  
  5.  

que no para de ir de una linea a otra ( de la asignacion al msgbox ) es algo muy estraño y no entiendo porqué

De hecho, si comento la linea de la asignación

Código: Text
  1.  
  2. MsgBox(aux, MsgBoxStyle.OkOnly)
  3. 'DataGridView1.Item(j + 1, i).Value = CType(aux, String)
  4.  
  5.  

el MsgBox imprime 90 ( lo correcto ) y no se hace el bucle "extraño" osea que el problema está en esa linea y no se en qué.

senzao18

  • Miembro HIPER activo
  • ****
  • Mensajes: 553
    • Ver Perfil
Re: Buble Extraño
« Respuesta #3 en: Martes 25 de Julio de 2006, 20:38 »
0
Pues yo insisto enque hagas debug y veas los indices jeej :D. :rolleyes:
---------------------------------------
Erick Aragon Zepeda
Dessarrollo de Aplicaciones .NET
http]
Blog de Articulos
Mi Blog
NoSolocodigo -->

franc

  • Miembro MUY activo
  • ***
  • Mensajes: 157
    • Ver Perfil
Re: Buble Extraño
« Respuesta #4 en: Martes 25 de Julio de 2006, 20:55 »
0
los indices están bien, no avanzan a pesar del "blucle no deseado... y a a par extraño" :(

senzao18

  • Miembro HIPER activo
  • ****
  • Mensajes: 553
    • Ver Perfil
Re: Buble Extraño
« Respuesta #5 en: Jueves 27 de Julio de 2006, 07:05 »
0
MsgBox(aux, MsgBoxStyle.OkOnly)
'DataGridView1.Item(j + 1, i).Value = CType(aux, String)

Cuando comentas la segunda lienA TODO BIEN,
Y si no la comentas todo mal?
O solo sale mal el ultimo total?......

Código: Text
  1.  
  2. If j = 4 Then
  3.  
  4. Dim aux As Decimal = CType(DataGridView1.Item(j + 1, i).Value, Decimal) - CType((CType(DataGridView1.Item(j, i).Value, Decimal) / 100 * CType(DataGridView1.Item(j + 1, i).Value, Decimal)), Decimal)
  5.  
  6. MsgBox(aux, MsgBoxStyle.OkOnly)
  7.  
  8. DataGridView1.Item(j + 1, i).Value = CType(aux, String)
  9.  
  10. End If
  11.  
  12.  

DataGridView1.Item(j + 1, i).Value = CType(aux, String)<---Aqui metes algo, pero igual esa celda ya tiene un valor antes de...... ????

Si los indices estan bien, entonces ahora pasa a checar los valores que toma cuando haces algo como esto CType(DataGridView1.Item(j + 1, i).Value, Decimal). Y pues con la calculadora ahi sacs cuentas  :blink: .

Por que tu error si que esta raro. :(
Lamento no poder ayudar mas.  :whistling:
---------------------------------------
Erick Aragon Zepeda
Dessarrollo de Aplicaciones .NET
http]
Blog de Articulos
Mi Blog
NoSolocodigo -->

senzao18

  • Miembro HIPER activo
  • ****
  • Mensajes: 553
    • Ver Perfil
Re: Buble Extraño
« Respuesta #6 en: Jueves 27 de Julio de 2006, 07:16 »
0
Tambien podrias hacer los calculos sobre el datasource....
Si tienes un origen de datos como un DataTable. Que es lo mas comun....

Podrias hacerlo los calculos ahi y las afectaciones a los DataRow o Registros, se te reflejaran en el control.

Y creo que este ciclo como que esta de mas
Código: Text
  1.  
  2. While (j &#60; DataGridView1.Columns.Count)
  3.  
  4.      If j = 4 Then
  5.  
  6.           Dim aux As Decimal = CType(DataGridView1.Item(j + 1, i).Value, Decimal) - CType((CType(DataGridView1.Item(j, i).Value, Decimal) / 100 * CType(DataGridView1.Item(j + 1, i).Value, Decimal)), Decimal)
  7.  
  8.             MsgBox(aux, MsgBoxStyle.OkOnly)
  9.  
  10.            DataGridView1.Item(j + 1, i).Value = CType(aux, String)
  11.  
  12.           End If
  13.  
  14.      j += 1
  15. End While
  16.  
  17.  

Para que barres las celdas??? Si ya sabes que siempre J sera 4 para que hagas el calculo pues mejor usa los numeros directamente, y solo barre los registros.

Código: Text
  1.  
  2.           Dim aux As Decimal = CType(DataGridView1.Item(5, i).Value, Decimal) - CType((CType(DataGridView1.Item(4, i).Value, Decimal) / 100 * CType(DataGridView1.Item(5, i).Value, Decimal)), Decimal)
  3.  
  4. DataGridView1.Item(5, i).Value = CType(aux, String)
  5.  
  6.  
  7.  

Otra cosa tambien tu formula como que no me deja tranquilo. No encuentro parentesis para indicar el orden en como se hace la operacion. jeje.

Y por ultimo yo usaria un FOR EACH para barrer el control, o el origen de datos.
---------------------------------------
Erick Aragon Zepeda
Dessarrollo de Aplicaciones .NET
http]
Blog de Articulos
Mi Blog
NoSolocodigo -->

franc

  • Miembro MUY activo
  • ***
  • Mensajes: 157
    • Ver Perfil
Re: Buble Extraño
« Respuesta #7 en: Jueves 27 de Julio de 2006, 18:04 »
0
Cuando comento esa linea, el msgbox imprime lo que tiene que imprimir ( 90 ) si no comento esa linea, empieza el buble y imprime 90 luego 81,3 etc etc.... hasta llegar a 0.000000005

inexplicable.


Por cierto, el bucle while parece inecesario, pero esque dentro de él hay 2 if`s mas que no he puesto porque no vienen al caso ( que por cierto, esos ifs hacenalgo parecido y si que van ), el problema está en ese if.

senzao18

  • Miembro HIPER activo
  • ****
  • Mensajes: 553
    • Ver Perfil
Re: Buble Extraño
« Respuesta #8 en: Viernes 28 de Julio de 2006, 07:26 »
0
Es logico que si comentas esa linea el resultado saldra bien, pues no haces afectacion a las celdas, el problema es que has de estar afectando mal a las celdas y la operacion hace que te regrese ese eresultado, checa los valores con los quew haces la operacion en cada ciclo y ve si algun valor no esta afectandose mal.

Si asi lo deseas pasa el proyecto con el formulario en el cual tienes el error para ejecutarlo y asi poder verlo mas a detalle.

Si ya viene con un caso de prueba mejor jeje.
---------------------------------------
Erick Aragon Zepeda
Dessarrollo de Aplicaciones .NET
http]
Blog de Articulos
Mi Blog
NoSolocodigo -->