【ABAP学习笔记】ZSDR0047&ZFIR0023A取中间表

参考资料

*SAP 可以通过使用中间表来进行数据调用。中间表是一个临时存储数据的表,通常用于在不同系统之间传递数据。在 SAP 中,可以使用不同的方法来调用中间表。
*一种常见的方法是使用 SAP 的数据传输工具,如 SAP 基础数据传输 (BDT) 或 ABAP 数据传输 (ALE)。这些工具可以帮助在不同的 SAP 系统之间传输数据,并将数据存储到中间表中。通过配置适当的数据传输设置,可以在源系统和目标系统之间建立连接,并定期或根据需要自动传输数据。
*另一种方法是使用 SAP 的 Open SQL 或 ABAP 程序来直接读取和写入中间表。可以使用适当的 ABAP 代码来定义和操作中间表,并在需要时从中检索数据或将数据写入中间表。
*总之,SAP 可以通过使用中间表来实现不同系统之间的数据调用和传输。具体的实现方法取决于你的情况和要求,可以选择适合你的方法来进行操作。 


*EDSAP.SY_CUSTOMS_DN 是一个表的名称,其中的命名可能根据特定系统或业务需求而定。根据常见的命名约定来看,这个表可能与 SAP 系统中的海关报关相关的数据有关。
*根据表名的部分含义推测,其中的 "EDSAP" 可能代表了一个特定的系统或命名空间,而 "SY_CUSTOMS_DN" 可能表示系统中用于存储海关报关单号 (Customs DN) 相关数据的表。
*然而,具体的含义还需要根据你所使用的系统和业务背景来进行确认。你可以通过查阅系统文档、询问相关的 SAP 系统管理员或负责人来获取更准确的信息。他们将能够提供关于 EDSAP.SY_CUSTOMS_DN 表的详细说明和用途。

*出口产生进口编号(审核通过)+对应的报关单号在iCLS存在 即抛送中间表。重复抓直到抓取,限时7天内(按iCLS 接入SAP 出口ODN之日之时算起)
*出口操作产生一个进口编号,并且该进口编号已通过审核。
*这个进口编号对应的报关单号在 iCLS(可能是一个系统或数据库)中存在。
*如果满足上述条件,将该数据抛送到中间表。
*重复进行数据抓取,直到成功抓取数据为止。
*数据抓取的时间限制为从 iCLS 接入 SAP 出口 ODN(运输订单号)之日开始,限时7天内。

*在SAP的DEMO环境和正式区环境运行时出现链接问题的原因可能有很多。以下是一些常见的可能原因:
*网络连接问题:在DEMO环境中,网络连接可能存在问题,例如网络延迟或不稳定,导致链接失败。而在正式区环境中,网络连接可能更加稳定。
*访问权限限制:DEMO环境可能具有更多的限制,例如访问特定数据库的权限限制。而正式区环境通常具有更高的权限,可以正常链接到数据库。
*数据库配置差异:DEMO环境和正式区环境中的数据库配置可能存在差异,例如数据库地址、端口或认证方式等。这些差异可能导致DEMO环境中的链接失败。
*数据库状态问题:DEMO环境中的数据库可能处于维护状态或者出现其他问题,导致链接失败。而正式区环境中的数据库通常保持良好的状态。
*为了解决这个问题,你可以尝试以下几个步骤:
*检查网络连接:确保你的网络连接稳定,并且没有阻止访问数据库的防火墙或网络配置。
*检查权限:确认你在DEMO环境中具有正确的数据库访问权限。如果有必要,联系系统管理员进行权限调整。
*检查配置:比较DEMO环境和正式区环境中的数据库配置,确保它们一致。如果有差异,尝试在DEMO环境中进行相应的配置修改。
*检查数据库状态:联系系统管理员确认DEMO环境中的数据库状态是否正常,并且没有任何维护活动或问题。
*如果以上步骤都无法解决问题,建议联系SAP支持团队,提供详细的错误信息和环境信息,以便他们能够更好地帮助你解决问题

测试运行

 开发区导数据

DATA gt_data TYPE TABLE OF ztsd0012.
DATA gs_data TYPE ztsd0012.

gs_data-kunnr = 'KH02'.            ""客编
gs_data-vkorg = 'Z01'.            ""销售组织
gs_data-vtweg = 'X'.            ""分销渠道
gs_data-matnr = 'WL02'.            ""物料编号
gs_data-kdmat = 'KHWL01'.            ""客户物料
gs_data-postx = '客户物料01'.            ""客户物料描述
gs_data-kunnr_e = 'APPLE'.          ""终端客户
gs_data-kdmat_e = 'ZDKHWUL01'.          ""终端客户料号
gs_data-zcase = 'ZA01'.            ""专案名称
gs_data-zmodel = 'JX01'.           ""机型"
gs_data-zerdat2 = SY-DATUM.          ""最后更改的日期"

APPEND  gs_data TO gt_data.
MODIFY ztsd0012 FROM TABLE gt_data.

运行 ZDB_PUSH_MATERIAL_SALELIST

*&---------------------------------------------------------------------*
*& Responsibility
*&---------------------------------------------------------------------*
* Program Name: ZDB_PUSH_MATERIAL_SALELIST
* Date written: 2019/06/12
* Author's name:EY-LUCY
* Last update:
* Program title:ZTSD0012表传输至ORACLE
* Project Name: 立讯精密ERP实施项目
* Version:      V1.0
*&---------------------------------------------------------------------*
* Description: (Incl. Related Function Area and System)
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
* Change History
*&---------------------------------------------------------------------*
*     Date   |   Programmer   |   Corr. #   |   Description
*   210626   |   YGL          |             | 增加程序查询和执行说明
*            |                |             |
REPORT zdb_push_material_salelist.
*&---------------------------------------------------------------------*
* DATA DEFINE                                                          *
*----------------------------------------------------------------------*
TABLES:mara.

DATA:
  gv_dbs       TYPE dbcon-con_name, "数据库连接名称
  go_exception TYPE REF TO cx_sy_native_sql_error,
  gv_error_msg TYPE string.


SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-003.
SELECT-OPTIONS:s_matnr FOR mara-matnr.
PARAMETERS:p_date TYPE sy-datum OBLIGATORY DEFAULT sy-datum.
SELECTION-SCREEN end of block b1.

