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

설정

트랙백

댓글

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

설정

트랙백

댓글

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 가져오기 종료

  DATAls_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.


  DATABEGIN OF ls_cdhdr.
  DATA:
    tabkey   TYPE cdpos-tabkey,
    objectid TYPE cdpos-objectid,
    udate    TYPE cdhdr-udate,
    mpdau    TYPE qmat-mpdau.
  DATAEND OF ls_cdhdr,
  lt_cdhdr LIKE TABLE OF ls_cdhdr.

  DATABEGIN OF ls_coll.
  DATAart   TYPE qals-art,
        matnr TYPE qals-matnr,
        werks TYPE qals-werk,
        aktiv TYPE qmat-aktiv,
        mpdau TYPE qmat-mpdau,
        aedat TYPE cdhdr-udate.
  DATAEND OF ls_coll,
  lt_coll LIKE TABLE OF ls_coll.

  DATAgt_qmat TYPE TABLE OF zcl_dt_qm00820_serp_gt_qmat,
        gs_qmat LIKE LINE OF gt_qmat.

  DATAwerks_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~tabkeypos~objectidhdr~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 aktivmpdau
      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.

  DATAev_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 lineslt_sysid ).




  DATAlv_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 VALUE '3072000',
    gc_size1    TYPE VALUE '64'.

  lv_cnt1 linesgt_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에 전송
  CLEARe_scnte_ecnt.
  "처음에 Success로 setting 한 뒤
  "한번이라도 Error가 발생하면 Error로 setting
  e_ret 'S'.

  DATAlo_client_proxy TYPE REF TO zcl_co_qm00820_serp_ao,
        ls_proxy_out    TYPE zcl_mt_qm00820_serp.

  DATAlv_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.

  DATAlo_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.

  DATAlo_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.
    CLEARls_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 linesls_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.
        CLEARlv_emsglv_send_emsg.

*     get protocol for asynchronous messaging
        lo_async_messaging ?=
         lo_client_proxy->get_protocolif_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_requestedlv_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_protocolif_wsprotocol=>message_id ).
        l_msg_id lo_msg_protocol->get_message_id).

        DO 10 TIMES.
          CLEARls_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 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.
            CLEARls_z045lt_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 lineslt_z045 ).

            "ack_state 값이 늦게 들어오는 경우가 있어서 Wait 함
            IF sy-subrc <> 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 SECONDS.
              CONTINUE.
            ENDIF.

            IF sy-subrc 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 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

설정

트랙백

댓글






'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

설정

트랙백

댓글

S4HANA Custom Code Tool Configuration guide 20170531 - v3.pdf


'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

설정

트랙백

댓글

REPORT y_dupl_find MESSAGE-ID zmc_qm001.


DATAgt_mseg TYPE TABLE OF mseg,
      gs_mseg LIKE LINE OF gt_mseg,
      cp_mseg LIKE LINE OF gt_mseg.


SELECT  mblnr
        mjahr
        zeile
        bwart
        xauto
        matnr
        werks
        lgort
        charg
        insmk
        zusch
        zustd
        sobkz
        lifnr
        kunnr
        kdauf
        kdpos
  INTO  CORRESPONDING FIELDS OF TABLE gt_mseg
  FROM  mseg
  UP TO 500 ROWS
 WHERE  budat_mkpf '20170501'
  order by PRIMARY KEY.

gs_mseg-mblnr '4910157785'.
gs_mseg-mjahr '2017'.
gs_mseg-zeile '0002'.
append gs_mseg to gt_mseg.

gs_mseg-mblnr '4910157956'.
gs_mseg-mjahr '2017'.
gs_mseg-zeile '0003'.
append gs_mseg to gt_mseg.


SORT gt_mseg BY mblnr mjahr zeile.

DATAall_cnt TYPE i,
      chk_cnt TYPE i.

LOOP AT gt_mseg INTO gs_mseg.
  cp_mseg gs_mseg.
  ADD TO all_cnt.

  AT NEW zeile.
    ADD TO chk_cnt.

    IF chk_cnt <> all_cnt.
      "바로 이전 데이타에서 중복 발생
      WRITE:/ cp_mseg-mblnrAT 20 cp_mseg-mjahrAT 30 cp_mseg-zeile.
      all_cnt all_cnt 1.
    ENDIF.
  ENDAT.
ENDLOOP.



단순하게 중복된 데이타가 있는지만 check 하고자 할때는


IT_ERR[] = ITBA[].

DELETE ADJACENT DUPLICATES FROM IT_ERR.

if sy-subrc = 0.

Message E123(ZK_MSGCLS).

endif.

