全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1444
推到 Plurk!
推到 Facebook!

在做mts/com+時,我用協調對像對進行更新數據時出現以下的錯誤:

尚未結案
weixubin
一般會員


發表:30
回覆:14
積分:8
註冊:2003-02-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-18 10:19:11 IP:61.144.xxx.xxx 未訂閱
在做mts/com+時,我用協調對像對進行更新數據時出現以下的錯誤:    {協調對像} 環境:需要事務 代碼: destructor TMtsUpdateCoor.Destroy; begin   inherited;   FDM.Free; end;    procedure TMtsUpdateCoor.Initialize; begin   inherited;   FDM := TfmDMUpdateCoor.Create(Forms.Application); end;    procedure TMtsUpdateCoor.UpdateDjDwzl(vDatas: OleVariant;   iMaxError: Integer; var iErrorCount: Integer); begin   try     FDM.DjDwzlDCom.AppServer.UpdateDatas(vDatas, iMaxError, iErrorCount);     SetComplete;   except     SetAbort;   end; end; {客戶端} MtsUpdateObj.UpdateDjDwzl(ClientDataSet.Data,0, AErrorCount);//每次在這裏會調用會出現以下錯誤.      ========================= 同是炎黄子孙
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-18 11:07:48 IP:203.204.xxx.xxx 未訂閱
引言: {客戶端} MtsUpdateObj.UpdateDjDwzl(ClientDataSet.Data,0, AErrorCount);//每次在這裏會調用會出現以下錯誤. ========================= 同是炎黄子孙
看錯誤訊息好像是Client和Server還沒連上線或找不到相關的Function。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-18 12:17:52 IP:61.224.xxx.xxx 未訂閱
引言: 在做mts/com 時,我用協調對像對進行更新數據時出現以下的錯誤: procedure TMtsUpdateCoor.Initialize; begin inherited; FDM := TfmDMUpdateCoor.Create(Forms.Application); //FDM := TfmDMUpdateCoor.Create(Self);<==改用Self試試,畢竟COM 跟一般Application 不同未必會initialize Application FDM.DjDwzlDCom.Connected := True;// end; procedure TMtsUpdateCoor.UpdateDjDwzl(vDatas: OleVariant; iMaxError: Integer; var iErrorCount: Integer); begin try FDM.DjDwzlDCom.AppServer.UpdateDatas(vDatas, iMaxError, iErrorCount); SetComplete; except SetAbort; end; end; {客戶端} ========================= 同是炎黄子孙
我並未看到你在Server端程式中呼叫 Initialize,我假設你已經在OnCreate 能否說明FDM.DjDwzlDCom 是啥東西?是DCom Connection嗎? 我猜你程式碼的目的應該要透過協調物件轉call其他Com 元件 用DCOm是一種方法,你也可直接叫用Interface 假設你DjDwzlDCom 所連接的元件為TDjDwz 那協調物件可改寫為
uses ...,DjDwz_TLB,...;
...
procedure TMtsUpdateCoor.UpdateDjDwzl(vDatas: OleVariant;
  iMaxError: Integer; var iErrorCount: Integer);
var inft:IDjDwz;
begin
  try
    inft := CoDjDwz.Create;
    inft.UpdateDatas(vDatas, iMaxError, iErrorCount);
    inft := nil;
    SetComplete;
  except
    SetAbort;
  end;
end;
混心雜欲 棄修身~唉
------
唉~
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-11-18 12:22:27 IP:218.1.xxx.xxx 未訂閱
FDM.DjDwzlDCom.Open;写了吗? 另,一般都用Delta保存,你为何用Data?     久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听
------
江上何人初见月,江月何年初照人
weixubin
一般會員


發表:30
回覆:14
積分:8
註冊:2003-02-20

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-18 15:39:12 IP:61.144.xxx.xxx 未訂閱
我並未看到你在Server端程式中呼叫 Initialize,我假設你已經在OnCreate 能否說明FDM.DjDwzlDCom 是啥東西?是DCom Connection嗎? 我猜你程式碼的目的應該要透過協調物件轉call其他Com+元件 用DCOm是一種方法,你也可直接叫用Interface 假設你DjDwzlDCom 所連接的元件為TDjDwz 那協調物件可改寫為
uses ...,DjDwz_TLB,...;
...
procedure TMtsUpdateCoor.UpdateDjDwzl(vDatas: OleVariant;
  iMaxError: Integer; var iErrorCount: Integer);
var inft:IDjDwz;
begin
  try
    inft := CoDjDwz.Create;
    inft.UpdateDatas(vDatas, iMaxError, iErrorCount);
    inft := nil;
    SetComplete;
  except
    SetAbort;
  end;