*add begin by ygl_20210526
SELECTION-SCREEN COMMENT /3(79) TEXT-s00 MODIF ID m01.
SELECTION-SCREEN COMMENT /7(79) TEXT-s01 MODIF ID m01.
SELECTION-SCREEN COMMENT /7(79) TEXT-s02 MODIF ID m01.
SELECTION-SCREEN COMMENT /7(79) TEXT-s03 MODIF ID m01.
*add end by ygl_20210526

START-OF-SELECTION.
*_传输至ORACLE
  PERFORM frm_sent_data.

*&---------------------------------------------------------------------*
*& Form FRM_SENT_DATA
*&---------------------------------------------------------------------*
*& 传输至ORACLE
*&---------------------------------------------------------------------*
FORM frm_sent_data.

  DATA:lv_kunnr TYPE ztsd0012-kunnr,
       l_str TYPE string value '0'.


  CLEAR :lv_kunnr,gv_error_msg.
*_读取传输数据
  SELECT
    kunnr,
    vkorg,
    vtweg,
    matnr,
    kdmat,
    postx,
    kunnr_e,
    kdmat_e,
    zcase,
    zmodel
    FROM ztsd0012
    WHERE matnr IN @s_matnr
    AND zerdat2 GE @p_date
    INTO TABLE @DATA(lt_data).


  CHECK lt_data IS NOT INITIAL.

** 检查数据库连接是否已配置
*  SELECT SINGLE conntxt
*    INTO gv_dbs
*    FROM zdbconn
*   WHERE sysname EQ 'EDSAP'.
*
*  IF sy-subrc IS NOT INITIAL.
*    MESSAGE s011(zfi001) WITH 'EDSAP' DISPLAY LIKE 'E'.
*    LEAVE LIST-PROCESSING.
*  ENDIF.
  gv_dbs = 'DB_EDC'.

* ORACLE数据库:连接-->更新-->断开
  TRY. "连接数据库
      EXEC SQL.
        connect to :gv_dbs
      ENDEXEC.

    CATCH cx_sy_native_sql_error INTO go_exception.
      CALL METHOD go_exception->get_text
        RECEIVING
          result = gv_error_msg.
  ENDTRY.

  IF gv_error_msg IS NOT INITIAL.
    MESSAGE s009(zfi001) WITH gv_error_msg DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

  CLEAR l_str.

  LOOP AT lt_data INTO DATA(ls_data).

    l_str = l_str + 1.

    CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
      EXPORTING
        input        = ls_data-matnr
      IMPORTING
        output       = ls_data-matnr
      EXCEPTIONS
        length_error = 1
        OTHERS       = 2.

    ls_data-kunnr   = |{ ls_data-kunnr   ALPHA = OUT }|.
    ls_data-kunnr_e = |{ ls_data-kunnr_e ALPHA = OUT }|.

    TRY .
        EXEC SQL.
          SELECT KUNNR
              INTO :LV_KUNNR
              FROM MATERIAL_SALESLIST
              WHERE MANDT = :SY-MANDT
                AND KUNNR = :LS_DATA-KUNNR
                AND VKORG = :LS_DATA-VKORG
                AND VTWEG = :LS_DATA-VTWEG
                AND MATNR = :LS_DATA-MATNR
        ENDEXEC.
        IF sy-subrc NE 0.
          EXEC SQL.
            INSERT INTO MATERIAL_SALESLIST
                     (
                        MANDT,
                        KUNNR,
                        VKORG,
                        VTWEG,
                        MATNR,
                        KDMAT,
                        POSTX,
                        KUNNR_E,
                        KDMAT_E,
                        ZCASE,
                        ZMODEL )
                    VALUES
                     (
                      :SY-MANDT,
                      :LS_DATA-KUNNR,
                      :LS_DATA-VKORG,
                      :LS_DATA-VTWEG,
                      :LS_DATA-MATNR,
                      :LS_DATA-KDMAT,
                      :LS_DATA-POSTX,
                      :LS_DATA-KUNNR_E,
                      :LS_DATA-KDMAT_E,
                      :LS_DATA-ZCASE,
                      :LS_DATA-ZMODEL
                      )
          ENDEXEC.
        ELSE.
          EXEC SQL.
            UPDATE MATERIAL_SALESLIST SET
                         KDMAT   = :LS_DATA-KDMAT,
                         POSTX   = :LS_DATA-POSTX,
                         KUNNR_E = :LS_DATA-KUNNR_E,
                         KDMAT_E = :LS_DATA-KDMAT_E,
                         ZCASE   = :LS_DATA-ZCASE,
                         ZMODEL  = :LS_DATA-ZMODEL
                   WHERE KUNNR   = :LS_DATA-KUNNR
                     AND VKORG   = :LS_DATA-VKORG
                     AND VTWEG   = :LS_DATA-VTWEG
                     AND MATNR   = :LS_DATA-MATNR
                     AND MANDT   = :SY-MANDT
          ENDEXEC.
        ENDIF.
      CATCH cx_sy_native_sql_error INTO go_exception.
        CALL METHOD go_exception->get_text
          RECEIVING
            result = gv_error_msg.
    ENDTRY.

    IF gv_error_msg IS NOT INITIAL.
      MESSAGE e004(zsdb001).
      ROLLBACK WORK.
    ELSE.
      MESSAGE s005(zsdb001).
      COMMIT WORK.
    ENDIF.

    CLEAR ls_data.
  ENDLOOP.

*_断开连接
  EXEC SQL.
    DISCONNECT :gv_dbs
  ENDEXEC.

  CONCATENATE text-001 l_str text-002 INTO l_str.

  MESSAGE l_str TYPE 'S'.

  CLEAR lt_data.

ENDFORM.

 读取操作

DATA conn TYPE dbcon-con_name.
conn = 'DB_EDC'.