'SAP Program > ABAP' 카테고리의 다른 글

SCI check 항목 Level 조정  (0) 2017.12.01
abap sci tool setting  (0) 2017.11.27
Internal table data to xml  (0) 2017.11.22
XML을 Internal table로 보내기  (0) 2017.11.22
GUI Status 생성시 덤프 발생하는 경우  (0) 2017.11.20

설정

트랙백

댓글

REPORT y_itab_to_xml.

*----------------------------------------------------------------------*
* PANTALLA SELECCION *
PARAMETERSgk_ruta TYPE rlgrap-filename.
* PANTALLA SELECCION *
*----------------------------------------------------------------------*

DATAlt_y042 TYPE TABLE OF yqmt_042.

*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
* START OF SELECTION *
START-OF-SELECTION.
  PERFORM llena_accesos.
  PERFORM descarga_xml.

END-OF-SELECTION.
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
* FORM LLENA_ACCESOS *
FORM llena_accesos.
  SELECT FROM yqmt_042
    INTO CORRESPONDING FIELDS OF TABLE lt_y042.

ENDFORM.
* FORM LLENA_ACCESOS *
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
* FORM DESCARGA_XML *
FORM descarga_xml.
  DATAl_dom      TYPE REF TO if_ixml_element,
        m_document TYPE REF TO if_ixml_document,
        g_ixml     TYPE REF TO if_ixml,
        w_string   TYPE xstring,
        w_size     TYPE i,
        w_result   TYPE i,
        w_line     TYPE string,
        it_xml     TYPE dcxmllines,
        s_xml      LIKE LINE OF it_xml,
        w_rc       LIKE sy-subrc.

  DATAxml TYPE dcxmllines.
  DATArc TYPE sy-subrc,
        BEGIN OF xml_tab OCCURS 0,
          d LIKE LINE OF xml,
        END OF xml_tab.

  CLASS cl_ixml DEFINITION LOAD.
  g_ixml cl_ixml=>create).
  CHECK NOT g_ixml IS INITIAL.

  m_document g_ixml->create_document).
  CHECK NOT m_document IS INITIAL.

  WRITE'Converting DATA TO DOM 1:'.

  CALL FUNCTION 'SDIXML_DATA_TO_DOM'
    EXPORTING
*     name         = 'ACCESOS'
*     dataobject   = accesos[]
      name         'LT_Y042'
      dataobject   lt_y042[]
    IMPORTING
      data_as_dom  l_dom
    CHANGING
      document     m_document
    EXCEPTIONS
      illegal_name 1
      OTHERS       2.
  IF sy-subrc 0.
    WRITE 'Ok'.
  ELSE.
    WRITE'Err =',
    sy-subrc.
  ENDIF.

  CHECK NOT l_dom IS INITIAL.

  w_rc m_document->append_childnew_child l_dom ).
  IF w_rc IS INITIAL.
    WRITE 'Ok'.
  ELSE.
    WRITE'Err =',
    w_rc.
  ENDIF.

  CALL FUNCTION 'SDIXML_DOM_TO_XML'
    EXPORTING
      document      m_document
    IMPORTING
      xml_as_string w_string
      size          w_size
    TABLES
      xml_as_table  it_xml
    EXCEPTIONS
      no_document   1
      OTHERS        2.
  IF sy-subrc 0.
    WRITE 'Ok'.
  ELSE.
    WRITE'Err =',
    sy-subrc.
  ENDIF.
  LOOP AT it_xml INTO xml_tab-d.
    APPEND xml_tab.
  ENDLOOP.

  DATAlv_filename TYPE string.

  lv_filename gk_ruta.

  CALL METHOD cl_gui_frontend_services=>gui_download
    EXPORTING
      filename                lv_filename
    CHANGING
      data_tab                xml_tab[]
    EXCEPTIONS
      file_write_error        1
      no_batch                2
      gui_refuse_filetransfer 3
      invalid_type            4
      no_authority            5
      unknown_error           6
      header_not_allowed      7
      separator_not_allowed   8
      filesize_not_allowed    9
      header_too_long         10
      dp_error_create         11
      dp_error_send           12
      dp_error_write          13
      unknown_dp_error        14
      access_denied           15
      dp_out_of_memory        16
      disk_full               17
      dp_timeout              18
      file_not_found          19
      dataprovider_exception  20
      control_flush_error     21
      not_supported_by_gui    22
      error_no_gui            23
      OTHERS                  24.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.

'SAP Program > ABAP' 카테고리의 다른 글

