应用程序是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表。
编辑:按建议反转查询
答案 0 :(得分:1)
查看OnGetTableName
上的TDatasetProvider
事件。
此外,我相信如果您反转您的查询会更好,即使用... FROM UPORABNKI inner join LOKACIJE...
答案 1 :(得分:0)
来自TDataSetProvider的OnGetTableName事件有一个名为TableName的var参数。你应该把它分配给'UPORABNIKI'。
此外,通常TDataSetProvider认为您在FROM子句中使用的表是您要更新的表,因此,如果您更改查询,则可能甚至不需要上述事件。
希望有所帮助, 马可
答案 2 :(得分:0)
我认为这是TDatasetProvider
无法生成更新所涉及的表的正确命令的情况。在这种情况下,我所做的是为TDatasetProvider.BeforeUpdateRecord
事件添加处理程序。此事件将允许您处理数据集上的每个操作,并生成所需的SQL语句,以便在数据服务器中保持这些操作。
您必须自己编写UPDATE / DELETE / INSERT语句,但您也将拥有关于如何更新表的绝对权力。这就是为什么我总是使用这个事件而不再依赖TDatasetProvider
intrinsec更新过程。