elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Problema con formatos VB.NET 2010, Access 2007[SOLUCIONADO]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Problema con formatos VB.NET 2010, Access 2007[SOLUCIONADO]  (Leído 6,910 veces)
Yaldabaot

Desconectado Desconectado

Mensajes: 186


Ver Perfil
Problema con formatos VB.NET 2010, Access 2007[SOLUCIONADO]
« en: 27 Julio 2014, 19:48 pm »

Hola,

Hice una aplicación de control de una serie de datos, la aplicación hasta el momento iba bien, pero cuando me empezaron a acosar unos usuarios con extrañas exepciones que en mi vida nunca ha visto.

La aplicación ya tenía una cierta cantidad de tiempo, y en los otros ordenadores pues funciona a la maravilla, hasta yo mismo verifiqué que al insertarse los valores sean los correctos.

Lo único y estoy casi seguro que el problema radica en este dato:

Cuando el usuario escribe en su caja de texto y pone por ejemplo un valor numérico 70000, cuando pierde el foco el text box formatea la variable que recibe  quedando de esta manera : 70,000 , a modo de código pues el valor es este : Double monto =  txtmonto.toString("###,###,###")

 Cuando se inserta en la base de datos simplemente se inserta con el separador de miles, hasta el momento que tiene la aplicación tiene más de un año casi y hasta ahora cero problemas. El campo den la base de datos tiene un valor de double, en este caso el motor de base de datos es Acess 2007.


Cuando revisé en el sistema operativo Windows 7, tenía que los separadores de miles eran con "," y los decimales con "."

Cuando el usuario acosador inserta le aparece esta imagen:




Cabe decir, que al formato del monto que es double lo pase luego a string para resolver el problema y hacerle un .replace(",",nothing) para que el número llegue intacto a la tabla, funciona en otros ordenadores y en ese bendito ordenador no -.-.

Y es un usuario muy hostigador y molesto, ojala puedan ayudarme con la ayuda.

Disculpen las molestias por la imagen, no se subirla bien a un foro

Les agradezco la ayuda brindada, y desde ya muchas gracias.


« Última modificación: 7 Agosto 2014, 23:00 pm por Yaldabaot » En línea

Nunca me contestan -_-
Yaldabaot

Desconectado Desconectado

Mensajes: 186


Ver Perfil
Re: Problema con formatos VB.NET 2010, Access 2007
« Respuesta #1 en: 30 Julio 2014, 16:12 pm »

Nadie sabe??, les agradecería alguna idea o ayuda!.


En línea

Nunca me contestan -_-
Yaldabaot

Desconectado Desconectado

Mensajes: 186


Ver Perfil
Re: Problema con formatos VB.NET 2010, Access 2007
« Respuesta #2 en: 6 Agosto 2014, 19:58 pm »

Les daré el fragmento del código a ver si alguien sabe

Código
  1.  
  2. Dim comprobar As String
  3.        Dim monto As Double
  4.  
  5.        comprobar = TxtMonto.Text
  6.  
  7.        If IsNumeric(comprobar) <> True Then
  8.            lblMonto.ForeColor = Color.Red
  9.            lblMonto.Text = "Dato Incorrecto"
  10.            btnGuardarDatos.Enabled = False
  11.        Else
  12.            btnGuardarDatos.Enabled = True
  13.            lblMonto.Text = ""
  14.  
  15.            'Actualización
  16.            monto = CDbl(comprobar)
  17.            TxtMonto.Text = monto.ToString("###,###,###.##")
  18.  
  19.        End If
  20.  
  21.  

Y acá pues es donde lo inserta

Código
  1.  
  2.    monto = CDbl(TxtMonto.Text)
  3.    cmd = New OleDb.OleDbCommand("insert into xxx1(xxx)  values  ('" & monto & "')" , conn)
  4.  
  5.  
« Última modificación: 6 Agosto 2014, 20:00 pm por Yaldabaot » En línea

Nunca me contestan -_-
Yaldabaot

Desconectado Desconectado

Mensajes: 186


Ver Perfil
Re: Problema con formatos VB.NET 2010, Access 2007
« Respuesta #3 en: 6 Agosto 2014, 21:01 pm »

La excepción que tira antes de la imagen(tree view sin abrir) dice lo siguiente:

La conversión de la cadena "La operación de usar una consu" en el tipo "Integer" no es válida.

Lo pongo examente como viene el enunciando para ver si me ayudan, porque sinceramente este error no se que es, es absurdo.

GRACIAS POR LEERME
En línea

