2014-01-20 63 views
1

該應用程序是datasnap(與sqlite數據庫)。我對運行兩個表(LOKACIJE和UPORABNIKI)以下查詢:德爾福更新加入的查詢

procedure TForm4.FormShow(Sender: TObject); 
begin 
    ClientDataSet1.Close; 
    ClientDataSet1.CommandText :=''; 
    ClientDataSet1.CommandText := 'select lokacije.[HOTEL_ID],'+ 
            '  lokacije.[NAZIV],'+ 
            '  uporabniki.[LOKACIJA_ID],'+ 
            '  uporabniki.[RESORT_ID],'+ 
            '  uporabniki.[HOTEL_ID],'+ 
            '  uporabniki.[UPORABNIK],'+ 
            '  uporabniki.[GESLO],'+ 
            '  uporabniki.[PRAVICE]'+ 
            '  from UPORABNIKI'+ 
            '  inner join LOKACIJE on uporabniki.lokacija_id=lokacije.lokacija_id '+ 
            ' where lokacije.[NAZIV] = :@NAZIV'+ 
            ' order by Uporabniki.[UPORABNIK]'; 
ClientDataSet1.Params.ParamByName('@NAZIV').Value:= '' + Form2.AdvOfficeStatusBar1.Panels[3].Text + '' ; 
ClientDataSet1.Open; 
end; 

查詢運行良好,並給了我所期望的結果。不過,我希望能夠編輯和保存此查詢的編輯(或添加)結果。我想更新(或添加新記錄)的表格是UPORABNIKI。我不需要寫任何東西給LOKACIJE表。我怎麼做到這一點?

除了節能新紀錄,我想查詢,因爲它們是從同一個表來自動填充值 LOKACIJA_ID,RESORT_ID,HOTEL_ID,當我在導航點擊按鈕「插入」。 UPORABNIKI被翻譯爲USERS表。

編輯:反向查詢的建議

+2

請參閱[創建主從關係](http://docwiki.embarcadero.com/RADStudio/XE3/en/Creating_Master-Detail_Relationships)。對於客戶端數據集,通常的方法是使用[嵌套詳細表](http://docwiki.embarcadero.com/RADStudio/XE3/en/Using_Nested_Detail_Tables)。 –

+0

@TOndrej - 沒有時間閱讀所有embarcadero,特別是因爲他們沒有提供適用於我的案例。 – user3181689

回答

0

我相信這是在TDatasetProvider是無法產生正確的命令來更新涉及到的表的情況下。在這種情況下,我所做的是向TDatasetProvider.BeforeUpdateRecord事件添加處理程序。此事件將讓您處理對數據集進行的每項操作,並生成所需的SQL語句,以便在數據服務器中持久保留這些操作。

你將不得不自己編寫UPDATE/DELETE/INSERT語句,但你也會對如何更新表具有絕對的權力。這就是爲什麼我總是使用這個事件,從不依靠TDatasetProvider intrinsec更新過程。

+0

拜託,你能給我一個UPDATE/DELETE/INSERT語句的例子嗎? – user3181689

+0

如果我正確理解這一點,我必須在我的表單上放置另一個查詢,這個查詢將由TDatasetProvider.BeforeUpdateRecord觸發,並且應該爲UPDATE/DELETE/INSERT事件提供服務? – user3181689

+0

@ user3181689:是的,這就是主意。您可以使用其他查詢組件或直接通過連接組件運行語句,當它支持該語言或您希望運行語句的任何其他方式時。 – AlexSC

1

見關於TDatasetProviderOnGetTableName事件。

而且,我相信,如果您反轉查詢可能會更好,即使用... FROM UPORABNKI inner join LOKACIJE...

+0

一直使用谷歌搜索超過了一個小時,並找不到任何有用的... – user3181689

0

從的TDataSetProvider的OnGetTableName事件有一個名爲表名一個變量參數。你應該把它分配給'UPORABNIKI'。

此外,通常TDataSetProvider認爲您在FROM子句上使用的表是您要更新的表,因此,如果更改查詢,則甚至可能不需要上述事件。

希望幫助, 馬爾科

+0

我必須寫在DatasetProvider getTablename上?表名:='UPORABNIKI'; ? – user3181689