Jump to content


Photo

Parameter 'Nombre' Not Found, IBQuery + Firebird 2.5


  • Please log in to reply
8 replies to this topic

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 22 January 2015 - 03:06 PM

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
  • 4945 posts
  • LocationMéxico

Posted 22 January 2015 - 03:32 PM

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
  • 7419 posts
  • LocationRepública Dominicana

Posted 22 January 2015 - 03:54 PM

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 posts
  • LocationMar del Plata / Bs As / Argentina

Posted 22 January 2015 - 05:33 PM

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
  • 7419 posts
  • LocationRepública Dominicana

Posted 22 January 2015 - 06:10 PM

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

Saludos.
  • 0

#6 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2137 posts

Posted 22 January 2015 - 07:22 PM

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
  • 2137 posts

Posted 22 January 2015 - 07:48 PM

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
  • 2092 posts
  • LocationRepública Dominicana

Posted 22 January 2015 - 09:41 PM

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
  • 2137 posts

Posted 22 January 2015 - 09:50 PM


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.