TRY.
    EXEC SQL.
      CONNECT TO :conn
    ENDEXEC.
    IF sy-subrc <> 0.
      RAISE EXCEPTION TYPE cx_sy_native_sql_error
        EXPORTING
          textid = cx_sy_native_sql_error=>cx_sy_native_sql_error.
    ENDIF.
    EXEC SQL.
      OPEN dbcur FOR
        SELECT KUNNR , matnr
               FROM MATERIAL_SALESLIST
               WHERE mandt = :sy-mandt
    ENDEXEC.
    DATA lv_kunnr TYPE ztsd0012-kunnr.
    DATA lv_matnr TYPE ztsd0012-matnr.
    DO.
      EXEC SQL.
        FETCH NEXT dbcur INTO :lv_kunnr , :lv_matnr
      ENDEXEC.
      IF sy-subrc <> 0.
        EXIT.
      ELSE.
        cl_demo_output=>write(  |{ lv_kunnr  }| ).
        cl_demo_output=>write(  |{ lv_matnr  }| ).
      ENDIF.
    ENDDO.
    EXEC SQL.
      CLOSE dbcur
    ENDEXEC.
    EXEC SQL.
      DISCONNECT :conn
    ENDEXEC.
  CATCH cx_sy_native_sql_error INTO DATA(exc).
    cl_demo_output=>write( exc->get_text( ) ).
ENDTRY.
cl_demo_output=>display( ).

读取操作2

TYPES : BEGIN OF ty_data,
          kunnr(10)   TYPE c,          ""客编
          vkorg(4)    TYPE c,          ""销售组织
          vtweg(2)    TYPE c,          ""分销渠道
          matnr(60)   TYPE c,          ""物料编号
          kdmat(60)   TYPE c,          ""客户物料
          postx(200)  TYPE c,          ""客户物料描述
          kunnr_e(20) TYPE c,          ""终端客户
          kdmat_e(60) TYPE c,          ""终端客户料号
          zcase(50)   TYPE c,          ""专案名称
          zmodel(40)  TYPE c,          ""机型
          mandt(20)   TYPE c,          ""集团"
        END OF ty_data.

DATA : gt_data TYPE TABLE OF ty_data,
       gs_data TYPE ty_data.

DATA: gv_dbs       TYPE dbcon-con_name VALUE 'DB_EDC', "数据库连接名称
      go_exception TYPE REF TO cx_sy_native_sql_error,
      gv_error_msg TYPE string. "返回错误消息

TRY.
    EXEC SQL.
      CONNECT TO :gv_dbs
    ENDEXEC.
    IF sy-subrc <> 0.
      RAISE EXCEPTION TYPE cx_sy_native_sql_error
        EXPORTING
          textid = cx_sy_native_sql_error=>cx_sy_native_sql_error.
    ENDIF.
    EXEC SQL.
      OPEN dbcur FOR
        SELECT kunnr , vkorg , vtweg , matnr , kdmat , postx , kunnr_e , kdmat_e , zcase , zmodel , mandt
               FROM MATERIAL_SALESLIST
               WHERE mandt = :sy-mandt

    ENDEXEC.
    DO.
      EXEC SQL.
        FETCH NEXT dbcur INTO :gs_data
      ENDEXEC.
      IF sy-subrc <> 0.
        EXIT.
      ELSE.
        APPEND gs_data TO gt_data.
      ENDIF.
    ENDDO.
    EXEC SQL.
      CLOSE dbcur
    ENDEXEC.
    EXEC SQL.
      DISCONNECT :gv_dbs
    ENDEXEC.
  CATCH cx_sy_native_sql_error INTO go_exception.
    CALL METHOD go_exception->get_text RECEIVING result = gv_error_msg.
ENDTRY.

IF gv_error_msg IS NOT INITIAL.
  MESSAGE s009(zfi001) WITH gv_error_msg DISPLAY LIKE 'E'.
  "*读取Oracle数据失败,原因:发生 SQL 错误:con=1(10.12.168.91:1521/bidb): ORA-00933
  "原因可能是:没有数据库表、或没有符合条件的数据
ENDIF.

BREAK-POINT.
"WHERE kunnr = :'A'

加个条件读取 

*&---------------------------------------------------------------------*
*& Report ZHF_TEST1
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zhf_test0 .

TABLES:t001.

TYPES : BEGIN OF ty_data,
          kunnr(10)   TYPE c,          ""客编
          vkorg(4)    TYPE c,          ""销售组织
          vtweg(2)    TYPE c,          ""分销渠道
          matnr(60)   TYPE c,          ""物料编号
          kdmat(60)   TYPE c,          ""客户物料
          postx(200)  TYPE c,          ""客户物料描述
          kunnr_e(20) TYPE c,          ""终端客户
          kdmat_e(60) TYPE c,          ""终端客户料号
          zcase(50)   TYPE c,          ""专案名称
          zmodel(40)  TYPE c,          ""机型
          mandt(20)   TYPE c,          ""集团"
        END OF ty_data.

DATA : gt_data TYPE TABLE OF ty_data,
       gs_data TYPE ty_data.

DATA: gv_dbs       TYPE dbcon-con_name VALUE 'DB_EDC', "数据库连接名称
      go_exception TYPE REF TO cx_sy_native_sql_error,
      gv_error_msg TYPE string. "返回错误消息

DATA gt_bukrs TYPE TABLE OF t001-bukrs WITH HEADER LINE.

*----------------------------------------------------------------------*
*                  选 择 屏 幕 定 义 块
*----------------------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK text1.
SELECT-OPTIONS  s_bukrs FOR t001-bukrs  MODIF ID f1  OBLIGATORY.
SELECTION-SCREEN END OF BLOCK text1.



*----------------------------------------------------------------------*
*                  初 始 化 块                                         *
*----------------------------------------------------------------------*
*该事件在屏幕未显示之前执行,对程式设置值及屏幕元素进行初始化赋值*
INITIALIZATION.


*----------------------------------------------------------------------*
*                  选 择 屏 幕 字 段 处 理 块
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.


*----------------------------------------------------------------------*
*                  逻 辑 处 理 块                                      *
*----------------------------------------------------------------------*

