Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Sentencia Update con Boolean

Estas en el tema de Sentencia Update con Boolean en el foro de Visual Basic clásico en Foros del Web. Hola, la otra vez tuve un problema para insertar checkBox en una tabla access, y ahora no puedo actualizar la tabla, me pone un cartel ...
  #1 (permalink)  
Antiguo 07/06/2008, 19:27
 
Fecha de Ingreso: abril-2008
Mensajes: 425
Antigüedad: 16 años
Puntos: 2
Sentencia Update con Boolean

Hola, la otra vez tuve un problema para insertar checkBox en una tabla access, y ahora no puedo actualizar la tabla, me pone un cartel que no coinciden los tipos de datos
la sentencia es
cn.Execute "UPDATE perfiles SET codperfil= '" & TxtCodigo.Text & "',nombre= '" & TxtNombre.Text & "',tipocomprobante= " + ChkTC.Value + ",comprobante= " + ChkC.Value + " ,sucursal= " + ChkS.Value + " ,perfil=" + ChkP.Value + " ,usuario=" + ChkU.Value + " ,listado= " + ChKl.Value + " ,auditoria=" + chkA.Value + " WHERE codperfil= '" & TxtCodigo.Text & "'"

alguien me puede decir como van los checkbox?? porque esta misma sentencia la uso en otras tabalas sin boolean y funciona.

Desde ya muchas gracias!
  #2 (permalink)  
Antiguo 08/06/2008, 00:49
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: Sentencia Update con Boolean

Hola, el problema no creo que sea con los CheckBox sino con el campo codperfil que seguramente será numérico y le tienes que quitar las comillas:

cn.Execute "UPDATE perfiles SET codperfil= '" & TxtCodigo.Text & "',nombre= '" & TxtNombre.Text & "',tipocomprobante= " & ChkTC.Value & ",comprobante= " & ChkC.Value & " ,sucursal= " & ChkS.Value & " ,perfil=" & ChkP.Value & " ,usuario=" & ChkU.Value & " ,listado= " & ChKl.Value & " ,auditoria=" & chkA.Value & " WHERE codperfil= " & TxtCodigo.Text

Nota: Te aconsejo que para concatenar valores utilices el signo de ampersand (&) en vez del signo más (+), evitarás problemas.

  #3 (permalink)  
Antiguo 08/06/2008, 05:42
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Respuesta: Sentencia Update con Boolean

La checkbox no devuelve un tipo Boolean, si no numérico (0: desmarcado; 1: marcado; 2, semiseleccionado). Si quieres concatenarlo como booleano en una sentencia, en lugar de utilizar el valor devuelto directamente, utiliza la función IIf de esta forma:

