matinal:SAP ABAP 关于sftp的发送接收源代码

症状
a) 您需要将文件从 SAP 应用程序服务器传输到仅支持 SFTP 协议的接收方。但是,SAP 应用程序服务器只能使用 HTTPS 协议发送文件。此外,您可能希望在发送前对文件进行加密。

b) 您需要通过 HTTPS 将文件从远程服务器传输到 SAP 应用程序服务器。此外,您可能希望在保存之前解密文件。

目前没有标准的程序或工具可用于文件加密、解密和传输。因此,您需要创建一个自定义程序。本说明为您提供示例编码以支持您创建自己的程序。

请注意:PGP 加密不是SAP Employee Central Payroll 服务产品的一部分。原因如下: PGP 需要在应用服务器上安装额外的操作级软件,这在云环境中是不可能的

其他条款
SAP SuccessFactors Employee Central Payroll、SFTP 服务器、文件传输、加密、解密

原因和先决条件
在使用您的自定义程序之前,必须满足以下先决条件:

您有权创建报告程序、从应用程序服务器检索文件以及将它们上传到远程服务器。
在本地服务器上启动用于出站处理的程序的用户对本地文件具有 READ 授权:授权对象 S_DATASET、PROGRAM = SAPLSCMS_FILE、ACTVT = 33(读取)、FILENAME = <本地文件名,包括完整路径>。
请注意:这并不一定意味着该用户可以显示文件内容。例如,如果您既未在程序中使用值帮助,也未授予用户对象 S_TCODE 和 TCD = AL11 的授权,则他们将无法从 UI 访问文件内容。
在 FILE 事务中,您维护了传出和传入文件的逻辑路径和文件名。
在 SM59 事务中,您维护了一个类型为 G =“HTTP 连接到外部服务器”的 RFC 目标,并将远程服务器作为目标主机。您已在“登录和安全”选项卡上维护了远程服务器的用户名和密码。两个系统中必要的基本配置都已完成(例如,在系统中建立可信连接、授权等)。要创建到外部服务器的 HTTPS 连接,Employee Central Payroll 系统必须信任服务器的证书。
要使用 SSL 连接,您需要通过 STRUST 事务附加外部服务器的 CA 证书。示例报告使用默认客户端 PSE(SSL 客户端标准)连接到远程服务器。
您已成功执行 RFC 目标的连接测试。
仅相关,如果您想使用加密功能:
在 STRUST 事务中,您维护了一个 PSE 并导入了您要发送的文件的最终收件人的证书。有关 STRUST 的更多信息,请参阅https://help.sap.com/viewer/2...
解决方案
SAP SuccessFactors 为客户提供对 SFTP 服务器的访问。您可以先通过HTTPS从ABAP应用服务器向这个SFTP服务器发送文件,然后再通过SFTP协议从SFTP服务器传输给接收方。除了使用 SuccessFactors SFTP 服务器,您还可以将文件发送到任何其他通过 HTTPS 协议接受文件的远程服务器。

本笔记所附的示例代码显示,

a) 来自 ABAP 应用程序服务器的文件如何通过 HTTPS 检索、加密和发送到远程服务器

b) 如何通过 HTTPS 检索来自远程服务器的文件、解密并将其存储在 ABAP 应用程序服务器上。

示例程序只为 PSE 和收件人提供一对输入字段。在生产场景中,您不会使用相同的 PSE 和收件人进行加密和解密。但是在您的实施和测试阶段,您可能想要检查是否正确调用了加密功能。为此,输入 PSE 所有者作为接收者(证书主题):只有这样,您才能在同一个 PSE 中同时拥有用于加密的公钥和用于解密的私钥。

如果您对加密或解密有任何问题,请检查系统日志(SM21 事务)以获取有关问题根源的信息。

示例程序使用您在 SM59 事务中维护的 RFC 连接。如果您将目标系统的凭据存储在该 RFC 连接中,您可以安排程序并将其作为后台作业运行:凭据将从 SM59 配置中获取,并且在文件传输期间不会提示您输入它们。

注意:在创建自己的程序时,请特别注意示例代码中以“@CUSTOMER”开头的注释,因为您需要实现自己的逻辑。通过示例程序的流程逻辑,您可以看到如何调用功能(本地读/写、http 文件传输、解密/加密)。

注意:示例编码并非旨在高效使用,SAP 既不提供任何支持,也不对您基于此示例可能实施的任何内容负责。这尤其适用于安全问题:您有责任为您的编码添加安全功能,并相应地配置您的系统(例如,保护您的系统免受病毒侵害)。