START-OF-SELECTION. "执行按钮后触发



  LOOP AT s_bukrs.
    gt_bukrs = s_bukrs-low .
    COLLECT gt_bukrs.
  ENDLOOP.


  TRY.
      EXEC SQL.
        CONNECT TO :gv_dbs
      ENDEXEC.
      IF sy-subrc <> 0.
        RAISE EXCEPTION TYPE cx_sy_native_sql_error
          EXPORTING
            textid = cx_sy_native_sql_error=>cx_sy_native_sql_error.
      ENDIF.
      EXEC SQL.
        OPEN dbcur FOR
          SELECT kunnr , vkorg , vtweg , matnr , kdmat , postx , kunnr_e , kdmat_e , zcase , zmodel , mandt
                 FROM MATERIAL_SALESLIST
                 WHERE mandt = :sy-mandt
                  AND VKORG IN :gt_bukrs
      ENDEXEC.
      DO.
        EXEC SQL.
          FETCH NEXT dbcur INTO :gs_data
        ENDEXEC.
        IF sy-subrc <> 0.
          EXIT.
        ELSE.
          APPEND gs_data TO gt_data.
        ENDIF.
      ENDDO.
      EXEC SQL.
        CLOSE dbcur
      ENDEXEC.
      EXEC SQL.
        DISCONNECT :gv_dbs
      ENDEXEC.
    CATCH cx_sy_native_sql_error INTO go_exception.
      CALL METHOD go_exception->get_text RECEIVING result = gv_error_msg.
  ENDTRY.
  IF gv_error_msg IS NOT INITIAL.
    MESSAGE s009(zfi001) WITH gv_error_msg DISPLAY LIKE 'E'.
    "*读取Oracle数据失败,原因:发生 SQL 错误:con=1(10.12.168.91:1521/bidb): ORA-00933
    "原因可能是:没有数据库表、或没有符合条件的数据
  ENDIF.
  BREAK-POINT.

测试运行2

 该代码在开发区、测试区运行没问题,但是DEMO区运行的话会提示:

数据库连接失败,原因:未将指定的次级数据库连接输入到表 DBCON 中。

REPORT zhf_test1 MESSAGE-ID zsdb001.

DATA: c_dbs        TYPE zdbconn-conntxt VALUE 'DB_EDC',
      go_exception TYPE REF TO cx_sy_native_sql_error,
      lv_error_msg TYPE string.

TRY.
    EXEC SQL.
      connect to :c_dbs
    ENDEXEC.

  CATCH cx_sy_native_sql_error INTO go_exception.
    CALL METHOD go_exception->get_text
      RECEIVING
        result = lv_error_msg.
ENDTRY.

IF lv_error_msg IS NOT INITIAL.
  MESSAGE e002 WITH lv_error_msg.
ENDIF.
TYPES : BEGIN OF ty_customs,
          mandt(3)            TYPE c,             ""用户端
          download_date       TYPE date,          ""回传日期
          download_time(6)    TYPE c,             ""回传时间
          sales_no(30)        TYPE c,             ""出货单号
          customs_no(20)      TYPE c,             ""报关单号
          supv_modenm(64)     TYPE c,             ""监管方式名称
          trans_mode(10)      TYPE c,             ""成交方式代码
          sap_state(1)        TYPE c,             ""SAP处理
          sap_upstate(1)      TYPE c,             ""SAP更新状态
          sap_upstate_date    TYPE date,          ""SAP更新日期
          sap_upstate_time(6) TYPE c,             ""SAP更新时间"
        END OF ty_customs.
DATA : gt_customs TYPE TABLE OF ty_customs,
       gs_customs TYPE ty_customs.
DATA: gv_dbs       TYPE dbcon-con_name VALUE 'DB_EDC', "数据库连接名称
      go_exception TYPE REF TO cx_sy_native_sql_error,
      gv_error_msg TYPE string. "返回错误消息
TRY.
    EXEC SQL.
      CONNECT TO :gv_dbs
    ENDEXEC.
    IF sy-subrc <> 0.
      RAISE EXCEPTION TYPE cx_sy_native_sql_error
        EXPORTING
          textid = cx_sy_native_sql_error=>cx_sy_native_sql_error.
    ENDIF.
    EXEC SQL.
      OPEN dbcur FOR
        SELECT MANDT ,DOWNLOAD_DATE ,DOWNLOAD_TIME ,SALES_NO ,CUSTOMS_NO ,SUPV_MODENM ,TRANS_MODE ,SAP_STATE ,SAP_UPSTATE ,SAP_UPSTATE_DATE ,SAP_UPSTATE_TIME
               FROM SY_CUSTOMS_DN
               WHERE mandt = :sy-mandt
    ENDEXEC.
    DO.
      CLEAR gs_customs.
      EXEC SQL.
        FETCH NEXT dbcur INTO :gs_customs
      ENDEXEC.
      IF sy-subrc <> 0.
        EXIT.
      ELSE.
        APPEND gs_customs TO gt_customs.
      ENDIF.
    ENDDO.
    EXEC SQL.
      CLOSE dbcur
    ENDEXEC.
    EXEC SQL.
      DISCONNECT :gv_dbs
    ENDEXEC.
  CATCH cx_sy_native_sql_error INTO go_exception.
    CALL METHOD go_exception->get_text RECEIVING result = gv_error_msg.
ENDTRY.
IF gv_error_msg IS NOT INITIAL.
  MESSAGE s009(zfi001) WITH gv_error_msg DISPLAY LIKE 'E'.
  "*读取Oracle数据失败,原因:发生 SQL 错误:con=1(10.12.168.91:1521/bidb): ORA-00933
  "原因可能是:没有数据库表、或没有符合条件的数据
ENDIF.

修改程式ZFIR0023A&ZSDR0047测试

修改声明ty_report

salematnr(60)  TYPE c,  "-----by C10089213 20230719----

添加声明

"-----by C10089213 20230719---- Begin----
TYPES : BEGIN OF ty_salematnr,
          mandt(20)   TYPE c,          ""集团"
          kunnr(10)   TYPE c,          ""客编
          vkorg(4)    TYPE c,          ""销售组织
          vtweg(2)    TYPE c,          ""分销渠道
          matnr(60)   TYPE c,          ""物料编号
          kdmat(60)   TYPE c,          ""客户物料
          postx(200)  TYPE c,          ""客户物料描述
          kunnr_e(20) TYPE c,          ""终端客户
          kdmat_e(60) TYPE c,          ""终端客户料号
          zcase(50)   TYPE c,          ""专案名称
          zmodel(40)  TYPE c,          ""机型
        END OF ty_salematnr.
DATA : gt_salematnr TYPE TABLE OF ty_salematnr,
       gs_salematnr TYPE ty_salematnr.
