Ir al contenido


Foto

Parameter 'Nombre' Not Found, IBQuery + Firebird 2.5


  • Por favor identifícate para responder
8 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 22 enero 2015 - 03:06

Hola a Todos, estoy realizando inserción de datos a "pelos" a través de una clase, al realizar el registro me presenta el siguiente error:



delphi
  1. ---------------------------
  2. Gestorcomb
  3. ---------------------------
  4. Parameter 'NUM' not found.
  5. ---------------------------
  6. Aceptar 
  7. ---------------------------



Este es el codigo que llevo:



delphi
  1. procedure TSolicitud.CrearSolicitud(DB: TIBDatabase; Numero,Fecha: string; Suplidor,Estado: Integer; Nota: string);
  2. var
  3.   Insertar: TIBQuery;
  4.   Transaccion: TIBTransaction;
  5. begin
  6.   if DB = nil then Exit;
  7.  
  8.   Transaccion := TIBTransaction.Create(nil);
  9.   Transaccion.DefaultDatabase := DB;
  10.  
  11.   Insertar := TIBQuery.Create(nil);
  12.   Insertar.Transaction := Transaccion;
  13.   Insertar.SQL.Add('INSERT INTO SOLICITUDES(SOL_ID, SOL_NUMERO, SOL_FECHA, SUP_ID, SOL_STATUS, SOL_NOTA) VALUES('',:NUM,:FECHA,:SUP,:ESTADO,:NOTA)');
  14.   Insertar.ParamByName('NUM').AsString := Numero;
  15.   Insertar.ParamByName('FECHA').AsString := Fecha;
  16.   Insertar.ParamByName('SUP').AsInteger := Suplidor;
  17.   Insertar.ParamByName('ESTADO').AsInteger := Estado;
  18.   Insertar.ParamByName('NOTA').AsString := Nota;
  19.   Insertar.Prepare;
  20.   Transaccion.StartTransaction;
  21.   try
  22.     Insertar.ExecSQL;
  23.   except
  24.     Transaccion.Rollback;
  25.     raise;
  26.   end;
  27.  
  28.   FreeAndNil(Insertar);
  29.   FreeAndNil(Transaccion);
  30.  
  31. end;



Así es como la llamo:



delphi
  1. Solicitud.CrearSolicitud(FrmPrincipal.BaseDatos,edNumero.Text,DateToStr(edFecha.Date),cbSuplidor.ItemIndex,cbEstado.ItemIndex,edNota.Lines.Text);



No consigo ver donde está el problema.

Saludos.
  • 0

#2 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 22 enero 2015 - 03:32

a mi en alguna otra base de datos me llegó a ocurrir esto que comentas. Si observas la línea:

Insertar.SQL.Add('INSERT INTO SOLICITUDES(SOL_ID, SOL_NUMERO, SOL_FECHA, SUP_ID, SOL_STATUS, SOL_NOTA) VALUES('',:NUM,:FECHA,:SUP,:ESTADO,:NOTA)');
  Insertar.ParamByName('NUM').AsString := Numero;


Puedo deducir que tu componente no está creando los parámetros a partir de la consulta y el sígno :  por ello cuando intentas usarlo te marca error
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 22 enero 2015 - 03:54

He hecho este pequeño cambio y el problema persiste:



delphi
  1. procedure TSolicitud.CrearSolicitud(DB: TIBDatabase; Numero,Fecha: string; Suplidor,Estado: Integer; Nota: string);
  2. var
  3.   Insertar: TIBQuery;
  4.   Transaccion: TIBTransaction;
  5. begin
  6.   if DB = nil then Exit;
  7.  
  8.   Transaccion := TIBTransaction.Create(nil);
  9.   Transaccion.DefaultDatabase := DB;
  10.  
  11.   Insertar := TIBQuery.Create(nil);
  12.   Insertar.Transaction := Transaccion;
  13.   Insertar.SQL.Text := 'INSERT INTO SOLICITUDES(SOL_ID, SOL_NUMERO, SOL_FECHA, SUP_ID, SOL_STATUS, SOL_NOTA) VALUES('',:NUM,:FECHA,:SUP,:ESTADO,:NOTA)';
  14.   Insertar.Params.ParseSQL(Insertar.SQL.Text, True);
  15.   Insertar.Params.ParamByName('NUM').AsString := Numero;
  16.   Insertar.Params.ParamByName('FECHA').AsString := Fecha;
  17.   Insertar.Params.ParamByName('SUP').AsInteger := Suplidor;
  18.   Insertar.Params.ParamByName('ESTADO').AsInteger := Estado;
  19.   Insertar.Params.ParamByName('NOTA').AsString := Nota;
  20.   Insertar.Prepare;
  21.   Transaccion.StartTransaction;
  22.   try
  23.     Insertar.ExecSQL;
  24.   except
  25.     Transaccion.Rollback;
  26.     raise;
  27.   end;
  28.  
  29.   FreeAndNil(Insertar);
  30.   FreeAndNil(Transaccion);
  31.  
  32. end;



Pensé que con:



delphi
  1. .Params.ParseSQL();
  2. .Prepare;



Se encargaban de hacer eso que comentas poli  8o|
  • 0

#4 Nikolas

Nikolas

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 604 mensajes
  • LocationMar del Plata / Bs As / Argentina

Escrito 22 enero 2015 - 05:33

Si el ID queda vacio, entonces:



delphi
  1.   Insertar.SQL.Text := 'INSERT INTO SOLICITUDES(SOL_ID, SOL_NUMERO, SOL_FECHA, SUP_ID, SOL_STATUS, SOL_NOTA) VALUES(:ID,:NUM,:FECHA,:SUP,:ESTADO,:NOTA)';
  2.   Insertar.Params.ParseSQL(Insertar.SQL.Text, True);
  3.   Insertar.Params.ParamByName('ID').AsString := '';
  4.   Insertar.Params.ParamByName('NUM').AsString := Numero;
  5.   Insertar.Params.ParamByName('FECHA').AsString := Fecha;
  6.   Insertar.Params.ParamByName('SUP').AsInteger := Suplidor;
  7.   Insertar.Params.ParamByName('ESTADO').AsInteger := Estado;
  8.   Insertar.Params.ParamByName('NOTA').AsString := Nota;



si es un autonumerador, directamente no lo pongas.
  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 22 enero 2015 - 06:10

Vaya, ahora marca un error diferente: Transaction is Active.

Saludos.
  • 0

#6 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 22 enero 2015 - 07:22

He excluido el campo SOL_ID, imagino que es autoincremental y por eso lo pasas como nulo, además he protegido la transacción para que se libere en cualquiera de los casos, hay que poner cuidado en el formato en que estás pasando la fecha, si estás usando Firebird para ir a la fija es mejor usar '22.1.2014', con las comillas, de todas formas en el ejemplo uso la función QuotedStr para la fecha, prueba a ver que pasa.



delphi
  1. procedure TSolicitud.CrearSolicitud(DB: TIBDatabase; Numero, Fecha: string;
  2.   Suplidor, Estado: Integer; Nota: string);
  3. var
  4.   Insertar: TIBQuery;
  5.   Transaccion: TIBTransaction;
  6. begin
  7.   if DB = nil then
  8.     Exit;
  9.  
  10.   Transaccion := TIBTransaction.Create(nil);
  11.   try
  12.     Transaccion.DefaultDatabase := DB;
  13.  
  14.     Insertar := TIBQuery.Create(nil);
  15.     Insertar.Transaction := Transaccion;
  16.     Insertar.SQL.Text :=
  17.       'INSERT INTO SOLICITUDES(SOL_NUMERO, SOL_FECHA, SUP_ID, SOL_STATUS, SOL_NOTA) VALUES(:NUM,:FECHA,:SUP,:ESTADO,:NOTA)';
  18.     Insertar.Params.ParamByName('NUM').AsString := Numero;
  19.     Insertar.Params.ParamByName('FECHA').AsString := QuotedStr(Fecha);
  20.     Insertar.Params.ParamByName('SUP').AsInteger := Suplidor;
  21.     Insertar.Params.ParamByName('ESTADO').AsInteger := Estado;
  22.     Insertar.Params.ParamByName('NOTA').AsString := Nota;
  23.     Transaccion.StartTransaction;
  24.     try
  25.       Insertar.ExecSQL;
  26.     except
  27.       Transaccion.Rollback;
  28.       raise;
  29.     end;
  30.   finally
  31.     FreeAndNil(Insertar);
  32.     FreeAndNil(Transaccion);
  33.   end;
  34. end;



Saludos.
  • 0

#7 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 22 enero 2015 - 07:48

Revisando más a fondo, intenta cambiando el tipo de datos del parámetro fecha al igual que llamada, a( TDate o TDateTime), porque creo que es el parámetro problemático:



delphi
  1. procedure TSolicitud.CrearSolicitud(DB: TIBDatabase; Numero, Fecha: TDate;
  2.   Suplidor, Estado: Integer; Nota: string);
  3. var
  4.   Insertar: TIBQuery;
  5.   Transaccion: TIBTransaction;
  6. begin
  7.   if DB = nil then
  8.     Exit;
  9.  
  10.   Transaccion := TIBTransaction.Create(nil);
  11.   try
  12.     Transaccion.DefaultDatabase := DB;
  13.  
  14.     Insertar := TIBQuery.Create(nil);
  15.     Insertar.Transaction := Transaccion;
  16.     Insertar.SQL.Text :=
  17.       'INSERT INTO SOLICITUDES(SOL_NUMERO, SOL_FECHA, SUP_ID, SOL_STATUS, SOL_NOTA) VALUES(:NUM,:FECHA,:SUP,:ESTADO,:NOTA)';
  18.     Insertar.Params.ParamByName('NUM').AsString := Numero;
  19.     Insertar.Params.ParamByName('FECHA').AsDate := Fecha; // Podría ser también AsDAteTime, dependiendo la definición
  20.     Insertar.Params.ParamByName('SUP').AsInteger := Suplidor;
  21.     Insertar.Params.ParamByName('ESTADO').AsInteger := Estado;
  22.     Insertar.Params.ParamByName('NOTA').AsString := Nota;
  23.     Transaccion.StartTransaction;
  24.     try
  25.       Insertar.ExecSQL;
  26.     except
  27.       Transaccion.Rollback;
  28.       raise;
  29.     end;
  30.   finally
  31.     FreeAndNil(Insertar);
  32.     FreeAndNil(Transaccion);
  33.   end;
  34. end;



y la llamada



delphi
  1. Solicitud.CrearSolicitud(FrmPrincipal.BaseDatos,edNumero.Text,edFecha.Date,cbSuplidor.ItemIndex,cbEstado.ItemIndex,edNota.Lines.Text);



Saludos.
  • 0

#8 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 22 enero 2015 - 09:41

Saludos.

Tengo mucho tiempo que no uso los componentes IBX, pero según yo, creo que te faltaría asignar la propiedad de base de datos al TIBQuery.

Por cierto, creo que ellos tienen el componente TIBSql para usarlos en casos como estos si mal no recuerdo, son más veloces que los TIBQuery para estas operaciones.
  • 0

#9 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 22 enero 2015 - 09:50


Tengo mucho tiempo que no uso los componentes IBX, pero según yo, creo que te faltaría asignar la propiedad de base de datos al TIBQuery.


Hola Rolphy, un gusto en leerte, en realidad no hace falta, en este caso concreto la transacción sirve de puente entre el query y la conexión a la DB y funciona correctamente

Un cordial saludo.
  • 0




IP.Board spam blocked by CleanTalk.