Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo Hace 4 Semanas
Avatar de The Cid James
The Cid James The Cid James is offline
Miembro
 
Registrado: jun 2013
Posts: 122
Poder: 5
The Cid James Va por buen camino
could not convert variant of type (null) into type (string)

Bueno como me dice el error la variable no puede ser convertida si es null aca les dejo el codigo, estoy tratando de usar un TEdit y convertirlo a integer (que es el valor que la tabla guarda en ese campo)

Código Delphi [-]
procedure Tfcantidad.BCokClick(Sender: TObject);
var
a: integer;
begin
  a := StrToInt(Ecantidad.Text); // no se supone que aca le estoy dando un valor a la variable 
  if (strtoint(Ecantidad.Text)<=0)
    then
      begin
        Application.MessageBox('El valor ingresado debe ser mayor a O', 'Drugstore',mb_yesno+mb_iconquestion);
      end
  else
    a := fmodulo.tVentadetalle ['cantidad'];
    fmodulo.tVentadetalle ['id_producto'] := fmodulo.tProductos ['id_producto'];
    fmodulo.tVentadetalle['Precio_v'] := ( a * fmodulo.tProductos ['precio_vent']) ;

end;
__________________
We are told to remember the idea, not the man, because a man can fail. He can be caught, he can be killed and forgotten, but 400 years later, an idea can still change the world.
Responder Con Cita
  #2  
Antiguo Hace 4 Semanas
Soa Pelaez Soa Pelaez is offline
Miembro
 
Registrado: nov 2015
Posts: 83
Poder: 3
Soa Pelaez Va por buen camino
Debes validar antes que el edit no esté vacío, en caso de que lo este lo puedes completar con un 0 o abortar el proceso e informarle al usuario que el edit debe tener un valor.

if Trim(Ecantidad.Text) = '' //
//Opción 1 --> Aqui colocas una validación informando al usuario que el edit está vacío y que debe tener un valor.
//Opción 2 --> Si no le deseas informar al usuario puedes completar el edit con un valor 0

Lo importante es que asegures que antes de asignarlo a la variable entera contenga un valor.

Espero haber ayudado.
Responder Con Cita
  #3  
Antiguo Hace 4 Semanas
Avatar de movorack
[movorack] movorack is offline
Miembro
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.052
Poder: 12
movorack Va camino a la fama
Hola,

Cita:
Empezado por Soa Pelaez Ver Mensaje
Debes validar antes que el edit no esté vacío,
Si bien debes hacer la validación que te dice Soa, esta la puedes hacer usando TryStrToInt

Aunque creo que el error está en una de estas asignaciones:

Cita:
Empezado por The Cid James Ver Mensaje
Código Delphi [-]
procedure Tfcantidad.BCokClick(Sender: TObject);
begin
  //..  
    a := fmodulo.tVentadetalle ['cantidad'];

    fmodulo.tVentadetalle ['id_producto'] := fmodulo.tProductos ['id_producto'];
    fmodulo.tVentadetalle['Precio_v'] := ( a * fmodulo.tProductos ['precio_vent']) ;
  //..
end;
Verás. Ahí estás intentando obtener un valor variant del dataset por mucho que en la tabla este sea una varchar.

Lo que debes hacer es especificar el tipo de dato para ese campo al momento de usarlo.

Ej:

Código Delphi [-]
procedure Tfcantidad.BCokClick(Sender: TObject);
begin
  //..  
    a := fmodulo.tVentadetalle.Fields.FieldByName('cantidad').AsInteger;

    fmodulo.tVentadetalle.Fields.FieldByName('id_producto').AsInteger := fmodulo.tProductos .Fields.FieldByName('id_producto').AsInteger;
    fmodulo.tVentadetalle.Fields.FieldByName('Precio_v').AsFloat := ( a * fmodulo.tProductos .Fields.FieldByName('precio_vent').AsFloat) ;
  //..
end;

Si el campo es nulo, y haces el llamado con un AsString retornará una cadena vacía y si lo llamas con un AsInteger retornará un 0.

Recomendación: Haz este cambio en todo tu sistema. No sabrás cuando a algún usuario se le dé por jugar con los datos y cargar datos nulos donde nunca los esperarías.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #4  
Antiguo Hace 4 Semanas
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.834
Poder: 9
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
+1 a todo lo dicho por [movorack]

De todos modos, el codigo que publicaste esta raro y por eso te da problemas.
Primero convertis de string a Integer el contenido del edit, y lo guardas en una variable.
Luego, en lugar de usar esa variable, volves a convertir para la validacion.
Y despues de validar, asignas en la misma variable el valor de un campo de la tabla, osea el valor que asignaste al principio nunca lo usaste. Creo que eso responde al "no se supone que le estoy dando valor?"
Responder Con Cita
  #5  
