Monday, June 11, 2012

ABAP Tips for Dynamic ABAP programming

A very simple program to select data from database table dynamically.

FIELD-SYMBOLS ' ' TYPE STANDARD TABLE.

DATATABREF TYPE REF TO DATA.


*Selection Screen for Table Name entry
PARAMETERSL_TABLE TYPE DD02L-TABNAME DEFAULT 'MARA'.

*Create data reference and assignment to field symbol.
CREATE DATA TABREF TYPE STANDARD TABLE OF (L_TABLE).
ASSIGN TABREF->TO  .



*Data Selection

SELECT FROM (L_TABLEINTO TABLE   ' '.

*Display Output Data
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  EXPORTING
    I_STRUCTURE_NAME L_TABLE
  TABLES
    T_OUTTAB         .
IF SY-SUBRC <> 0.
  MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
  WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

Monday, April 2, 2012

Generate XML file for Company Sales data

Hi All,
Today I am going to write a new program to generate XML format file output.

 It's a report program with some input selection parameters and brings out a XML file in output.

 I used this program to create XML file for 'Company Sales Data', which is used to upload on government portal. I hope this will help others for creating the similar requirement.

 Selection Screen
******************* Downloaded XML File Output format
REPORT  ZSD_XML_DOWNLOAD.
************************************************************************
*                      Data Declaration                                *
************************************************************************
TYPE-POOLSIXML.

TABLESVBRK,VBRP,KNA1.

TYPESBEGIN OF TY_DATA,
        VBELN TYPE VBRK-VBELN,
        VBTYP TYPE VBRK-VBTYP,
        FKDAT TYPE VBRK-FKDAT,
        KUNRG TYPE VBRK-KUNRG,
        BUKRS TYPE VBRK-BUKRS,

        POSNR TYPE VBRP-POSNR,
        FKIMG TYPE VBRP-FKIMG,
        VRKME TYPE VBRP-VRKME,
        VGBEL TYPE VBRP-VGBEL,
        MATNR TYPE VBRP-MATNR,
        MATKL TYPE VBRP-MATKL,
       END OF TY_DATA.

TYPESBEGIN OF TY_OUTPUT,
        BUKRS TYPE CHAR6,"VBRK-BUKRS,    "Company Code
        VBELN TYPE VBRK-VBELN,    "Invoice
        FKDAT TYPE STRING,    "Invoice Date
        REGIO TYPE KNA1-REGIO,    "State Id
        BZIRK TYPE KNVV-BZIRK,    "Sales District
        WHID  TYPE STRING,        "WareHouse Id
        KUNRG TYPE VBRK-KUNRG,    "Payer    "Dealer Id

        MATNR TYPE VBRP-MATNR,    "Product
        VRKME TYPE VBRP-VRKME,    "Sales Unit
        FKIMG TYPE VBRP-FKIMG,    "Quantity

       END OF TY_OUTPUT.

TYPESBEGIN OF TY_KUNNR,
        VBELN TYPE LIKP-VBELN,
        KUNNR TYPE LIKP-KUNNR,
       END OF TY_KUNNR.

DATAIT_DATA   TYPE STANDARD TABLE OF TY_DATA,
      IT_KUNNR  TYPE STANDARD TABLE OF TY_KUNNR,
      IT_KNA1   TYPE STANDARD TABLE OF KNA1,
      IT_OUTPUT TYPE STANDARD TABLE OF TY_OUTPUT,
      WA_OUTPUT TYPE TY_OUTPUT,
      WA_OUTPUT1 TYPE TY_OUTPUT,
      WA_DATA   TYPE TY_DATA,
      WA_KUNNR  TYPE TY_KUNNR,
      WA_KNA1   TYPE KNA1.

DATAIT_ZFMSCC     TYPE STANDARD TABLE OF ZFMSCC,
      IT_ZFMSCUST   TYPE STANDARD TABLE OF ZFMSCUST,
      IT_ZFMSDIST   TYPE STANDARD TABLE OF ZFMSDIST,
      IT_ZFMSSTATE  TYPE STANDARD TABLE OF ZFMSSTATE,
      IT_ZFMSWH     TYPE STANDARD TABLE OF ZFMSWH,
      IT_ZFMSUNIT   TYPE STANDARD TABLE OF ZFMSUNIT,
      WA_ZFMSCC     TYPE ZFMSCC,
      WA_ZFMSCUST   TYPE ZFMSCUST,
      WA_ZFMSSTATE  TYPE ZFMSSTATE,
      WA_ZFMSDIST   TYPE ZFMSDIST,
      WA_ZFMSWH     TYPE ZFMSWH,
      WA_ZFMSUNIT   TYPE ZFMSUNIT.
************************************************************************
*                      Selection Screen                                *
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
SELECT-OPTIONSS_FKDAT FOR VBRK-FKDAT,
                S_WERKS FOR VBRP-WERKS,
                S_LGORT FOR VBRP-LGORT,
                S_MATKL FOR VBRP-MATKL,
                S_SPART FOR VBRK-SPART.
SELECTION-SCREEN END OF BLOCK B1.

SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME.
PARAMETERS P_FILE LIKE RLGRAP-FILENAME OBLIGATORY .
SELECTION-SCREEN END OF BLOCK B2.

************************************************************************
*                    At Selection Screen                               *
************************************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.

  CALL FUNCTION 'F4_FILENAME'
    EXPORTING
      PROGRAM_NAME  SYST-CPROG
      DYNPRO_NUMBER SYST-DYNNR
      FIELD_NAME    ' '
    IMPORTING
      FILE_NAME     P_FILE.

************************************************************************
*                      Start of Selection                              *
************************************************************************
START-OF-SELECTION.

  PERFORM GET_DATA.

  PERFORM BUILD_OUTPUT.

  PERFORM BUILD_XML_FILE.

*  PERFORM DOWNLOAD_FILE.
*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GET_DATA .

  SELECT K~VBELN K~VBTYP K~FKDAT K~KUNRG K~BUKRS P~POSNR P~FKIMG P~VRKME P~VGBEL P~MATNR P~MATKL
    INTO TABLE IT_DATA
    FROM VBRK AS K
    INNER JOIN VBRP AS ON P~VBELN K~VBELN
    WHERE K~VBTYP 'M' OR K~VBTYP 'U' "AND ( K~VBTYP = 'M' AND P~WERKS NOT LIKE 'DP%' ) )
      AND K~FKDAT IN S_FKDAT
      AND K~FKSTO SPACE
      AND K~RFBSK <> 'E'
      AND K~SPART IN S_SPART                                  "Inserted 02-03-2012
      AND P~WERKS IN S_WERKS
      AND P~LGORT IN S_LGORT
      AND P~MATKL IN S_MATKL.
  IF SY-SUBRC EQ 0.
    SORT IT_DATA BY VBELN POSNR.
*Get Ship to party details
    SELECT VBELN KUNNR INTO TABLE IT_KUNNR
      FROM LIKP
      FOR ALL ENTRIES IN IT_DATA
      WHERE VBELN IT_DATA-VGBEL.

    SELECT FROM KNA1 INTO TABLE IT_KNA1
      FOR ALL ENTRIES IN IT_KUNNR
      WHERE KUNNR IT_KUNNR-KUNNR.
  ENDIF.

  DATAL_TABIX TYPE SY-TABIX,
        L_WERKS TYPE LIKP-WERKS.
  CLEARL_TABIX,L_WERKS.

  LOOP AT IT_DATA INTO WA_DATA.
    L_TABIX SY-TABIXCLEAR L_WERKS.

    IF WA_DATA-VBTYP 'U'.

      SELECT SINGLE WERKS INTO L_WERKS
      FROM LIKP
      WHERE VBELN WA_DATA-VGBEL
        AND WERKS LIKE 'DP%'.
      IF L_WERKS IS INITIAL.
        DELETE IT_DATA INDEX L_TABIX.
        CONTINUE.
      ENDIF.

    ELSEIF WA_DATA-VBTYP 'M'.

      SELECT SINGLE WERKS INTO L_WERKS
      FROM LIPS "LIKP
      WHERE VBELN WA_DATA-VGBEL
        AND WERKS NOT LIKE 'DP%'.
      IF L_WERKS IS INITIAL.
        DELETE IT_DATA INDEX L_TABIX.
        CONTINUE.
      ENDIF.

    ENDIF.

    MOVE-CORRESPONDING WA_DATA TO WA_OUTPUT.

    READ TABLE IT_KUNNR INTO WA_KUNNR WITH KEY VBELN WA_DATA-VGBEL.

    READ TABLE IT_KNA1 INTO WA_KNA1 WITH KEY KUNNR WA_KUNNR-KUNNR.
    IF WA_KNA1-REGIO IS NOT INITIAL.
      WA_OUTPUT-REGIO  WA_KNA1-REGIO.
    ENDIF.

    SELECT SINGLE BZIRK FROM KNVV INTO WA_OUTPUT-BZIRK
      WHERE KUNNR WA_KUNNR-KUNNR
       AND  BZIRK <> SPACE.

    COLLECT WA_OUTPUT INTO IT_OUTPUT.
    CLEAR WA_OUTPUT.
  ENDLOOP.

  IF IT_OUTPUT IS INITIAL.
    MESSAGE 'No Records exist' TYPE 'I'.
  ENDIF.
ENDFORM.                    " GET_DATA
*&---------------------------------------------------------------------*
*&      Form  DOWNLOAD_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM DOWNLOAD_FILE .

**  DATA:  L_XML  TYPE REF TO CL_XML_DOCUMENT.
**
*** CREATE THE XML OBJECT
**  CREATE OBJECT L_XML.
**
*** CONVERT THE DATA TO XML
**  CALL METHOD L_XML->CREATE_WITH_DATA( DATAOBJECT = IT_OUTPUT[] ).
**
***  CALL METHOD L_XML->CREATE_WITH_TABLE( TABLE = IT_OUTPUT[] ).
**
*** DATA IS CONVERTED TO XML; DISPLAY THE XML-DOCUMENT
**  CALL METHOD L_XML->DISPLAY.


*  CALL FUNCTION 'GUI_DOWNLOAD'
*    EXPORTING
*      FILENAME                = 'C:\DATA\company_sales_data.txt'
*      FILETYPE                = 'ASC'
*      WRITE_FIELD_SEPARATOR   = ' '
*    TABLES
*      DATA_TAB                = IT_OUTPUT
*    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
*      OTHERS                  = 22.
*  IF SY-SUBRC <> 0.
** Implement suitable error handling here
*  ELSE.
*    MESSAGE 'File Downloaded successfully' TYPE 'S'.
*  ENDIF.

ENDFORM.                    " DOWNLOAD_FILE
*&---------------------------------------------------------------------*
*&      Form  BUILD_XML_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM BUILD_XML_FILE .
  DATA L_FILENAME TYPE STRING.
  L_FILENAME P_FILE.

  TYPESBEGIN OF XML_LINE,
          DATA(256TYPE X,
         END OF XML_LINE.

  DATAL_IXML            TYPE REF TO IF_IXML,
        L_STREAMFACTORY   TYPE REF TO IF_IXML_STREAM_FACTORY,
        L_OSTREAM         TYPE REF TO IF_IXML_OSTREAM,
        L_RENDERER        TYPE REF TO IF_IXML_RENDERER,
        L_DOCUMENT        TYPE REF TO IF_IXML_DOCUMENT.

  DATAL_ELEMENT_COMPANYSALESLIST  TYPE REF TO IF_IXML_ELEMENT,
        L_ELEMENT_COMPANYSALE       TYPE REF TO IF_IXML_ELEMENT,
        L_ELEMENT_COMPANYID         TYPE REF TO IF_IXML_ELEMENT,
        L_ELEMENT_INVOICENUMBER     TYPE REF TO IF_IXML_ELEMENT,
        L_ELEMENT_INVOIEDATE        TYPE REF TO IF_IXML_ELEMENT,
        L_ELEMENT_STATEID           TYPE REF TO IF_IXML_ELEMENT,
        L_ELEMENT_DISTRICTID        TYPE REF TO IF_IXML_ELEMENT,
        L_ELEMENT_WAREHOUSEID       TYPE REF TO IF_IXML_ELEMENT,
        L_ELEMENT_DEALERID          TYPE REF TO IF_IXML_ELEMENT,
        L_ELEMENT_CMP_SD_LIST       TYPE REF TO IF_IXML_ELEMENT,
        L_ELEMENT_CMP_SD            TYPE REF TO IF_IXML_ELEMENT,
        L_ELEMENT_PRDID             TYPE REF TO IF_IXML_ELEMENT,
        L_ELEMENT_UNITID            TYPE REF TO IF_IXML_ELEMENT,
        L_ELEMENT_QUANTITY          TYPE REF TO IF_IXML_ELEMENT,

        L_ELEMENT_FLIGHT  TYPE REF TO IF_IXML_ELEMENT,
        L_ELEMENT_FROM    TYPE REF TO IF_IXML_ELEMENT,
        L_ELEMENT_TO      TYPE REF TO IF_IXML_ELEMENT,
        L_ELEMENT_DUMMY   TYPE REF TO IF_IXML_ELEMENT,
        L_VALUE           TYPE STRING.

  DATAL_XML_TABLE       TYPE TABLE OF XML_LINE,
        L_XML_SIZE        TYPE I,
        L_RC              TYPE I.

  CHECK IT_OUTPUT IS NOT INITIAL.

  DELETE IT_OUTPUT WHERE MATNR SPACE.

  SORT IT_OUTPUT BY VBELN REGIO BZIRK.

  LOOP AT IT_OUTPUT INTO WA_OUTPUT1.
    CLEAR WA_OUTPUT.
    WA_OUTPUT WA_OUTPUT1.
    AT FIRST.
*       Creating a ixml factory
      L_IXML CL_IXML=>CREATE).
*       Creating the dom object model
      L_DOCUMENT L_IXML->CREATE_DOCUMENT).
