Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   ¿Por qué no inserta? (https://www.clubdelphi.com/foros/showthread.php?t=41069)

deadsystems 07-03-2007 01:25:54

¿Por qué no inserta?
 
Hola, amigos del foro.

Tengo una aplicación donde quiero guardar en una base de datos en MS Access los datos que se introducen en un formulario que contiene edit's.
Cuando oprimo el boton guardar se debe ejecutar el siguiente código SQL

Código SQL [-]
  With Datamodule6 do begin
    With Guarda_Colega do begin
      Close;
      Active := True;
      With SQL do begin
        Clear;
        Text := 'INSERT INTO TColegas (indicativo, nombre, apellido1, apellido2) Values (:indicativo, :nombre, :apellido1, :apellido2)';
        ParamByName('indicativo').Value:=edit9.Text;
        ParamByName('nombre').Value:=edit5.Text;
        ParamByName('apellido1').Value:=edit6.Text;
        ParamByName('apellido2').Value:=edit7.Text;
        ExecSQL;
      end;
    end;
  end;

Sin embargo, cuando ejecuto el código me devuelve un error.

¿Qué estoy haciendo mal?

Saludos.

vtdeleon 07-03-2007 01:45:31

Que componentens usas>? ADO?, Si es el caso, antes de ParamByName va Parameter. (Parameter.ParamByName('nombre').Value)
Si es otro componente, entonces en vez de usar Value debes definirle el tipo de datos correspondiente, Por ejemplo AsString o AsInteger,...

Neftali [Germán.Estévez] 07-03-2007 11:19:05

Cita:

Empezado por deadsystems
Sin embargo, cuando ejecuto el código me devuelve un error.

¿Y el error es?????????

deadsystems 07-03-2007 15:07:25

Ahora el error que me devuelve es "Field value requiered. Field: indicativo."

jhonny 07-03-2007 15:29:25

Coloca un Break y haz un depurar, así te darás cuenta que edit9.Text; debe estar vació...

deadsystems 07-03-2007 15:38:16

El error esta en la línea:

Código Delphi [-]
   With SQL do begin

En el datamodule que utilizo tengo un Query donde en la propiedad SQL tengo:

Código SQL [-]
insert into TColegas (indicativo, nombre, apellido1, apellido2)
Values (indicativo, nombre, apellido1, apellido2)

saludos.

Lepe 07-03-2007 17:12:20

El error ahora es obvio la sql debe ser:
Código SQL [-]
insert into TColegas (indicativo, nombre, apellido1, apellido2)
Values (:indicativo, :nombre, :apellido1, :apellido2)

para indicar que cada "value" es un parámetro que debe ser suministrado con Parambyname.

PD: ¿Me llevo el gallifante? :D

Saludos

Lepe 07-03-2007 17:18:18

Pues no, parece que no me lo llevo :p

Código Delphi [-]

var Val:Variant;
begin
  With Datamodule6 do begin
    With Guarda_Colega do begin
      Close;
//      Active := True; No puede estar activa si vamos a modificar su SQL
      With SQL do begin
//        Clear;  //sobra, ya lo hace internamente
        Text := 'INSERT INTO TColegas (indicativo, nombre, apellido1, apellido2) Values (:indicativo, :nombre, :apellido1, :apellido2)';
        if edit9.Text = EmptyStr then
          Val := NULL
          else
          Val := edit9.text;       
        ParamByName('indicativo').Value:=Val;

// lo mismo que he hecho, para el resto de parámetros.
// Puedes reusar la variable Val, ya que siempre se le asigna un valor.

        ExecSQL;
      end;
    end;
  end;

vtdeleon 07-03-2007 22:46:37

Chanfle!, en la cara de uno!

Saludos

deadsystems 07-03-2007 23:07:59

Con el ejemplo de Lepe me da el error:

'Maximum validity check failed. Field: indicativo.'

jhonny 07-03-2007 23:41:37

Lo que sucede es que en tu BD mas exactamente en tu tabla tienes configurado un Check que restringe valores para que sean menores en ese campo a algun determinado valor (Que seria el valor que estas pasando como parametro).

deadsystems 07-03-2007 23:54:19

Yo tengo el campo indicativo con un tamaño de 8 catacteres y tan solo le paso 6, a lo sumo 7 que es el máximo permitido.

jhonny 08-03-2007 00:09:01

No estoy hablándote de el tamaño del campo si no de el dato en si pues debe haber un Check en la tabla; verifica los Check de tu tabla pues allí habrá alguno que este verificando ese dato.

Lepe 08-03-2007 01:52:23

Tambien puede ocurrir otro detalle:

En mi SQL he indicado los dos puntos seguido del nombre del campo, por ejemplo ":indicativo".... en ese caso no se interpreta como un parámetro sino como un nombre de campo, es decir en lugar de usar "Parambyname('indicativo')" debes usar "FieldByName('indicativo')"

Para que se considere un parámetro, debería ser los dos puntos seguido de "algo " que no sea el nombre del campo, por ejemplo "values (:prIndicativo, :prNombre, ...)"



Saludos

vtdeleon 08-03-2007 02:14:34

:eek: Y ese comportamiento?:eek: Que extraño me resulta esto.

Saludos


La franja horaria es GMT +2. Ahora son las 04:59:41.

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