end;
混心雜欲 棄修身~唉 [/quote] 現在發現更新不了數據庫.... 我用李维的写的配書源码在我的工程中测试也会出现同样的问题(Delphi6 SQL2000): try FMyDM.dcomcPublishers.AppServer.UpdateDatas(vDatas, iMaxError, iErrorCount); SetComplete; except SetAbort; ShowMessage('fff');〈--會運行到這裏 end; 不知道各位有沒有同感 ========================= 同是炎黄子孙
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-11-18 17:23:09 IP:61.224.xxx.xxx 未訂閱
引言: 現在發現更新不了數據庫.... 我用李维的写的配書源码在我的工程中测试也会出现同样的问题(Delphi6 SQL2000): try FMyDM.dcomcPublishers.AppServer.UpdateDatas(vDatas, iMaxError, iErrorCount); SetComplete; except SetAbort; ShowMessage('fff');〈--會運行到這裏 end; 不知道各位有沒有同感 ========================= 同是炎黄子孙
那表示執行FMyDM.dcomcPublishers.AppServer.UpdateDatas(vDatas, iMaxError, iErrorCount);出錯 原因為 1.呼叫前未將FMyDM.dcomcPublishers 建立或FMyDM.dcomcPublishers.Connected= True 2.dcomcPublishers.AppServer.UpdateDatas內容寫錯,請先撰寫測試程式直接由客戶呼叫dcomcPublishers.AppServer.UpdateDatas,測試是否可正常異動資料庫 混心雜欲 棄修身~唉
------
唉~
weixubin
一般會員


發表:30
回覆:14
積分:8
註冊:2003-02-20

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-11-18 21:03:06 IP:210.77.xxx.xxx 未訂閱
[/quote] 那表示執行FMyDM.dcomcPublishers.AppServer.UpdateDatas(vDatas, iMaxError, iErrorCount);出錯 原因為 1.呼叫前未將FMyDM.dcomcPublishers 建立或FMyDM.dcomcPublishers.Connected= True 2.dcomcPublishers.AppServer.UpdateDatas內容寫錯,請先撰寫測試程式直接由客戶呼叫dcomcPublishers.AppServer.UpdateDatas,測試是否可正常異動資料庫 混心雜欲 棄修身~唉 [/quote] 还是不行呀,我试过好几次了。你有没有做成功过呢,如有现成例子能不能借来参考一下,已经搞了很长时间了,一点办法都没有了 ========================= 同是炎黄子孙
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-11-19 17:32:05 IP:61.224.xxx.xxx 未訂閱
引言: 还是不行呀,我试过好几次了。你有没有做成功过呢,如有现成例子能不能借来参考一下,已经搞了很长时间了,一点办法都没有了 同是炎黄子孙
放心我目前開發的分散式系統採用COM+架構有協調,資料維護,系統等元件相互合作,運作正常,不過程式架構不能給你參考,我另外簡單設計一個範例你試試看 http://delphi.ktop.com.tw/loadfile.php?TOPICID=12764779&CC=285481 說明:
/*前言*/
  本範例程式的目的用來展試示COM+元件式交易的寫法,如何透過協調物件來控制交易達到重用物件的目的
為盡量簡化程式,訂單採用單表(非master/detail)
請勿來信跟我討論說本範例設計情境不實用,或用MIDAS原本架構有更好的作法等等非主題性問題
透過本範例應該可以了解到如果對Server端元件作適當分割的話,的確採用COM+元件跟本不須撰寫任何資料庫交易的控制程式碼    /*設計情境說明*/
1.需求
  在修改訂單時,必須要檢查目前的庫存量是否足夠,否則令該次訂單修改失敗,以確保能夠順利出貨
2.Server Tier 設計
  Server 端主要由訂單元件(Order,支援交易) ,庫存元件(WareHouse,支援交易),協調元件(Coor,必須交易)
  等三個COM+元件構成
2.1 訂單元件(Order,支援交易)
   非常單純的訂單維護元件,只擺標準的Data Access Component(DataSetProvider-ADOQuery-ADOConnection)及作必要的設定
    
2.2 庫存元件(WareHouse,支援交易)
   提供庫存資料維護及下述方法供控制產品庫存量
   function ReduceCount(const product_id: WideString;product_count: Integer): Integer;
   //扣減庫存數量(產品代號,扣減數量):成功傳回0,失敗傳回不足數量      2.3 協調元件(Coor,必須交易)
   協調元件件,負責異動定單並執行扣庫存動作,若扣庫存失敗會將不足數量與產品代號由NotEnoughCount,ProductID傳回
   function MyApplyUpdates(Delta: OleVariant;out NotEnoughCount: Integer; out ProductID: WideString): OleVariant;
   
3.Client Tier設計
  簡單的維護程式主要有兩個畫面分別為訂單維護畫面與庫存維護畫面,使用訂單維護畫面時,請預先設定產品的庫存數量
  執行訂單項目更新時會呼叫 協調元件 MyApplyUpdates方法,若失敗會傳回庫存不足的數量
ps.Client 套透過SocketConnection連接Server    /*資料庫安裝*/
 執行本程式之前請先在Database Create 兩個表格分別為
 1.order 結構如下
   order_no int            //訂單編號 Prime Key  
   product_id varchar(40)  //產品代號 Prime Key
   order_number int        //訂購數量
   price money             //單價
   
 2.WareHouse 結構如下
   product_id  varchar(40) //產品代號 Prime Key
   product_count  int      //庫存數量
   
 Server端元件與Database連結方式採外部檔案控制,因此請將所附檔案DBConn.udl copy 至C:\底下,並雙擊重新設定Database連結方式 
  