Nunca me contestan -_-
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: Problema con formatos VB.NET 2010, Access 2007
« Respuesta #4 en: 6 Agosto 2014, 21:29 pm »

1) El mensaje de la excepción es bien claro, no se puede tratar la cadena de texto "La operación necesita una consu" como si fuese un valor de tipo Integer, en alguna parte del código, la cual no tiene porque ser necesariamente la que has mostrado, estás intentando hacer ese tipo de conversión, y es donde está el error.
Aunque te parezca un error absurdo, es muy común en los inicios de cualquier programador equivocarse de esa manera.

2) En el código que has mostrado parece como si, mientras un usuario escribe en un textbox, tu quisieras comprobar si lo que escribe es un número, y luego reemplazar/formatear el texto de ese textbox mientras el usuario pueda seguir escribiendo?... en ese caso debes darle otro enfoque a lo que intentes conseguir.

3) En lugar de usar métodos del siglo pasado de VisualBasic6 (IsNumeric) deberías reemplazarlo por métodos de la programación actual (Double.TryParse), ejemplo:

Código
  1.        Dim comprobar As String = TxtMonto.Text
  2.        Dim monto As Double = 0.0R
  3.        Dim Success As Boolean = Double.TryParse(comprobar, monto)
  4.  
  5.        Select Case Success
  6.            Case True
  7.                lblmonto.Text = ""
  8.                TxtMonto.Text = monto.ToString("###,###,###.##")
  9.  
  10.            Case Else
  11.                lblmonto.ForeColor = Color.Red
  12.                lblmonto.Text = "Dato Incorrecto"
  13.  
  14.        End Select
  15.  
  16.        btnGuardarDatos.Enabled = Success

4) Si lo que pretendes es que en el TextBox solo se puedan escribir dígitos y puntos, como ya digo tienes que darle otro enfoque al código, esa no es la manera apropiada, esta sería una manera:

