Другими словами, вы хотите создать диалог с осведомленных управления без данных. Для этого вам нужно три TSQLQueries: один для извлечения данных при входе в диалог (в случае редактирования данных), один для вставки и один для обновления.
Вот какой-то отредактированный код из такого диалога, который я написал на днях. Параметр «n» - это идентификатор редактируемого кортежа; его значение будет равно -1, если я вставляю новую запись.
Function TEditCashbox.Execute (n: longint): boolean;
var
q: TSqlQuery;
begin
if n = -1 then
begin
edDate.Text:= datetostr (date);
edAmount.text:= '0';
end
else with qGetCashbox do
begin
params[0].asinteger:= n;
open;
edDate.text:= fieldbyname ('curdate').asstring;
edAmount.text:= fieldbyname ('amount').asstring;
edDetails.text:= fieldbyname ('details').asstring;
close
end;
if showmodal = mrOK then
begin
if n = -1 then
begin
q:= qInsertCashbox;
q.ParamByName ('p0').asinteger:= dm.GenerateID ('cashbox')
end
else
begin
q:= qUpdateCashbox;
q.ParamByName ('p0').asinteger:= n
end;
with q do
begin
parambyname ('p1').asdate:= strtodate (edDate.text);
parambyname ('p2').asinteger:= strtoint (edAmount.Text);
parambyname ('p3').asstring:= edDetails.text;
execsql
end;
end
end.
qGetCashbox является запрос определяется как выбора CURDATE, количество детали из кассы, где ID =: p1
qInsertCashbox является вставкой в кассу (ID, CURDATE, количество, деталь) значений (: р0, р1,:: р2, р3:)
qUpdateCashbox является обновление кассовое установить CURDATE =: p1, сумма = р2, детали = р3: WHERE ID =: p0
Конечно, вы также можете использовать компоненты, поддерживающие данные, для которых требуются «trinity» - TSQLDataSet, TDataSetProvider и TClientDataSet. Использование компонентов, знакомых с данными, проще, но иногда бывают случаи, когда этот подход не подходит. Если вы используете компоненты, осведомленные о данных, то мой код шаблона выглядит следующим образом:
sdsEditDeposit.params[0].AsInteger:= n; // this is the TSQLDataSet
with qEditDeposit do // this is the clientdataset
begin
open;
if n = -1 then // new tuple
begin
insert;
fieldbyname ('amount').asinteger:= 0;
fieldbyname ('curdate').asdatetime:= date;
end;
edit;
if showmodal = mrOK then
begin
if n = -1 then
begin
n:= dm.GenerateID;
fieldbyname ('id').asinteger:= n;
end;
result:= n;
post;
applyupdates (0)
end
else
begin
cancel;
result:= 0
end;
end;
Это бьет! Спасибо. –