검색결과 리스트
SAP Program/ABAP에 해당되는 글 62건
- 2018.01.26 abap source hide & decompress
- 2018.01.11 SAP Standard menu exit - MENUSYST
- 2018.01.03 PO Ack read demo report
- 2017.12.27 USER Role PFCG 관련 BAPI & 권한 관련
- 2017.12.19 User exit & BADI 찾기
- 2017.12.19 ABAP Editor se38 or se37 edit 못하게 control
- 2017.12.05 SAP Object Type Description
- 2017.12.01 SAP PO Multi 시 Ack 값 받아오기
- 2017.12.01 SCI check 항목 Level 조정
- 2017.11.27 abap sci tool setting
글
abap source hide & decompress
1은 SE38이거나 "RPY_PROGRAM_READ"함수를 사용하여 코드를 볼 수 있습니다.
모든 코드는 REPOSRC 테이블에 저장되고 압축 모드로 저장됩니다
. 소스 코드를 볼 수 없습니다.
2. 다음 코드 암호화 프로그램하지만 코드가 암호화되면,주의 표기되고 SAP의 소스 코드를 볼 수없는
기준 링크 https://archive.sap.com/discussions/thread/740272을
REPORT z_hide_abap
NO STANDARD PAGE HEADING.
DATA: gt_code(72) TYPE c OCCURS 0,
gv_code LIKE LINE OF gt_code,
gt_code2(72) TYPE c OCCURS 0.
PARAMETERS: program LIKE sy-repid.
START-OF-SELECTION.
READ REPORT program INTO gt_code.
IF sy-subrc NE 0.
MESSAGE e398(00) WITH 'Report' program 'not found.'.
* ATTENTION:
* READ REPORT on a hidden source code return SY-SUBRC=8 !!!
ENDIF. "IF sy-subrc NE 0
READ TABLE gt_code INDEX 1 INTO gv_code.
* append *special* 1st line to hide cource code
APPEND '*@#@@[SAP]' TO gt_code2.
LOOP AT gt_code INTO gv_code.
APPEND gv_code TO gt_code2.
ENDLOOP.
INSERT REPORT program FROM gt_code2.
3. 코드 복원
참조 링크 https://www.daniel-berlin.de/devel/sap-dev/decompress-abap-source-code/
코드 다운로드 https://github.com/daberlin/sap-reposrc-decompressor를
vs2015으로 명령 프롬프트는, 예를 들어 decompress.exe, 소스 코드를 컴파일 생성
ztme11으로, 다음 코드는 암호화 코드를 사용
*&---------------------------------------------------------------------*
*& Report ZS_REPOSRC_DOWNLOAD
*&---------------------------------------------------------------------*
*& Purpose: Download compressed source code from table REPOSRC
*& Author : Daniel Berlin
*& Version: 1.0.1
*& License: CC BY 3.0 (http://creativecommons.org/licenses/by/3.0/)
*&---------------------------------------------------------------------*
REPORT zs_reposrc_download.
DATA: v_fnam TYPE rlgrap-filename, " Local file name
v_file TYPE string, " Same, but as a string
v_xstr TYPE xstring, " Source (compressed)
v_xlen TYPE i, " Length of source
t_xtab TYPE TABLE OF x255. " Source plugged into a table
PARAMETERS: report TYPE progname DEFAULT sy-repid "#EC *
MATCHCODE OBJECT progname OBLIGATORY.
START-OF-SELECTION.
" -- Select local file name
WHILE v_fnam IS INITIAL.
v_fnam = report.
CALL FUNCTION 'NAVIGATION_FILENAME_HELP'
EXPORTING
default_path = v_fnam
mode = 'S'
IMPORTING
selected_filename = v_fnam.
ENDWHILE.
v_file = v_fnam.
" -- Fetch compressed source code
SELECT SINGLE data INTO v_xstr FROM reposrc
WHERE progname = report AND r3state = 'A'.
v_xlen = XSTRLEN( v_xstr ).
" -- Plug source into a table
CALL METHOD cl_swf_utl_convert_xstring=>xstring_to_table
EXPORTING
i_stream = v_xstr
IMPORTING
e_table = t_xtab
EXCEPTIONS
OTHERS = 1.
" -- Download to local file
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filetype = 'BIN'
filename = v_file
bin_filesize = v_xlen
TABLES
data_tab = t_xtab
EXCEPTIONS
OTHERS = 0.
다운로드 한 프로그램이 ztme11이면 ztme11을 decompress.exe가있는 디렉토리로 이동하십시오.
cmd에서 decompress.exe가있는 디렉터리로 전환 한 후 다음 명령을 실행합니다.
decompress.exe ztme11 ztme11.abap -u
텍스트 편집기를 사용하여 현재 디렉토리를 열고 ztme11.abap, 당신은 암호화하기 전에 코드를 볼 수 있습니다
'SAP Program > ABAP' 카테고리의 다른 글
LEAVE LIST-PROCESSING (0) | 2018.02.02 |
---|---|
LEAVE TO LIST-PROCESSING (0) | 2018.02.02 |
SAP Standard menu exit - MENUSYST (0) | 2018.01.11 |
PO Ack read demo report (0) | 2018.01.03 |
USER Role PFCG 관련 BAPI & 권한 관련 (0) | 2017.12.27 |
글
SAP Standard menu exit - MENUSYST
'SAP Program > ABAP' 카테고리의 다른 글
LEAVE TO LIST-PROCESSING (0) | 2018.02.02 |
---|---|
abap source hide & decompress (0) | 2018.01.26 |
PO Ack read demo report (0) | 2018.01.03 |
USER Role PFCG 관련 BAPI & 권한 관련 (0) | 2017.12.27 |
User exit & BADI 찾기 (0) | 2017.12.19 |
글
PO Ack read demo report
SXI_DEMO_ACK_READ
'SAP Program > ABAP' 카테고리의 다른 글
abap source hide & decompress (0) | 2018.01.26 |
---|---|
SAP Standard menu exit - MENUSYST (0) | 2018.01.11 |
USER Role PFCG 관련 BAPI & 권한 관련 (0) | 2017.12.27 |
User exit & BADI 찾기 (0) | 2017.12.19 |
ABAP Editor se38 or se37 edit 못하게 control (0) | 2017.12.19 |
글
USER Role PFCG 관련 BAPI & 권한 관련
BAPI_USER_ACTGROUPS_ASSIGN --> User ID에 해당 role을 추가하는 펑션
PRGN_ACTIVITY_GROUP_USERPROF --> 새로 추가하거나 삭제된 user Id에 대한 활성화
추가로, BAPI_USER_ACTGROUPS_ASSIGN 은 Role 추가시 기존 Role을 전부 삭제해버리는 문제가있었지만
기존 Role을 저장해두었다가 엎어치는 방법으로 처리했습니다 ^^
유저들에 할당된 권한을 제거 하시는 거라면
BAPI_USER_ACTGROUPS_DELETE 를 사용 해 보세요
매개변수로 입력한 유저에 할당된 모든 롤이 제거 됩니다
유저 별로 처리해야하니 해당 처리해야 하는 유저들을
루핑 돌면서 건건으로 처리하시면 될듯해요
혹시 제거후 다른 권한을 넣어줘야 되는 것이라면
BAPI_USER_ACTGROUPS_ASSIGN 을 사용해보세요
이걸 사용하면 모든 권한을 없애고 넣으려고 하는 권한만 생깁니다
혹시 이전에 있는 권한에 다른 권한을 추가 또는 삭제 하려고 한다면
BAPI_USER_GET_DETAIL 사용해서 권한 읽어온후 그 데이터에 추가 삭제등 처리해서
먼저의 BAPI_USER_ACTGROUPS_ASSIGN 이 펑션으로 처리하면 될듯하네요
select *
from USRBF2
where bname = 'QMA01'
and objct = 'Z_COM_BUK'.
select *
from ust12
where objct = 'Z_COM_BUK'
and auth in ('T-P148051400', 'T-P148051401')
and AKTPS = 'A'
AND FIELD = 'BUKRS'.
'SAP Program > ABAP' 카테고리의 다른 글
SAP Standard menu exit - MENUSYST (0) | 2018.01.11 |
---|---|
PO Ack read demo report (0) | 2018.01.03 |
User exit & BADI 찾기 (0) | 2017.12.19 |
ABAP Editor se38 or se37 edit 못하게 control (0) | 2017.12.19 |
SAP Object Type Description (0) | 2017.12.05 |
글
User exit & BADI 찾기
BADI는 se24 -> CL_EXITHANDLER 입력 -> GET_INSTANCE 메써드의 소스로 들어가셔서
CALL METHOD cl_exithandler=>get_class_name_by_interface 부분에 디버깅을 걸고 난 후
해당 t-code를 실행시키면 이 부분에 디버깅이 걸리는데,
이때, exit_name 필드 값이 관련 BADI입니다..
'SAP Program > ABAP' 카테고리의 다른 글
PO Ack read demo report (0) | 2018.01.03 |
---|---|
USER Role PFCG 관련 BAPI & 권한 관련 (0) | 2017.12.27 |
ABAP Editor se38 or se37 edit 못하게 control (0) | 2017.12.19 |
SAP Object Type Description (0) | 2017.12.05 |
SAP PO Multi 시 Ack 값 받아오기 (0) | 2017.12.01 |
글
ABAP Editor se38 or se37 edit 못하게 control
SE38
Function Group : XSEU
User-Exit exit_sapls38e_001
se24
BADI : CLIF_TOGGLE_DISPEDIT 클래스 작성기에서 조회모드와 변경모드간 교환
se11
SEDD0001 ABAP/4 Dictionary에서 고객종료
EXIT_SAPLSEDD_001
EXIT_SAPDSAHD_010 Exit in Program Attributes (Call: Create Program; Display, Change Attr.)
EXIT_SAPLEDITOR_001 User Exit for $$ Editor (Dynamic Pattern)
EXIT_SAPLEDITOR_002 User's Own Function Codes for $$ Editor: Special Case for ABAP Editor
EXIT_SAPLLOCAL_EDT1_001 User Exit for Editor (Dynamic Pattern)
EXIT_SAPLLOCAL_EDT1_002 User's Own Function Code in ABAP Editor
EXIT_SAPLS38E_001 Exit for ABAP Editor
EXIT_SAPLSEDD_001 Exit for ABAP Dictionary
EXIT_SAPLSEDTATTR_010 Exit in Program Attributes Release 4 (on Create Program,Disp./Chg. Attrs.)
EXIT_SAPLSEU0_001 Exit Menu Painter (Invisible Call)
EXIT_SAPLSEUK_001 Exit Transaction Code Maintenance (Invisible Call)
EXIT_SAPLSEUK_002 Exit Transaction Code Maintenance
EXIT_SAPLSMPE_001 Exit Menu Painter
EXIT_SAPLSMPE_002 Exit Menu Painter (Invisible Call)
EXIT_SAPLWBABAP_010 Function Exit on Initial Screen of ABAP Editor (New Version of Workbench)
EXIT_SAPLWBSCREEN_001 Screen Painter Exit (New Version of Workbench)
EXIT_SAPLWBSCREEN_002 User's Own Function Codes in Screen Painter (New Version of Workbench)
EXIT_SAPMS38E_010 Function Exit on Intial Screen of ABAP Editor (Old Workbench)
EXIT_SAPMS38L_001 Function Builder Exit
EXIT_SAPMS38L_002 User's Own Function Code in the Function Builder
EXIT_SAPMSEDT_001 User Exit for Editor (Dynamic Pattern)
EXIT_SAPMSEDT_002 User's Own Function Code in ABAP Editor
EXIT_SAPMSEU0_100 Exit Object Browser
EXIT_SAPMSEUS_001 Screen Painter Exit (Old Workbench)
EXIT_SAPMSEUS_002 User's Own Function Code in Screen Painter (Old Workbench)
EXIT_SAPMSMPE_001 Exit Menu Painter (Function)
'SAP Program > ABAP' 카테고리의 다른 글
USER Role PFCG 관련 BAPI & 권한 관련 (0) | 2017.12.27 |
---|---|
User exit & BADI 찾기 (0) | 2017.12.19 |
SAP Object Type Description (0) | 2017.12.05 |
SAP PO Multi 시 Ack 값 받아오기 (0) | 2017.12.01 |
SCI check 항목 Level 조정 (0) | 2017.12.01 |
글
SAP Object Type Description
Function Module : TRINT_OBJECT_TABLE
PERFORM get_system_types TABLES st_system_types.
Include file : LTR_OBJECTSF02
그외의 Local Object type 은 OBJT Table 에서 가져옴.
'SAP Program > ABAP' 카테고리의 다른 글
User exit & BADI 찾기 (0) | 2017.12.19 |
---|---|
ABAP Editor se38 or se37 edit 못하게 control (0) | 2017.12.19 |
SAP PO Multi 시 Ack 값 받아오기 (0) | 2017.12.01 |
SCI check 항목 Level 조정 (0) | 2017.12.01 |
abap sci tool setting (0) | 2017.11.27 |
글
SAP PO Multi 시 Ack 값 받아오기
FUNCTION z_qm_if_lims_insp_type.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(I_DATE) TYPE TAB_ISUR_DATUM OPTIONAL
*" VALUE(I_SYSID) TYPE STRING
*" EXPORTING
*" VALUE(E_RET) TYPE ZIF_STATUS
*" VALUE(E_MSG) TYPE CHAR100
*" VALUE(E_SCNT) TYPE SATC_D_JOB_LIMIT_UPPER
*" VALUE(E_ECNT) TYPE SATC_D_JOB_LIMIT_UPPER
*" TABLES
*" LT_Z045 STRUCTURE ZQMT_045
*" LT_WERKS STRUCTURE WERKS_RANG OPTIONAL
*"----------------------------------------------------------------------
DATA : lt_callstack TYPE sys_callst,
ls_callstack LIKE LINE OF lt_callstack,
lv_func_name TYPE dbglevent.
* 현재 function name 가져오기 시작
*** Get Stack
CALL FUNCTION 'SYSTEM_CALLSTACK'
EXPORTING
max_level = 0
IMPORTING
et_callstack = lt_callstack.
LOOP AT lt_callstack INTO ls_callstack
WHERE eventtype = 'FUNC'. " Get Last FUNC Call
EXIT.
ENDLOOP.
*** Set Function Name
lv_func_name = ls_callstack-eventname.
* 현재 function name 가져오기 종료
DATA: ls_z045 LIKE LINE OF lt_z045,
lv_werks_set TYPE zqmt_045-werks,
lv_werks TYPE t001w-werks,
ls_date LIKE LINE OF i_date.
DATA: BEGIN OF ls_cdhdr.
DATA:
tabkey TYPE cdpos-tabkey,
objectid TYPE cdpos-objectid,
udate TYPE cdhdr-udate,
mpdau TYPE qmat-mpdau.
DATA: END OF ls_cdhdr,
lt_cdhdr LIKE TABLE OF ls_cdhdr.
DATA: BEGIN OF ls_coll.
DATA: art TYPE qals-art,
matnr TYPE qals-matnr,
werks TYPE qals-werk,
aktiv TYPE qmat-aktiv,
mpdau TYPE qmat-mpdau,
aedat TYPE cdhdr-udate.
DATA: END OF ls_coll,
lt_coll LIKE TABLE OF ls_coll.
DATA: gt_qmat TYPE TABLE OF zcl_dt_qm00820_serp_gt_qmat,
gs_qmat LIKE LINE OF gt_qmat.
DATA: werks_sql TYPE string.
IF lt_werks[] IS NOT INITIAL.
READ TABLE lt_werks INDEX 1.
CONCATENATE 'pos~tabkey like ''' lt_werks-low '%''' INTO werks_sql.
lv_werks_set = lt_werks-low.
ENDIF.
* Get Code Group
SELECT pos~tabkey,
pos~objectid,
hdr~udate
INTO CORRESPONDING FIELDS OF TABLE @lt_cdhdr
FROM cdhdr AS hdr
INNER JOIN cdpos AS pos
ON pos~objectclas = hdr~objectclas
AND pos~objectid = hdr~objectid
AND pos~changenr = hdr~changenr
WHERE (werks_sql)
AND hdr~objectclas = 'MATERIAL'
AND hdr~udate IN @i_date
AND pos~tabname = 'DQMAT'
GROUP BY pos~tabkey, pos~objectid, hdr~udate.
LOOP AT lt_cdhdr INTO ls_cdhdr.
ls_coll-art = ls_cdhdr-tabkey+4(4).
ls_coll-matnr = ls_cdhdr-objectid.
ls_coll-werks = ls_cdhdr-tabkey+0(4).
ls_coll-aedat = ls_cdhdr-udate.
SELECT SINGLE aktiv, mpdau
INTO (@ls_coll-aktiv, @ls_coll-mpdau)
FROM qmat
WHERE art = @ls_coll-art
AND matnr = @ls_coll-matnr
AND werks = @ls_coll-werks.
COLLECT ls_coll INTO lt_coll.
CLEAR ls_coll.
ENDLOOP.
loop at lt_coll into ls_coll.
MOVE-CORRESPONDING ls_coll to gs_qmat.
append gs_qmat to gt_qmat.
clear gs_qmat.
ENDLOOP.
READ TABLE i_date INTO ls_date INDEX 1.
IF gt_qmat[] IS INITIAL.
ls_z045-i_object = lv_func_name.
ls_z045-werks = lv_werks_set.
ls_z045-idate_fr = ls_date-low.
ls_z045-idate_to = ls_date-high.
ls_z045-i_sysid = i_sysid.
ls_z045-e_ret = 'E'.
ls_z045-e_scnt = 0.
ls_z045-e_ecnt = 0.
ls_z045-e_msg = 'No Data'.
ls_z045-ernam = sy-uname.
ls_z045-erdat = sy-datlo.
ls_z045-erzet = sy-timlo.
APPEND ls_z045 TO lt_z045.
e_msg = ls_z045-e_msg.
e_ret = 'E'.
EXIT.
ENDIF.
DATA: ev_ret TYPE char1,
ev_msg TYPE zmesse,
lv_date TYPE sy-datlo,
lv_time TYPE sy-timlo.
DATA : lt_sysid TYPE TABLE OF string,
ls_sysid TYPE string,
lv_sys_cnt TYPE i,
lv_sel_cnt TYPE i.
SPLIT i_sysid AT ',' INTO TABLE lt_sysid.
LOOP AT lt_sysid INTO ls_sysid.
IF ls_sysid IS INITIAL.
DELETE lt_sysid.
ENDIF.
ENDLOOP.
"전송하게 될 system 수량 계산
lv_sys_cnt = lines( lt_sysid ).
DATA: lv_cnt1 TYPE i,
lv_cnt2 TYPE i,
lv_fr_num TYPE i,
lv_to_num TYPE i,
lv_total TYPE i,
lv_ava_cnt TYPE i,
lv_xnum TYPE i,
lv_do_time TYPE i.
* DATA: lo_proxy_lims TYPE REF TO zcl_co_qm00820_serp_ao.
* DATA: lo_fault TYPE REF TO cx_ai_system_fault,
* lv_emsg TYPE string.
* DATA: ls_proxy_out TYPE zcl_mt_qm00820_serp,
* lv_cnt1 TYPE i,
* lv_cnt2 TYPE i,
* lv_fr_num TYPE i,
* lv_to_num TYPE i,
* lv_total TYPE i,
* lv_ava_cnt TYPE i,
* lv_xnum TYPE i,
* lv_do_time TYPE i.
CONSTANTS:
gc_max_size TYPE i VALUE '3072000',
gc_size1 TYPE i VALUE '64'.
lv_cnt1 = lines( gt_qmat ).
"전송되는 Table size 계산
lv_total = lv_cnt1 * gc_size1.
"1번에 send 가능한 size 계산
lv_ava_cnt = gc_max_size / gc_size1.
"나누어 전송해야 하는 Count 계산
lv_do_time = lv_total / gc_max_size + 1.
* IF gc_max_size < lv_total.
*
* ENDIF.
"Code group 과 code를 LIMS에 전송
CLEAR: e_scnt, e_ecnt.
"처음에 Success로 setting 한 뒤
"한번이라도 Error가 발생하면 Error로 setting
e_ret = 'S'.
DATA: lo_client_proxy TYPE REF TO zcl_co_qm00820_serp_ao,
ls_proxy_out TYPE zcl_mt_qm00820_serp.
DATA: lv_cs_root TYPE REF TO cx_root,
lo_fault TYPE REF TO cx_ai_system_fault,
lo_ai_application_fault TYPE REF TO cx_ai_application_fault,
lv_send_emsg TYPE string,
lv_emsg TYPE string.
DATA: lo_msg_protocol TYPE REF TO if_wsprotocol_message_id,
l_msg_id TYPE sxmsmguid,
lo_ack TYPE REF TO if_ws_acknowledgment,
l_ack_status_simple TYPE prx_ack_status,
l_ack_status_detail TYPE prx_ack_status_detail_table.
DATA: lo_async_messaging TYPE REF TO if_wsprotocol_async_messaging,
lv_ack_request TYPE prx_ack_request_details.
CREATE OBJECT lo_client_proxy.
lv_date = sy-datlo.
lv_time = sy-timlo.
lv_fr_num = 1.
DO lv_do_time TIMES.
CLEAR ls_proxy_out.
ls_proxy_out-mt_qm00820_serp-xnums = lv_xnum.
ls_proxy_out-mt_qm00820_serp-xdate = lv_date.
ls_proxy_out-mt_qm00820_serp-xtime = lv_time.
ls_proxy_out-mt_qm00820_serp-xsysid = i_sysid.
lv_to_num = lv_to_num + lv_ava_cnt.
CLEAR: ls_proxy_out-mt_qm00820_serp-gt_qmat[], gs_qmat.
LOOP AT gt_qmat INTO gs_qmat FROM lv_fr_num TO lv_to_num.
CONDENSE gs_qmat-mpdau.
APPEND gs_qmat TO ls_proxy_out-mt_qm00820_serp-gt_qmat.
CLEAR gs_qmat.
ENDLOOP.
lv_cnt1 = lines( ls_proxy_out-mt_qm00820_serp-gt_qmat ).
ls_proxy_out-mt_qm00820_serp-xrows = lv_cnt1.
CONDENSE ls_proxy_out-mt_qm00820_serp-xnums.
CONDENSE ls_proxy_out-mt_qm00820_serp-xrows.
TRY.
CLEAR: lv_emsg, lv_send_emsg.
* get protocol for asynchronous messaging
lo_async_messaging ?=
lo_client_proxy->get_protocol( if_wsprotocol=>async_messaging ).
* Ask for transport acknowledgment
CLEAR lv_ack_request.
lv_ack_request =
if_wsprotocol_async_messaging=>co_transport_acknowledgment.
lo_async_messaging->set_acknowledgment_requested( lv_ack_request ).
CATCH cx_ai_system_fault cx_ai_application_fault INTO lv_cs_root.
CALL METHOD lv_cs_root->if_message~get_text
RECEIVING
result = lv_send_emsg.
ENDTRY.
TRY.
CALL METHOD lo_client_proxy->qm00820_serp_ao
EXPORTING
output = ls_proxy_out.
COMMIT WORK AND WAIT.
CATCH cx_ai_system_fault cx_ai_application_fault INTO lv_cs_root.
CALL METHOD lv_cs_root->if_message~get_text
RECEIVING
result = lv_send_emsg.
ENDTRY.
TRY.
* Ack Message 읽어오기
lo_msg_protocol ?=
lo_client_proxy->get_protocol( if_wsprotocol=>message_id ).
l_msg_id = lo_msg_protocol->get_message_id( ).
DO 10 TIMES.
CLEAR: ls_z045.
SELECT SINGLE st~msgguid,
st~ack_state,
CASE st~ack_state
WHEN '072' THEN 'S'
WHEN '077' THEN 'S'
WHEN '080' THEN 'A'
WHEN '000' THEN 'W'
ELSE 'E'
END,
err~errtxt
INTO (@ls_z045-ifkey, @ls_z045-ack_state,
@ls_z045-e_ret, @ls_z045-e_msg)
FROM sxmspmast AS st
LEFT OUTER JOIN sxmsperror AS err
ON err~msgguid = st~msgguid
WHERE st~msgguid = @l_msg_id.
IF ls_z045-ack_state <> '000' AND
ls_z045-ack_state <> '071'.
EXIT.
ENDIF.
"ack_state 값이 늦게 들어오는 경우가 있어서 Wait 함
IF ls_z045-ack_state = '000' OR
ls_z045-ack_state = '071'.
WAIT UP TO 1 SECONDS.
ENDIF.
ENDDO.
* lo_ack = cl_proxy_access=>get_acknowledgment( l_msg_id ).
* l_ack_status_simple = lo_ack->get_status( ).
"Ack Message가 여러개의 sub msg를 가지고 있는 경우
"sxmspmast에서 sub msg의 ack status를 읽어서 처리함
IF ls_z045-ack_state = '080'.
DO 10 TIMES.
CLEAR: ls_z045, lt_z045.
SELECT st~msgguid AS ifkey,
st~ack_state,
CASE st~ack_state
WHEN '072' THEN 'S'
WHEN '077' THEN 'S'
WHEN '080' THEN 'A'
WHEN '000' THEN 'W'
ELSE 'E'
END AS e_ret,
CASE mas~ob_system "PO xsysid 값이 있는 필드
WHEN 'ILIM_COM_D' THEN 'LM0'
WHEN 'ALIM_TJN_D' THEN 'LMC'
WHEN 'ALIM_DGN_D' THEN 'LMD'
WHEN 'ALIM_HUN_D' THEN 'LMH'
WHEN 'ALIM_MEX_D' THEN 'LMM'
WHEN 'ALIM_VNM_D' THEN 'LMV'
END AS i_sysid,
err~errtxt AS e_msg
INTO CORRESPONDING FIELDS OF TABLE @lt_z045
* INTO (@ls_z045-ifkey, @ls_z045-ack_state,
* @ls_z045-e_ret, @ls_z045-i_sysid,
* @ls_z045-e_msg)
FROM sxmspmast AS st
INNER JOIN sxmspemas AS mas
ON mas~msgguid = st~msgguid
LEFT OUTER JOIN sxmsperror AS err
ON err~msgguid = mas~msgguid
WHERE st~parentmsg = @l_msg_id.
LOOP AT lt_z045 INTO ls_z045.
ls_z045-i_object = lv_func_name.
ls_z045-werks = lv_werks_set.
ls_z045-idate_fr = ls_date-low.
ls_z045-idate_to = ls_date-high.
IF ls_z045-e_ret = 'S'.
ls_z045-e_scnt = lv_cnt1.
ELSE.
ls_z045-e_ecnt = lv_cnt1.
ENDIF.
ls_z045-ernam = sy-uname.
ls_z045-erdat = lv_date.
ls_z045-erzet = lv_time.
MODIFY lt_z045 FROM ls_z045 INDEX sy-tabix.
ENDLOOP.
lv_sel_cnt = lines( lt_z045 ).
"ack_state 값이 늦게 들어오는 경우가 있어서 Wait 함
IF sy-subrc <> 0 OR
ls_z045-ack_state = '000' OR
ls_z045-ack_state = '071' OR
"insert 가 늦게 되어서 전송한 system 전체 값이 나오지
"않는 경우가 발생하여 전송한 count 와 비교함
lv_sel_cnt < lv_sys_cnt.
WAIT UP TO 1 SECONDS.
CONTINUE.
ENDIF.
IF sy-subrc = 0 AND
* ls_z045-ack_state <> '000' AND
ls_z045-ack_state <> '071'.
EXIT.
ENDIF.
ENDDO.
"1개의 system에 전송한 경우
ELSE.
ls_z045-i_object = lv_func_name.
ls_z045-werks = lv_werks_set.
ls_z045-idate_fr = ls_date-low.
ls_z045-idate_to = ls_date-high.
ls_z045-i_sysid = i_sysid.
IF ls_z045-e_ret = 'S'.
ls_z045-e_scnt = lv_cnt1.
ELSE.
ls_z045-e_ecnt = lv_cnt1.
ENDIF.
* ls_z045-e_msg = e_msg.
ls_z045-ernam = sy-uname.
ls_z045-erdat = lv_date.
ls_z045-erzet = lv_time.
APPEND ls_z045 TO lt_z045.
* lo_ack->get_status_detail( IMPORTING ack_status_detail_table = l_ack_status_detail ).
ENDIF.
CATCH cx_ai_system_fault cx_ai_application_fault INTO lv_cs_root.
CALL METHOD lv_cs_root->if_message~get_text
RECEIVING
result = lv_send_emsg.
ENDTRY.
ADD 1 TO lv_xnum.
lv_fr_num = lv_to_num + 1.
IF lv_send_emsg IS INITIAL.
e_ret = ls_z045-e_ret.
IF ls_z045-e_ret = 'S'.
e_scnt = e_scnt + lv_cnt1.
ELSE.
e_ecnt = e_ecnt + lv_cnt1.
ENDIF.
ELSE.
ls_z045-i_object = lv_func_name.
ls_z045-werks = lv_werks_set.
ls_z045-i_sysid = i_sysid.
ls_z045-idate_fr = ls_date-low.
ls_z045-idate_to = ls_date-high.
ls_z045-e_ret = 'E'.
ls_z045-e_ecnt = lv_cnt1.
ls_z045-e_msg = lv_send_emsg.
ls_z045-ernam = sy-uname.
ls_z045-erdat = lv_date.
ls_z045-erzet = lv_time.
APPEND ls_z045 TO lt_z045.
e_msg = lv_emsg.
"처음에 Success로 setting 한 뒤
"한번이라도 Error가 발생하면 Error로 setting
e_ret = 'F'.
e_ecnt = e_ecnt + lv_cnt1.
ENDIF.
ENDDO.
ENDFUNCTION.
'SAP Program > ABAP' 카테고리의 다른 글
ABAP Editor se38 or se37 edit 못하게 control (0) | 2017.12.19 |
---|---|
SAP Object Type Description (0) | 2017.12.05 |
SCI check 항목 Level 조정 (0) | 2017.12.01 |
abap sci tool setting (0) | 2017.11.27 |
Internal table에서 중복 데이타 찾기 (0) | 2017.11.23 |
글
SCI check 항목 Level 조정
'SAP Program > ABAP' 카테고리의 다른 글
SAP Object Type Description (0) | 2017.12.05 |
---|---|
SAP PO Multi 시 Ack 값 받아오기 (0) | 2017.12.01 |
abap sci tool setting (0) | 2017.11.27 |
Internal table에서 중복 데이타 찾기 (0) | 2017.11.23 |
Internal table data to xml (0) | 2017.11.22 |
글
abap sci tool setting
'SAP Program > ABAP' 카테고리의 다른 글
SAP PO Multi 시 Ack 값 받아오기 (0) | 2017.12.01 |
---|---|
SCI check 항목 Level 조정 (0) | 2017.12.01 |
Internal table에서 중복 데이타 찾기 (0) | 2017.11.23 |
Internal table data to xml (0) | 2017.11.22 |
XML을 Internal table로 보내기 (0) | 2017.11.22 |