Question

J'utilise Firedac TfdQuery pour insérer des valeurs dans la base de données Informix, en utilisant ci-dessous Snippet:

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;

Je suis capable de ne pas être prise en charge.J'ai même essayé la chaîne vide au lieu de mais encore une fois la même erreur.Pouvez-vous s'il vous plaît me guider avec l'utilisation appropriée de GetLastaututogenValue?J'utilise le pilote de pont dbexpress.

Était-ce utile?

La solution 3

Je l'ai fait fonctionner en utilisant la requête suivante dans ma procréation stockée:

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

et renvoie la même valeur dans Proc stocké.

Autres conseils

GetLastautogenValue prend en charge le retour de:

  1. la dernière valeur de champ automatiquement incrémentielle utilisée à insertion / poste pour Toutes les sources de données;
  2. la dernière valeur automatique d'auto-incrémentielle utilisée à EXECSQL / ExecProc pour les conducteurs de Firedac natif;
  3. la dernière valeur de la séquence / générateur pour les pilotes de FireDac natifs.L'argument GetLastaututogenValue est un nom de générateur / séquence.
  4. Firedac XE5 n'a pas de pilote natif pour Informix.Ainsi, (2) et (3) ne sont pas pris en charge pour Informix.Votre code est inséré avec exécuté, donc (1) n'est pas supporté également.Par conséquent, vous obtenez une "capacité non prise en charge".

vous pouvez contourner en exécutant la requête suivante juste après la requête d'insertion:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top