/*關鍵程式碼*/
/~Server Tier~/
//扣減庫存數量(產品代號,扣減數量):成功傳回0,失敗傳回不足數量
function TWarehouse.ReduceCount(const product_id: WideString;
  product_count: Integer): Integer;
 var remainCount:integer;
begin
 try
  adoquery1.SQL.Text := 'select * from WareHouse where product_id = '+QuotedStr(product_id);
  adoquery1.Open;
  adoquery1.First;
  if adoquery1.Eof then adoQuery1.AppendRecord([product_id,0]);
  remainCount :=  adoQuery1['product_count'] -  product_count;
  if remainCount >=0 then
  begin//庫存量足夠應付訂單
   adoQuery1.Edit;
   adoQuery1['product_count'] := remainCount;
   adoQuery1.post;
   SetComplete;
   result := 0;
  end else begin//庫存量不足,設定交易失敗
   SetAbort;
   result :=abs( remainCount);
  end;
 except
  SetAbort;
 end;
end;    //協調元件件,負責異動定單並執行扣庫存動作,若扣庫存失敗會將不足數量與產品代號由NotEnoughCount,ProductID傳回
function TCoor.MyApplyUpdates(Delta: OleVariant;
  out NotEnoughCount: Integer; out ProductID: WideString): OleVariant;
var order:IOrder;
     warehouse:IWarehouse;
     OwnerData:OleVariant;
     cds:TClientDataSet;
     product_id:string;
     product_count:integer;
     wc,ErrorCount:integer;
begin
 order := CoOrder.Create;
 warehouse := CoWarehouse.Create;
 cds :=TClientDataSet.Create(self);
 try
  try
   //=====異動訂單資料=====
   result := order.AS_ApplyUpdates('DataSetProvider1',Delta,0,ErrorCount,OwnerData);       //=====從Delta中解出訂單的異動數量來執行扣庫存動作=====
   cds.Data := Delta;
   cds.First;NotEnoughCount := 0;ProductID := '';
   while not cds.Eof do
   begin
    wc := 0;
    if not cds.FieldByName('product_id').IsNull then
      product_id := cds.FieldByName('product_id').AsString;
    product_count := cds.FieldByName('order_number').AsInteger;
    case cds.UpdateStatus of
     //新增訂單項目故必須扣庫存
     usInserted : wc := warehouse.ReduceCount(product_id,product_count);
     //刪除訂單項目故必須回補庫存
     usDeleted : wc := warehouse.ReduceCount(product_id,-product_count);
     //異動庫存-先回補
     usUnmodified        : wc := warehouse.ReduceCount(product_id,-product_count);
     //異動庫存-後扣
     usModified                :  wc := warehouse.ReduceCount(product_id,product_count);
    end;
    //若產品庫存量不足,終止異動動作
    if wc > 0 then begin
     NotEnoughCount := wc;
     ProductID := product_id;
     SetAbort;
     exit;
    end;
    cds.Next;
   end;
   SetComplete;
  finally
   order := nil;
   warehouse := nil;
   cds.Free;
  end;
 except
  SetAbort;
  raise;
 end;
end; 
       
/~Client Tier~/
procedure TForm1.Button1Click(Sender: TObject);
var r:OleVariant;
    NotEnoughCount:integer;
    ProductID:WideString;
begin
  cdsOrder.CheckBrowseMode;
  if cdsOrder.ChangeCount >0 then
  begin
   r:=scCoor.AppServer.MyApplyUpdates(cdsOrder.Delta,NotEnoughCount,ProductID);
   if NotEnoughCount = 0 then
   begin
    if cdsOrder.Reconcile(r) then
    begin
     cdsOrder.MergeChangeLog;
     Showmessage('訂單變更成功');
    end;
   end else begin
    Showmessage(''''+ProductID+'''產品庫存量不足'+InttoStr(NotEnoughCount)+',請重新調整該項目數量。');
   end;
  end
end; 
撰寫分散式架構的系統遠比Cliet/Serve難上好幾倍,希望本程式對你有所幫助... 混心雜欲 棄修身~唉
------
唉~
weixubin
一般會員


發表:30
回覆:14
積分:8
註冊:2003-02-20

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-11-20 10:23:27 IP:61.144.xxx.xxx 未訂閱
謝謝speedup   從你的例子中我受益非淺! 再次謝謝  ========================= 同是炎黄子孙
weixubin
一般會員


發表:30
回覆:14
積分:8
註冊:2003-02-20

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-11-20 10:39:33 IP:61.144.xxx.xxx 未訂閱
Speedup大哥 分原本想給你的,給錯了,怎麽辦? ========================= 同是炎黄子孙
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-11-20 15:53:49 IP:203.204.xxx.xxx 未訂閱
引言: Speedup大哥 分原本想給你的,給錯了,怎麽辦? ========================= 同是炎黄子孙
已請站長幫你改成未給分,請你重新指定得分者就可以了。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-04-30 13:45:07 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-05-19 8:44:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!