0

Progress 4GL (OpenEdge 10.2B) を使用して Magento API を使用して株式を更新しようとしています。

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.
4

1 に答える 1

1

これらの API では、SOAP エラーは「より大きな」エラーが発生した場合にのみ発生します。たとえば、Web サービスがダウンしている場合、ログイン基準が満たされていない場合、データ型が間違っている場合などです。通常、戻り値は SOAP エンベロープではなく応答にあります。

存在しない商品を在庫0にするだけでいいのでしょうか?1 に設定しようとするとどうなりますか? おそらく、Web サービスがこの場合に期待するコードを実際に提供することを、PHP (または通常使用する言語) から再確認する必要がありますか?

それ以外の場合は、作成された wsdl-documentation を確認する必要があります。結果パラメーター (コード内の結果) が INTEGER であり、より複雑な xml-document (基本的にはオブジェクト) の形式ではないことを 100% 確信していますか? それが本当に 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.

そして、FINALLY ブロックに挿入します。

IF cError <> "" THEN DO:
    MESSAGE "Errors occured:" SKIP
        cError
        VIEW-AS ALERT-BOX ERROR.
END.
于 2013-10-24T10:52:35.700 に答える