*       Fill root node with value CompanySalesList
      L_ELEMENT_COMPANYSALESLIST  L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                  NAME 'CompanySalesList'
                  PARENT L_DOCUMENT ).
    ENDAT.

    AT NEW BZIRK.
*      Fill root node with value CompanySale
      L_ELEMENT_COMPANYSALE L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                  NAME 'CompanySale'
                  PARENT L_ELEMENT_COMPANYSALESLIST ).

*       Create element 'CompanyId' as child of 'CompanySale'
      L_VALUE WA_OUTPUT-BUKRS.
      L_ELEMENT_COMPANYID  L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                  NAME 'companyId'
                  VALUE L_VALUE
                  PARENT L_ELEMENT_COMPANYSALE  ).
*       Create element 'InvoiceNumber ' as child of 'CompanySale'
      L_VALUE WA_OUTPUT-VBELN.
      L_ELEMENT_INVOICENUMBER  L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                  NAME 'invoiceNumber'
                  VALUE L_VALUE
                  PARENT L_ELEMENT_COMPANYSALE  ).

*       Create element 'InvoiceDate ' as child of 'CompanySale'
      L_VALUE WA_OUTPUT-FKDAT.
      L_ELEMENT_INVOIEDATE  L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                  NAME 'invoiceDate'
                  VALUE L_VALUE
                  PARENT L_ELEMENT_COMPANYSALE  ).

