参考资料
*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.