鉴于日后便于维护,尽量不修改客户端,初步设想能否把客户端的控件尽量动态建立。比如动态建立ClientDataSet调用服务器端的方法取得数据,付给Grid显示数据。这样起码不用在客户端的DataMoudle中建立众多的ClientDataSet,以后维护方便,只要在服务器端调整发送的数据即可。请大家指点这样作的可行性,  目前尚未试验成功,得不到数据,不知除了设置其RemoteServerdm和ProviderName属性外,还需作什么工作?

解决方案 »

  1.   

    请教,Bes96261(秋水孤鶩) 你的函数中的 TmpCDS 为一个 TClientDataSet, 其 RemoteServer及ProviderName如何设置,我在使用的过程中,如果没有设置此两上属性,就会性生错误。一定要设置不可。请问有何妙法可以不设置此两个属性。
    GetSQL(UserID, dstNm,ParamStr);  //产生SQL语句
    函数体执行的大概思想是什么???
      

  2.   

    To: delphi1234567中间层这样设:
      TmpCDS.Provider := dsp1;  //TDataSetProvider
      dsp1.DataSet := Qry1;  //TADOQuery
      Qry1.Connection := TADOConnection;GetSQL(UserID, dstNm,ParamStr);  //产生SQL语句
    这个过程的大概意思是这样:
    dstNm:数据集名称,根据dstNm值及UserID提出相关SQL语句
    UserID:为用户登录名,用以权限判断及SQL语句的生成
    ParamStr:SQL语句中条件参数,即where后面的参数If UserID 用权限 then
    begin
      SQL := UserID + DstNm;   //从文件或数据库中获取SQL语句
      Format(SQL,ParamStr);    //格式化SQL语句
    end else
          Create ErrorCode;
      
      

  3.   

    TO : Bes96261(秋水孤鶩) 帮我看看这个行吗???http://www.delphibbs.com/delphibbs/DispQ.asp?LID=2513334
    我在 Type Library 中添加了一个 Mothed.并希望入三个参数,传出一个结果.
    传入三个参数:
    int, string, variant传出一个参数
    variant添加了一个 GetData方法,在 parameters 页中修改 Return Type 为 VARIANT,提示错误:
    Function of Automation Interfaces must have a return type of HRESULT.经查 HRESULT, 其定义如下:HRESULT is the return type for functions that return an error code.
    type HRESULT = type Longint;
    其我不需要返回错误代码呀.真晕.
      

  4.   

    中间层这样设:
      TmpCDS.Provider := dsp1;  //TDataSetProvider
    在 ClientDataSet 里面找不到 Provider 属性哩.
    只有 ProviderName 属性,但不适用.
      

  5.   

    中间层这样设:
      TmpCDS.Provider := dsp1;  //TDataSetProvider
    在 ClientDataSet 里面找不到 Provider 属性哩.
    只有 ProviderName 属性,但不适用.
      

  6.   

    不好意思,是我写错了,是将 TmpCDS.ProviderName := dsp1;另外,在你的GetData的参数格式后,你试再加一个
     Name: vData
     Type: VARIANT*
     Modifier: [out,retval]
    的参数,则函数会变成Function的格式这是我的窗体文件中的设置:
      object TmpCDS: TClientDataSet
        Aggregates = <>
        Params = <>
        ProviderName = 'tmpdsp'
        Left = 192
        Top = 16
      end
      object tmpdsp: TDataSetProvider
        Tag = 100
        DataSet = Q_tmp
        Options = [poAllowCommandText]
        UpdateMode = upWhereKeyOnly
        Left = 240
        Top = 16
      end
      object Q_tmp: TADOQuery
        Connection = BesConnection
        CursorType = ctStatic
        Parameters = <>
        SQL.Strings = (
          '')
        Left = 288
        Top = 16
      end
      

  7.   

    晕!,
    看俺的.
      //  appserver tier: function (const dp,Qry,SQL :widestring):olevariant;
    begin
      

  8.   

    {********************************************************************************
    *   File         : Global Object sub Unit                                       *
    *   Version      : 1.0                                                          *
    *   Creation Date: 2004-03-04                                                   *
    *   Author       : Wink.zow                                                     *
    *   Commonent    : All Application  interface ,prepared by HIP FUNG wink.zow    *
    *                                                                               *
    *********************************************************************************}
    unit uGObj;interface
     uses
         windows,messages,dialogs,classes,sysutils,db,adodb,provider,uGBaseObj,
         variants,dbclient,uFrmPubDm;type
        TGObj = class(TBOintf)
        private
            FDM :TFrmPubDm;
        Protected    public
             Function WriteLogin_Log(const Userid,hostid,hostip,client :WideString):boolean;override;
             Function UserChk(const UserID :WideString):boolean;override;
             function LoginChk(const UserID,Pwd :WideString):boolean;override;
             Function GetFieldValue(const Table_nm,Field_nm,conditionstr,Return_field,
             sort_field:WideString):TStrings;override;
             Function    GetTransaction_code(const Tran_type :Integer):String;override;
             function  SearchObj(const Provider_nm,Query_nm,table_nm,field_list,conditions,sort_field:widestring):olevariant;
             function  GetField_list(const Provider_nm,Query_nm,table_nm,field_list,return_field,conditions,sort_field:widestring):TStrings;
             function  GetVendorID(const classID,title_cd:string):String;
             function  chk_pono(const pono :String):boolean;
             constructor Create;override;
             destructor  Destory;override;    end;implementation{ TIBSEOClass }function TGObj.chk_pono(const pono: String): boolean;
    begin
      with FDM.Qcommon do
      begin
         close;
         prepared := false;
         sql.Add('select * from po_order_headers_all where order_number ='+#39+pono+#39);
         prepared := true;
         open;
         if  (recordcount>0) then
         result := true
         else
         result := false;
         close;
      end;
    end;constructor TGObj.Create;
    begin
      inherited;
        FDM := TFrmPubDm.Create(nil);
    end;destructor TGObj.Destory;
    begin
      FreeAndNil(FDM);
      inherited;
    end;
    function TGObj.GetFieldValue(const Table_nm, Field_nm, conditionstr,
      Return_field, sort_field: WideString): TStrings;
    var
       i:integer;
       tempstr :Tstrings;
       condstr,sort_str :WideString;
    begin
         if(trim(conditionstr)<>'') then
         condstr := ' where '+conditionstr
         else
         condstr := ' ';
         if(trim(sort_field)<>'') then
         sort_str := ' group by '+sort_field
         else
         sort_str := ' ';     Tempstr := TStringList.Create;
        with FDM do
        try
          if(pubdbc.connected = false) then
             pubdbc.connected := true;
           with Qcommon do
           begin
              close;
              prepared := false;
              sql.clear;
              sql.add('select '+Field_nm+' from '+Table_nm +condstr+sort_str);
              prepared := true;
              open;
              for i:= 0 to  recordcount-1 do
              begin
                tempstr.add(fieldbyname(return_field).asstring);
                next;
               end;
              close;
              result := tempstr;
            end;
           finally
              fdm.pubdbc.connected := false;
           end;
    end;function TGObj.GetField_list(const Provider_nm, Query_nm, table_nm,
      field_list,return_field, conditions, sort_field: widestring): TStrings;
    var
       mProvider:TDatasetProvider;
       mDataset:TADOQuery;
       cond_str,sort_str :widestring;
       FieldList :TStrings;
       i:integer;
    begin
         result := nil;
         try
          FieldList := TStringList.Create;
           if Trim(Query_nm)='' then exit;
              mProvider := TDatasetProvider(FDM.FindComponent(Provider_nm));
           if not Assigned(mProvider) then Exit;
           if Assigned(mProvider.Dataset) then
              mDataset:=TADoQuery(mProvider.Dataset)
             else
              mDataset:=FDM.QPublic;
           if(trim(conditions)<>'') then
       cond_str := 'where '+conditions
       else
       cond_str := '';
       if(trim(sort_field)<>'') then
       sort_str := 'Order by '+sort_field
       else
       sort_str := '';with FDM do
        try
          if(pubdbc.connected = false) then
             pubdbc.connected := true;
           with Qpublic do
           begin
              close;
              prepared := false;
              sql.clear;
              sql.add('select '+field_list+'  from  '+table_nm+cond_str+' '+sort_str);
              prepared := true;
              open;
              if recordcount>0 then
              begin
                  for i:= 0 to recordcount-1 do
                  begin
                      FieldList.Add(fieldbyname(return_field).AsString);
                      next;
                  end;
                  close;
              end;
              result := fieldList;
          end;
           finally
              fdm.pubdbc.connected := false;
           end;
      except  end;end;
      

  9.   


    function TGObj.GetTransaction_code(const Tran_type: Integer): String;
    beginend;//--------------------User Authroization Processing---------------------------
    function TGObj.GetVendorID(const classID,Title_cd: string): String;
    begin
      with FDM do
        try
          if(pubdbc.connected = false) then
             pubdbc.connected := true;
           with Proc_GetVendorid do
           begin
              close;
              prepared := false;
              parameters.ParamByName('@iden').value := trim(classid);
              parameters.ParamByName('@title_code').Value := trim(title_cd);
              prepared := true;
              open;
              result := parameters.ParamByName('@out_vendor_id').value;
              close;
            end;
           finally
              fdm.pubdbc.connected := false;
           end;
    end;function TGObj.LoginChk(const UserID, Pwd: WideString): boolean;
    begin
      with FDM do
        try
          if(pubdbc.connected = false) then
             pubdbc.connected := true;
           with Qcommon do
           begin
              close;
              prepared := false;
              sql.clear;
              sql.add('select userid,pwd from GL_USER_MASTER Where userid ='+#39+UserID+#39+' and PWD ='+#39+PWD+#39);
              prepared := true;
              open;
              IF(Recordcount>0) then
              result := true
              else
              Result := false;
              close;
            end;
           finally
              fdm.pubdbc.connected := false;
           end;
    end;
    function TGObj.SearchObj(const Provider_nm, Query_nm, table_nm, field_list,
      conditions, sort_field: widestring): olevariant;
    var
       mProvider:TDatasetProvider;
       mDataset:TADOQuery;
       cond_str,sort_str :widestring;
    begin
        if Trim(Query_nm)='' then exit;
              mProvider := TDatasetProvider(FDM.FindComponent(Provider_nm));
           if not Assigned(mProvider) then Exit;
           if Assigned(mProvider.Dataset) then
              mDataset:=TADoQuery(mProvider.Dataset)
             else
              mDataset:=FDM.QPublic;
           try
              mDataset.Close;
           except
           end;if(trim(conditions)<>'') then
       cond_str := conditions
       else
       cond_str := '';
       if(trim(sort_field)<>'') then
       sort_str := sort_field
       else
       sort_str := '';
    with FDM do
        try
          if(pubdbc.connected = false) then
             pubdbc.connected := true;
           with Qpublic do
           begin
              close;
              prepared := false;
              sql.clear;
              sql.add('select '+field_list+'  from  '+table_nm+cond_str+' '+sort_str);
              prepared := true;
              open;
              result := DspPublic.data;
              close;
          end;
           finally
              fdm.pubdbc.connected := false;
           end;
    end;function TGObj.UserChk(const UserID: WideString): boolean;
    begin
     with FDM do
        try
          if(pubdbc.connected = false) then
             pubdbc.connected := true;
           with Qcommon do
           begin
              close;
              prepared := false;
              sql.clear;
              sql.add('select userid,pwd from GL_USER_MASTER Where userid ='+#39+UserID+#39);
              prepared := true;
              open;
              IF(Recordcount>0) then
              result := true
              else
              Result := false;
            end;
           finally
              fdm.pubdbc.connected := false;
           end;end;function TGObj.WriteLogin_Log(const Userid, hostid, hostip,
      client: WideString): boolean;
    begin
       with FDM do
        try
          if(pubdbc.connected = false) then
             pubdbc.connected := true;
             try
             with Proc_WriteLog do
             begin
               close;
               prepared := false;
               Parameters.ParamByName('@USERID').VALUE := Userid;
               Parameters.ParamByName('@HOSTID').VALUE := hostid;
               Parameters.ParamByName('@HOSTIP').VALUE := hostip;
               Parameters.ParamByName('@Client').VALUE := client;
               prepared := true;
               ExecProc;
               result := true;
             end
             except
                result := false;
             end;
          finally
             fdm.pubdbc.connected := false;
          end;end;end.