请教三层! ( 积分: 15 )

  • 主题发起人 主题发起人 frankie_24
  • 开始时间 开始时间
F

frankie_24

Unregistered / Unconfirmed
GUEST, unregistred user!
请教一个问题,我在服务端写了函数,作用是取得表中的编号字段的最大值
代码:
function TDateLInk.Get_GetMax(const TableName, IDName: WideString): Int64;
var
Str :String;
MaxID :Integer;
begin
Str :='Select ISNULL(Max(' + IDName + '),0) From ' + TableName;
With ADOSetdo
//ADOSet是ADOQuery
begin
Close;
SQL.Clear;
SQL.Add(Str);
Open;
end;
MaxID :=ADoset.DataSource.DataSet.Fields[0].AsInteger;
Result := MaxID;
end;

TableName 是表的名字 IDName是表中编号的字段
我在客户端调用
代码:
Edit1.Text:=Frm_Data.Socket.AppServer.GetMax('DutyInfo','DutyID');
运行后提示"找不到成员"
这个是什么意思啊?
不可以这样做吗?
服务端用ADO,ADOQuery,DataSetProvider
客户端用Socket,ClientDataset
谢谢了,没有多少分..见谅!

对了,还有,要是我直接把表名和字段都写进去,不通过客户端传参数,这样返回就可以用
不知道是为什么!
 
帮帮忙a
这个问题没有人遇到吗?
头大啊...
 
不是吧,我问三次问题了就这样啊,我的问的问题很难吗?
怎么就没有人说说啊...
 
我要疯了,没有人知道吗?
真是晕了..
 
由于编译器不进行类型检查,在运行期实际调用可能失败。所以最好采用静态联编的方式来访问远程数据模块的接口,方法就是用特定的接口类型对Appserver属性进行强制类型转换。假设你的远程数据模块的接口叫IMyAppServer,则改为:
Edit1.Text:=IMyAppServer(Frm_Data.Socket.AppServer).GetMax('DutyInfo','DutyID');
 
终于有人说了,我试过你说的办法,还是不可以..
我用了,它会提示说我错误..
忘记什么错误了....
还有没有别的方法了..
 
我有用了一下,提示
Invalid Typecast
错误
 
提示"找不到成员"
就是说找不到成员函数GetMax,你再试试下面的这个写法:
with Frm_Data.Socket.AppServer as IMyAppServerdo
GetMax('DutyInfo','DutyID');
哦,我想起来了,对于tcp/Ip方式的无法实现真正的静态联编,所以上面的也不对,
应该用下面的,99%可以:
var
TempInterface: IMyAppServer;
begin
TempInterface:= Frm_Data.Socket.AppServer;
TempInterface.GetMax('DutyInfo','DutyID');
end;
 
var
TempInterface: IDateLink;
begin
TempInterface:= Frm_Data.Socket.AppServer;
TempInterface.GetMax('DutyInfo','DutyID');
end;
Edit1.Text :=TempInterface;
这样写吗?
但是提示我还是报错啊
说的是
Incompatible types 'Variant' and 'IDatelink'
谢谢你了
帮我看看吧
 
Incompatible types 'Variant' and 'IDatelink'
这明显提示类型不匹配。
要调用该接口,必须在客户程序中引用类型库编辑器生成的_TLB.pas文件.
如果 还不行,那我也没办法,鬼知道程序其他地方有没问题,呵呵
 
Edit1.Text:=Frm_Data.Socket.AppServer.GetMax('DutyInfo','DutyID');
怎么Edit.Text是文本型,而GetMax返回整形?
 
To: lisongmagic
非常感谢你,你给了我很多的提示,很感谢你昂..
我其他的代码应该没有问题的.就是添加这个函数就这样了...不过还是谢谢你了
to:linqiang105
也很高兴你能进来看看,谢谢了
你指出的问题,我知道,我在代码中加上转换..
 
GetMax('DutyInfo','DutyID');
这个函数返回的是string兼容类型把,这么基本的东西你不会搞错吧,呵呵
 
呵呵,不是类型的问题
这个我代码中加上转换了...
呵呵...
 
var
TempInterface: IDateLink;
begin
TempInterface:= Idatelink(IDispatch(Frm_Data.Socket.AppServer));
TempInterface.GetMax['DutyInfo','DutyID'];
end;
Edit1.Text :=IntToStr(TempInterface.GetMax['DutyInfo','DutyID']);
我这样写了,还是不对
再帮我看看吧...谢谢了
 
var
TempInterface: IDateLink;
begin
TempInterface:= Idatelink(Frm_Data.Socket.AppServer);
TempInterface.GetMax('DutyInfo','DutyID');
end;
Edit1.Text :=IntToStr(TempInterface.GetMax('DutyInfo','DutyID'));
你的IDispatch是什么东西啊 加那干吗?
 
由于你给我的提示,我搜索了一下,要是不加那个就会有错误提示 Invalid Typecast
要是加了就不会,我不知道那个是什么意思啊
我都晕了...
 
var
TempInterface: IDateLink;
begin
TempInterface:= Frm_Data.Socket.AppServer;
TempInterface.GetMax('DutyInfo','DutyID');
end;
Edit1.Text :=IntToStr(TempInterface.GetMax('DutyInfo','DutyID'));
说明:Socker是你的SocketConnection的name属性,
 
Incompatible types 'Variant' and 'IDatelink'
按照你说的,又提示这样的错误
你看看我的函数是不是是错的啊?
难道是我的返回类型有问题啊?
 
IAppServer = interface(IDispatch)
Ixxx = interface(IAppServer)
TRemoteDataModule = class(TDataModule, IAppServer)
Txxx = class(TRemoteDataModule, Ixxx)
-->
var
TempInterface: Txxx;
你的IDateLink是什么啊
 
后退
顶部