DATA: gv_dbs       TYPE dbcon-con_name VALUE 'DB_EDC', "数据库连接名称
      go_exception TYPE REF TO cx_sy_native_sql_error,
      gv_error_msg TYPE string. "返回错误消息
"-----by C10089213 20230719---- End----

获取数据是添加frm_con_db

FORM getdata .

*  PERFORM frm_s_s3_process.
  PERFORM frm_get_zfir0023_data.
  PERFORM frm_con_db. "-----by C10089213 20230719----
  PERFORM frm_s_s4s5_process.
ENDFORM.

 ALV标题字段添加fieldcat

init_fieldcat 'SALEMATNR' TEXT-109  ''  ''   ''     'L'. "-----by C10089213 20230719----

 ZFIR0023A 取值添加

          "-----by C10089213 20230719---- Begin----
          READ TABLE gt_salematnr INTO gs_salematnr WITH KEY  kunnr = <fs_s4>-kunnr2 BINARY SEARCH.
          IF sy-subrc = 0.
            <fs_s4>-salematnr = gs_salematnr-matnr.
          ENDIF.
          "-----by C10089213 20230719---- End----
          "-----by C10089213 20230719---- Begin----
          READ TABLE gt_salematnr INTO gs_salematnr WITH KEY  kunnr = <fs_s5>-kunnr2 BINARY SEARCH.
          IF sy-subrc = 0.
            <fs_s5>-salematnr = gs_salematnr-matnr.
          ENDIF.
          "-----by C10089213 20230719---- End----

ZSDR0047 取值添加

  "-----by C10089213 20230719---- Begin----
  LOOP AT i_data ASSIGNING <fs_data>.
    READ TABLE gt_salematnr INTO gs_salematnr
    WITH KEY kunnr = <fs_data>-kunnr2 BINARY SEARCH.
    IF sy-subrc = 0 .
      <fs_data>-salematnr = gs_salematnr-matnr.
    ENDIF.
  ENDLOOP.
  "-----by C10089213 20230719---- End----

 子程序添加

FORM frm_con_db . "-----by C10089213 20230719----
   TRY.
      EXEC SQL.
        CONNECT TO :gv_dbs
      ENDEXEC.
      IF sy-subrc <> 0.
        RAISE EXCEPTION TYPE cx_sy_native_sql_error
          EXPORTING
            textid = cx_sy_native_sql_error=>cx_sy_native_sql_error.
      ENDIF.
      EXEC SQL.
        OPEN dbcur FOR
          SELECT  mandt ,kunnr , vkorg , vtweg , matnr , kdmat , postx , kunnr_e , kdmat_e , zcase , zmodel
                 FROM MATERIAL_SALESLIST
                 WHERE mandt = :sy-mandt
      ENDEXEC.
      DO.
        EXEC SQL.
          FETCH NEXT dbcur INTO :gs_SALEMATNR
        ENDEXEC.
        IF sy-subrc <> 0.
          EXIT.
        ELSE.
          APPEND gs_salematnr TO gt_salematnr.
        ENDIF.
      ENDDO.
      EXEC SQL.
        CLOSE dbcur
      ENDEXEC.
      EXEC SQL.
        DISCONNECT :gv_dbs
      ENDEXEC.
    CATCH cx_sy_native_sql_error INTO go_exception.
      CALL METHOD go_exception->get_text RECEIVING result = gv_error_msg.
  ENDTRY.
  IF gv_error_msg IS NOT INITIAL.
    MESSAGE s009(zfi001) WITH gv_error_msg DISPLAY LIKE 'E'.
    "*读取Oracle数据失败,原因:发生 SQL 错误:con=1(10.12.168.91:1521/bidb): ORA-00933
    "原因可能是:没有数据库表、或没有符合条件的数据
  ENDIF.

  SORT gt_salematnr BY mandt kunnr vkorg vtweg matnr kdmat.
  
ENDFORM.

 修改程式ZFIR0023A&ZSDR0047  测试370

 添加声明st_data

        "-----by ZHF C10089213 20230720----start
        supv_modenm(64)  TYPE c,             ""监管方式名称
        trans_mode(10)   TYPE c,             ""成交方式代码
        "-----by ZHF C10089213 20230720----end

 取值声明

"-----by ZHF C10089213 20230720---- Begin----
TYPES : BEGIN OF ty_customs,
          mandt(3)            TYPE c,             ""用户端
          download_date       TYPE date,          ""回传日期
          download_time(6)    TYPE c,             ""回传时间
          sales_no(30)        TYPE c,             ""出货单号
          customs_no(20)      TYPE c,             ""报关单号
          supv_modenm(64)     TYPE c,             ""监管方式名称
          trans_mode(10)      TYPE c,             ""成交方式代码
          sap_state(1)        TYPE c,             ""SAP处理
          sap_upstate(1)      TYPE c,             ""SAP更新状态
          sap_upstate_date    TYPE date,          ""SAP更新日期
          sap_upstate_time(6) TYPE c,             ""SAP更新时间"
        END OF ty_customs.
DATA : gt_customs TYPE TABLE OF ty_customs,
       gs_customs TYPE ty_customs.
DATA: gv_dbs       TYPE dbcon-con_name VALUE 'DB_EDC', "数据库连接名称
      go_exception TYPE REF TO cx_sy_native_sql_error,
      gv_error_msg TYPE string. "返回错误消息
DATA lv_go   TYPE c.
"-----by ZHF C10089213 20230720---- End----

PERFORM

 "-----by ZHF C10089213 20230720---- Begin----
  CALL FUNCTION 'Z_COMMON_ENHANCE_CHECK'
    EXPORTING
      im_name = 'Z_SD_ZSDR0047_CUSTOMS'
    IMPORTING
      e_go    = lv_go.
  IF lv_go = 'X' .
    PERFORM frm_con_customs_dn.
  ENDIF.
  "-----by ZHF C10089213 20230720---- End----

ZENHANCE_FM_MAINT

 ZSDR0047修改值

  "-----by ZHF C10089213 20230720---- Begin----
  IF gt_customs IS NOT INITIAL.
    LOOP AT i_data ASSIGNING <fs_data>.
      READ TABLE gt_customs INTO gs_customs
      WITH KEY sales_no = <fs_data>-vbeln
               customs_no = <fs_data>-zzvbeln  BINARY SEARCH.
      IF sy-subrc = 0 .
        <fs_data>-supv_modenm = gs_customs-supv_modenm. "监管方式
        <fs_data>-trans_mode = gs_customs-trans_mode. "成交方式
      ENDIF.
    ENDLOOP.
  ENDIF.
  "-----by ZHF C10089213 20230720---- End----