*       Create element 'StateID' as child of 'CompanySale'
      L_VALUE WA_OUTPUT-REGIO.
      L_ELEMENT_STATEID  L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                  NAME 'stateId'
                  VALUE L_VALUE
                  PARENT L_ELEMENT_COMPANYSALE  ).

*       Create element 'DistrictId' as child of 'CompanySale'
      L_VALUE WA_OUTPUT-BZIRK.
      L_ELEMENT_DISTRICTID  L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                  NAME 'districtId'
                  VALUE L_VALUE
                  PARENT L_ELEMENT_COMPANYSALE  ).


*       Create element 'WarehouseId' as child of 'CompanySale'
      L_VALUE WA_OUTPUT-WHID.
      L_ELEMENT_WAREHOUSEID  L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                  NAME 'warehouseId'
                  VALUE L_VALUE
                  PARENT L_ELEMENT_COMPANYSALE  ).

*       Create element 'dealerId' as child of 'CompanySale'
      L_VALUE WA_OUTPUT-KUNRG.
      L_ELEMENT_DEALERID  L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                  NAME 'dealerId'
                  VALUE L_VALUE
                  PARENT L_ELEMENT_COMPANYSALE  ).

*       Create element 'CompanySaleDetailsList' as child of 'CompanySale'
      L_ELEMENT_CMP_SD_LIST  L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                  NAME 'CompanySaleDetailsList'
                  PARENT L_ELEMENT_COMPANYSALE  ).
