1

SAP .NET Connector 3.0 を使用して RFC クライアントを構築し、ユーザーが最も簡単な方法で SAP と通信できるようにしています。
ここで、私が開発を進めるのを妨げているものの短いサンプルを提供したいと思います。現在、私の目的は既存の販売注文を変更することです。BAPI_SALESORDER_CHANGESOヘッダーとアイテムデータを変更するために使用するFMです。12 品目 (000010 から 0000120 まで) の販売注文があります。シナリオ B と C はうまくいきません。

シナリオ A:顧客の注文書の変更
結果: PO 番号が正常に変更されました。問題ない。

public DataTable BAPI_SALESORDER_CHANGE(RfcDestination destination)
    {
        RfcRepository repo = destination.Repository;
        IRfcFunction salesDoc = repo.CreateFunction("BAPI_SALESORDER_CHANGE");
        IRfcFunction salesDocCommit = repo.CreateFunction("BAPI_TRANSACTION_COMMIT");
        salesDoc.SetValue("SALESDOCUMENT", "3939393837");

        IRfcStructure salesHeader = salesDoc.GetStructure("ORDER_HEADER_IN");
        salesHeader.SetValue("PURCH_NO_C", "Order_01");
        IRfcStructure salesHeaderINX = salesDoc.GetStructure("ORDER_HEADER_INX");
        salesHeaderINX.SetValue("UPDATEFLAG", "U");
        salesHeaderINX.SetValue("PURCH_NO_C", "X");

        RfcSessionManager.BeginContext(destination);
        salesDoc.Invoke(destination);
        salesDocCommit.Invoke(destination);
        RfcSessionManager.EndContext(destination);

        IRfcTable returnTable = salesDoc.GetTable("RETURN");

        return ConvertToDataTable(returnTable);        
    }

シナリオ B:品目目標数量の変更
結果:メッセージを受け取りました: 販売注文が保存されました。しかし、数量は変更されていません。ここで何が問題なのですか?

public DataTable BAPI_SALESORDER_CHANGE(RfcDestination destination)
    {
        //...
        //Same peace of code as above    
        IRfcStructure salesHeader = salesDoc.GetStructure("ORDER_HEADER_IN");
        IRfcStructure salesHeaderINX = salesDoc.GetStructure("ORDER_HEADER_INX");
        salesHeaderINX.SetValue("UPDATEFLAG", "U");  

        IRfcTable salesItems = salesDoc.GetTable("ORDER_ITEM_IN");
        salesItems.Append();
        salesItems.SetValue("ITM_NUMBER", 000120);
        salesItems.SetValue("TARGET_QTY", Convert.ToDecimal("1"));
        IRfcTable salesItemsINX = salesDoc.GetTable("ORDER_ITEM_INX");
        salesItemsINX.Append();
        salesItemsINX.SetValue("UPDATEFLAG", "U");
        salesItemsINX.SetValue("ITM_NUMBER", 000120);
        salesItemsINX.SetValue("TARGET_QTY", "X");   
        //...
        //Invoke methods     
    }

シナリオ C:新規アイテムの追加
結果: salesDoc.Invoke(destination) メソッドのエラー: 「ユーザーへの接続なしの画面出力」。

public DataTable BAPI_SALESORDER_CHANGE(RfcDestination destination)
    {
        //...
        //Same peace of code as above 
        IRfcStructure salesHeader = salesDoc.GetStructure("ORDER_HEADER_IN");
        IRfcStructure salesHeaderINX = salesDoc.GetStructure("ORDER_HEADER_INX");
        salesHeaderINX.SetValue("UPDATEFLAG", "U");

        IRfcTable salesItems = salesDoc.GetTable("ORDER_ITEM_IN");
        salesItems.Append();
        salesItems.SetValue("ITM_NUMBER", 130);
        salesItems.SetValue("MATERIAL", "000000000081828282");
        salesItems.SetValue("TARGET_QTY", Convert.ToDecimal("1"));
        IRfcTable salesItemsINX = salesDoc.GetTable("ORDER_ITEM_INX");
        salesItemsINX.Append();
        salesItemsINX.SetValue("UPDATEFLAG", "I");
        salesItemsINX.SetValue("ITM_NUMBER", 130);
        salesItemsINX.SetValue("MATERIAL", "X");
        salesItemsINX.SetValue("TARGET_QTY", "X");
        //...
        //Invoke methods               
    }
4

2 に答える 2

0

ABAP プログラムと同様に、BAPI_SALESORDER_CHANGE への呼び出しが成功した後、BAPI_TRANSACTION_COMMIT を呼び出す必要があります。それ以外の場合、トランザクションは SAP によってコミットされません。

于 2014-11-04T22:28:45.150 に答える