ZFIR0023A 修改值

        "-----by ZHF C10089213 20230720---- Begin---- "只加USD不加CNY,因为人民币不出口报关
        IF gt_customs IS NOT INITIAL.
          LOOP AT ty_data ASSIGNING FIELD-SYMBOL(<fs_s5>).
            READ TABLE gt_customs INTO gs_customs
            WITH KEY sales_no = <fs_s5>-vbeln
                     customs_no = <fs_s5>-zzvbeln  BINARY SEARCH. "条件:交货单号和报关单号
            IF sy-subrc = 0 .
              <fs_s5>-supv_modenm = gs_customs-supv_modenm. "监管方式
              <fs_s5>-trans_mode = gs_customs-trans_mode. "成交方式
            ENDIF.
          ENDLOOP.
        ENDIF.
        "-----by ZHF C10089213 20230720---- End----

 ZSDR0047 fieldcat

     "-----by ZHF C10089213 20230720----begin
        145 '监管方式',
        146 '成交方式'.
    "-----by ZHF C10089213 20230720----End
     "-----by ZHF C10089213 20230720----begin
        145 '監管方式',
        146 '成交方式'.
    "-----by ZHF C10089213 20230720----End

"-----by ZHF C10089213 20230720----begin
    145 'Supervision Method',
    146 'Terms of Delivery'.
    "-----by ZHF C10089213 20230720----End

 ZFIR0023A   fieldcat

    "-----by C10089213 20230720---- Begin----
    init_fieldcat 'VBELN'       TEXT-014  ''  'LIPS' 'VBELN'   'L'.   "出货单号
    init_fieldcat 'ZZVBELN'     TEXT-056  ''  'LIKP' 'ZZVBELN' 'L'.   "报关单号
    init_fieldcat 'SUPV_MODENM' TEXT-109  ''  ''     ''        'L'.   "监管方式名称
    init_fieldcat 'TRANS_MODE'  TEXT-110  ''  ''     ''        'L'.   "成交方式代码
    "-----by C10089213 20230720---- End----

 FORM frm_con_db 

FORM frm_con_customs_dn. "-----by ZHF C10089213 20230720----
  TRY.
      EXEC SQL.
        CONNECT TO :gv_dbs
      ENDEXEC.
      IF sy-subrc <> 0.
        RAISE EXCEPTION TYPE cx_sy_native_sql_error
          EXPORTING
            textid = cx_sy_native_sql_error=>cx_sy_native_sql_error.
      ENDIF.
      EXEC SQL.
        OPEN dbcur FOR
          SELECT
          MANDT ,DOWNLOAD_DATE ,DOWNLOAD_TIME ,SALES_NO ,
          CUSTOMS_NO ,SUPV_MODENM ,TRANS_MODE ,SAP_STATE ,
          SAP_UPSTATE ,SAP_UPSTATE_DATE ,SAP_UPSTATE_TIME
                 FROM SY_CUSTOMS_DN
                 WHERE mandt = :sy-mandt
      ENDEXEC.
      DO.
        CLEAR gs_customs.
        EXEC SQL.
          FETCH NEXT dbcur INTO :gs_customs
        ENDEXEC.
        IF sy-subrc <> 0.
          EXIT.
        ELSE.
          APPEND gs_customs TO gt_customs.
        ENDIF.
      ENDDO.
      "错误捕捉 "当取不到数据时会发生跳转,点“返回”的时候会变卡
    CATCH cx_sy_native_sql_error INTO go_exception.
      CALL METHOD go_exception->get_text
        RECEIVING
          result = gv_error_msg.
      "释放对象得放在错误捕捉下面
      EXEC SQL.
        CLOSE dbcur
      ENDEXEC.
      EXEC SQL.
        DISCONNECT :gv_dbs
      ENDEXEC.
  ENDTRY.
  IF gv_error_msg IS NOT INITIAL.
    "MESSAGE s009(zfi001) WITH gv_error_msg DISPLAY LIKE 'E'.
  ENDIF.

  IF gt_customs IS NOT INITIAL.
    SORT gt_customs BY mandt download_date
         download_time sales_no customs_no.
  ENDIF.

ENDFORM.

K_KKB_FIELDCAT_MERGE 错误

背景:使用了函数 REUSE_ALV_FIELDCATALOG_MERGE  ,该函数会调用K_KKB_FIELDCAT_MERGE。

 该FM会把整个程序代码拷贝至其内表中,如果程序的行超过72个字符,即报如上错误。

第一次运行时不会报错,但是重新登入后会报错!

即使放在子程序中不调用也仍然会报错!

即使注释掉了也会报错!

解决方法:要把代码长度改短!!!

错误提示如下:

类别                   ABAP 编程错误
运行时错误             READ_REPORT_LINE_TOO_LONG
异常                   CX_SY_READ_SRC_LINE_TOO_LONG
ABAP 程序              SAPLSKBH
应用组件               BC-SRV-ALV
日期和时间             2023.07.20 13:07:35

短文本
    The ABAP program lines are wider than the internal table.

发生了什么?
    Error in the ABAP application program.

    The current ABAP program "SAPLSKBH" had to be terminated because it found a
    statement that could not be executed.

错误分析
    An exception has occurred in class "CX_SY_READ_SRC_LINE_TOO_LONG". This
     exception was not caught
    in procedure "K_KKB_FIELDCAT_MERGE" "(FUNCTION)" or propagated by a RAISING
     clause.
    Since the caller of the procedure could not have anticipated this
    exception, the current program was terminated.
    The reason for the exception occurring was:
    The reason for the exception is:
    An attempt was made to read program "ZSDR0047" from the database. The READ
    REPORT statement allows you to copy a program text into an internal
    table. The occupied line length in the program text must not exceed the
    width of the internal table. Internal table
     "\FUNCTION=K_KKB_FIELDCAT_MERGE\DATA=L_ABAP_SOURCE[]" is 72 characters
    wide. The program line is 107 characters wide.

