SQL7.0 + DCOM +Delphi5 (分布三層)(80分)

  • 主题发起人 主题发起人 rixin
  • 开始时间 开始时间
R

rixin

Unregistered / Unconfirmed
GUEST, unregistred user!
SQL7.0 + DCOM +Delphi5 (分布三層)
SQL7.0+NT,windows98+用戶端,window98+應用服務器分別在不同機器上.
用戶端在數入資料前先將Server端的某Table或Query進行
append
然後輸入數據, 當用戶端applyupdate(0)時, 確報警找不到指定的Table或Query.???
 
你肯定是把一个PROVIDER当作临时的PROVIDER,任意换它连接的TABLE,引起提交前
的连接与提交后不一致,以至APPLYUPDATES时,无法提交。
 
以上問題已解決:
delphi 5中,須將TDataSetProvider的ResolveToDataSet執True方可.

煩請看看新問題:
當用戶端輸入如下值傳到Server端時
Fwatt:='aa';
Ftype:='bb';

在Server端(另一台機器):
if Table1.locate('watt;type',vararrayof([Fwatt,Ftype]),[] then

SCode:=Table1.fieldbyname('code').asstring;
....
1. Scode得到的是找到的下一條記錄值
2. 當用戶端未輸入Ftype時(空), 在Server端找不出記錄

請問何因?
詳細請看:
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=207814
 
難道真沒辦法?
 
1代码贴得更全些,特别是客户调用时。
2为何用Table来查,用Tquery写Sql我觉得最保险。
3Ftype不应为空,如果是空,最好换一个语句,参数中
就别再有ftype了
 
因table中記錄不多故用 Locate
代碼如下:
-----client -----
procedure TFormOrder_in.BitDOKClick(Sender: TObject);
var Pset:string;
begin
...
//Add finished goods part code
Pset:='pcode';
Fptno:=DataModule3.TBeforePrint.dataRequest(VarArrayof([Pset,SLotNo]));
if Fptno='0' then
showmessage('PartCode not find!')
else
if Fptno<>'100' then
showmessage('PartCode error!'+#13+Fptno);
...
end
---------server-------
function TReceiveOrder.PTodataDataRequest(Sender: TObject;
Input: OleVariant): OleVariant;
var flotno,Fcode,Ftype,FFwatt,FFpercent,FFpack,FFmemo,FFspec:string;
Fcode12345,Fcode6789,Fcode10112,Pohmcode:string;
No_OK:char;
begin
if VarisArray(input) then
begin
// FOrdServer.LabelProc.Caption:=input[0]+'->'+input[1];
Flotno:=Input[1];
with QOdatado
begin
close;
with SQLdo
begin
clear;
Add('select *');
Add('from dbo.orderohm');///royalsys/poc/orderohm.dbf');
Add('where Lot_no=:Sflotno');
end;
parambyname('Sflotno').asstring:=Flotno;
prepare;
open;
end;
if input[0]='pcode' then
begin
//before Print
Torder.Open;
Tcode2112.Open;
//ChgCode
Tcode34.open;
Tcode5.open;
Tcode10.open;
if Torder.Locate('lot_no',Flotno,[])then
begin
with Torderdo
begin
Ftype:=fieldbyname('type1').asstring;
//+fmemo=02
FFwatt:=fieldbyname('watt').asstring;
//34
FFpercent:=fieldbyname('per_cent').asstring;
//05
FFpack:=fieldbyname('pack_type').asstring;
//10
FFmemo:=fieldbyname('memo').asstring;
//1112
FFspec:=fieldbyname('special').asstring;
//1112
{以上變量都有空可能)
end;
{H->Chip, I->Network, B->Coated, A-Cement}
Fcode:='B';
//fcode:1
No_OK:='Y';
Fcode12345:=Fcode;
////////////////(當Ftype為空時, 找不到)
if Tcode2112.Locate('type;memo',VarArrayOf([Ftype,FFmemo]),[])then

Fcode12345:=Fcode12345+Tcode2112.fieldbyname('FO2').asstring //focde:2
else
begin
No_OK:='N';
Fcode12345:=Fcode12345+'=';
end;
//////////////
if Tcode34.locate('FWatt;Ftype',vararrayof([FFwatt,Fcode]),[])then
Fcode12345:=Fcode12345+Tcode34.fieldbyname('FNO34').asstring //fcode:3,4
else
begin
No_OK:='N';
Fcode12345:=Fcode12345+'==';
end;
/////////// 賦值時, 得到下一條記錄值
if Tcode5.Locate('Fpercent;Ftype',vararrayof([FFpercent,Fcode]),[])then
Fcode12345:=Fcode12345+Tcode5.fieldbyname('FNO5').asstring //fcode:5
else
begin
No_OK:='N';
Fcode12345:=Fcode12345+'=';
end;
if Tcode10.Locate('Fpack;Ftype',vararrayof([FFpack,Fcode]),[])then
Fcode10112:=Tcode10.fieldbyname('FNO10').asstring //fcode:10
else
begin
No_OK:='N';
Fcode10112:='=';
end;
....
if No_OK<>'N' then
result:='100'
else
begin
FOrdServer.LabelProc.Caption:=Fcode12345+fcode10112;
result:=Fcode;
//'000';
end;
end
else
result:='0';
end
...
end;
 
建议你用Lookup,不用Locate,
另,在TLocateOptions
中加入loPartialKey试试
 
rixin:難啊......!不知道我可有備份.
 
hi,懶虫:
where are you now?
please e-mail to me.
 
多人接受答案了。
 
后退
顶部