*    ENDAT.
*
*    AT NEW MATNR.

*       Create element 'CompanySaleDetails' as child of 'CompanySale'
      L_ELEMENT_CMP_SD L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                  NAME 'CompanySaleDetails'
                  PARENT L_ELEMENT_CMP_SD_LIST ).

*       Create element 'companyId' as child of 'CompanySaleDetails'
      L_VALUE WA_OUTPUT-BUKRS.
      L_ELEMENT_COMPANYID L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                  NAME 'companyId'
                  VALUE L_VALUE
                  PARENT L_ELEMENT_CMP_SD ).

      L_VALUE WA_OUTPUT-MATNR.
      L_ELEMENT_PRDID L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                  NAME 'productId'
                  VALUE L_VALUE
                  PARENT L_ELEMENT_CMP_SD ).

      L_VALUE WA_OUTPUT-VRKME.
      L_ELEMENT_UNITID L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                  NAME 'unitId'
                  VALUE L_VALUE
                  PARENT L_ELEMENT_CMP_SD ).

      L_VALUE WA_OUTPUT-FKIMG.
      L_ELEMENT_PRDID L_DOCUMENT->CREATE_SIMPLE_ELEMENT(
                  NAME 'quantity'
                  VALUE L_VALUE
                  PARENT L_ELEMENT_CMP_SD ).


    ENDAT.

  ENDLOOP.


*   Creating a stream factory
  L_STREAMFACTORY L_IXML->CREATE_STREAM_FACTORY).
*   Connect internal XML table to stream factory
  L_OSTREAM L_STREAMFACTORY->CREATE_OSTREAM_ITABLETABLE L_XML_TABLE ).

*   Rendering the document
  L_RENDERER L_IXML->CREATE_RENDEREROSTREAM  L_OSTREAM
                                        DOCUMENT L_DOCUMENT ).
  L_RC L_RENDERER->RENDER).

*   Saving the XML document
  L_XML_SIZE L_OSTREAM->GET_NUM_WRITTEN_RAW).

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>GUI_DOWNLOAD
    EXPORTING
      BIN_FILESIZE L_XML_SIZE
      FILENAME     L_FILENAME "'c:\data\companysalesdata.xml'
      FILETYPE     'BIN'
    CHANGING
      DATA_TAB     L_XML_TABLE
    EXCEPTIONS
      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.
  ELSE.
    MESSAGE 'File Downloaded successfully' TYPE 'S'.
  ENDIF.

ENDFORM.                    " BUILD_XML_FILE
*&---------------------------------------------------------------------*
*&      Form  BUILD_OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM BUILD_OUTPUT .
  CHECK IT_OUTPUT IS NOT INITIAL.

