鉴于日后便于维护,尽量不修改客户端,初步设想能否把客户端的控件尽量动态建立。比如动态建立ClientDataSet调用服务器端的方法取得数据,付给Grid显示数据。这样起码不用在客户端的DataMoudle中建立众多的ClientDataSet,以后维护方便,只要在服务器端调整发送的数据即可。请大家指点这样作的可行性, 目前尚未试验成功,得不到数据,不知除了设置其RemoteServerdm和ProviderName属性外,还需作什么工作?
调试欢乐多
GetSQL(UserID, dstNm,ParamStr); //产生SQL语句
函数体执行的大概思想是什么???
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;
我在 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;
其我不需要返回错误代码呀.真晕.
TmpCDS.Provider := dsp1; //TDataSetProvider
在 ClientDataSet 里面找不到 Provider 属性哩.
只有 ProviderName 属性,但不适用.
TmpCDS.Provider := dsp1; //TDataSetProvider
在 ClientDataSet 里面找不到 Provider 属性哩.
只有 ProviderName 属性,但不适用.
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
看俺的.
// appserver tier: function (const dp,Qry,SQL :widestring):olevariant;
begin
* 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;
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.