Используя getlastautogenvalue.
-
22-12-2019 - |
Вопрос
Я использую Firedac TFDQuery, чтобы вставить значения в базе данных Informix, используя ниже фрагмент кода:
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;
.
Я получаю возможность не поддерживаться.Я даже попробовал пустую строку вместо того, но опять же одинаковую ошибку.Можете ли вы вести меня с правильным использованием getlastautogenvalue?Я использую драйвер моста DBExpress.
Решение 3
Я сделал это работать, используя следующий запрос в моем хранимом количестве:
SELECT DBINFO('sqlca.sqlerrd1') FROM SYSTABLES WHERE tabname = '<tablename>'
.
и вернуть одинаковое значение в хранящемся proc.
Другие советы
getlastautogenvalue поддерживает возвращение:
- последнее автоматическое увеличение значения поля, используемое при вставке / посте для Все источники данных;
- Последнее автоматическое постепенное значение, используемое на execsql / Execproc для родных драйверов Firedac;
- Последнее значение последовательности / генератора для собственных драйверов FireDac.Аргумент GetLastautogenValue - это имя генератора / последовательности.
firedac xe5 не имеет родного драйвера для Informix.Итак, (2) и (3) не поддерживаются для Informix.Ваш код вставляет с выполнением, поэтому (1) тоже не поддерживается.Следовательно, вы получаете «возможности не поддерживаются».
Вы можете обработать, выполнив следующий запрос сразу после вставки QUERY:
SELECT DBINFO('sqlca.sqlerrd1') FROM SYSTABLES WHERE tabname = 'systables'
.