注意:示例程序中使用的 SSF_KRN_ENVELOPE 和 SSF_KRN_DEVELOPE 密码功能模块仅支持公钥密码标准 PKCS#7。非对称密钥必须是 RSA 或 ECDSA。支持的对称密码算法请参考 SAP note 2004653的对应部分。如果要显示所有支持的密码标准的列表,请启动事务 SE38,输入Program Name = SSF02并执行 (F8)。在选项部分,选择SSF 格式字段的值帮助以显示该列表。如果您使用SSFW_KRN_ENVELOPE和SSFW_KRN_DEVELOPE 功能模块,您可以使用这些标准中的任何一个加密/解密文件。

要在您自己的系统中实现示例程序,请执行以下操作:

1.在SE38事务中,新建一个程序。例如,ZSAMPLE_CRYPT_TRANSFER_FILE 或选择任何其他名称。

  1. 在编辑器中,选择Utilities -> More Utilities -> Upload/Download 并将附件(ZSAMPLE_CRYPT_TRANSFER_FILE.txt)上传 到该程序中。
  2. 激活程序。
  3. 选择Goto -> Text Elements为每个选择参数和选择屏幕的每个块定义文本。
    您会在选择文本的选项卡上找到一些条目:这些条目是在程序激活期间根据选择参数自动生成的,现在您只需填写文本。通过双击程序中块标题的文本符号 text-<xyz>
    为文本符号创建条目。适当的文本包含在示例编码中,作为每个选择参数或块标题旁边的注释,您可以简单地将它们从那里复制到选择文本或文本符号中。

提示:您将在示例编码的末尾找到选择屏幕的定义。

  1. 激活文本。
*&---------------------------------------------------------------------*
REPORT zsample_crypt_transfer_file.
*&---------------------------------------------------------------------*
*&
*& Sample report for
*&  a) transferring a file from the application server
*&     to an external file server via HTTP(S) protocol
*&     Optionally, the file can be encrypted before sending
*&  b) fetching a file from an external server via HTTP(S) and
*&     saving it to the application server.
*&     Optionally, the file can be decrypted before saving
*&
*& !!! Basic example only - coding needs to be adapted by customer!!!
*&
*& For adapting to customer specific needs, pay special attention
*& to comments marked with '@CUSTOMER'
*&
*& !!! MESSAGE and WRITE statements              !!!
*& !!! to be used only for testing in dialog mode!!!
*& Define appropriate messages and write to application log
*& in order to run the program in batch mode
*&
*&---------------------------------------------------------------------*
*& M O D I F I C A T I O N   L O G                                     *
*&---------------------------------------------------------------------*
*& Date         Author        Description                              *
*&---------------------------------------------------------------------*
*& yyyy-mm-dd   XXXXXXXXXX    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*
*&
*&---------------------------------------------------------------------*


* ======================================================================
* Local classes
* ======================================================================


* ======================================================================
* lcl_file:
* Represents the file, provides basic operations like SAVE, and
* cryptographic operations
* =====================================================================
CLASS lcl_file DEFINITION FINAL.

  PUBLIC SECTION.

    TYPES:
      tty_line TYPE STANDARD TABLE OF ssfdata .

    CONSTANTS gc_mode_orig TYPE c VALUE '1' ##NO_TEXT.
    CONSTANTS gc_mode_decrypted TYPE c VALUE '2' ##NO_TEXT.
    CONSTANTS gc_mode_encrypted TYPE c VALUE '3' ##NO_TEXT.
    CONSTANTS gc_line_length TYPE i VALUE 255 ##NO_TEXT.

    METHODS save
      IMPORTING
        !iv_pathname TYPE fileintern
        !iv_mode     TYPE flag DEFAULT '2' .
    METHODS encrypt
      IMPORTING
        !iv_pse       TYPE ssfappl
        !iv_recipient TYPE certsubjct
      RAISING
        cx_crypto_error .
    METHODS decrypt
      IMPORTING
        !iv_pse       TYPE ssfappl
        !iv_recipient TYPE certsubjct
      RAISING
        cx_crypto_error .
    METHODS create_from_xstring
      IMPORTING
        !iv_xstring  TYPE xstring
        !iv_pathname TYPE string
        !iv_bytes    TYPE i OPTIONAL .
    METHODS load_from_applsrv
      IMPORTING
        !iv_pathname    TYPE fileintern
        !iv_filename    TYPE string
      RETURNING
        VALUE(rv_subrc) TYPE i .
    METHODS get_mimetype
      RETURNING
        VALUE(rv_mimetype) TYPE w3conttype .
    METHODS get_xstring
      IMPORTING
        !iv_mode    TYPE c
      EXPORTING
        !ev_xstring TYPE xstring
        !ev_length  TYPE i
        !ev_subrc   TYPE sysubrc .

  PRIVATE SECTION.

    DATA: mv_extension        TYPE string,
          mt_decrypted_line   TYPE tty_line,
          mt_encrypted_line   TYPE saml2_pse_bin_data_t,
          mt_source_line      TYPE tty_line,
          mv_decrypted_length TYPE i,
          mv_encrypted_length TYPE i,
          mv_filename         TYPE string,
          mv_source_length    TYPE i,
          mv_mimetype         TYPE w3conttype.

    METHODS set_name_and_type
      IMPORTING
        !iv_pathname TYPE string .