abap sci tool setting  (0) 2017.11.27
Internal table에서 중복 데이타 찾기  (0) 2017.11.23
XML을 Internal table로 보내기  (0) 2017.11.22
GUI Status 생성시 덤프 발생하는 경우  (0) 2017.11.20
BADI 생성/조회 t-code  (0) 2017.11.03

설정

트랙백

댓글

REPORT y_test_xml MESSAGE-ID zmc_qm001.


PARAMETERSp_filnam TYPE localfile OBLIGATORY

DEFAULT 'C:\test_xml4.xml'.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_filnam.

  DATAl_v_fieldname TYPE dynfnam.

  l_v_fieldname p_filnam.

  CALL FUNCTION 'F4_FILENAME'
    EXPORTING
      program_name  syst-cprog
      dynpro_number syst-dynnr
      field_name    l_v_fieldname
    IMPORTING
      file_name     p_filnam.

START-OF-SELECTION.

  TYPES:
    BEGIN OF ty_tab,
      name  TYPE string,
      value TYPE string,
      depth TYPE i,
    END OF ty_tab.

  DATA:
    lcl_xml_doc  TYPE REF TO cl_xml_document,
    v_subrc      TYPE sysubrc,
    v_node       TYPE REF TO if_ixml_node,
    v_child_node TYPE REF TO if_ixml_node,
    v_root       TYPE REF TO if_ixml_node,
    v_iterator   TYPE REF TO if_ixml_node_iterator,
    v_nodemap    TYPE REF TO if_ixml_named_node_map,
    v_count      TYPE i,
    v_index      TYPE i,
    v_attr       TYPE REF TO if_ixml_node,
    v_name       TYPE string,
    v_prefix     TYPE string,
    v_value      TYPE string,
    v_depth      TYPE i,
    v_char       TYPE char2.

  DATA:
    itab TYPE STANDARD TABLE OF ty_tab,
    wa   TYPE ty_tab.

  CREATE OBJECT lcl_xml_doc.

  CALL METHOD lcl_xml_doc->import_from_file
    EXPORTING
      filename p_filnam
    RECEIVING
      retcode  v_subrc.

  CHECK v_subrc 0.

  v_node lcl_xml_doc->m_document.

  CHECK NOT v_node IS INITIAL.

  v_iterator v_node->create_iterator).
  v_node v_iterator->get_next).

  WHILE NOT v_node IS INITIAL.

    CASE v_node->get_type).

      WHEN if_ixml_node=>co_node_element.
        v_name v_node->get_name).
        v_nodemap v_node->get_attributes).
        v_depth v_node->get_depth).

        IF NOT v_nodemap IS INITIAL.
* attributes
          v_count v_nodemap->get_length).

          DO v_count TIMES.
            v_index   sy-index 1.
            v_attr    v_nodemap->get_itemv_index ).
            v_name    v_attr->get_name).
            v_prefix  v_attr->get_namespace_prefix).
            v_value   v_attr->get_value).

*            v_depth   = v_node->get_depth( ).
          ENDDO.

        ENDIF.

      WHEN  if_ixml_node=>co_node_text OR
            if_ixml_node=>co_node_cdata_section.
* text node
        v_value v_node->get_value).
*        v_depth   = v_node->get_depth( ).

        MOVE v_value TO v_char.

        IF v_char <> cl_abap_char_utilities=>cr_lf.
          wa-name   v_name.
          wa-value  v_value.
          wa-depth  v_depth.

          APPEND wa TO itab.
          CLEAR wa.
        ENDIF.

    ENDCASE.
* advance to next node
    v_node v_iterator->get_next).
  ENDWHILE.

  LOOP AT itab INTO wa.
    WRITE/  'Name :'wa-name,  AT 30 'Valeu:'wa-valueAT 60 'Depth:'wa-depth.
  ENDLOOP.

'SAP Program > ABAP' 카테고리의 다른 글

Internal table에서 중복 데이타 찾기  (0) 2017.11.23
Internal table data to xml  (0) 2017.11.22
GUI Status 생성시 덤프 발생하는 경우  (0) 2017.11.20
BADI 생성/조회 t-code  (0) 2017.11.03
BP Relation Table  (0) 2017.11.02

설정

트랙백

댓글

Non Unicode System에서 한글(2Byte 한글)이 포함된 Text File을

Unicode SAP System에서 읽을때 한글을 1Byte 씩 읽게되면 문제가 발생하는데

이를 해결하는 방법



DATA: BEGIN OF  GT_DATA OCCURS 0,

                PONO(6) TYPE C,

                ZEVT_DTTM(19) TYPE C,

                ZBFEVT(3) TYPE C,

                ZAFEVT(3) TYPE C,

                EVT(3) TYPE C,

                ZFAULT(630) TYPE C,