Código
  1.    ''' <summary>
  2.    ''' The keys that are allowed to press in the TextBox.
  3.    ''' </summary>
  4.    Private ReadOnly AllowedKeys As Char() = "0123456789."
  5.  
  6.    ''' <summary>
  7.    ''' Handles the Enter event of the TextBox control.
  8.    ''' </summary>
  9.    ''' <param name="sender">The source of the event.</param>
  10.    ''' <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
  11.    Private Sub TxtMonto_Enter(ByVal sender As Object, ByVal e As EventArgs) Handles TxtMonto.MouseEnter
  12.  
  13.        ' Disable Copy/Paste contextmenu by creating a new empty one.
  14.        If sender.ContextMenuStrip Is Nothing Then
  15.            sender.ContextMenuStrip = New ContextMenuStrip
  16.        End If
  17.  
  18.    End Sub
  19.  
  20.    ''' <summary>
  21.    ''' Handles the KeyPress event of the TextBox control.
  22.    ''' </summary>
  23.    ''' <param name="sender">The source of the event.</param>
  24.    ''' <param name="e">The <see cref="KeyPressEventArgs"/> instance containing the event data.</param>
  25.    Private Sub TxtMonto_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles TxtMonto.KeyPress
  26.  
  27.        Select Case e.KeyChar
  28.  
  29.            Case Convert.ToChar(Keys.Enter) ' 'Enter' key is pressed.
  30.                ' Do something here...
  31.  
  32.            Case Convert.ToChar(Keys.Back) ' 'Backspace' key is pressed.
  33.                e.Handled = False ' Delete the character
  34.  
  35.            Case Convert.ToChar(Keys.Capital Or Keys.RButton) ' 'CTRL+V' combination is pressed.
  36.                ' Paste clipboard content only if contains allowed keys.
  37.                e.Handled = Not Clipboard.GetText().All(Function(c) AllowedKeys.Contains(c))
  38.  
  39.            Case Else ' Other key is pressed.
  40.                e.Handled = Not AllowedKeys.Contains(e.KeyChar)
  41.  
  42.        End Select
  43.  
  44.    End Sub

Otra manera sería que en lugar de usar un TextBox normal utilizases un MaskedTextbox y aplicarle una máscara numérica, usando la propiedad "Mask".

De todas formas no me ha quedado muy claro lo que pretendes conseguir, la función de ese textbox y porque intentas aplicarle un formato específico mientras el usuario typea.

5) Si tienes dudas acerca dle formato que le estás intentando dar al número, tienes información y ejemplos en MSDN:
· Double.ToString(IFormatProvider)
· Double.ToString(String)

Saludos
« Última modificación: 6 Agosto 2014, 21:51 pm por Eleкtro » En línea



Yaldabaot

Desconectado Desconectado

Mensajes: 186


Ver Perfil
Re: Problema con formatos VB.NET 2010, Access 2007
« Respuesta #5 en: 6 Agosto 2014, 22:34 pm »

Gracias por la respuesta, voy a verificar el asunto. Al fin alguien me ha dado la luz en el problema, todos me decían que era sencillo pero no me especificaban cómo arreglarlo, pues lo único que veía era el error del parse, el cuál se como resolverlo pero jamás me imaginé que era eso.

Ahora bien,¿ cómo hago yo para saber dónde está el error, si la aplicación no está donde tengo el IDE, lo que ves es lo que me lanza?.

Pues no tengo muchos años de programar, llevo pocos, aveces pues uno va aprendiendo poco a poco, y agradezco mucho que personas que sepan más que yo me indiquen como mejorarlo y hacerlo de la manera correcta.

Gracias Elektro, te informaré cuando lo resuelva y cómo lo hice.

En línea

Nunca me contestan -_-
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: Problema con formatos VB.NET 2010, Access 2007
« Respuesta #6 en: 6 Agosto 2014, 23:03 pm »

Ahora bien,¿ cómo hago yo para saber dónde está el error, si la aplicación no está donde tengo el IDE, lo que ves es lo que me lanza?.

Pues a menos que el Client se instale VS y sepa depurar y utilizar los breakpoints y comprobar los autos y etc... no se me ocurre como saberlo desde el lado del Server xD.

Creo que lo más lógico dado el caso sería que añadieses controles de errores (bloques de Try/Catch) en las partes del código que tu creas que puedan ser conflictivas, y al detectar la excepción mostrases un msgbox con todos los datos, como el método que lanzó el error y los valores que habia introducido al momento de la excepción, y el usuario no tendría más que copiar el texto de ese MsgBox para reportarte el problema, supongo que eso te ayudaría a estar mucho más cerca o resolver completamente el supuesto Bug.

Aquí tienes todo lo necesario para saber como mostrar los datos en el MsgBox:
· Exception Properties
( Las propiedades que deberías mostrar en mi opinión: Message, TargetSite, Source y StackTrace además de 'txtmonto.text' y en fin lo que tu consideres oportuno )

En fin, deberías hacer eso, optimizar los chequeos de tu App y cuando lo hayas echo pasarle la actualización del programa a ese Client ...y ya solo quedaría esperar a que diese error y te lo reportase.

Quizás esto también te pueda servir de algo en el asunto: [SOURCE] Elektro ErrorDialog aunque para mostrar el método desencadenante habría que hacerle algún retoque.

Un saludo



Reectifico, no me habia dado cuenta hasta ahora que la excepción de la imagen es de tipo Integer, no Double, por ende estás comprobando el bloque de código incorrecto.
lo más lógico sería antes de nada (antes de ponerte a hacer 1.000 chequeos de errores), comprobar las conversiones que haces en el código, es decir todas las conversiones de String a Integer (Cint(), Integer.tryparse, convert.toint32() etc... no se como lo estarás haciendo), una de ellas es la conflictiva, revisa eso.

Saludos
« Última modificación: 7 Agosto 2014, 10:12 am por Eleкtro » En línea



Yaldabaot

Desconectado Desconectado

Mensajes: 186


Ver Perfil
Re: Problema con formatos VB.NET 2010, Access 2007
« Respuesta #7 en: 6 Agosto 2014, 23:30 pm »

Gracias elektro por la atención, voy a verificarlo, te cuento como me va!.
En línea

Nunca me contestan -_-
Yaldabaot

Desconectado Desconectado

Mensajes: 186


Ver Perfil
Re: Problema con formatos VB.NET 2010, Access 2007
« Respuesta #8 en: 6 Agosto 2014, 23:33 pm »

 Dim count As Integer = Convert.ToInt32(cmd.ExecuteScalar())

Esa es la única rara, será esa?.
En línea

Nunca me contestan -_-
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: Problema con formatos VB.NET 2010, Access 2007
« Respuesta #9 en: 7 Agosto 2014, 10:11 am »

Dim count As Integer = Convert.ToInt32(cmd.ExecuteScalar())

Esa es la única rara, será esa?.

pues... sin probarlo no puedo decírtelo yo.

asegúrate de que el output que recibes de la cmd es númerico...

saludos.
En línea



Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines