2012-04-30 3 views
0

Я планирую создать диалоговое окно, которое создало бы пустую запись в базе данных Firebird, а затем заполнило поля значениями, взятыми из текстовых полей редактирования в этот диалог.Добавьте пустую строку, затем заполните ее диалоговым окном в Delphi/DataSnap/dbExpress

Я использую следующее: DBEXPRESS DataSnap Delphi XE2

Может быть, это должно идти, как это:

DataSource.DataSet.Append; 
(call the dialog with the db text boxes pointing to DataSource) 
if ModalResult = mrOK then 
    DataSource.DataSet.Post; 

Есть идеи? Я хотел бы знать, какие компоненты использовать (ClientDataSet, SQLQuery или SQLDataSet). Я понятия не имею, как это сделать.

EDIT: Код форматирования

ответ

1

Другими словами, вы хотите создать диалог с осведомленных управления без данных. Для этого вам нужно три 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;  
+0

Это бьет! Спасибо. –

1

Вы можете захотеть разрешить для отмены, а также ...

DataSource.DataSet.Append; 
(call the dialog with the db text boxes pointing to DataSource) 
if ModalResult = mrOK then 
    DataSource.DataSet.Post 
else 
    Datasource.Dataset.cancel; 

Я использую компоненты TADOQuery с MS-SQL и он работает надежно.

+0

Благодарим вас, какие компоненты следует разместить в диалоговом окне? CDS, SQLQuery или SQLDataSet? Я запутался. –

+0

Извините, я только что отредактировал. Я использую компоненты TADOQuery по большей части. –

0

Вам необходимо настроить TSQLConnection для вашей базы данных и (чтобы упростить) TSQLTable. Свяжите TSQLTable с TSQLConnection и выберите нужную таблицу в свойстве TableName. Затем переместите TDataSetProvider на форму и подключите ее к TSQLTable. Теперь возьмите TClientDataSet, установите его Поставщика в TDataSetProvider и подключите DataSource к TClientDataSet.

Помните: чтобы фактически записать данные в базу данных, вы должны вызвать TClientDataSet.ApplyUpdates.

Подробнее here

+0

Благодарим вас за ввод. Я использую ApplyUpdates. Нужно ли вызывать этот метод после Post? –

+0

Не после каждого сообщения, но если вы хотите отправить изменения в Firebird. Таким образом, по крайней мере один раз между Post и Close будет хорошо. –