END OF GT_DATA.



DATA: BEGIN OF GT_REC OCCURS 0,

  TDATA(999)    TYPE C,

END OF GT_REC.


DATA:GT_TEST LIKE TABLE OF GT_REC WITH HEADER LINE.


DATA: W_DSN(500)      TYPE C,

      W_FILEPATH(500) TYPE C,

      W_REC(999)      TYPE C,

      W_CNV(999)      TYPE C.




FORM DATA_UPLOAD USING U_FILENM.


  DATA: LW_FILENM TYPE STRING.

  DATA: W_STR TYPE STRING.

  DATA: CP_TAB  TYPE         NLS_LANGU_CP_TAB,

        L_WA    TYPE         NLS_LANGU_CP_LINE,

        CC      TYPE REF TO  CL_NLS_STRUC_CONTAINER.


  DATA:  BEGIN OF HEAD OCCURS 0,

         H_STR(1056),

  END OF HEAD.


  W_DSN = U_FILENM.


  PERFORM OPEN_DATASET.


  IF G_ERR2 IS INITIAL.

    PERFORM READ_DATASET.

  ENDIF.


  PERFORM CLOSE_DATASET.


  IF SY-SUBRC <> 0.

    MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO

            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ENDIF.


ENDFORM.                    " DATA_UPLOAD




FORM OPEN_DATASET .


  DATA MESS TYPE STRING.

  CLEAR : G_ERR2.


  OPEN DATASET W_DSN FOR INPUT IN LEGACY TEXT MODE CODE PAGE '8500'.


  IF SY-SUBRC = 8.

    MESSAGE S000 WITH 'File not exists'.

    G_ERR2 = 'X'.

    EXIT.

  ENDIF.


  IF SY-SUBRC <> 0.

    MESSAGE S000 WITH 'File not exists'.

    G_ERR2 = 'X'.

    EXIT.

  ENDIF.


ENDFORM.                    " OPEN_DATASET



FORM READ_DATASET .


  DATA:  CP_TAB      TYPE NLS_LANGU_CP_TAB,

         L_WA        TYPE NLS_LANGU_CP_LINE,

         L_CODEPAGE  TYPE CPCODEPAGE,

         CC          TYPE REF TO CL_NLS_STRUC_CONTAINER,

         L_BUF(999)  TYPE C.


  CLEAR : GT_DATA, GT_DATA[].


* NON UNICODE(한글 2바이트로 인식)

  DO.

    CLEAR W_REC.

    READ DATASET W_DSN INTO W_REC.

    IF SY-SUBRC <> 0.

      EXIT.

    ENDIF.


    GT_REC = W_REC.

    APPEND GT_REC.

  ENDDO.


  LOOP AT GT_REC.

    L_WA-LANGU = '3'.

    L_WA-CODEPAGE = '8500'.

    INSERT L_WA INTO TABLE CP_TAB.

    CC = CL_NLS_STRUC_CONTAINER=>CREATE( CP_TAB = CP_TAB ).

    TRY.

        CALL METHOD CC->STRUC_TO_CONT

          EXPORTING

            STRUC = GT_REC

            LANGU = '3'

          IMPORTING

            CONT  = GT_TEST-TDATA.

      CATCH CX_SY_CONVERSION_CODEPAGE .

      CATCH CX_PARAMETER_INVALID_RANGE .

    ENDTRY.


    CC = CL_NLS_STRUC_CONTAINER=>CREATE( CP_TAB = CP_TAB ).

    TRY.

        CALL METHOD CC->CONT_TO_STRUC

          EXPORTING

            CONT  = GT_TEST-TDATA

            LANGU = '3'

          IMPORTING

            STRUC = GT_DATA.

      CATCH CX_SY_CONVERSION_CODEPAGE .

      CATCH CX_PARAMETER_INVALID_RANGE .

    ENDTRY.


    APPEND GT_DATA.

  ENDLOOP.



ENDFORM.                    " READ_DATASET

설정

트랙백

댓글

GUI Status 생성시 덤프 발생하는 경우 조치 방법


LSMPEF30의 847 Line의


new_adm-actcode 에 X 값을 지워준다.




'SAP Program > ABAP' 카테고리의 다른 글

Internal table data to xml  (0) 2017.11.22
XML을 Internal table로 보내기  (0) 2017.11.22
BADI 생성/조회 t-code  (0) 2017.11.03
BP Relation Table  (0) 2017.11.02
MCHBH LFGJA LFMON Max 값 select  (0) 2017.10.26

설정

트랙백

댓글