Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Yaldabaot en 27 Julio 2014, 19:48 pm



Título: Problema con formatos VB.NET 2010, Access 2007[SOLUCIONADO]
Publicado por: Yaldabaot 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:


(http://imagizer.imageshack.us/v2/150x100q90/746/daDzM1.jpg) (http://imageshack.com/f/kqdaDzM1j)

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.


Título: Re: Problema con formatos VB.NET 2010, Access 2007
Publicado por: Yaldabaot en 30 Julio 2014, 16:12 pm
Nadie sabe??, les agradecería alguna idea o ayuda!.


Título: Re: Problema con formatos VB.NET 2010, Access 2007
Publicado por: Yaldabaot 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.  


Título: Re: Problema con formatos VB.NET 2010, Access 2007
Publicado por: Yaldabaot 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


Título: Re: Problema con formatos VB.NET 2010, Access 2007
Publicado por: Eleкtro 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) (http://msdn.microsoft.com/en-us/library/shxtf045%28v=vs.110%29.aspx)
· Double.ToString(String) (http://msdn.microsoft.com/en-us/library/kfsatb94%28v=vs.110%29.aspx)

Saludos


Título: Re: Problema con formatos VB.NET 2010, Access 2007
Publicado por: Yaldabaot 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.



Título: Re: Problema con formatos VB.NET 2010, Access 2007
Publicado por: Eleкtro 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 (http://msdn.microsoft.com/en-us/library/system.exception_properties%28v=vs.110%29.aspx)
( 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 (http://foro.elhacker.net/net/source_elektro_errordialog-t413792.0.html) 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


Título: Re: Problema con formatos VB.NET 2010, Access 2007
Publicado por: Yaldabaot en 6 Agosto 2014, 23:30 pm
Gracias elektro por la atención, voy a verificarlo, te cuento como me va!.


Título: Re: Problema con formatos VB.NET 2010, Access 2007
Publicado por: Yaldabaot en 6 Agosto 2014, 23:33 pm
 Dim count As Integer = Convert.ToInt32(cmd.ExecuteScalar())

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


Título: Re: Problema con formatos VB.NET 2010, Access 2007
Publicado por: Eleкtro 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.


Título: Re: Problema con formatos VB.NET 2010, Access 2007
Publicado por: Yaldabaot en 7 Agosto 2014, 22:59 pm
Elektro, ya lo conseguí!!!.

No se porque se nos ocurrió ver los permisos de administrador, y zaz!! nos funcionó, al parecer eran permisos de administrador de la aplicación y del archivo de base de datos, no se sabe porque el active directory lo desactivó.

Gracias por tu ayuda!.


Título: Re: Problema con formatos VB.NET 2010, Access 2007[SOLUCIONADO]
Publicado por: Eleкtro en 8 Agosto 2014, 18:31 pm
Aun queda la duda de como es posible que los permisos de usuario de "X" App influyan en el código hasta el punto de lanzar una excepción de Casteo? xD, ¿es posible que el objeto "cmd" sea un proceso que ejecutes vía CMD y al no tener permisos suficientes éste en lugar de devoler un valor numérico devolviese un mensaje de error (String) sobre los permisos o algo? ...esa podría ser una causa, bueno sea como sea me alegro de que lo hayas solucionado.

Saludos


Título: Re: Problema con formatos VB.NET 2010, Access 2007[SOLUCIONADO]
Publicado por: Yaldabaot en 8 Agosto 2014, 19:27 pm
Sinceramente no se cómo se resolvió y es algo extraño el error, porque era debido a permisos de administrador, pero supongo que el asunto anda por donde me dijiste,pero aún me queda esa duda porque ese comando CMD es un objeto oledb.command entonces no si es que eso se ejecuta por otra vía, cuando lo probamos con la misma cuenta pero con todos los permisos de administrador pues inserta perfectamente, tuvimos que restablecerlos todos y funcionó!!, cómo te digo ha sido un error muy dolor de cabeza y extraño pero lo solventamos, si alguien supiera la causa de ese error de casteo y que se solucionara por permisos de administrador pues bienvenido sea!, te agradezco mucho que estuvieras al tanto del caso, espero que esto ayude a muchas personas del foro que en un futuro tengan este problema.