Pregunta

Estoy usando Firedac TFDQUERY para insertar valores en la base de datos Informix, usando el fragmento de código a continuación:

with QHeaderQuery do
begin
  if not (Prepared) then
  begin
    {DatabaseName := Sessions.CurrentSession.Databases[0].DatabaseName;
    SessionName := Sessions.CurrentSession.SessionName;}
    Connection := FDManager.Connections[0];
    SQL.Clear;
    SQL.Add('insert into asptheade ( ');
    SQL.Add('theade_trans, theade_store,  theade_register, theade_location, ');
    SQL.Add('theade_date, theade_cashier, theade_type, theade_name, ');
    SQL.Add('theade_salesperson, theade_group, theade_group_disc, ');
    SQL.Add('theade_comm_flag, theade_comm_price, theade_cust_code, ');
    SQL.Add('theade_sub_total, ');
    SQL.Add('theade_tax_total, theade_disc_total, theade_grand_total, ');
    SQL.Add('theade_change_amt, theade_drawertime, theade_posted_date, theade_gratuity) ');
    SQL.Add('values ( :d0, :d1, :s2, :s3, ');
    SQL.Add(' current year to second, :s4, :s5, :s6, ');
    SQL.Add(':s7, :s8, :f9, ');
    SQL.Add(':s10, :s11, :s12, :f13, ');
    SQL.Add(':f14, :f15, :f16, :f17, :f18, :f19, :f20 ) ');
    Prepared := True;
  end;
  {SQL.Add( Format( 'values ( %d, %d, "%s", "%s", ',  }
  Params[0].AsInteger := FTrans;
  Params[1].AsInteger := FStore;
  Params[2].AsString := FRegister;
  Params[3].AsString := FLocation;
  {SQL.Add( Format( ' current, "%s", "%s", "%s", ',    }
  Params[4].AsString := FCashier;
  Params[5].AsString := FTransType;
  Params[6].AsString := FStatementText;
  {SQL.Add( Format( '"%s", "%s", %f, ',}
  Params[7].AsString := FSalesPerson;
  Params[8].AsString := FDiscGroup;
  Params[9].AsFloat := FDiscRate * 100;
  {SQL.Add( Format( '"%s", "%s", "%s", %f, ',}
  Params[10].AsString := FCommFlag;
  Params[11].AsString := FCommPrice;
  Params[12].AsString := FCustCode;
  Params[13].AsFloat := FSubTotal;
  {SQL.Add( Format( '%f, %f, %f, %f ) ',}
  Params[14].AsFloat := FTaxTotal;
  Params[15].AsFloat := FDiscTotal;
  Params[16].AsFloat := FGrandTotal;
  Params[17].AsFloat := FChangeAmt;
  Params[18].AsDateTime := FDrawerTime;
  Params[19].AsDateTime := FServiceDate;
  Params[20].AsFloat := FGratuity;

  Execute;
  FValid := True;
end;
FTrans :=   FDManager.Connections[0].GetLastAutoGenValue('asptheade');
QHeaderQuery.Close;

No estoy recibiendo capacidad de competencia.Incluso probé una cadena vacía en lugar de pero de nuevo el mismo error.¿Puedes por favor guiarme con el uso adecuado de GetLastautogenValue?Estoy usando Dbexpress Bridge Driver.

¿Fue útil?

Solución 3

Hice que funcione utilizando la siguiente consulta en mi PROC almacenado:

SELECT DBINFO('sqlca.sqlerrd1') FROM SYSTABLES WHERE tabname = '<tablename>'

y devuelve el mismo valor en el proceso almacenado.

Otros consejos

GetLASTAUTOGENVALUE Soporta el regreso de:

  1. El último valor de campo incremental utilizado en la inserción / publicación para todas las fuentes de datos;
  2. El último valor automático incremental utilizado en EXECSQL / Execproc para conductores nativos de Firedac;
  3. El último valor de la secuencia / generador para los conductores nativos de Firedac.El argumento GetLastautoGalue es un nombre generador / secuencia.
  4. Firedac XE5 no tiene controlador nativo para Informix.Entonces, (2) y (3) no son compatibles con Informix.Su código se inserta con Ejecutar, por lo que (1) tampoco es compatible.En consecuencia, usted está obteniendo "Capacidad no compatible".

Puede solucionarlo alternar al ejecutar la siguiente consulta justo después de la consulta de inserción:

SELECT DBINFO('sqlca.sqlerrd1') FROM SYSTABLES WHERE tabname = 'systables'

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top