在“CX_SY_READ_SRC_LINE_TOO_LONG”类中发生了异常。这
未捕获异常
在过程"K_KKB_FIELDCAT_MERGE" "(FUNCTION)"中或由引发传播
条款。
因为过程的调用者不可能预料到这一点
异常,当前项目终止。
发生异常的原因是:
异常的原因是:
试图从数据库中读取程序“ZSDR0047”。读
语句允许您将程序文本复制到内部
表。程序文本中占用的行长度不得超过
内部表的宽度。内部表
\FUNCTION=K_KKB_FIELDCAT_MERGE\DATA=L_ABAP_SOURCE[]"是72个字符
宽。程序行有107个字符宽。

接口中缺少 RAISING 子句
    程序                                    SAPLSKBH
    包括                                    LSKBHU12
    行                                      1
    模块类型                                (FUNCTION)
    模块名                                  K_KKB_FIELDCAT_MERGE

异常的触发位置
    程序                                    SAPLSKBH
    包括                                    LSKBHU12
    行                                      365
    模块类型                                (FUNCTION)
    模块名                                  K_KKB_FIELDCAT_MERGE

行    代码

  335         l_word_len  = strlen( l_prog_tab_local ).
  336         l_wordx_len = strlen( i_callback_program ).
  337         l_word_len  = l_word_len - 3.  "Includekörper
  338         l_wordy_len = l_wordx_len - l_word_len.
  339
  340 * TOP as last string of include name
  341         assign l_prog_tab_local+l_word_len(3) to <l_incl_top>.
  342         check <l_incl_top> = l_top.    "'TOP' as last
  343
  344 * first string of include eq last strings of main program
  345         assign l_prog_tab_local(l_word_len) to <l_incl_top>.
  346         assign l_program+l_wordy_len(l_word_len) to <l_main_prog>.
  347         check  <l_main_prog> = <l_incl_top>.             " first o
  348         " last of main
  349
  350         exit.
  351
  352       endloop.
  353       check sy-subrc eq 0.             " no -TOP program available
  354       if <l_main_prog> <> <l_incl_top>."letztes Inlcude noch kein
  355         exit.                          " -TOP Inlcude
  356       endif.
  357     endif.
  358     if i_inclname ne space.
  359       l_prog_tab_local = i_inclname .
  360     endif.
  361
  362 *    class cx_sy_read_src_line_too_long definition load.
  363 *    data: ex_too_long type ref to  cx_sy_read_src_line_too_long.
  364 *    try.
>>>>>     read report l_prog_tab_local into l_abap_source.
  366 *      catch cx_sy_read_src_line_too_long into ex_too_long.
  367 *    endtry.
  368     check sy-subrc eq 0.
  369
  370 * scan abap source for ddic references of fields
  371     l_tabname = i_tabname.             " FGS
  372
  373     call function 'ABAP_SCAN_DATA_DESCRIPTION'
  374       exporting
  375         structure_name      = l_tabname  " FGS
  376         main_program_name   = i_callback_program
  377         i_context           = 'X'
  378       tables
  379         abap_source         = l_abap_source
  380         ddic_fieldinfo      = l_fieldinfo_old
  381         ddic_fieldinfo2     = l_fieldinfo
  382       exceptions
  383         source_not_accepted = 0
  384         others              = 0.

V_KNA1_SINGLE_READ函数提示错误

 SAP函数 V_KNA1_SINGLE_READ 用于读取客户主数据的地址信息。如果在使用该函数时提示地址不存在,可能有以下原因:
1. 客户主数据不存在:首先需要确认所查询的客户主数据是否存在于系统中。如果客户主数据不存在,那么相应的地址信息也无法被找到。
2. 地址信息未维护:如果客户主数据存在,但是地址信息未被正确地维护或者未被完整地填写,那么在使用 V_KNA1_SINGLE_READ 函数时会提示地址不存在。
3. 数据逻辑错误:可能存在数据逻辑错误导致地址无法被正确读取。这可能是由于数据输入错误、字段映射问题或其他数据相关问题导致的。
为了解决这个问题,你可以先检查客户主数据是否存在,然后确保地址信息在系统中被正确地维护。如果问题仍然存在,建议你联系SAP系统管理员或技术支持人员以获取更多的帮助和支持。

函数 V_KNA1_SINGLE_READ 是一个用于读取SAP系统中客户主数据的函数。它可以根据给定的客户号(KUNNR)或销售组织(VKORG)和分销渠道(VTWEG)来获取单个客户的信息。

以下是一个使用 V_KNA1_SINGLE_READ 函数的例子:

DATA: lv_kunnr TYPE kna1-kunnr, " 客户号
lv_vkorg TYPE kna1-vkorg, " 销售组织
lv_vtweg TYPE kna1-vtweg, " 分销渠道
lt_kna1 TYPE TABLE OF kna1, " 结果表

lv_kunnr = '100001'. " 设置客户号

CALL FUNCTION 'V_KNA1_SINGLE_READ'
EXPORTING
kunnr = lv_kunnr " 客户号
vkorg = lv_vkorg " 销售组织
vtweg = lv_vtweg " 分销渠道
TABLES
kna1 = lt_kna1. " 结果表

IF sy-subrc = 0. " 函数调用成功
LOOP AT lt_kna1 INTO DATA(ls_kna1).
WRITE: / '客户号:', ls_kna1-kunnr,
'客户名称:', ls_kna1-name1.
ENDLOOP.
ENDIF.

在上面的例子中,我们首先声明了一些变量来存储客户号、销售组织和分销渠道。然后,我们调用 V_KNA1_SINGLE_READ 函数,并将客户号、销售组织和分销渠道传递给该函数。函数会将查询到的客户主数据存储在结果表 lt_kna1 中。最后,我们通过循环遍历结果表 lt_kna1,并输出客户号和客户名称。

请注意,具体的使用方式和参数可能会根据系统版本和配置有所不同。建议在实际使用时参考相关的 SAP 文档或向 SAP 系统管理员咨询。

EXCEPTIONS 可以尝试打开注释,否则会跑到函数里面并有错误提醒导致程式运行不了,如果还是不行可以在下面打个断点,然后在运行几次。

参考代码