*  SELECT * FROM ZFMSCC INTO TABLE IT_ZFMSCC
*    FOR ALL ENTRIES IN IT_OUTPUT
*    WHERE SAP_COMPANY_CODE = IT_OUTPUT-BUKRS.

  SELECT FROM ZFMSCUST INTO TABLE IT_ZFMSCUST
    FOR ALL ENTRIES IN IT_OUTPUT
    WHERE SAP_CUSTOMER IT_OUTPUT-KUNRG
      AND DISTRICT IT_OUTPUT-BZIRK.               "Inserted 01-03-2012

  SELECT FROM ZFMSSTATE INTO TABLE IT_ZFMSSTATE
    FOR ALL ENTRIES IN IT_OUTPUT
    WHERE SAP_STATE IT_OUTPUT-REGIO.

  SELECT FROM ZFMSDIST INTO TABLE IT_ZFMSDIST
    FOR ALL ENTRIES IN IT_OUTPUT
    WHERE SAP_DISTRICT IT_OUTPUT-BZIRK.

  SELECT FROM ZFMSUNIT INTO TABLE IT_ZFMSUNIT
    FOR ALL ENTRIES IN IT_OUTPUT
    WHERE SAP_UNIT IT_OUTPUT-VRKME.

  SELECT FROM ZFMSWH INTO TABLE IT_ZFMSWH
    FOR ALL ENTRIES IN IT_OUTPUT
    WHERE SAP_MATERIAL IT_OUTPUT-MATNR.

  DATAL_DATE TYPE CHAR10.

  LOOP AT IT_OUTPUT INTO WA_OUTPUT.

    PERFORM CONVERSION_EXIT_ALPHA_OUTPUT USING WA_OUTPUT-VBELN CHANGING WA_OUTPUT-VBELN.

    CLEAR L_DATE.

    L_DATE+0(2WA_OUTPUT-FKDAT+6(2).
    L_DATE+2(1'/'.
    L_DATE+3(2WA_OUTPUT-FKDAT+4(2).
    L_DATE+5(1'/'.
    L_DATE+6(4WA_OUTPUT-FKDAT+0(4).

    WA_OUTPUT-FKDAT L_DATE.

*    READ TABLE IT_ZFMSCC INTO WA_ZFMSCC
*      WITH KEY SAP_COMPANY_CODE = WA_OUTPUT-BUKRS.
*    IF SY-SUBRC EQ 0.
*      WA_OUTPUT-BUKRS = WA_ZFMSCC-FMS_COMPANY_CODE.
*      PERFORM CONVERSION_EXIT_ALPHA_OUTPUT USING WA_OUTPUT-BUKRS CHANGING WA_OUTPUT-BUKRS.
*    ELSE.
*      CLEAR WA_OUTPUT-BUKRS.
*    ENDIF.

    SELECT SINGLE FMS_COMPANY_CODE INTO WA_OUTPUT-BUKRS
      FROM ZFMSCC
      WHERE SAP_COMPANY_CODE WA_OUTPUT-BUKRS.
    IF SY-SUBRC EQ 0.
      PERFORM CONVERSION_EXIT_ALPHA_OUTPUT USING WA_OUTPUT-BUKRS CHANGING WA_OUTPUT-BUKRS.
    ENDIF.

    READ TABLE IT_ZFMSCUST INTO WA_ZFMSCUST
      WITH KEY SAP_CUSTOMER WA_OUTPUT-KUNRG
               DISTRICT WA_OUTPUT-BZIRK.              "Inserted 01-03-2012
    IF SY-SUBRC EQ 0.
      WA_OUTPUT-KUNRG WA_ZFMSCUST-FMS_CUSTOMER.
      PERFORM CONVERSION_EXIT_ALPHA_OUTPUT USING WA_OUTPUT-KUNRG CHANGING WA_OUTPUT-KUNRG.
    ELSE.
      CLEAR WA_OUTPUT-KUNRG.
    ENDIF.

    READ TABLE IT_ZFMSSTATE INTO WA_ZFMSSTATE
      WITH KEY SAP_STATE WA_OUTPUT-REGIO.
    IF SY-SUBRC EQ 0.
      WA_OUTPUT-REGIO WA_ZFMSSTATE-FMS_STATE.
    ELSE.
      CLEAR WA_OUTPUT-REGIO.
    ENDIF.

    READ TABLE IT_ZFMSDIST INTO WA_ZFMSDIST
     WITH KEY SAP_DISTRICT WA_OUTPUT-BZIRK.
    IF SY-SUBRC EQ .
      WA_OUTPUT-BZIRK WA_ZFMSDIST-FMS_DISTRICT.
    ELSE.
      CLEAR WA_OUTPUT-BZIRK.
    ENDIF.

    READ TABLE IT_ZFMSUNIT INTO WA_ZFMSUNIT
    WITH KEY SAP_UNIT WA_OUTPUT-VRKME.
    IF SY-SUBRC EQ 0.
      WA_OUTPUT-VRKME WA_ZFMSUNIT-FMS_UNIT.
    ELSE.
      CLEAR WA_OUTPUT-VRKME.
    ENDIF.

    READ TABLE IT_ZFMSWH INTO WA_ZFMSWH
      WITH KEY  SAP_MATERIAL WA_OUTPUT-MATNR.
    IF SY-SUBRC EQ 0.
      WA_OUTPUT-MATNR WA_ZFMSWH-FMS_MAT_ID"FMS_MATERIAL.                      "Changed 02-03-2012
      PERFORM CONVERSION_EXIT_ALPHA_OUTPUT USING WA_OUTPUT-MATNR CHANGING WA_OUTPUT-MATNR.
    ELSE.
      CLEAR WA_OUTPUT-MATNR.
    ENDIF.

    CONCATENATE WA_OUTPUT-BUKRS WA_OUTPUT-BZIRK INTO
        WA_OUTPUT-WHID.

    MODIFY IT_OUTPUT FROM WA_OUTPUT.

  ENDLOOP.
ENDFORM.                    " BUILD_OUTPUT
*&---------------------------------------------------------------------*
*&      Form  CONVERSION_EXIT_ALPHA_OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_WA_OUTPUT_BUKRS  text
*      <--P_WA_OUTPUT_BUKRS  text
*----------------------------------------------------------------------*
FORM CONVERSION_EXIT_ALPHA_OUTPUT  USING    P_IN
                                   CHANGING P_OUT.

  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
    EXPORTING
      INPUT  P_IN
    IMPORTING
      OUTPUT P_OUT.

ENDFORM.                    " CONVERSION_EXIT_ALPHA_OUTPUT

Friday, September 23, 2011

Report on Open and Shipped Orders

This report provides the information about Open orders and Shipped Orders.
REPORT z_0000__1_3_1_1___0023. *Include for Data declaration INCLUDE z_0000__1_3_1_1___0023_top. *Include for selection screen INCLUDE z_0000__1_3_1_1___0023_scr. *Include for Calculations INCLUDE z_0000__1_3_1_1___0023_f01. *----------------------------------------------------------------------* * Initialization * *----------------------------------------------------------------------* INITIALIZATION. PERFORM refresh_data. *----------------------------------------------------------------------* * Start of selection * *----------------------------------------------------------------------* START-OF-SELECTION. * Fetching the required Data PERFORM fetch_data. *Build Field catalog. PERFORM build_field_catalog. *----------------------------------------------------------------------* * End of selection * *----------------------------------------------------------------------* END-OF-SELECTION. IF t_output IS NOT INITIAL. *Display report output PERFORM display_alv. ELSE. MESSAGE 'No data found' TYPE 'I'. ENDIF. *&---------------------------------------------------------------------* *& Include Z_0000__1_3_1_1___0023_TOP *&---------------------------------------------------------------------* TYPE-POOLS: slis. *----------------------------------------------------------------------* * Table-declaration * *----------------------------------------------------------------------* TABLES: vbrk,vbak,likp,lips,vbap,kna1,knvv. *----------------------------------------------------------------------* * Structure declaration * *----------------------------------------------------------------------* TYPES : BEGIN OF x_vbak, vbeln LIKE vbak-vbeln, END OF x_vbak. TYPES : BEGIN OF x_vbap, vbeln LIKE vbak-vbeln, "Sales document kunnr LIKE vbak-kunnr, "Sold-to-Party * kvgr4 LIKE vbak-kvgr4, "Cust Grp A kdgrp LIKE knvv-kdgrp, "Cust Group posnr LIKE vbap-posnr, "Sales Document Item matnr LIKE vbap-matnr, "Material Number arktx LIKE vbap-arktx, "Product description kwmeng LIKE vbap-kwmeng, "Cumulative Order Quantity in Sales Units werks LIKE vbap-werks, "Plant netwr LIKE vbap-netwr, "Total Value Sales order line END OF x_vbap. TYPES : BEGIN OF x_lips, vbeln LIKE likp-vbeln, lfdat LIKE likp-lfdat, wadat_ist LIKE likp-wadat_ist, posnr LIKE lips-posnr, lfimg LIKE lips-lfimg, END OF x_lips. TYPES : BEGIN OF x_kna1, kunnr LIKE kna1-kunnr, name1 LIKE kna1-name1, END OF x_kna1. TYPES : BEGIN OF x_vbfa, vbelv LIKE vbfa-vbelv, posnv LIKE vbfa-posnv, vbeln LIKE vbfa-vbeln, posnn LIKE vbfa-posnn, vbtyp_n LIKE vbfa-vbtyp_n, matnr LIKE vbfa-matnr, rfmng LIKE vbfa-rfmng, END OF x_vbfa. TYPES : BEGIN OF x_output, kunnr LIKE vbak-kunnr, name1 LIKE kna1-name1, vbeln LIKE vbak-vbeln, arktx LIKE vbap-arktx, kwmeng LIKE vbap-kwmeng, netwr LIKE vbap-netwr, "Inserted Ver 03.00 lfimg LIKE lips-lfimg, wadat_ist LIKE likp-wadat_ist, open_unit LIKE vbap-kwmeng, mbdat like vbep-mbdat, END OF x_output. TYPES: BEGIN OF x_vbep, vbeln LIKE vbep-vbeln, posnr LIKE vbep-posnr, etenr LIKE vbep-etenr, mbdat LIKE vbep-mbdat, END OF x_vbep. *----------------------------------------------------------------------* * Internal table declaration * *----------------------------------------------------------------------* DATA : t_vbak TYPE STANDARD TABLE OF x_vbak, t_vbap TYPE STANDARD TABLE OF x_vbap, t_lips TYPE STANDARD TABLE OF x_lips, t_kna1 TYPE STANDARD TABLE OF x_kna1, t_vbfa TYPE STANDARD TABLE OF x_vbfa, t_output TYPE STANDARD TABLE OF x_output, t_fieldcat TYPE TABLE OF slis_fieldcat_alv WITH HEADER LINE, t_vbep TYPE STANDARD TABLE OF x_vbep. DATA : wa_vbap TYPE x_vbap, wa_kna1 TYPE x_kna1, wa_lips TYPE x_lips, wa_vbfa TYPE x_vbfa, wa_output TYPE x_output, wa_vbep TYPE x_vbep. *----------------------------------------------------------------------* * Declaration for Email processing * *----------------------------------------------------------------------* DATA: docdata LIKE sodocchgi1, objpack LIKE sopcklsti1 OCCURS 1 WITH HEADER LINE, objtxt LIKE solisti1 OCCURS 10 WITH HEADER LINE, objbin1 LIKE solisti1 OCCURS 10 WITH HEADER LINE, objbin2 LIKE solisti1 OCCURS 10 WITH HEADER LINE, objbin_final LIKE solisti1 OCCURS 10 WITH HEADER LINE, reclist LIKE somlreci1 OCCURS 1 WITH HEADER LINE, tab_lines TYPE sy-tabix. DATA: gd_sender_type LIKE soextreci1-adr_typ. DATA: c_tab TYPE c VALUE cl_abap_char_utilities=>horizontal_tab, c_ret TYPE c VALUE cl_abap_char_utilities=>cr_lf. DATA: c_dev TYPE sy-sysid. *&---------------------------------------------------------------------* *& Include Z_0000__1_3_1_1___0023_SCR *&---------------------------------------------------------------------* SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME. SELECT-OPTIONS: s_vbeln FOR vbak-vbeln, "Sales Document s_kunnr FOR kna1-kunnr, "Customer Number s_land1 FOR kna1-land1, "Country of Destination * s_kvgr4 FOR vbak-kvgr4, "Customer Group s_KDGRP for knvv-KDGRP, "Customer Group * s_GPC, *Begin of change Ver 02.00 * s_lfdat FOR likp-lfdat. "Date of Delivery s_vdatu for vbak-vdatu. "Req Delivery date *End of change Ver 02.00 SELECTION-SCREEN END OF BLOCK b1. *&---------------------------------------------------------------------* *& Include Z_0000__1_3_1_1___0023_F01 *&---------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form REFRESH_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM refresh_data . *Refresh internal table data. REFRESH : t_vbak , t_vbap , t_lips , t_kna1 , t_vbfa , t_output, t_fieldcat, t_vbep. ENDFORM. " REFRESH_DATA *&---------------------------------------------------------------------* *& Form FETCH_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM fetch_data . DATA l_index TYPE sy-index. *Select Sales Item data. SELECT k~vbeln k~kunnr v~kdgrp p~posnr p~matnr p~arktx p~kwmeng p~werks p~netwr "Inserted Ver 03.00 INTO CORRESPONDING FIELDS OF TABLE t_vbap FROM ( ( ( vbak AS k INNER JOIN vbap AS p ON k~vbeln = p~vbeln ) INNER JOIN kna1 AS a ON a~kunnr = k~kunnr ) INNER JOIN knvv AS v ON v~kunnr = a~kunnr AND k~vkorg = v~vkorg AND k~vtweg = v~vtweg AND k~spart = v~spart ) WHERE k~vbeln IN s_vbeln AND a~kunnr IN s_kunnr AND v~kdgrp IN s_kdgrp *Begin of insert Ver 02.00 and k~vdatu in s_vdatu. *End of insert Ver 02.00 IF t_vbap IS NOT INITIAL. SORT t_vbap BY vbeln posnr. *Select Sales Document Flow data from VBFA SELECT vbelv posnv vbeln posnn vbtyp_n matnr rfmng FROM vbfa INTO TABLE t_vbfa FOR ALL ENTRIES IN t_vbap WHERE vbelv = t_vbap-vbeln AND vbtyp_n = 'J'. IF t_vbfa IS NOT INITIAL. *Select Delivery based on Sales order on selection screen. SELECT p~vbeln p~lfdat p~wadat_ist s~posnr s~lfimg FROM ( likp AS p INNER JOIN lips AS s ON p~vbeln = s~vbeln ) INTO TABLE t_lips FOR ALL ENTRIES IN t_vbfa WHERE p~vbeln = t_vbfa-vbeln AND s~posnr = t_vbfa-posnn. *Begin of commenting Ver 02.00 * AND p~lfdat IN s_lfdat. *End of commenting Ver 02.00 ENDIF. * SORT t_lips BY vbeln posnr. *Select Customer name SELECT kunnr name1 FROM kna1 INTO TABLE t_kna1 FOR ALL ENTRIES IN t_vbap WHERE kunnr = t_vbap-kunnr AND land1 IN s_land1. SORT t_kna1 BY kunnr. DELETE ADJACENT DUPLICATES FROM t_kna1. *Select Product availability date from VBEP table SELECT vbeln posnr etenr mbdat FROM vbep INTO TABLE t_vbep FOR ALL ENTRIES IN t_vbap WHERE vbeln = t_vbap-vbeln AND posnr = t_vbap-posnr. *Create Output Internal table for Display ALV report LOOP AT t_vbap INTO wa_vbap. wa_output-kunnr = wa_vbap-kunnr. "Customer # READ TABLE t_kna1 INTO wa_kna1 WITH KEY kunnr = wa_vbap-kunnr. wa_output-name1 = wa_kna1-name1. "Customer Name wa_output-vbeln = wa_vbap-vbeln. "Sales Order # wa_output-arktx = wa_vbap-arktx. "Product description wa_output-kwmeng = wa_vbap-kwmeng. "Total Value of sales order quantity wa_output-netwr = wa_vbap-netwr. "Total Value of sales order line "Inserted Ver 03.00 *Read sales doc data for sales order READ TABLE t_vbfa INTO wa_vbfa WITH KEY vbelv = wa_vbap-vbeln posnv = wa_vbap-posnr. *Read delivery data READ TABLE t_lips INTO wa_lips WITH KEY vbeln = wa_vbfa-vbeln posnr = wa_vbfa-posnn. *Selecting Delivered unit of SO line SELECT SUM( DISTINCT rfmng ) INTO wa_output-lfimg FROM vbfa WHERE vbelv = wa_vbap-vbeln AND posnv = wa_vbap-posnr AND vbtyp_n = 'J'. *Begin of Change Ver 02.00 * IF s_lfdat IS NOT INITIAL AND wa_lips IS INITIAL. IF s_vdatu IS NOT INITIAL AND wa_lips IS INITIAL. *End of change Ver 02.00 CONTINUE. ELSE. wa_output-wadat_ist = wa_lips-wadat_ist. "When shipped (GI date) wa_output-open_unit = ( wa_vbap-kwmeng - wa_output-lfimg ). "Open unit of sales. ENDIF. READ TABLE t_vbep INTO wa_vbep WITH KEY vbeln = wa_vbap-vbeln posnr = wa_vbap-posnr. IF sy-subrc EQ 0. wa_output-mbdat = wa_vbep-mbdat. "Product Availability date ENDIF. APPEND wa_output TO t_output. CLEAR : wa_output,wa_lips,wa_vbfa,wa_vbap,wa_kna1. ENDLOOP. ENDIF. ENDFORM. " FETCH_DATA *&---------------------------------------------------------------------* *& Form BUILD_FIELD_CATALOG *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM build_field_catalog . PERFORM fieldcat_add USING 'KUNNR' 15 'Customer' 'Customer' '' '' '' '' ''. PERFORM fieldcat_add USING 'NAME1' 15 'Customer Name' 'Customer Name' '' '' '' '' ''. PERFORM fieldcat_add USING 'VBELN' 15 'Sales Order Number' 'Sales Order Number' '' '' '' '' ''. PERFORM fieldcat_add USING 'ARKTX' 15 'Product Discription' 'Product Discription' '' '' '' '' ''. PERFORM fieldcat_add USING 'KWMENG' 15 'Total Units of Sales Order Line' 'Total Units of Sales Order Line' '' '' '' '' ''. *Begin of insert Ver 03.00 PERFORM fieldcat_add USING 'NETWR' 15 'Total Value of Sales Order Line' 'Total Value of Sales Order Line' '' '' '' '' ''. *End of insert Ver 03.00 PERFORM fieldcat_add USING 'LFIMG' 15 'Delivered Unit of Sales Order Line' 'Delivered Unit of Sales Order Line' '' '' '' '' ''. PERFORM fieldcat_add USING 'WADAT_IST' 15 'When Shipped(GI date)' 'When Shipped(GI date)' '' '' '' '' ''. PERFORM fieldcat_add USING 'OPEN_UNIT' 15 'Open Units of sales Order line' 'Open Units of sales Order line' '' '' '' '' ''. PERFORM fieldcat_add USING 'MBDAT' 20 'Prdct Availability Date' 'Prdct Avail Date' '' '' '' '' ''. ENDFORM. " BUILD_FIELD_CATALOG *&---------------------------------------------------------------------* *& Form DISPLAY_ALV *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM display_alv . CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING * I_INTERFACE_CHECK = ' ' * I_BYPASSING_BUFFER = ' ' * I_BUFFER_ACTIVE = ' ' i_callback_program = sy-repid * I_CALLBACK_PF_STATUS_SET = ' ' * I_CALLBACK_USER_COMMAND = ' ' * I_CALLBACK_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_TOP_OF_PAGE = ' ' * I_CALLBACK_HTML_END_OF_LIST = ' ' * I_STRUCTURE_NAME = * I_BACKGROUND_ID = ' ' * I_GRID_TITLE = * I_GRID_SETTINGS = * IS_LAYOUT = it_fieldcat = t_fieldcat[] * IT_EXCLUDING = * IT_SPECIAL_GROUPS = * IT_SORT = * IT_FILTER = * IS_SEL_HIDE = * I_DEFAULT = 'X' * I_SAVE = ' ' * IS_VARIANT = * IT_EVENTS = * IT_EVENT_EXIT = * IS_PRINT = * IS_REPREP_ID = * I_SCREEN_START_COLUMN = 0 * I_SCREEN_START_LINE = 0 * I_SCREEN_END_COLUMN = 0 * I_SCREEN_END_LINE = 0 * I_HTML_HEIGHT_TOP = 0 * I_HTML_HEIGHT_END = 0 * IT_ALV_GRAPHICS = * IT_HYPERLINK = * IT_ADD_FIELDCAT = * IT_EXCEPT_QINFO = * IR_SALV_FULLSCREEN_ADAPTER = * IMPORTING * E_EXIT_CAUSED_BY_CALLER = * ES_EXIT_CAUSED_BY_USER = TABLES t_outtab = t_output * EXCEPTIONS * PROGRAM_ERROR = 1 * OTHERS = 2 . 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. " DISPLAY_ALV *&---------------------------------------------------------------------* *& Form FIELDCAT_ADD *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_0250 text * -->P_15 text * -->P_C_CMP text * -->P_C_CMP text * -->P_0254 text * -->P_0255 text * -->P_0256 text * -->P_0257 text * -->P_0258 text *----------------------------------------------------------------------* FORM fieldcat_add USING lp_fieldname lp_outputlen lp_seltext_s lp_seltext_m lp_seltext_l lp_cfieldname lp_do_sum lp_key lp_no_zero. CLEAR: t_fieldcat. t_fieldcat-fieldname = lp_fieldname. t_fieldcat-outputlen = lp_outputlen. t_fieldcat-no_zero = lp_no_zero. t_fieldcat-seltext_s = lp_seltext_s. t_fieldcat-seltext_l = lp_seltext_l. IF lp_seltext_m IS INITIAL. t_fieldcat-seltext_m = t_fieldcat-seltext_s. ELSE. t_fieldcat-seltext_m = lp_seltext_m. ENDIF. IF t_fieldcat-seltext_l IS INITIAL. t_fieldcat-seltext_l = t_fieldcat-seltext_m. ELSE. t_fieldcat-seltext_l = lp_seltext_l. ENDIF. t_fieldcat-cfieldname = lp_cfieldname. t_fieldcat-do_sum = lp_do_sum. t_fieldcat-key = lp_key. APPEND t_fieldcat. ENDFORM. " FIELDCAT_ADD .