Antiguo Hace 3 Semanas
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.159
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Otra opción a lo que te comenta movorack es poner la variable global NullStrictConvert a false. Eso hará que el valor NULL de un variant se convierta automáticamente dependiendo del tipo de datos de la variable a la que asignas (numérica: 0, booleana: false, string: cadena vacía).

LineComment Saludos
Responder Con Cita
  #6  
Antiguo Hace 3 Semanas
Avatar de The Cid James
The Cid James The Cid James is offline
Miembro
 
Registrado: jun 2013
Posts: 122
Poder: 5
The Cid James Va por buen camino
Cita:
Empezado por Soa Pelaez Ver Mensaje
Debes validar antes que el edit no esté vacío, en caso de que lo este lo puedes completar con un 0 o abortar el proceso e informarle al usuario que el edit debe tener un valor.

if Trim(Ecantidad.Text) = '' //
//Opción 1 --> Aqui colocas una validación informando al usuario que el edit está vacío y que debe tener un valor.
//Opción 2 --> Si no le deseas informar al usuario puedes completar el edit con un valor 0

Lo importante es que asegures que antes de asignarlo a la variable entera contenga un valor.

Espero haber ayudado.
Gracia mas que claro todo

Cita:
Empezado por movorack Ver Mensaje
Hola,


Si bien debes hacer la validación que te dice Soa, esta la puedes hacer usando TryStrToInt

Aunque creo que el error está en una de estas asignaciones:



Verás. Ahí estás intentando obtener un valor variant del dataset por mucho que en la tabla este sea una varchar.

Lo que debes hacer es especificar el tipo de dato para ese campo al momento de usarlo.

Ej:

Código Delphi [-]
procedure Tfcantidad.BCokClick(Sender: TObject);
begin
  //..  
    a := fmodulo.tVentadetalle.Fields.FieldByName('cantidad').AsInteger;

    fmodulo.tVentadetalle.Fields.FieldByName('id_producto').AsInteger := fmodulo.tProductos .Fields.FieldByName('id_producto').AsInteger;
    fmodulo.tVentadetalle.Fields.FieldByName('Precio_v').AsFloat := ( a * fmodulo.tProductos .Fields.FieldByName('precio_vent').AsFloat) ;
  //..
end;


Si el campo es nulo, y haces el llamado con un AsString retornará una cadena vacía y si lo llamas con un AsInteger retornará un 0.

Recomendación: Haz este cambio en todo tu sistema. No sabrás cuando a algún usuario se le dé por jugar con los datos y cargar datos nulos donde nunca los esperarías.
No sabia ese método muchas gracias, de todas formas como ya había tenido un error cargando datos me asegure que los campos necesarios sean "obligatorios" desde la base de datos. Con respecto a las declaraciones de los otros campos, trabajan bien no he tenido nungin problema con ellas y mandan todos los datos que necesito igual voy a leer lo que me pasaste para entenderlo, siempre es bueno entender mas cosas

Cita:
Empezado por AgustinOrtu Ver Mensaje
+1 a todo lo dicho por [movorack]

De todos modos, el codigo que publicaste esta raro y por eso te da problemas.
Primero convertis de string a Integer el contenido del edit, y lo guardas en una variable.
Luego, en lugar de usar esa variable, volves a convertir para la validacion.
Y después de validar, asignas en la misma variable el valor de un campo de la tabla, osea el valor que asignaste al principio nunca lo usaste. Creo que eso responde al "no se supone que le estoy dando valor?"
Eso en realidad iba dentro del else por la hora no se como quedo ahi xD

Cita:
Empezado por roman Ver Mensaje
Otra opción a lo que te comenta movorack es poner la variable global NullStrictConvert a false. Eso hará que el valor NULL de un variant se convierta automáticamente dependiendo del tipo de datos de la variable a la que asignas (numérica: 0, booleana: false, string: cadena vacía).

LineComment Saludos
Gracias a todos por las respuestas ahora me pongo a probar las opciones.
Saludos
__________________
We are told to remember the idea, not the man, because a man can fail. He can be caught, he can be killed and forgotten, but 400 years later, an idea can still change the world.

Última edición por The Cid James fecha: Hace 3 Semanas a las 22:00:09.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
could not convert variant of type (null) into type (string) davidmedina29 Varios 10 18-02-2016 14:00:56
Could not convert variant of type (olestr) into type (boolean) al ejecutar sp MarinaLR MS SQL Server 1 22-12-2015 17:51:29
Problema: type variant en campo a calcular Nicolas_2011 Varios 9 26-06-2012 18:16:37
Could not convert variant of type (Null) into type (Integer) Alejo15x Varios 2 30-11-2010 18:35:50
Sql que no retorna datos me da error:invalid variant type conversion bezaig SQL 6 17-03-2010 09:58:53


La franja horaria es GMT +2. Ahora son las 18:05:41.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi