Ir al contenido


Foto

FireDAC marca error extraño en consulta INSERT


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

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 23 junio 2016 - 08:11

Amigos, tengo un problema que no le encuentro ni pies ni cabeza, ésta es mi función para realizar una inserción de datos, sólamente en ésta función me está marcando un error extraño:


delphi
  1. function TOrdenTrabajoP.GenerarOT: Integer;
  2. var Insert: TFDQuery;
  3. begin
  4. Insert := TFDQuery.Create(nil);
  5. Insert.Connection := Datos.dbDatos;
  6. Insert.Transaction := Datos.trTransaccion;
  7. Insert.SQL.Clear;
  8. Insert.SQL.text := 'INSERT INTO OT_PREVENTIVO(veh_id,ot_fecha,ot_status,ot_vme_med,ot_vme_med_type) VALUES(:VME,:FECHA,:STATUS,:MED,:UND) RETURNING OT_ID';
  9. Insert.ParamByName('vme').AsInteger := OVmeID;
  10. Insert.ParamByName('fecha').AsDateTime := now;
  11. Insert.ParamByName('status').AsInteger := 0; //Pendiente de aprobacion of. técnica
  12. Insert.ParamByName('med').AsFloat := OMedidor;
  13. Insert.ParamByName('und').AsInteger := OMedTipo;
  14.  
  15. Datos.trTransaccion.StartTransaction;
  16. try
  17. Insert.Open;
  18. except
  19. on E:EFDDBEngineException do begin
  20. MessageDLG(E.Message,mtError,[mbOk],0);
  21. Datos.trTransaccion.Rollback;
  22. Abort;
  23. end;
  24. end;
  25.  
  26. Datos.trTransaccion.Commit;
  27.  
  28. Result := Insert.Fields[0].AsInteger;
  29.  
  30. Insert.Free;
  31. end;

Éste es el error que marca y no le encuentro el problema, la consulta copio y pego en ibexpert y funciona sin problemas:

 

[Window Title]
Error

[Content]
[FireDAC][Phys][FB]Dynamic SQL Error
SQL error code = -104
Token unknown - line 2, column 1
INSERT

[OK]

 

 

¿Alguna idea?


  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 23 junio 2016 - 08:53

Me he dado cuenta, que sucede debido a las transacciones, sin una transacción asignada a la base de datos ella funciona correctamente, ¿que propiedades debo verificar para que funcione ese tipo de consulta?.


  • 0

#3 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 23 junio 2016 - 08:53

Amigos, tengo un problema que no le encuentro ni pies ni cabeza, ésta es mi función para realizar una inserción de datos, sólamente en ésta función me está marcando un error extraño:


delphi
  1. function TOrdenTrabajoP.GenerarOT: Integer;
  2. var Insert: TFDQuery;
  3. begin
  4. Insert := TFDQuery.Create(nil);
  5. Insert.Connection := Datos.dbDatos;
  6. Insert.Transaction := Datos.trTransaccion;
  7. Insert.SQL.Clear;
  8. Insert.SQL.text := 'INSERT INTO OT_PREVENTIVO(veh_id,ot_fecha,ot_status,ot_vme_med,ot_vme_med_type) VALUES(:VME,:FECHA,:STATUS,:MED,:UND) RETURNING OT_ID';
  9. Insert.ParamByName('vme').AsInteger := OVmeID;
  10. Insert.ParamByName('fecha').AsDateTime := now;
  11. Insert.ParamByName('status').AsInteger := 0; //Pendiente de aprobacion of. técnica
  12. Insert.ParamByName('med').AsFloat := OMedidor;
  13. Insert.ParamByName('und').AsInteger := OMedTipo;
  14.  
  15. Datos.trTransaccion.StartTransaction;
  16. try
  17. Insert.Open;
  18. except
  19. on E:EFDDBEngineException do begin
  20. MessageDLG(E.Message,mtError,[mbOk],0);
  21. Datos.trTransaccion.Rollback;
  22. Abort;
  23. end;
  24. end;
  25.  
  26. Datos.trTransaccion.Commit;
  27.  
  28. Result := Insert.Fields[0].AsInteger;
  29.  
  30. Insert.Free;
  31. end;

Éste es el error que marca y no le encuentro el problema, la consulta copio y pego en ibexpert y funciona sin problemas:

 

 

¿Alguna idea?

 

 

No debería ser ?

  1. try
  2. Insert.Execsql; // <- cambio aquí
  3. except
  4. on E:EFDDBEngineException do begin
  5. MessageDLG(E.Message,mtError,[mbOk],0);
  6. Datos.trTransaccion.Rollback;
  7. Abort;
  8. end;
  9. end;
 
Saludox ! :)

  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 23 junio 2016 - 08:59

No, cuando se trata de la declaración RETURNING se utiliza Open o OpernOrExecute, es una especie de SELECT que te devuelve un recordset, en este caso el ID generado en el campo OT_ID, funciona correctamente si NO le asigno una transacción al TFDConnection, si le asigno una pues sucede eso.

 

Saludos.


  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 23 junio 2016 - 09:49

Ya pude resolver ese problema, tuve que crear un Stored Procedure y usar el TFDStoredProc, aquí no genera problemas, pero aún me intriga ese caso usando TFDQuery.


  • 0

#6 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 23 junio 2016 - 10:10

amigo enecumene, yo nunca utilizo componentes para la transaccion. Directamente utilizo los metodos de TFDConnection, que aparentemente si no tiene su propiedad Transaction asignada, crea un objeto interno para manejarlo. No he estudiado el codigo asi que no estoy muy seguro de como hace su trabajo, pero si puedo decir que lo hace bien

 

Un esqueleto general de como lo hago:


delphi
  1. procedure ...;
  2. var
  3. qry: TFDQuery;
  4. begin
  5. qry := TFDQuery.Create(nil);
  6. try
  7. // asigno la conexion, supongamos que es variable global/instancia/parametro del metodo
  8. qry.Connection := Connection;
  9. // sentencia sql
  10. qry.SQL.Text := '....';
  11. // tipo de datos de cada parametro
  12. qry.ParamByName('...').DataType := TFieldType.ftXXX;
  13. // valores para cada parametro
  14. qry.ParamByName('...').DataType := Value;
  15.  
  16. Connection.StartTrans;
  17. try
  18. qry.Open; // o .ExecSQL;
  19. Connection.Commit;
  20. except
  21. Connection.Rollback;
  22. raise;
  23. end;
  24. finally
  25. qry.Free;
  26. end;
  27. end;


Editado por Agustin Ortu, 23 junio 2016 - 10:11 .

  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 24 junio 2016 - 06:33

Pues la verdad no sabía que el mismo TFDconnection realizaba las transacciones, en un principio mi sistema era monousuario y todo funcionaba bien, incluso la consulta de este tema, ahora es multiusuario y en red, trabajaba bien, excepto que los datos se reflejaban sólo cuando se desconectaba la base de datos, y eso que tiene su propiedad autocommit tildada, asi que tuve que recurrir al uso de las transacciones y ahora los datos se reflejan sin necesidad de desconectar la BD.


  • 0




IP.Board spam blocked by CleanTalk.