ENDCLASS.



CLASS lcl_file IMPLEMENTATION.

  METHOD create_from_xstring.
*      IMPORTING
*        !iv_xstring  TYPE xstring
*        !iv_pathname TYPE string
*        !iv_bytes    TYPE i OPTIONAL .

    " -------------------------------------------------------------
    " Creates file content from given xstring and sets some
    " instance attributes.
    " Method can be used e.g. after retrieving a file via HTTP GET
    " -------------------------------------------------------------

    DATA:
      lv_xstring TYPE xstring,
      lv_line    TYPE ssfdata.

    lv_xstring = iv_xstring.

    IF iv_bytes IS INITIAL.
      mv_source_length = xstrlen( lv_xstring ).
    ELSE.
      mv_source_length = iv_bytes.
    ENDIF.

    WHILE xstrlen( lv_xstring ) > 0.
      lv_line = lv_xstring.
      APPEND lv_line TO mt_source_line.
      SHIFT lv_xstring LEFT BY gc_line_length PLACES IN BYTE MODE.
    ENDWHILE.

    set_name_and_type( iv_pathname ).

  ENDMETHOD.


  METHOD decrypt.
*      IMPORTING
*        !iv_pse       TYPE ssfappl
*        !iv_recipient TYPE certsubjct
*      RAISING
*        cx_crypto_error .

    " -----------------------------------------------------------------
    " Decrypts the binary content of the original file and
    " puts the result into mt_decrypted_line
    " -----------------------------------------------------------------

    FIELD-SYMBOLS:
      <ls_source_line> TYPE ssfdata.

    DATA:
      ls_encrypted_line TYPE ssfbin,
      lt_encrypted_line TYPE saml2_pse_bin_data_t,
      lv_ssftoolkit     TYPE  ssftoolkit,
      lv_str_format     TYPE  ssfform,
      lv_str_profile    TYPE  ssfprof,
      lv_crc            TYPE  ssfreturn,
      lt_recipient      TYPE TABLE OF ssfinfo,
      ls_recipient      TYPE ssfinfo.


    " Before decrypting, we need to re-format the content:
    " Decryption works with a structured line type, but
    " the original content has a flat line type
    LOOP AT mt_source_line ASSIGNING <ls_source_line>.
      CLEAR ls_encrypted_line.
      ls_encrypted_line-bindata = <ls_source_line>.
      APPEND ls_encrypted_line TO lt_encrypted_line.
    ENDLOOP.

    CALL FUNCTION 'SSF_GET_PARAMETER'
      EXPORTING
        mandt       = sy-mandt
        application = iv_pse
      IMPORTING
        ssftoolkit  = lv_ssftoolkit
        str_format  = lv_str_format
        str_profile = lv_str_profile
      EXCEPTIONS
        OTHERS      = 1.
    IF sy-subrc <> 0.
      WRITE: / 'SSF parameter read failed - see system log (SM21)'.
      RAISE EXCEPTION TYPE cx_crypto_error.
    ENDIF.

    " function module needs a recipient list:
    ls_recipient-id = iv_recipient.
    ls_recipient-profile = lv_str_profile.
    APPEND ls_recipient TO lt_recipient.

    CALL FUNCTION 'SSF_KRN_DEVELOPE'
      EXPORTING
        ssftoolkit            = lv_ssftoolkit
        str_format            = lv_str_format
        ostr_enveloped_data_l = mv_source_length
      IMPORTING
        ostr_output_data_l    = mv_decrypted_length
        crc                   = lv_crc
      TABLES
        ostr_enveloped_data   = lt_encrypted_line
        recipient             = lt_recipient
        ostr_output_data      = mt_decrypted_line
      EXCEPTIONS
        OTHERS                = 1.
    IF sy-subrc <> 0 OR lv_crc <> 0 OR mt_decrypted_line IS INITIAL.
      WRITE: / 'Decryption for file ', mv_filename, ' failed - see system log (SM21)'.
      RAISE EXCEPTION TYPE cx_crypto_error.
    ELSE.
      WRITE: / 'File ', mv_filename, ' decrypted'.
    ENDIF.

  ENDMETHOD.


  METHOD encrypt.