..." ,listado= " & IIf(ChKl.Value=1, "True", "False) & " ,auditoria="...

También, una buena forma de comprobar dónde está el fallo es detener el programa en esa línea, obtener el resultado de la concatenación con Debug, e intentar ejecutarlo directamente contra el gestor de base de datos, que probablemente te diga exactamente qué es lo que está fallando.

Bueno, y aprovecho para saludar, que este es mi primer post
  #4 (permalink)  
Antiguo 08/06/2008, 10:02
 
Fecha de Ingreso: abril-2008
Mensajes: 425
Antigüedad: 16 años
Puntos: 2
Respuesta: Sentencia Update con Boolean

Hola, lo probe con el debug, y me levanta todos los datos del checkbox, y para evitar problemas tengo los txt declarados como texto....eso es lo que mas me llama la atencion.
gracias por responder
  #5 (permalink)  
Antiguo 08/06/2008, 14:47
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Pregunta Respuesta: Sentencia Update con Boolean

¿Puedes postearnos la cadena con los valores tal cual se envía a Execute en tiempo de ejecución y los tipos con que has declarado los campos de la tabla?
  #6 (permalink)  
Antiguo 08/06/2008, 16:24
 
Fecha de Ingreso: abril-2008
Mensajes: 425
Antigüedad: 16 años
Puntos: 2
Respuesta: Sentencia Update con Boolean

Hola, disculpame pero no entiendo ..... la cadena esta posteada arriba, o queres la declaracion de la conexion??
  #7 (permalink)  
Antiguo 09/06/2008, 03:38
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Respuesta: Sentencia Update con Boolean

Me refiero a que detengas la ejecución del programa en esa línea y copies la cadena tal cual se lanza, una vez concatenados los valores, hacia la función Execute.

Sustituye la línea Execute "UPDATE ..." por:

Código:
Dim SQL As String

SQL = "UPDATE perfiles SET codperfil= '" & TxtCodigo.Text & "',nombre= '" & TxtNombre.Text & "',tipocomprobante= " & ChkTC.Value & ",comprobante= " & ChkC.Value & " ,sucursal= " & ChkS.Value & " ,perfil=" & ChkP.Value & " ,usuario=" & ChkU.Value & " ,listado= " & ChKl.Value & " ,auditoria=" & chkA.Value & " WHERE codperfil= " & TxtCodigo.Text 

Debug.Print SQL
Debug.Assert False

cn.Execute SQL
Cuando ejecutes, el programa se detendrá en la línea "Debug.Assert", y tendrás en la ventana de depuración la cadena UPDATE completa. Copiala de ahí y postéala aquí, a ver qué es lo que realmente se está enviando a Execute, y te podremos ayudar mejor.
  #8 (permalink)  
Antiguo 10/06/2008, 11:17
 
Fecha de Ingreso: abril-2008
Mensajes: 425
Antigüedad: 16 años
Puntos: 2
Respuesta: Sentencia Update con Boolean

Esto es lo que manda el depurador.. aparentemente esta todo ok, ya que es la modificacion indicada....no se cual puede ser el problema..

UPDATE perfiles SET codperfil= '34',nombre= 'prueba',tipocomprobante= 1,comprobante= 0 ,sucursal= 1 ,perfil=0 ,usuario=1 ,listado= 0 ,auditoria=1 WHERE codperfil= 34
  #9 (permalink)  
Antiguo 11/06/2008, 00:42
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Respuesta: Sentencia Update con Boolean

Hola!

Me atrevo a deducir que los campos tipocomprobante, comprobante, sucursal, perfil, usuario, listado y auditoria son de tipo booleano (tipo "Si/No" en Access)... si ese es el caso, fíjate que les estás asignando 0 (cero) o 1, cuando siendo booleanos el dato que aceptan es únicamente True o False.

Prueba a utilizar esta concatenación en lugar de la tuya, a ver si te funciona:

Código:
SQL = "UPDATE perfiles SET codperfil= '" & TxtCodigo.Text & _
      "',nombre= '" & TxtNombre.Text & _
      "',tipocomprobante= " & Iif(ChkTC.Value=1, "True", "False") & _
      ",comprobante= " & Iif(ChkC.Value=1, "True", "False") & _
      " ,sucursal= " & Iif(ChkS.Value=1, "True", "False") & _
      " ,perfil=" & Iif(ChkP.Value=1, "True", "False") & _
      " ,usuario=" & Iif(ChkU.Value=1, "True", "False") & _
      " ,listado= " & Iif(ChKl.Value=1, "True", "False") & _
      " ,auditoria=" & Iif(chkA.Value=1, "True", "False") & _
      " WHERE codperfil= " & TxtCodigo.Text
(fíjate en que no se concatena directamente el valor del checkbox, que siempre es uno o cero).

La función IIf lo que hace es evaluar el primer parámetro, igual que un If normal, y devolver el segundo parámetro si la condición es cierta, o el segundo si es falsa; eso significa que "IIf(ChkA.Value=1, "True", "False")" devuelve la cadena "True" si ChkA.Value es 1 y la cadena "False" si ChkA.Value no es uno, porque recuerda que también puede admitir el valor 2.
  #10 (permalink)  
Antiguo 11/06/2008, 04:21
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: Sentencia Update con Boolean

Cita:
Iniciado por analoyra Ver Mensaje
Hola, lo probe con el debug, y me levanta todos los datos del checkbox, y para evitar problemas tengo los txt declarados como texto....eso es lo que mas me llama la atencion.
gracias por responder
los txt ¿te refieres a los campos de la tabla?
¿Todos están declarados como texto, incluso "sucursal", "perfil", "usuario".. y "codperfil"?

  #11 (permalink)  
Antiguo 11/06/2008, 12:44
 
Fecha de Ingreso: abril-2008
Mensajes: 425
Antigüedad: 16 años
Puntos: 2
Respuesta: Sentencia Update con Boolean

Hola, muchas gracias , ese el caso que decia, Txoco tiene razon . los tipo texto son txtnombre y txtcodigo, los demas son boolean.
Gracias por la ayuda
  #12 (permalink)  
Antiguo 11/06/2008, 15:08
Colaborador
 
Fecha de Ingreso: enero-2008
Ubicación: Unas veces aquí, otras veces allí
Mensajes: 1.482
Antigüedad: 16 años, 3 meses
Puntos: 37
Respuesta: Sentencia Update con Boolean

A ver si lo entiendo!

¿El campo codperfil, es boolean??

Y no hablamos de cómo sean los Textox o CheckBox (eso es evidente) sino cómo están (qué tipo tienen en la tabla).

y al hacer la consulta no tienes que hacer ninguna comparación IIF los ChechBox siempre devuelven un valor de 0 o 1, es decir True o False.

No se si se resolvió tu problema, pero si es así deberías indicarlo.

  #13 (permalink)  
Antiguo 12/06/2008, 00:42
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Respuesta: Sentencia Update con Boolean

En VB, 1 ó 0 no es lo mismo que True o False, puesto que el primer caso es numérico (byte como mínimo) y el segundo es Boolean, que es un tipo de por sí. En muchos lenguajes, se "comprimen" las variables booleanas de tal forma que en un byte se almacenen hasta 8 de ellas, o bien se utiliza un único bit de los 8 de byte.

Por esta razón, 2 también puede ser True, igual que 32.

En c y c++, por ejemplo, no existe el boolean como tal, y se considera que toda variable numérica es False si vale cero y True en caso contrario, pero en VB, y en todas las bases de datos que conozco, son tipos diferentes, por lo que "campo=1" no es lo mismo que "campo=True", y puede fallar.

Analoyra tenía dos soluciones: bien la que le he propuesto, que es "la óptima" (como decía un profesor mío), o bien cambiar el tipo de los campos en la base de datos por numéricos (byte, para no desperdiciar espacio)
  #14 (permalink)  
Antiguo 13/06/2008, 10:15
 
Fecha de Ingreso: abril-2008
Mensajes: 425
Antigüedad: 16 años
Puntos: 2
Respuesta: Sentencia Update con Boolean

Hola, los checkbox son boolean, es decir se refieren solo a permisos, true o false, lo resolvi de una manera que no me gusta porque use varias lineas de codigo mas.
si es posible quisiera resolverlo de una manera que sea la correcta
  #15 (permalink)  
Antiguo 13/06/2008, 11:51
Avatar de Txoco  
Fecha de Ingreso: junio-2008
Ubicación: Perdido en tierras Quijotescas
Mensajes: 189
Antigüedad: 15 años, 11 meses
Puntos: 7
Respuesta: Sentencia Update con Boolean

Hola!

No confundas los checkboxes, porque no son booleanos, ya que aunque tu lo veas como "marcado/no marcado" (true/false), realmente son numéricos, porque te devuelve 1 ó 0. Te recuerdo que puedes configurar un checkbox para que te devuelva un 2. Para verlo, despliega la propiedad Value de un checkbox cualquiera y verás que tiene las siguientes posibilidades:

0 - Unchecked
1 - Checked
2 - Grayed

Por eso no puede ser booleano. Tampoco lo confundas con que apunte a un campo booleano, porque sigue devolviendo un número (de hecho, un Integer, 16 bits), y debes hacer la conversión a mano.

La forma correcta es hacer la concatenación comparando la propiedad Value con 1 ó 0, y puedes hacerlo en una única línea (como te recomendé, con IIf), o en varias instrucciones como esta, una por cada control:

Código:
    ....
    SQL = SQL & ", TipoComprobante="
    If ChkTC.Value = 1 Then
        SQL = SQL & "True"
    Else
         SQL = SQL & "False"
    End If

    SQL = SQL & ", Comprobante="
    If ChkC.Value = 1 Then...
Las dos formas son igual de buenas... y las únicas. Lo normal además es que las bases de datos no consideren "1" como "True" de forma automática.
  #16 (permalink)  
Antiguo 13/06/2008, 13:10
 
Fecha de Ingreso: abril-2008
Mensajes: 425
Antigüedad: 16 años
Puntos: 2
Respuesta: Sentencia Update con Boolean

Ahh!! OK, los check estan declarados en la base de datos como boolean, pero realimente si se me habia creado un confusion...
Igual lo que hice fue algo asi
rsAux.Open "Select * from Perfiles", cn, adOpenKeyset, adLockOptimistic
With Rs
.AddNew
Rs(0) = TxtCodigo.Text
Rs(1) = TxtNombre.Text
If ChkTC.Value = vbChecked Then
Rs(2) = 1
Else
Rs(2) = 0
End If
If ChkC.Value = vbChecked Then
Rs(3) = 1
Else
Rs(3) = 0
End If

Por lo que posteaste no esta tan mal lo que pense.... Gracias
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:09.