2013-10-23 32 views
0

我想更新我們的股票就想到了用進步4GL(OpenEdge 102億),Magento的API進展4GL Web服務過程

到目前爲止好,即:我可以更新庫存,如果SKU匹配。但如果不是,它不會返回錯誤。

因此,我研究了ABL如何管理SAOP故障錯誤,並找到了一些我嘗試實施的例子。但無濟於事。

代碼如下:

DEFINE VARIABLE hWebService AS HANDLE NO-UNDO. 
DEFINE VARIABLE hMage_Api_Model_Server_V2_HandlerPortType AS HANDLE NO-UNDO. 
DEFINE VARIABLE username AS CHARACTER NO-UNDO. 
DEFINE VARIABLE apiKey AS CHARACTER NO-UNDO. 
DEFINE VARIABLE stock AS CHARACTER NO-UNDO. 
DEFINE VARIABLE codigo AS CHARACTER NO-UNDO. 
DEFINE VARIABLE loginReturn AS CHARACTER NO-UNDO. 
DEFINE VARIABLE product AS CHARACTER NO-UNDO. 
DEFINE VARIABLE data AS LONGCHAR NO-UNDO. 
DEFINE VARIABLE resultado AS INTEGER NO-UNDO. 
DEFINE VARIABLE SOAP-FAULT-CODE AS CHARACTER NO-UNDO. 
DEFINE VARIABLE SOAP-FAULT-DETAIL AS CHARACTER NO-UNDO. 
DEFINE VARIABLE iError AS INTEGER  NO-UNDO. 
DEFINE VARIABLE cError AS CHARACTER NO-UNDO. 

DO ON ERROR UNDO, THROW: 
CREATE SERVER hWebService. 

/* TODO: Definir variaveis globais */ 
username = 'username'. 
apiKey = 'password'. 

hWebService:CONNECT(" -WSDL 'http://www.medicalemcasa.com/api/v2_soap?wsdl'"). 

RUN Mage_Api_Model_Server_V2_HandlerPortType SET hMage_Api_Model_Server_V2_HandlerPortType ON hWebService. 
RUN login IN hMage_Api_Model_Server_V2_HandlerPortType(INPUT username, INPUT apiKey, OUTPUT loginReturn). 


product = "100asda001a". 
data = " 
     <data> 
     <qty>'250'</qty> 
     </data> 
     ". 

PROCEDURE catalogInventoryStockItemUpdate: 
    DEFINE INPUT PARAMETER data AS CHARACTER NO-UNDO. 
END PROCEDURE. 

RUN catalogInventoryStockItemUpdate IN hMage_Api_Model_Server_V2_HandlerPortType (INPUT loginReturn, INPUT product, INPUT data, OUTPUT resultado). 
DISPLAY resultado. 

CATCH mySoapErrorObject AS Progress.Lang.SoapFaultError: 
    DO iError = 1 TO mySoapErrorObject:NumMessages: 
     cError = cError + mySoapErrorObject:getMessage(iError) + "~n". 
    END. 
    DELETE OBJECT mySoapErrorObject. 
END CATCH. 

CATCH mySystemErrorObject AS Progress.Lang.SysError: 
    DO iError = 1 TO mySystemErrorObject:NumMessages: 
     cError = cError + mySystemErrorObject:getMessage(iError) + "~n". 
    END. 
    DELETE OBJECT mySystemErrorObject. 
END CATCH. 

FINALLY: 
IF cError <> "" THEN DO: 
    MESSAGE "Errors occured:" SKIP 
     cError 
     VIEW-AS ALERT-BOX ERROR. 
END. 
END FINALLY. 
END. 

hWebService:DISCONNECT(). 
DELETE OBJECT hWebService. 
+0

?是否有任何錯誤發生? – Jensd

+0

你也實現了我認爲的一個例子,而不是處理錯誤的一般方法。而不是檢查VersionMismatch,只需嘗試MESSAGE hSoapFault:SOAP-FAULT-DETAIL並從此處獲取。 – Jensd

+0

嗨Jensd。 「resultado」的結果是SKU是否存在1。關於hSoapFault,請參閱我的編輯。 – pedropeixoto

回答

1

在這些API的我和SOAP錯誤的工作時,有一個「大」的錯誤只發生。例如,如果web服務關閉,登錄標準不符合,數據類型錯誤等。通常返回值是在響應中,而不是在SOAP信封中。

是不是可以將一個不存在的產品設置爲庫存0?如果您嘗試將其設置爲1,會發生什麼情況?也許您應該仔細檢查PHP(或者您通常使用的任何語言)Web服務是否實際提供了您期望的代碼?

否則,你應該看看創建的wsdl文檔 - 你是否100%確定結果參數(在你的代碼中的resultado)是一個INTEGER而不是任何形式的更復雜的xml文檔(基本上是一個對象)?如果它真的是HANDLE,那麼可能沒有運行時錯誤,但是沒有值插入到INTEGER中。

你也應該刪除所有當前的錯誤處理,並處理錯誤更普遍的方式取代它(並進行代碼更具體的,如果需要,而不是從一個例子制定的文件):

DEFINE VARIABLE iError AS INTEGER  NO-UNDO. 
DEFINE VARIABLE cError AS CHARACTER NO-UNDO. 

CATCH mySoapErrorObject AS Progress.Lang.SoapFaultError: 
    DO iError = 1 TO mySoapErrorObject:NumMessages: 
     cError = cError + mySoapErrorObject:getMessage(iError) + "~n". 
    END. 
    DELETE OBJECT mySoapErrorObject. 
END CATCH. 

CATCH mySystemErrorObject AS Progress.Lang.SysError: 
    DO iError = 1 TO mySystemErrorObject:NumMessages: 
     cError = cError + mySystemErrorObject:getMessage(iError) + "~n". 
    END. 
    DELETE OBJECT mySystemErrorObject. 
END CATCH. 

而插入在最終塊:在結果(resultado變量)請告訴我

IF cError <> "" THEN DO: 
    MESSAGE "Errors occured:" SKIP 
     cError 
     VIEW-AS ALERT-BOX ERROR. 
END. 
+0

我使用PHP檢查了兩次,並發現了故障代碼101,這意味着插入的SKU不存在。這就是我期望在ABL中獲得的。結果確實是一個「XML Schema int值」,所以我認爲應該這樣定義它?關於錯誤處理,我刪除了我所擁有的所有內容,並插入了剛給我的代碼。我必須在開始時添加「DO ON ERROR」語句,我認爲這是正確的?我不知道。 – pedropeixoto

+0

忘了提及我把我的新代碼放在最新的編輯中。 – pedropeixoto

+0

對不起,如果我不能自己運行代碼,不要以爲我可以幫助你。您可以查看Progress Developer Community。也許有人曾與Magento合作過。 [鏈接這裏](https://community.progress.com/?Redirected=true) – Jensd