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),?

解决方案 »

  1.   

    另外,我发现TSimpleDateSet 的右键菜单有一个特有的 Edit Internal DataSet...
    我在help中没找到相关的说明,请问这个是干什么的?
      

  2.   

    难道说用DBExpress不可以执行创建视图与删除视图的命令吗?
      

  3.   

    根据李维说:
    Dbexpress目前不支持多表关联查询或者通过视图修改。
    如果可以用SQL语句直接操作
      

  4.   

    其实UpdateSQL也没什么神秘,  无非是数据增删改的时候提供了一种机制让你去控制数据, 你的这种问题, 通过三个SQL语句就能够实现了
      

  5.   

    没人说他神秘,问题是我那三句sql没地方写,我没地方告诉TSimplayDataSet我自己想如何修改。
      

  6.   

    那你可以用触发器来完成视图的更新与修改呀。用Instead of 触发器就可以了。
    你在程序中只要按习惯对视图修改就可以了。
    我找个时间来试试。
      

  7.   

    Edit internal dataset
    就是修改它的DataSet属性的一些属性嘛dbx既然不支持多表更新就应该提供UpdateSQL控件嘛,真是的,要不PZ兄自己写一个UpdateSQL控件,造福大家?^_^
      

  8.   

    :(
    我还真想写一个,可没那能耐。算了,我曲线救国了,我就用了一个表,其余的用计算字段,然后再OnGetText 里面查的别的表。
    我发现了,不能盲目跟着风,第一版本用IBX好好的,第二版就发傻用什么DBX,骑虎难下,好多东西都不如IBX.
      

  9.   

    呵呵,我知道你为什么发这个傻,因为IBX只能用IB,而DBX支持多种DB:)偶也是这样,现在基本上都是用DBX,像你这种情况只好用SQL更新了。
      

  10.   

    你说DBX都是第二个版本了,连BDE都有的这么一个东西为啥DBX没有?
    我觉得只要把TSQLDataSet改成类似TIBDataSet那样,Insert,update,delete和selete 这4句都让自己写就行了。
      

  11.   

    因为现在BORLAND忙着将DBX移植到.net下(就是所谓的BDP)
      

  12.   

    刚才在Borland的新闻组照了一下,也有人为这问题,告知用TDataSetProvider的OnUpdateData事件里面写代码。看来是没方便的写法了,我还是用我的OnGetText吧,好在那个表才几十行。
      

  13.   

    处理join过的数据,一个比较好的方法是在TdataSetProvider组件的事件处理函数中进行这种复杂的数据处理(BeforeUpdateRecord)。方法为:在BeforeUpdateRecord事件处理函数取出分属于不同数据表的数据,在搭配TsimpleDataSet/TClientDataSet的OldValue\Value和NewValue等特性值,再代入不同的SQL语句中的动态参数,最后通过TSQLDataSet组件执行这些语句把每一个数据表的数据更新回数据源中。
        由于修改数据包含了新增、修改和删除数据,因此一般对每一个要更新回数据表的数据可使用三个不同的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属性