Incompatibilidad entre el tipo de operador y el tipo de operando

Tengo una tabla OPERADORAS, con los campos:
IdOperadora (integer autoin)
oper_nombre (char)
oper_clave (char)
Tengo un formulario :

en el comboBox listo el Id de cada operadora: 1,2,3,4, etc.
en el textBox se ingresa la clave de la operadora.

Para saber si tiene acceso al sistema hago la sigt consulta (botón INGRESAR):

---------------------------------------------------------
SELECT * FROM operadoras INTO CURSOR cOperClave

IF cOperClave.clave=thisform.txtClave.Value then
    IF cOperClave.idOperadora=thisform.cmbIdoperadora.Value then
MESSAGEBOX('Contraseña correcta')
ENDIF
ELSE
         MESSAGEBOX('Contraseña NO correcta')
Endif
----------------------------------------------------------
La consulta y los IF's los hice así para detectar el error.
El error que me apunta es en el 2do. IF, me sale este mensaje:

"Incompatibilidad entre el tipo de operador y el tipo de operando"

Ya comprobé que el tipo de dato que captura el comboBox es numérico.

Si en el IF del problema pongo un número no me da error:

------------------------------------------------
IF cOperClave.idOperadora=14 then
              MESSAGEBOX('Contraseña correcta')
Endif
------------------------------------------------

¿Qué está mal?
Me interesa resolver esto, pues en los formulario/reportes se usará los campos del tipo Id(integer autoin) para mostrar los resultados, por ejemplo, que liste todas las ventas del IdProducto=154

2 Respuestas

Respuesta
1

Es un placer saludarte. Espero poder ayudarte.

Lo que en sazon veo que intentas hacer es un form de login. ¿Cómo "alimentas" tu combo? Si el error era por tipos de datos... es bueno asegurarse siempre de la fuente de datos que alimentan nuestros controles...! Los combos tiene cierto comportamiento especial. ¿Cómo habias definido la fuente de datos del combo? ¿Con valores? ¿Con un campo de un cursor? Una consulta SELECT?

Enhora buena que encontrastes la solucion.

Ahora... en esta linea:

cOperClave.clave=thisform.txtClave.Value then

¿El tipo de datos del campo y del control son caracter? De ser asi, te aconsejo utilices la funcion ALLTRIM() para quitar cualquier espacio en blanco que pudiesen tener, ya sea el dato en el registro del cursor o el control al escribir. Las claves de acceso (y todos los datos... un poco mas general) deben validarse tal cual existen. Por ejemplo: si mi clave de acceso es komatsu y al escribir dejo un espacio y queda " komatsu"... al validar con el campo, no podras acceder porque el espacio en blanco hace que la expresion no sea la misma. Igual.. recorta los espacios en blanco en el campo del cursor. Asi te aseguras de validar ambas fuentes al 100%.

Ahora... ya en terminos generales... para un form login, yo aconsejo cargar primero la tabla o cursor y realizar una busqueda sobre los registros con seek o LOCATE FOR. Imagina la posibilidad que el cursor no se cargue, o que el primer dato sea null o empty... (utiliza _TALLY para saber si el cursor tiene registros... ISNULL para verificar que el primer campo y el primer registro no es nulo o EMPTY para ver si no este vacio)... se armaria un kilombo con tu validacion.

Aca, en mi blog, tengo una entrada sobre como diseñar un form de login... podria ser de utilidad para vos. Te adjunto el Link

http://ravennfoxpro.blogspot.com/2012/11/crear-disenar-un-formulario-de-acceso.html 

Bien... cualquier cosa, avisame. Estoy a la orden.

Desde Managua, Nicaragua!

Ravenn :D :D :D

Respuesta
2

Ya encontré la solución, el tipo de campo que se almacena en
thisform.cmbIdoperadora.Value no es numérico.
Lo descrubrí usando la función VARTYPE() la cual indicaba que
thisform.cmbIdoperadora.Value era del tipo Char.

Al parecer VARTYPE() es más confiable que TYPE(), pues cuando
usaba TYPE(), me decía que thisform.cmbIdoperadora.Value era Numérico.

En conclusión, para que funcione el IF

----------------------------------------------------------------
IF cOperClave.idOperadora=thisform.cmbIdoperadora.Value then
       MESSAGEBOX('Contraseña correcta')
ENDIF
----------------------------------------------------------------

Lo cambié por:

---------------------------------------------------------------------
IF cOperClave.idOperadora=VAL(thisform.cmbIdoperadora.Value) then
        MESSAGEBOX('Contraseña correcta')
ENDIF
---------------------------------------------------------------------

Ahora sí compara numérico con numérico.

De todas manera si alguien tiene otra sugerencia se lo agradezco de
antemano.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas