2016-05-16 64 views
1

我使用的DBGrid,DBF和DataSource只是想出如何使這樣的1.我一直停留在任務刪除某本書只有ammount的去除時,使兩行合併,如果例如,如果書名是「測試」,並且我會添加另一行書籍風車「測試」它將合併並將本書的數量從1改變到2或2到3等等。的DBGrid,DBF合併2個相同的行

procedure TForm1.Button1Click(Sender: TObject); 

begin 
    with dbgrid1.DataSource.DataSet do begin 
    Insert; 
    Edit; 
    DBGrid1.DataSource.DataSet.FieldByName('Nr.').AsInteger; 
    Fields.fieldbyname('Year').value := Edit1.Text; 
    Fields.fieldbyname('Author').value := Edit2.Text; 
    Fields.fieldbyname('Name').value := Edit3.Text; 
    Fields.fieldbyname('Ammount').value := Edit4.Text; 
    Post; 
    Next; 

    end; 
end; 

在這裏你可以看到它是如何看enter image description here

GADS - 年汽車 - 作者 Nosaukums - BooksName Kopijas- ammount的

回答

3

你可以做到這一點做這樣的事情:

procedure TForm1.AddBook; 
var 
    ADataSet : TDataSet; 
begin 
    // Note: you need to complete this by filling in the DBGrid1.DataSource.DataSet.FieldByName('Nr.').AsInteger; 
    // Also, I'm assuming that the field which stores the number of copies is called "Amount" - change if necessary 
    ADataSet := dbgrid1.DataSource.DataSet; 
    if ADataSet.Locate('Name', Edit3.Text, []) then begin 
    ADataSet.Edit; 
    ADataSet.FieldByName('Amount').AsInteger := ADataSet.FieldByName('Amount').AsInteger + 1; 
    end 
    else begin 
    ADataSet.Insert; 
    ADataSet.fieldbyname('Year').value := Edit1.Text; 
    ADataSet.fieldbyname('Author').value := Edit2.Text; 
    ADataSet.fieldbyname('Name').value := Edit3.Text; 
    ADataSet.fieldbyname('Amount').value := Edit4.Text; 
    end; 
    ADataSet.Post; 
end; 

這種方式避免了在使用相同的名稱字段的值,而最好有副本,然後將它們合併數據庫具有兩行一起更新一個並刪除另一個。

而且,請注意,我使用「與」構建避免。當您使用「與」,你在打字保存經常被調試,你必須做些什麼來解決爬行,因爲其使用中的錯誤量超標。

但是,如果這是一個後端關係數據庫管理系統,它支持SQL中的多用戶數據庫,這將是更好的使用在服務器,例如執行的SQL語句插入或更新做使用參數化的存儲過程(以避免SQL注入風險),然後在客戶端應用程序刷新數據。