*      IMPORTING
*        !iv_pse       TYPE ssfappl
*        !iv_recipient TYPE certsubjct
*      RAISING
*  
<think>好的,我现在需要处理用户关于SAP系统中车间和仓库盘盈盘亏处理方式及差异的问题。首先,我要回忆之前用户提到的内容,用户之前问过车间库负库存的设置,引用了matinalSAP FICO的资料。现在用户进一步询问盘盈盘亏的具体处理方法和区别,需要结合之前的引用信息,同时可能需要补充其他相关知识。 首先,盘盈盘亏通常涉及库存差异的处理,这在SAP中可能通过不同的移动类型和会计科目来体现。根据引用[1],车间库是虚拟库,允许负库存,而实体仓库不允许。这可能影响盘点的处理方式。例如,车间库的差异可能通过生产订单调整,而实体仓库的差异可能直接通过库存调整科目处理。 然后,引用[2]提到KO88结算生产订单时产生的会计凭证,涉及生产成本和材料成本差异科目。这说明生产相关的差异可能通过生产订单结算流程处理,而仓库的差异可能直接调整库存科目。 接下来,我需要区分车间和实体仓库的处理步骤。车间库作为虚拟库,可能与生产订单相关,盘盈盘亏可能通过调整生产订单的投入或产出来处理,使用特定的移动类型如701/702。而实体仓库的差异可能使用移动类型701/702,并直接过账到差异科目,影响库存价值。 另外,会计处理方面,车间库的差异可能关联到生产成本科目,而实体仓库差异可能对应库存调整科目。需要注意系统配置中是否允许负库存对处理方式的影响,车间库允许负库存可能意味着差异处理更灵活,而实体仓库需要及时调整避免负库存。 用户可能还想知道具体的操作事务代码,比如MI07用于库存盘点,MI20查看差异,以及KO88结算生产订单。同时,需要说明两者的核心区别在于库存类型、会计科目和处理流程。 最后,生成相关问题需要考虑用户可能进一步的问题,比如配置步骤、会计凭证差异、生产订单影响等。确保问题覆盖用户可能的兴趣点,帮助他们深入理解处理机制。</think>### SAP车间与仓库盘盈盘亏处理方法及区别 #### 一、车间库(虚拟库)盘盈盘亏处理 1. **业务背景** 车间库作为配合生产回冲扣料的虚拟库,允许负库存[^1],其差异通常与生产订单执行相关。例如:生产投料未完全消耗或退库未及时记录。 2. **处理步骤** - **差异确认**:通过事务代码`MI07`进行库存盘点,系统生成差异清单。 - **调整方式**: - 盘盈:使用移动类型`701`(库存增加)关联生产订单,冲减生产成本。 - 盘亏:使用移动类型`702`(库存减少)关联生产订单,增加生产成本。 - **会计处理**:差异通过生产订单结算(事务代码`KO88`)转入成本中心或差异科目,例如: ``` 借:生产成本-差异调整 贷:库存-车间库 ``` [^2] #### 二、实体仓库盘盈盘亏处理 1. **业务限制** 实体仓库禁止负库存[^1],差异需立即处理,通常由物料管理模块触发。 2. **处理步骤** - **差异过账**:使用移动类型`701`/`702`直接调整库存,系统自动生成会计凭证: ``` 借/贷:库存商品 贷/借:库存盘盈盘亏科目 ``` - **权限控制**:需审批流程(通过审批码或电子工作流)。 #### 三、核心区别对比 | **维度** | **车间库** | **实体仓库** | |----------------|-----------------------------------|--------------------------------| | **库存类型** | 虚拟库(允许负库存)[^1] | 实物库(禁止负库存) | | **差异来源** | 生产订单执行偏差 | 收发存操作误差 | | **会计科目** | 关联生产成本科目[^2] | 直接使用库存调整科目 | | **处理流程** | 需结合生产订单结算(KO88)[^2] | 独立过账,无需关联订单 | #### 四、配置要点 1. **车间库**:在物料主数据中设置“特殊库存标识”(如生产库存),并配置移动类型与生产订单的关联。 2. **实体库**:在物料管理(MM)模块定义库存调整科目,并设置审批策略。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值