DATA:
  gv_dbs       TYPE dbcon-con_name, "数据库连接名称
  go_exception TYPE REF TO cx_sy_native_sql_error,
  gv_error_msg TYPE string.

PERFORM frm_sent_data.

*&---------------------------------------------------------------------*
*& Form FRM_SENT_DATA
*&---------------------------------------------------------------------*
*& 传输至ORACLE
*&---------------------------------------------------------------------*
FORM frm_sent_data.

  DATA:
       l_str    TYPE string VALUE '0'.

  TYPES : BEGIN OF ty_data,
*            mandt(3)            TYPE c,                     ""用户端
*            download_date       TYPE date,             ""回传日期
*            download_time(6)    TYPE c,             ""回传时间
*            sales_no(30)        TYPE c,                 ""出货单号
*            customs_no(20)      TYPE c,               ""报关单号
*            supv_modenm(64)     TYPE c,              ""监管方式名称
*            trans_mode(10)      TYPE c,               ""成交方式代码
*            sap_state(1)        TYPE c,                 ""SAP处理
*            sap_upstate(1)      TYPE c,               ""SAP更新状态
*            sap_upstate_date    TYPE date,          ""SAP更新日期
*            sap_upstate_time(6) TYPE c,          ""SAP更新时间"
            kunnr TYPE kna1-kunnr,
            NAME1 TYPE kna1-NAME1,
          END OF ty_data.

  DATA : lv_kunnr TYPE kna1-kunnr,
         lv_NAME1 TYPE kna1-NAME1.


  DATA : gt_data TYPE TABLE OF ty_data,
         gs_data TYPE ty_data.


* 检查数据库连接是否已配置
  SELECT SINGLE conntxt
    INTO gv_dbs
    FROM zdbconn
   WHERE sysname EQ 'EDSAP'.

  IF sy-subrc IS NOT INITIAL.
    MESSAGE s009(zfi001) WITH 'EDSAP' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

  gv_dbs = 'DB_EDC'.

* ORACLE数据库:连接-->更新-->断开
  "连接数据库



  TRY.
      EXEC SQL.
        connect to :gv_dbs
      ENDEXEC.

    CATCH cx_sy_native_sql_error INTO go_exception.
      CALL METHOD go_exception->get_text
        RECEIVING
          result = gv_error_msg.
  ENDTRY.


  IF gv_error_msg IS NOT INITIAL.
    MESSAGE s009(zfi001) WITH gv_error_msg DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.



*  TRY .
*      EXEC SQL.
*        SELECT KUNNR , NAME1
*            INTO  :gs_data
*            FROM SAP_CUSTOMER_02
*            WHERE MANDT = :SY-MANDT
*      ENDEXEC.
*  ENDTRY.


"SAP_CUSTOMER_02
EXEC SQL.
  OPEN cursor FOR
  select KUNNR , NAME1
  from SAP_CUSTOMER_02
  where mandt = :sy-MANDT
ENDEXEC.
DO.
  CLEAR gs_data.
EXEC SQL.
    FETCH NEXT cursor INTO :gs_data
  ENDEXEC.
  IF sy-subrc <> 0.
    EXIT.
  ELSE.
    WRITE:/ gs_data-KUNNR,'',gs_data-NAME1.
  ENDIF.
ENDDO.
EXEC SQL.
  CLOSE cursor
ENDEXEC.



  "FORM Write_data.
  " WRITE:/ gs_data-KUNNR,'',gs_data-NAME1.
  "ENDFORM .





  EXEC SQL.
    DISCONNECT :gv_dbs
  ENDEXEC.

  "CONCATENATE TEXT-001 l_str TEXT-002 INTO l_str.

  MESSAGE l_str TYPE 'S'.

  "  CLEAR lt_data.

ENDFORM.
TABLES: EDSAP.SY_CUSTOMS_DN.

DATA: ls_customs_dn TYPE EDSAP.SY_CUSTOMS_DN.

ls_customs_dn-MANDT = 'XXX'.  "填写相应的客户端
ls_customs_dn-DOWNLOAD_DATE = SY-DATUM.  "当前日期
ls_customs_dn-DOWNLOAD_TIME = SY-UZEIT.  "当前时间
ls_customs_dn-SALES_NO = '12345'.  "销售订单号
ls_customs_dn-CUSTOMS_NO = '67890'.  "报关单号
ls_customs_dn-SUPV_MODENM = 'AIR'.  "监管方式
ls_customs_dn-TRANS_MODE = 'SEA'.  "运输方式
ls_customs_dn-SAP_STATE = 'COMPLETED'.  "SAP 状态
ls_customs_dn-SAP_UPSTATE = 'SUCCESS'.  "SAP 更新状态
ls_customs_dn-SAP_UPSTATE_DATE = SY-DATUM.  "SAP 更新日期
ls_customs_dn-SAP_UPSTATE_TIME = SY-UZEIT.  "SAP 更新时间

INSERT INTO EDSAP.SY_CUSTOMS_DN VALUES ls_customs_dn.
DATA: lt_customs_dn TYPE TABLE OF EDSAP.SY_CUSTOMS_DN,
      ls_customs_dn TYPE EDSAP.SY_CUSTOMS_DN.

SELECT MANDT
       DOWNLOAD_DATE
       DOWNLOAD_TIME
       SALES_NO
       CUSTOMS_NO
       SUPV_MODENM
       TRANS_MODE
       SAP_STATE
       SAP_UPSTATE
       SAP_UPSTATE_DATE
       SAP_UPSTATE_TIME
  INTO TABLE lt_customs_dn
  FROM EDSAP.SY_CUSTOMS_DN.

LOOP AT lt_customs_dn INTO ls_customs_dn.
  WRITE: / ls_customs_dn-MANDT,
           ls_customs_dn-DOWNLOAD_DATE,
           ls_customs_dn-DOWNLOAD_TIME,
           ls_customs_dn-SALES_NO,
           ls_customs_dn-CUSTOMS_NO,
           ls_customs_dn-SUPV_MODENM,
           ls_customs_dn-TRANS_MODE,
           ls_customs_dn-SAP_STATE,
           ls_customs_dn-SAP_UPSTATE,
           ls_customs_dn-SAP_UPSTATE_DATE,
           ls_customs_dn-SAP_UPSTATE_TIME.
ENDLOOP.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值