D7, DBExpress,interbase 7.1下面是我的SQL,使用的TSimpleDataSet.
select
R.F_USERID
, R.F_OPERATIONID
, (select L1.F_NAME from D_OPERATIONLIST L1 where L1.F_ID=R.F_OPERATIONID) as F_NAME1
from D_OPERATIONRIGHT R由于涉及到了2个表得到的视图的修改,而 DBX没有提供类似BDE(或者IBX)中的TUpdateSQL(TIBUpdateSQL)类似的控件,请问该如何修改它(F_USERID和F_OPERATIONID),?
select
R.F_USERID
, R.F_OPERATIONID
, (select L1.F_NAME from D_OPERATIONLIST L1 where L1.F_ID=R.F_OPERATIONID) as F_NAME1
from D_OPERATIONRIGHT R由于涉及到了2个表得到的视图的修改,而 DBX没有提供类似BDE(或者IBX)中的TUpdateSQL(TIBUpdateSQL)类似的控件,请问该如何修改它(F_USERID和F_OPERATIONID),?
我在help中没找到相关的说明,请问这个是干什么的?
Dbexpress目前不支持多表关联查询或者通过视图修改。
如果可以用SQL语句直接操作
你在程序中只要按习惯对视图修改就可以了。
我找个时间来试试。
就是修改它的DataSet属性的一些属性嘛dbx既然不支持多表更新就应该提供UpdateSQL控件嘛,真是的,要不PZ兄自己写一个UpdateSQL控件,造福大家?^_^
我还真想写一个,可没那能耐。算了,我曲线救国了,我就用了一个表,其余的用计算字段,然后再OnGetText 里面查的别的表。
我发现了,不能盲目跟着风,第一版本用IBX好好的,第二版就发傻用什么DBX,骑虎难下,好多东西都不如IBX.
我觉得只要把TSQLDataSet改成类似TIBDataSet那样,Insert,update,delete和selete 这4句都让自己写就行了。
由于修改数据包含了新增、修改和删除数据,因此一般对每一个要更新回数据表的数据可使用三个不同的TSQLDataSet组件分别执行Insert\Update\Delete等SQL语句。procedure TfrmJoinDemo.BitBtn1Click(Sender: TObject);
begin
if(dmJoinDemo.sqlcdsJoins.ChangeCount > 0) then
dmJoinDemo.sqlcdsJoins.ApplyUpdates(0);
end;procedure TdmJoinDemo.sqlcdsJoinsBeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;
UpdateKind: TUpdateKind; var Applied: Boolean);
begin
case UpdateKind of
ukModify :
UpdateData(SourceDs, DeltaDs);
//ukInsert :
//ukDelete :
end;
Applied := True;
end;procedure TdmJoinDemo.UpdateData(SourceDS: TDataSet;
DeltaDS: TCustomClientDataSet);
const
sUpdateEMP = ' UPDATE EMPLOYEE SET EMP_NO = :EMP_NO, FIRST_NAME =:FIRST_NAME'
+'WHERE EMP_NO = :OLD_EMP_NO ';
sUpdateDept = 'UPDATE DEPARTMENT SET DEPARTMENT = :DEPARTMENT, PHONE_NO'
+'=:PHONE_NO WHERE DEPT_NO = :OLD_DEPT_NO'; procedure UpdateEMP;
var
iCount : Integer;
sFieldName : String;
nValue : Variant;
begin
sqldsExecSQL.CommandText := sUpdateEMP;
for iCount := 0 to DeltaDS.FieldCount - 1 do
begin
nValue := DeltaDS.Fields[iCount].NewValue;
sFieldName := DeltaDS.Fields[iCount].FieldName;
if (Assigned(sqldsExecSQL.Params.FindParam(sFieldName))) then
begin
if (not VarIsEmpty(nValue)) then
sqldsExecSQL.Params.ParamByName(sFieldName).Value := nValue
else
sqldsExecSQL.Params.ParamByName(sFieldName).Value :=
DeltaDS.Fields[iCount].OldValue;
end;
end;
sqldsExecSQL.Params.ParamByName('OLD_EMP_NO').Value :=
DeltaDS.FieldByName('EMP_NO').OldValue;
sqldsExecSQL.ExecSQL(False);
end; procedure UpdateDEPT;
var
iCount : Integer;
sFieldName : String;
nValue : Variant;
begin
sqldsExecsQL.CommandText := sUpdateDept;
for iCount := 0 to DeltaDS.FieldCount - 1 do
begin
nValue := DeltaDS.Fields[iCount].NewValue;
sFieldName := DeltaDS.Fields[iCount].FieldName;
if (Assigned(sqldsExecSQL.Params.FindParam(sFieldName))) then
begin
if (not VarIsEmpty(nValue)) then
sqldsExecSQL.Params.ParamByName(sFieldName).Value := nValue
else
sqldsExecSQL.Params.ParamByName(sFieldName).Value :=
DeltaDS.Fields[iCount].OldValue;
end;
end;
sqldsExecSQL.Params.ParamByName('OLD_DEPT_NO').Value :=
DeltaDS.FieldByName('DEPT_NO').OldValue;
sqldsExecSQL.ExecSQL(False);
end;begin
UpdateEMP;
UpdateDEPT;
end;
UpdateData方法通过检查Tfield对象的NewValue特性值是否有值判断该字段是否被修改。对于没有被修改的字段就用该字段的老值更新。另外 Edit Internal DataSet...既是展开的TSimpleDataSet/DataSet属性