REPORT /z/ad_z1pd_p_01.

INCLUDE /z/ad_z1pd_p_i01.  " Data definition
INCLUDE /z/ad_z1pd_p_i02.  " Selection screen

START-OF-SELECTION.

* kontrola opravneni znovu
  AUTHORITY-CHECK OBJECT 'S_TCODE'
*      ID 'TCD' FIELD 'CO03'.
      ID 'TCD' FIELD '/z/AD_Z1PD_P'.
  IF NOT sy-subrc = 0.
    MESSAGE 'Nemte oprvnn pro tento report nebo transakci' TYPE 'E'.
  ENDIF.
p_path = p_path1.
  lo_if_preactor = NEW /z/ad_z1p_cl_p_dsv( p_path ).

  CASE abap_true.
    WHEN p_sel.               " Data selection
      PERFORM select_data.
    WHEN p_excp.              " Maintainance Table Exceptions
      CALL SCREEN 100.
    WHEN p_stt.               " Maintenance Table Statuses
      PERFORM call_stt.
*      TRY.
*          CALL TRANSACTION '/z/AD_Z1PD_31' WITH AUTHORITY-CHECK.
*        CATCH cx_sy_authorization_error INTO lx_auth_err.
**          DATA(lv_message) = lx_auth_err->get_text( ).
**          MESSAGE |Nemte oprvnn pro transakci | && lx_auth_err->transaction_name
**            TYPE 'S' DISPLAY LIKE 'E'.
*          MESSAGE lx_auth_err->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
*          RETURN.
*      ENDTRY.
    WHEN p_rest.              " Maintenance Table Resources
      PERFORM call_rest.
*      TRY.
*          CALL TRANSACTION '/z/AD_Z1PD_32' WITH AUTHORITY-CHECK.
*        CATCH cx_sy_authorization_error INTO lx_auth_err.
**          MESSAGE |Nemte oprvnn pro transakci | && lx_auth_err->transaction_name
**            TYPE 'S' DISPLAY LIKE 'E'.
*          MESSAGE lx_auth_err->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
*          RETURN.
*      ENDTRY.
WHEN p_oscp.              " Maintenance Table OperationsSecondaryConstraintsPVP
      PERFORM call_oscp.
  ENDCASE.

FORM call_stt.
  AUTHORITY-CHECK OBJECT 'S_TCODE'
      ID 'TCD' FIELD '/z/AD_Z1PD_31'.
  IF NOT sy-subrc = 0.
    MESSAGE 'Nemte oprvnn pro tento report nebo transakci' TYPE 'E'.
  ELSE.
    CALL TRANSACTION '/z/AD_Z1PD_31'.
  ENDIF.
ENDFORM.

FORM call_rest.
  AUTHORITY-CHECK OBJECT 'S_TCODE'
      ID 'TCD' FIELD '/z/AD_Z1PD_32'.
  IF NOT sy-subrc = 0.
    MESSAGE 'Nemte oprvnn pro tento report nebo transakci' TYPE 'E'.
  ELSE.
    CALL TRANSACTION '/z/AD_Z1PD_32'.
  ENDIF.
ENDFORM.

FORM call_oscp.
  AUTHORITY-CHECK OBJECT 'S_TCODE'
      ID 'TCD' FIELD '/z/AD_Z1PD_34'.
  IF NOT sy-subrc = 0.
    MESSAGE 'Nemte oprvnn pro tento report nebo transakci' TYPE 'E'.
  ELSE.
    CALL TRANSACTION '/z/AD_Z1PD_34'.
  ENDIF.
ENDFORM.

FORM select_data.
*-------------------------------------------------
* Productive and planned orders
*-------------------------------------------------
  IF p_orders = abap_true.
    lo_if_preactor->create_orders_files(
      EXPORTING
        iv_plord = p_plords    " Planned orders included
it_gstrp = s_gstrp[]    " Preactor Drasov - Table Basic Start Date Range
).
  ENDIF.

*-------------------------------------------------
* Stock
*-------------------------------------------------
  IF p_stock = abap_true.
    lo_if_preactor->create_stock_files( iv_ecken = p_ecken ).
  ENDIF.

*-------------------------------------------------
* Resources
*-------------------------------------------------
  IF p_resc = abap_true.
    lo_if_preactor->create_resources_files( ).
  ENDIF.

*-------------------------------------------------
* Transport Times
*-------------------------------------------------
  IF p_trtim = abap_true.
    lo_if_preactor->create_transport_times_files( ).
  ENDIF.

ENDFORM.
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'MAIN100'.
  SET TITLEBAR 'MAIN100'.

  IF go_custom_container IS INITIAL.
    IF go_custom_container IS BOUND.
      go_custom_container->free( ).
      FREE go_custom_container.
    ENDIF.

*  CREATE OBJECT go_custom_container
*    EXPORTING
*      container_name = gv_container.

    go_custom_container = NEW cl_gui_custom_container( gv_container ).
    IF lo_if_p IS INITIAL.
      lo_if_p = NEW /z/ad_z1p_cl_p_dsv( p_path ).
    ENDIF.
lo_if_p->maintain_table_exceptions( ir_container = go_custom_container ).
  ENDIF.
ENDMODULE.

*&---------------------------------------------------------------------*
*&      Module  LEAVE_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE leave_0100 INPUT.
  gv_save_ok = ok_code.
  CLEAR ok_code.
  CASE gv_save_ok.
    WHEN 'EXIT'.
      SET SCREEN 0. LEAVE SCREEN.
*      LEAVE TO SCREEN 0.
    WHEN OTHERS.
*     do nothing
  ENDCASE.

ENDMODULE.

*&---------------------------------------------------------------------*
*&  Include           /z/AD_Z1PD_P_I01
*&---------------------------------------------------------------------*

CONSTANTS:  gcv_path_prod     TYPE char128 VALUE '/home/RLP/RLPdata/shortterm/',

TABLES: caufvd, sscrfields.

DATA: lo_if_preactor TYPE REF TO /z/ad_z1p_if_preactor.
DATA: p_path TYPE string.

DATA: ok_code             LIKE sy-ucomm,
      gv_save_ok          LIKE sy-ucomm,
      gv_container        TYPE scrfname VALUE 'GRID_CONTAINER',
*      g_grid             TYPE REF TO cl_gui_alv_grid,
      go_custom_container TYPE REF TO cl_gui_custom_container.
*      gt_fieldcat        TYPE lvc_t_fcat,
*      gs_layout          TYPE lvc_s_layo,
*      g_max              TYPE i VALUE 100.

* Data for Date Range - Selection date
DATA: lt_filetable TYPE filetable,
      lv_rc        TYPE i,
      lv_end_date  TYPE syst_datum.
*  DATA lv_path TYPE string.

DATA lx_auth_err TYPE REF TO cx_sy_authorization_error.
DATA:path TYPE char128.


&---------------------------------------------------------------------*
*&  Include           /z/AD_Z1PD_PREACT_I02
*&---------------------------------------------------------------------*

PARAMETERS: p_sel TYPE c RADIOBUTTON GROUP g1.
SELECTION-SCREEN BEGIN OF BLOCK block01 WITH FRAME TITLE text-001.
PARAMETERS: p_short TYPE c RADIOBUTTON GROUP g2 USER-COMMAND term DEFAULT 'X'.
PARAMETERS: p_middle TYPE c RADIOBUTTON GROUP g2.

PARAMETERS: p_orders TYPE c AS CHECKBOX DEFAULT abap_true USER-COMMAND prorder. " MODIF ID a01.

SELECTION-SCREEN BEGIN OF BLOCK block02 WITH FRAME TITLE text-002.
SELECT-OPTIONS s_gstrp FOR caufvd-gstrp. "Mezn termn zahjen

SELECTION-SCREEN SKIP.
PARAMETERS: p_plords TYPE c AS CHECKBOX DEFAULT abap_true MODIF ID plo.
SELECTION-SCREEN END OF BLOCK block02.

SELECTION-SCREEN SKIP.
PARAMETERS: p_stock TYPE c AS CHECKBOX DEFAULT abap_true. " MODIF ID a01.
SELECTION-SCREEN BEGIN OF BLOCK block03 WITH FRAME TITLE text-003.
PARAMETERS: p_ecken TYPE ps_ecken.
*SELECTION-SCREEN SKIP.
SELECTION-SCREEN END OF BLOCK block03.

SELECTION-SCREEN SKIP.
SELECTION-SCREEN SKIP.
PARAMETERS: p_resc TYPE c AS CHECKBOX DEFAULT abap_true.

SELECTION-SCREEN SKIP.
PARAMETERS: p_trtim TYPE c AS CHECKBOX DEFAULT abap_true.

SELECTION-SCREEN SKIP.
PARAMETERS: p_stat TYPE c AS CHECKBOX DEFAULT abap_true.
PARAMETERS: p_res TYPE c AS CHECKBOX DEFAULT abap_true.
PARAMETERS: p_exc TYPE c AS CHECKBOX DEFAULT abap_true.
parameters: p_sexc type c as CHECKBOX DEFAULT abap_true.

SELECTION-SCREEN SKIP.
PARAMETERS: p_foscp TYPE c AS CHECKBOX DEFAULT abap_true.

SELECTION-SCREEN SKIP.
PARAMETERS: p_prt TYPE c AS CHECKBOX DEFAULT abap_false.

*SELECTION-SCREEN skip.
*PARAMETERS: P_param type c AS CHECKBOX DEFAULT abap_false.

SELECTION-SCREEN SKIP.
*IF sy-sysid EQ 'RLP' and p_short eq 'X'.
*  path = gcv_path_prod.
*      else.
*        path = gcv_path_mid_prod.
*endif.
*if   sy-sysid EQ 'D1D' and p_short eq 'X'.
*  path = gcv_path_qual.
*  else.
*    path = gcv_path_mid_qual.
*  ENDIF.
PARAMETERS: p_path1 TYPE text256 OBLIGATORY DEFAULT gcv_path_dev.

*PARAMETERS: p_path TYPE string OBLIGATORY DEFAULT 'K:\Functions\Pt\CSV'.
*PARAMETERS: p_path TYPE string OBLIGATORY DEFAULT 'C:\Temp'.

SELECTION-SCREEN END OF BLOCK block01.

PARAMETERS: p_excp TYPE c RADIOBUTTON GROUP g1.

PARAMETERS: p_stt TYPE c RADIOBUTTON GROUP g1.

PARAMETERS: p_rest TYPE c RADIOBUTTON GROUP g1.

PARAMETERS: p_oscp TYPE c RADIOBUTTON GROUP g1.

* ----------------
* INITIALIZATION
* ----------------
INITIALIZATION.
* kontrola opravneni
  CASE sy-sysid.
    WHEN  'RLP'.
      p_path = gcv_path_prod.
    WHEN 'D1Q'.
      p_path = gcv_path_qual.
    WHEN 'D1D'.
      p_path = gcv_path_dev.
  ENDCASE.
  AUTHORITY-CHECK OBJECT 'S_TCODE'
*      ID 'TCD' FIELD 'CO03'.
      ID 'TCD' FIELD '/z/AD_Z1PD_P'.
  IF NOT sy-subrc = 0.
    MESSAGE 'Nemte oprvnn pro tento report nebo transakci' TYPE 'E'.
  ENDIF.

  IF sy-sysid <> 'RLP'.
*    p_path = 'c:\Temp\P'.
    p_path = gcv_path_prod.
*    PARAMETERS: p_path1 type text256 OBLIGATORY DEFAULT p_path.
  ENDIF.

  CASE abap_true.
    WHEN p_short.
      PERFORM set_sel_date_short.
      IF sy-sysid <> 'RLP'.
        p_path = gcv_path_qual.
      ELSE.
        p_path = gcv_path_prod.
      ENDIF.
    WHEN p_middle.
      PERFORM set_sel_date_middle.
      IF sy-sysid <> 'RLP'.
        p_path = gcv_path_mid_qual.
      ELSE.
        p_path = gcv_path_mid_prod.
      ENDIF.
  ENDCASE.

* --------------------
* AT SELECTION-SCREEN
* --------------------
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path1.
  p_path = p_path1.
  CALL METHOD cl_gui_frontend_services=>directory_browse
    EXPORTING
*     window_title         = 'TEST PH'   " Title of Browsing Window
      initial_folder       = p_path    " Start Browsing Here
    CHANGING
      selected_folder      = p_path    " Folder Selected By User
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
  p_path1 = p_path.

*  CALL METHOD cl_gui_cfw=>flush.
*  CONCATENATE lv_path '' INTO p_path.


*  CALL METHOD cl_gui_frontend_services=>file_open_dialog
*    EXPORTING
**     window_title            =     " Title Of File Open Dialog
**     default_extension       =     " Default Extension
**     default_filename        =     " Default File Name
**     file_filter             =     " File Extension Filter String
**     with_encoding           =     " File Encoding
*      initial_directory       = 'c:\Temp\preactor'  " Initial Directory
**     multiselection          =     " Multiple selections poss.
*    CHANGING
*      file_table              = lt_filetable    " Table Holding Selected Files
*      rc                      = lv_rc    " Return Code, Number of Files or -1 If Error Occurred
**     user_action             =     " User Action (See Class Constants ACTION_OK, ACTION_CANCEL)
**     file_encoding           =
*    EXCEPTIONS
*      file_open_dialog_failed = 1
*      cntl_error              = 2
*      error_no_gui            = 3
*      not_supported_by_gui    = 4
*      OTHERS                  = 5.
*  IF sy-subrc <> 0.
*    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
*               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
*  ELSE.
*    READ TABLE lt_filetable INTO p_path INDEX 1.
*  ENDIF.

AT SELECTION-SCREEN.
  CASE sscrfields-ucomm.
    WHEN 'TERM'.
      PERFORM ucomm_term.
    WHEN 'PRORDER'.
      PERFORM ucomm_prorder.
    WHEN OTHERS.
  ENDCASE.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    CASE screen-group1.
      WHEN 'PLO'.
        IF p_orders = abap_false.
          screen-input = 0.
        ELSE.
          screen-input = 1.
        ENDIF.
        MODIFY SCREEN.
    ENDCASE.
  ENDLOOP.

* -------------------------------
*   FORMs
* -------------------------------
FORM set_sel_date_short.
  REFRESH s_gstrp.
  CLEAR p_ecken.

* ----------
  lv_end_date = sy-datum.
  lv_end_date = lv_end_date + 14.   " current date + 14 days

  s_gstrp-sign = 'I'.
  s_gstrp-option = 'BT'.
  s_gstrp-high = lv_end_date.
  APPEND s_gstrp.
* ---------


* ---------
  lv_end_date = sy-datum.
lv_end_date = lv_end_date + 360.   " current date + 90 days, newly 360 days

  p_ecken = lv_end_date.
* ---------

ENDFORM.

FORM set_sel_date_middle.
  REFRESH s_gstrp.
*  CLEAR p_ecken.
  p_ecken = '29991231'.


** ----------
*  lv_end_date = sy-datum.
*  lv_end_date = lv_end_date + 14.   " current date + 14 days
*
*  s_gstrp-sign = 'I'.
*  s_gstrp-option = 'BT'.
*  s_gstrp-high = lv_end_date.
*  APPEND s_gstrp.
** ---------


** ---------
*  lv_end_date = sy-datum.
*  lv_end_date = lv_end_date + 90.   " current date + 90 days
*
*  p_ecken = lv_end_date.
** ---------

ENDFORM.

FORM ucomm_term.
  CASE abap_true.
    WHEN p_short.
      PERFORM set_sel_date_short.
      IF sy-sysid <> 'RLP'.
        p_path = gcv_path_qual.
      ELSE.
        p_path = gcv_path_prod.
      ENDIF.
    WHEN p_middle.
      PERFORM set_sel_date_middle.
      IF sy-sysid <> 'RLP'.
        p_path = gcv_path_mid_qual.
      ELSE.
        p_path = gcv_path_mid_prod.
      ENDIF.
  ENDCASE.
ENDFORM.

FORM ucomm_prorder.
  IF p_orders = abap_false.
    p_plords = abap_false.
  ENDIF.
ENDFORM.




  METHOD /z/ad_z1p_if_p~create_orders_files.
    gv_plord = iv_plord.
    gt_gstrp = it_gstrp.

    me->read_prorders( ).         " Production orders
    me->read_prorders_details( ).    " Read components, operations for production orders

    IF iv_plord = abap_true.
      me->read_plorders( ).       " Planned orders
      me->read_plorders_details( ).    " Read components, operations for planned orders
    ENDIF.

    me->read_oper_prt( ).         " Product resource tools assigned to operation

    me->read_top_material( ).     "  Read materials on the top level
    me->read_ind_req( ).          "  Read independent requirements


    me->prepare_orders_data( ).         " Prepare order's data

    me->create_file( 1 ).   " 1 - Headers.csv
    me->create_file( 2 ).   " 2 - Operations.csv
    me->create_file( 3 ).   " 3 - BOMs.csv
    me->create_file( 11 ).   " 11 - OperationsSecondaryConstraints.csv
    me->create_file( 12 ).   " 12 - Demand.csv
    me->create_file( 14 ).   " 14 - Cooproducts.csv
    me->create_file( 15 ).   " 15 - parameters.cs


  ENDMETHOD.
 METHOD read_prorders.

    DATA lt_prorders_temp TYPE /z/ad_z1pd_preact_t01.

SELECT  a~aufnr, c~auart, a~gamng, a~gmein, a~gstrp, a~gltrp, a~aufpl, a~fevor, a~dispo, a~aprio,
b~matnr, b~kdauf, b~kdpos, b~wemng AS gwemg, c~ktext, c~objnr, b~projn
*      INTO CORRESPONDING FIELDS OF TABLE @gt_prorders
INTO CORRESPONDING FIELDS OF TABLE @lt_prorders_temp
FROM afko AS a
INNER JOIN afpo AS b ON a~aufnr = b~aufnr
INNER JOIN aufk AS c ON a~aufnr = c~aufnr
LEFT outer JOIN mara AS d ON b~matnr = d~matnr
*      WHERE a~gltrp IN @gt_gstrp AND            " Basic start date
WHERE a~gstrp IN @gt_gstrp AND            " Basic start date
c~werks = @gcv_werk_dsv AND         " Werks Drasov
c~loekz = @space AND                " OZKV, ZVZM
c~idat2 = '00000000' AND            " TEUZ
*            b~elikz = @space AND                " DODA
c~autyp = '10'                      " PP Production Order
.

    LOOP AT lt_prorders_temp REFERENCE INTO DATA(lr_prorders_temp).

      CALL FUNCTION 'STATUS_TEXT_EDIT'
        EXPORTING
*         CLIENT                  = SY-MANDT
*         FLG_USER_STAT           = ' '
          objnr = lr_prorders_temp->objnr
*         ONLY_ACTIVE             = 'X'
          spras = 'C'
*         BYPASS_BUFFER           = ' '
        IMPORTING
*         ANW_STAT_EXISTING       =
*         E_STSMA                 =
          line  = lr_prorders_temp->sttxt
*         USER_LINE               =
*         STONR =
*     EXCEPTIONS
*         OBJECT_NOT_FOUND        = 1
*         OTHERS                  = 2
        .
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.
*povolen ZABL VZ krom vjimek ne
IF ( lr_prorders_temp->sttxt CS 'ZABL' and lr_prorders_temp->sttxt CS 'DODA' ) or
  ( lr_prorders_temp->sttxt CS 'ZABL' and lr_prorders_temp->sttxt CS 'TEUZ' ) or
  ( lr_prorders_temp->sttxt CS 'ZABL' and lr_prorders_temp->sttxt CS 'OZKV' ) or
  ( lr_prorders_temp->sttxt CS 'ZABL' and lr_prorders_temp->sttxt CS 'UZAV' ) or
  ( lr_prorders_temp->sttxt CS 'ZABL' and lr_prorders_temp->sttxt CS 'ZPT' ) OR
   lr_prorders_temp->sttxt CS 'ZPT'.
        DELETE lt_prorders_temp.
      ENDIF.

    ENDLOOP.

    APPEND LINES OF lt_prorders_temp TO gt_prorders.

  ENDMETHOD.
  METHOD read_prorders_details.

*    DATA: ls_order_objects TYPE bapi_pp_order_objects,
*          lt_operation     TYPE TABLE OF bapi_order_operation1.
*          lt_component     TYPE TABLE OF bapi_order_component.
    DATA: ls_prorders_oper_temp TYPE /z/ad_z1pd_preact_s05,
          lt_prorders_oper_temp TYPE  /z/ad_z1pd_preact_t05.
*    DATA: lv_stsma TYPE j_stsma.

    DATA: lv_arbpl_old TYPE arbpl,
          lv_vornr_old TYPE vornr.


*    ls_order_objects-components = abap_true.
*    ls_order_objects-operations = abap_true.

    LOOP AT gt_prorders REFERENCE INTO DATA(lr_prorder).

*      CALL FUNCTION 'BAPI_PRODORD_GET_DETAIL'
*        EXPORTING
*          number        = lr_prorder->aufnr
**         COLLECTIVE_ORDER       =
*          order_objects = ls_order_objects
**       IMPORTING
**         RETURN        =
*        TABLES
**         HEADER        =
**         POSITION      =
**         SEQUENCE      =
*          operation     = lt_operation
**         TRIGGER_POINT =
**         component     = lt_component
**         PROD_REL_TOOL =
*        .

*      LOOP AT lt_operation REFERENCE INTO DATA(lr_oper).
*
*        ls_prodord_oper-aufnr = lr_prorder->aufnr.
*        ls_prodord_oper-vornr = lr_oper->operation_number.
*        ls_prodord_oper-ltxa1 = lr_oper->description.
*        ls_prodord_oper-arbpl = lr_oper->work_center.
*        ls_prodord_oper-ssavd = lr_oper->late_sched_start_date_exec.
*        ls_prodord_oper-ssevd = lr_oper->late_sched_fin_date_exec.
*        ls_prodord_oper-DARUE = lr_oper->.
*        ls_prodord_oper-RSTZE = lr_oper->.
*        ls_prodord_oper-DABEA = lr_oper->.
*        ls_prodord_oper-BEAZE = lr_oper->.
*
*      ENDLOOP.

*---------------------------------------------
* Production order operation's data
*---------------------------------------------

      REFRESH lt_prorders_oper_temp.
      TRY .

          SELECT  @lr_prorder->aufnr AS aufnr, a~vornr, a~ltxa1, c~arbpl, a~steus, a~uemus, a~objnr,
                  a~aufpl, a~aplzl, b~ssavd, b~ssedd AS ssevd, a~spmus,
                  a~splim, a~spanz,
                  a~banfn, a~bnfpo,
*              b~vgw01 AS darue, b~vge01 AS rstze,
                  b~vgw01, b~vge01,
*              ( @lr_prorder->gamng * b~vgw03 ) AS dabea, b~vge03 AS beaze,  " as krt poet kus
*                  b~vgw03, b~vge03,           " jen as
              ( @lr_prorder->gamng * b~vgw03 ) AS vgw03, b~vge03,           " as krt poet kus

                  b~zminu, b~zeimu, b~minwe, b~meinh, b~zlpro, b~zeilp, b~lmnga, b~plifz,

                  CASE b~zwnor
                    WHEN 0 THEN c~zwnor
                    ELSE  b~zwnor
                  END AS zwnor,

                  CASE b~zeiwn
                    WHEN @abap_false THEN c~zeiwn
                   ELSE b~zeiwn
                  END AS zeiwn,

* Pokud nen povinn rozd. zakliknuto beru hodnotu 1,
* jinak beru skuten poet rozdlen - SPANZ
*              CASE a~spmus
**                WHEN @abap_true THEN a~splim
*                WHEN @abap_true THEN a~spanz
*                ELSE 1  "a~spanz
*              END AS splim,

*              COALESCE( b~zwnor, c~zwnor ) , COALESCE( b~zeiwn, c~zeiwn ) AS zeiwn

          d~lief    " Extern pozen

          FROM afvc AS a
          INNER JOIN afvv AS b ON a~aufpl = b~aufpl AND
                                  a~aplzl = b~aplzl
          INNER JOIN crhd AS c ON a~arbid = c~objid
          INNER JOIN t430 AS d ON a~steus = d~steus
*              APPENDING CORRESPONDING FIELDS OF TABLE @gt_prorders_oper
          INTO CORRESPONDING FIELDS OF TABLE @lt_prorders_oper_temp
          WHERE   a~aufpl = @lr_prorder->aufpl
            AND   c~objty = 'A'    "work center
            .

        CATCH cx_sy_open_sql_db INTO DATA(lo_cx_existing).
*          WRITE: / lo_cx_existing->get_text( ).

      ENDTRY.

* Pedchoz operace
      CLEAR: lv_arbpl_old, lv_vornr_old.
      SORT lt_prorders_oper_temp BY vornr.
      LOOP AT lt_prorders_oper_temp REFERENCE INTO DATA(lr_op).
        lr_op->arbpl_prev = lv_arbpl_old.
        lr_op->vornr_prev = lv_vornr_old.
        lv_arbpl_old = lr_op->arbpl.
        lv_vornr_old = lr_op->vornr.
      ENDLOOP.
* Nsledujc operace
      CLEAR: lv_arbpl_old, lv_vornr_old.
      SORT lt_prorders_oper_temp BY vornr DESCENDING.
      LOOP AT lt_prorders_oper_temp REFERENCE INTO lr_op.
        lr_op->arbpl_next = lv_arbpl_old.
        lr_op->vornr_next = lv_vornr_old.
        lv_arbpl_old = lr_op->arbpl.
        lv_vornr_old = lr_op->vornr.
      ENDLOOP.

      LOOP AT lt_prorders_oper_temp REFERENCE INTO DATA(lr_oper_temp).
        CALL FUNCTION 'STATUS_TEXT_EDIT'
          EXPORTING
*           CLIENT           = SY-MANDT
            flg_user_stat    = abap_true
            objnr            = lr_oper_temp->objnr
*           ONLY_ACTIVE      = 'X'
            spras            = 'C'    " CZECH LANGUAGE !!!
*           BYPASS_BUFFER    = ' '
          IMPORTING
*           ANW_STAT_EXISTING       =
*           e_stsma          =
            line             = lr_oper_temp->sttxt
            user_line        = lr_oper_temp->u_sttxt
*           STONR            =
          EXCEPTIONS
            object_not_found = 1
            OTHERS           = 2.
        IF sy-subrc <> 0.
* Implement suitable error handling here
        ENDIF.

        IF lr_oper_temp->sttxt CS 'ZVM' OR lr_oper_temp->sttxt CS 'ZPT'.
          DELETE lt_prorders_oper_temp.
        ENDIF.

      ENDLOOP.

      APPEND LINES OF lt_prorders_oper_temp TO gt_prorders_oper.

*---------------------------------------------
* Production order component's data
*---------------------------------------------

      SELECT aufnr, vornr, matnr, posnr, schgt, bdmng, enmng, meins, sobkz,
             shkzg, dumps
        FROM resb
        APPENDING CORRESPONDING FIELDS OF TABLE @gt_prorders_comp
        WHERE aufpl = @lr_prorder->aufpl AND
              kzear = @abap_false AND
              xloek = @abap_false AND
              postp <> 'D' AND    " Document
              postp <> 'T'       " Text
        ##NULL_VALUES_OK.

    ENDLOOP.

  ENDMETHOD.
  METHOD read_plorders.

    SELECT plnum, matnr, gsmng, meins, kdauf, kdpos, psttr, pedtr,
            ststa, bedid, plgrp AS fevor, dispo, pspel as projn,
            cuobj
      INTO CORRESPONDING FIELDS OF TABLE @gt_plorders
      FROM plaf
      WHERE plwrk = @gcv_werk_dsv AND
            psttr IN @gt_gstrp AND
            ( paart = 'LA' OR paart = 'KD' ) AND
            beskz = 'E' AND
            obart = '1'
    .

  ENDMETHOD.
  METHOD read_plorders_details.

    TYPES: BEGIN OF lty_routing,
             plnnr TYPE plnnr,
             plnal TYPE plnal,
           END OF lty_routing.
    TYPES: BEGIN OF lty_bom,
             stlnr TYPE stnum,
             stlal TYPE stalt,
           END OF lty_bom.

    DATA: lt_comp TYPE TABLE OF bapi_pldordcomp_e1,
          lt_oper TYPE TABLE OF bapi_pldordcapa_e1.
*          lt_header TYPE TABLE OF bapiplaf_e1.

    DATA: ls_plorders_comp      TYPE /z/ad_z1pd_preact_s07,
          ls_plorderc_oper      TYPE /z/ad_z1pd_preact_s08,
          lt_plorderc_oper_temp TYPE /z/ad_z1pd_preact_t08,
          lv_arbpl_old          TYPE arbpl,
          lv_vornr_old          TYPE vornr.

    DATA: ls_routing TYPE lty_routing,
          lt_opr     TYPE TABLE OF capp_opr.

    DATA: ls_bom TYPE lty_bom.

    DATA: lv_zwnor TYPE dzwnor,
          lv_zeiwn TYPE dzeiwn.

    DATA: lt_plpo_exp TYPE TABLE OF coplpo, " NEW
          lt_plko_exp TYPE TABLE OF plko.

    DATA: lt_stb    TYPE TABLE OF stpox,
          ls_cstmat TYPE cstmat.


    LOOP AT gt_plorders REFERENCE INTO DATA(lr_plorder).

      CLEAR: ls_routing, ls_bom, ls_plorderc_oper.

**----------------------------------------------------
** Planned order operation's data
**----------------------------------------------------

      " Existuje zznam v KBKO ?
      SELECT SINGLE plnnr, plnal INTO @ls_routing
        FROM kbko
        WHERE bedid = @lr_plorder->bedid AND typkz = '2'.

      IF ls_routing IS INITIAL.
*        " Postup nenalezen, vloen fiktivn operace
*        ls_plorderc_oper-plnum = lr_plorder->plnum.
*        ls_plorderc_oper-vornr = 'FIKT'.
*        APPEND ls_plorderc_oper TO gt_plorders_oper.
      ELSE.

        REFRESH: lt_plko_exp, lt_plpo_exp, lt_plorderc_oper_temp.

        " ten postupu
        CALL FUNCTION 'CP_EX_PLAN_READ'
          EXPORTING
*           CMODE_IMP     = 'R'
*           PLNTY_IMP     = 'N'
            plnnr_imp     = ls_routing-plnnr
            plnal_imp     = ls_routing-plnal
            sttag_imp     = sy-datum " nutno jet doladit, dt sprvn datum
*           CHECK_IMP     = 'X'
            cuobj_imp     = lr_plorder->cuobj
*           PARNT_IMP     = ' '
*           FCAPO_IMP     = ' '
*           TCA11_IMP     = ' '
*           FLG_VAL_REC_IMP                      = ' '
*           STLNR_IMP     =
*           I_PLAS_KEY_TAB                       =
*           PRODCOST      = ' '
*           I_BUSINESS_OBJECT                    =
*           I_FLG_CHARACTERISTICS_PLANNING       = ' '
*           I_EDGNO       =
            vbeln_imp     = lr_plorder->kdauf
            posnr_imp     = lr_plorder->kdpos
*           LOSGR_IMP     = 1
*           I_PLANT       =
*           I_FLG_CALLED_F_MRP                   = ' '
*         IMPORTING
*           RES_APPR_CHK_EXP                     =
*           ERROR_EXP     =
*           E_MAPL        =
*           PI_SET_USED   =
          TABLES
*           MLST_EXP      =
*           PLAB_EXP      =
*           PLAS_EXP      =
*           PLFH_EXP      =
*           PLFL_EXP      =
*           PLFT_EXP      =
*           PLFV_EXP      =
            plko_exp      = lt_plko_exp
*           PLMZ_EXP      =
            plpo_exp      = lt_plpo_exp
*           PLTX_EXP      =
*           AENNR_EXP     =
*           PLMK_EXP      =
*           PLMW_EXP      =
          EXCEPTIONS
            not_found     = 1
            plnal_initial = 2
            OTHERS        = 3.
        IF sy-subrc <> 0.
* Implement suitable error handling here
        ENDIF.

        IF lt_plpo_exp IS INITIAL.
*          " Postup nenalezen, vloen fiktivn operace
*          ls_plorderc_oper-plnum = lr_plorder->plnum.
*          ls_plorderc_oper-vornr = 'FIKT'.
*          APPEND ls_plorderc_oper TO gt_plorders_oper.
        ELSE.
          " Zapisu status postupu do gt_plorders
          READ TABLE lt_plko_exp INTO DATA(ls_plko) INDEX 1.
          lr_plorder->statu = ls_plko-statu.
          lr_plorder->plnal = ls_plko-plnal.
          IF lr_plorder->statu = 4.
            " Pokud je status = 4, tak pidm zznamy do tabulky operac

            LOOP AT lt_plpo_exp REFERENCE INTO DATA(lr_plpo).

              MOVE-CORRESPONDING lr_plpo->* TO ls_plorderc_oper.

              ls_plorderc_oper-plnum = lr_plorder->plnum.
              ls_plorderc_oper-plnal = lr_plorder->plnal.
              " pracovn as krt poet kus
              ls_plorderc_oper-vgw03 = lr_plpo->vgw03 * lr_plorder->gsmng.

              IF ls_plorderc_oper-ssavd IS  INITIAL.
                ls_plorderc_oper-ssavd = ''.          " Jen pro testy
              ENDIF.
              IF ls_plorderc_oper-ssevd IS INITIAL.
                ls_plorderc_oper-ssevd = ''.          " Jen pro testy
              ENDIF.

              CLEAR: lv_zwnor, lv_zeiwn.
              SELECT SINGLE arbpl, zwnor, zeiwn
                INTO (@ls_plorderc_oper-arbpl, @lv_zwnor, @lv_zeiwn)
                FROM crhd
                WHERE objid = @lr_plpo->arbid AND
                      objty = 'A'.

              SELECT SINGLE lief
                INTO @ls_plorderc_oper-lief
                FROM t430
                WHERE steus = @lr_plpo->steus.

              IF ls_plorderc_oper-zwnor = 0.
                ls_plorderc_oper-zwnor = lv_zwnor.
              ENDIF.
              IF ls_plorderc_oper-zeiwn = abap_false.
                ls_plorderc_oper-zeiwn = lv_zeiwn.
              ENDIF.

*            APPEND ls_plorderc_oper TO gt_plorders_oper.
              APPEND ls_plorderc_oper TO lt_plorderc_oper_temp. " Zatm jen ulom do temp.tabulky, pidm pozdji

            ENDLOOP.

            " pedchoz operace
            CLEAR: lv_arbpl_old, lv_vornr_old.
            SORT lt_plorderc_oper_temp BY vornr.
            LOOP AT lt_plorderc_oper_temp REFERENCE INTO DATA(lr_op).
              lr_op->arbpl_prev = lv_arbpl_old.
              lr_op->vornr_prev = lv_vornr_old.
              lv_arbpl_old = lr_op->arbpl.
              lv_vornr_old = lr_op->vornr.
            ENDLOOP.

            " nsledujc operace
            CLEAR: lv_arbpl_old, lv_vornr_old.
            SORT lt_plorderc_oper_temp BY vornr DESCENDING.
            LOOP AT lt_plorderc_oper_temp REFERENCE INTO lr_op.
              lr_op->arbpl_next = lv_arbpl_old.
              lr_op->vornr_next = lv_vornr_old.
              lv_arbpl_old = lr_op->arbpl.
              lv_vornr_old = lr_op->vornr.
            ENDLOOP.

            MOVE-CORRESPONDING lt_plorderc_oper_temp TO gt_plorders_oper KEEPING TARGET LINES.
            " pidn operac do globln tabulky

          ENDIF.  " Status postupu 4
        ENDIF.  " Postup nalezen
      ENDIF.  " Existuje zznam v KBKO

*----------------------------------------------------
* Planned order component's data
*----------------------------------------------------
      " M kusovnk status 04
      IF lr_plorder->ststa = '04'.

        " ten komponent pro plnovanou zakzku
        SELECT plnum, matnr, posnr, schgt, bdmng, enmng, meins, sobkz,
               @lr_plorder->matnr AS baugr, stlnr, stlkn, dumps, aufst,
               aufwg, baust, bauwg, shkzg, kdauf, kdpos
          FROM resb
          APPENDING CORRESPONDING FIELDS OF TABLE @gt_plorders_comp
          WHERE plnum = @lr_plorder->plnum AND
                kzear = @abap_false AND
                xloek = @abap_false AND
                postp <> 'D' AND    " Document
                postp <> 'T'.       " Text.

      ELSE.
        " pokus o naten statusu kusovnku
        CLEAR: ls_cstmat.
        REFRESH: lt_stb.

* -------------------------------
* ten zakzkovho kusovnku
* -------------------------------
        " kontrola, zda existuje zakzkov kusovnk
        SELECT stlnr FROM kdst INTO @DATA(istlnr) UP TO 1 ROWS
          WHERE vbeln = @lr_plorder->kdauf AND vbpos = @lr_plorder->kdpos
            AND matnr = @lr_plorder->matnr AND werks  = @gcv_werk_dsv.
        ENDSELECT.

        IF sy-subrc = 0.  " Zkazkov kusovnk existuje
          CALL FUNCTION 'CS_BOM_EXPL_KND_V1'
            EXPORTING
*             FTREL                 = ' '
*             ALEKZ                 = ' '
*             ALTVO                 = ' '
*             AUFSW                 = ' '
*             AUMGB                 = ' '
*             AUMNG                 =
*             AUSKZ                 = ' '
*             AMIND                 = ' '
*             BAGRP                 = ' '
*             BEIKZ                 = ' '
*             BESSL                 = ' '
*             BGIXO                 = ' '
*             BREMS                 = ' '
              capid                 = 'AUS1'
*             CHLST                 = ' '
*             COSPR                 = ' '
*             CUOBJ                 = 000000000000000
*             CUOVS                 = 0
*             CUOLS                 = ' '
              datuv                 = sy-datum " nutno jeste doladit
*             DELNL                 = ' '
*             DRLDT                 = ' '
*             EHNDL                 = ' '
*             EMENG                 = 0
*             ERSKZ                 = ' '
*             ERSSL                 = ' '
*             FBSTP                 = ' '
*             KNFBA                 = ' '
*             KSBVO                 = ' '
*             MBWLS                 = ' '
*             MKTLS                 = 'X'
*             MDMPS                 = ' '
*             MEHRS                 = ' '
*             MKMAT                 = ' '
*             MMAPS                 = ' '
*             SALWW                 = ' '
*             SPLWW                 = ' '
*             MMORY                 = ' '
              mtnrv                 = lr_plorder->matnr
*             NLINK                 = ' '
*             POSTP                 = ' '
*             RNDKZ                 = ' '
*             RVREL                 = ' '
*             SANFR                 = ' '
*             SANIN                 = ' '
*             SANKA                 = ' '
*             SANKO                 = ' '
*             SANVS                 = ' '
*             SCHGT                 = ' '
*             STKKZ                 = ' '
              stlal                 = '01'  "Beru vdy alternativu 1
*             STLAN                 = ' '
*             STPST                 = 0
*             SVWVO                 = 'X'
              werks                 = gcv_werk_dsv
*             NORVL                 = ' '
*             MDNOT                 = ' '
*             PANOT                 = ' '
*             QVERW                 = ' '
              vbeln                 = lr_plorder->kdauf
              vbpos                 = lr_plorder->kdpos
*             VERID                 = ' '
*             VRSVO                 = 'X'
*             SGT_SCAT              =
*             SGT_REL               =
            IMPORTING
              topmat                = ls_cstmat
*             DSTST                 =
            TABLES
              stb                   = lt_stb
*             MATCAT                =
            EXCEPTIONS
              alt_not_found         = 1
              call_invalid          = 2
              material_not_found    = 3
              missing_authorization = 4
              no_bom_found          = 5
              no_plant_data         = 6
              no_suitable_bom_found = 7
              conversion_error      = 8
              OTHERS                = 9.
          IF sy-subrc <> 0.
* Implement suitable error handling here
          ENDIF.

        ELSE.   " Zakzkov kusovnk neexistuje
* --------------------------------------------
* ten K-Matovho kusovnk, ppadn pevnho
* --------------------------------------------
          CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
            EXPORTING
*             FTREL                 = ' '
*             ALEKZ                 = ' '
*             ALTVO                 = ' '
*             AUFSW                 = ' '
*             AUMGB                 = ' '
*             AUMNG                 = 0
*             AUSKZ                 = ' '
*             AMIND                 = ' '
*             BAGRP                 = ' '
*             BEIKZ                 = ' '
*             BESSL                 = ' '
*             BGIXO                 = ' '
*             BREMS                 = ' '
              capid                 = 'AUS1'
*             CHLST                 = ' '
*             COSPR                 = ' '
              cuobj                 = lr_plorder->cuobj
*             CUOVS                 = 0
*             CUOLS                 = ' '
              datuv                 = sy-datum   "nutno jeste doladit
*             DELNL                 = ' '
*             DRLDT                 = ' '
*             EHNDL                 = ' '
*             EMENG                 = 0
*             ERSKZ                 = ' '
*             ERSSL                 = ' '
*             FBSTP                 = ' '
*             KNFBA                 = ' '
*             KSBVO                 = ' '
*             MBWLS                 = ' '
*             MKTLS                 = 'X'
*             MDMPS                 = ' '
*             MEHRS                 = ' '
*             MKMAT                 = ' '
*             MMAPS                 = ' '
*             SALWW                 = ' '
*             SPLWW                 = ' '
*             MMORY                 = ' '
              mtnrv                 = lr_plorder->matnr
*             NLINK                 = ' '
*             POSTP                 = ' '
*             RNDKZ                 = ' '
*             RVREL                 = ' '
*             SANFR                 = ' '
*             SANIN                 = ' '
*             SANKA                 = ' '
*             SANKO                 = ' '
*             SANVS                 = ' '
*             SCHGT                 = ' '
*             STKKZ                 = ' '
*             STLAL                 = ' '
*             STLAN                 = ' '
*             STPST                 = 0
*             SVWVO                 = 'X'
              werks                 = gcv_werk_dsv
*             NORVL                 = ' '
*             MDNOT                 = ' '
*             PANOT                 = ' '
*             QVERW                 = ' '
*             VERID                 = ' '
*             VRSVO                 = 'X'
*             SGT_SCAT              =
*             SGT_REL               =
*             CALLER_APP            =
            IMPORTING
              topmat                = ls_cstmat
*             DSTST                 =
            TABLES
              stb                   = lt_stb
*             MATCAT                =
            EXCEPTIONS
              alt_not_found         = 1
              call_invalid          = 2
              material_not_found    = 3
              missing_authorization = 4
              no_bom_found          = 5
              no_plant_data         = 6
              no_suitable_bom_found = 7
              conversion_error      = 8
              OTHERS                = 9.
          IF sy-subrc <> 0.
* Implement suitable error handling here
          ENDIF.

        ENDIF.

* ----------------------------------------------------------------------------------
* Zpis statusu kusovnku (pro ppad, e nen na 4) a ppad, e kusovnk existuje
* ----------------------------------------------------------------------------------
        IF ls_cstmat IS NOT INITIAL.
          lr_plorder->ststa = ls_cstmat-stlst.
        ENDIF.

      ENDIF.       " status 04
    ENDLOOP.

  ENDMETHOD.

  METHOD read_oper_prt.

    DATA: lt_affh  TYPE TABLE OF affh,
          ls_crfhd TYPE crfhd.

    DATA: ls_oper_prt TYPE /z/ad_z1pd_preact_opprtools.

    DATA: lt_plfh TYPE TABLE OF plfh.

* -----------------------------------------------------
* Piazen ppravky k operacm VZ - ten pmo z VZ
* -----------------------------------------------------
    LOOP AT gt_prorders_oper REFERENCE INTO DATA(lr_prod_oper).

      REFRESH lt_affh.

      SELECT objty, objid, psnfh,  mgsol, mgeinh
        INTO CORRESPONDING FIELDS OF TABLE @lt_affh
        FROM affh
        WHERE aufpl = @lr_prod_oper->aufpl
          AND aplzl = @lr_prod_oper->aplzl
          AND loekz = @abap_false.

      IF lt_affh IS NOT INITIAL.

        LOOP AT lt_affh REFERENCE INTO DATA(lr_affh).

          CLEAR ls_crfhd.

          CALL FUNCTION 'CF_RF_ROUT_FHM_MASTER_READ'
            EXPORTING
              objid_imp     = lr_affh->objid
              objty_imp     = lr_affh->objty
            IMPORTING
              crfhd_exp     = ls_crfhd
            EXCEPTIONS
              not_found_fhm = 1
              OTHERS        = 2.
          IF sy-subrc <> 0.
* Implement suitable error handling here
          ELSE.
            IF ls_crfhd-fhmar = 'M'.    " Beru pouze M-kov
              ls_oper_prt-aufnr = lr_prod_oper->aufnr.
              ls_oper_prt-vornr = lr_prod_oper->vornr.
              ls_oper_prt-psnfh = lr_affh->psnfh.
              ls_oper_prt-mgsol = lr_affh->mgsol.
              ls_oper_prt-mgeinh = lr_affh->mgeinh.
              ls_oper_prt-matnr = ls_crfhd-matnr.
              ls_oper_prt-maktx = ls_crfhd-fhktx.
              ls_oper_prt-fhmar = ls_crfhd-fhmar.

              APPEND ls_oper_prt TO gt_file_operprodtools.
            ENDIF.
          ENDIF.

        ENDLOOP.

      ENDIF.

    ENDLOOP.


* -------------------------------------------------------
* Piazen ppravky k operacm PlZak - ten z postupu
* -------------------------------------------------------
    LOOP AT gt_plorders_oper REFERENCE INTO DATA(lr_plod_oper).

      REFRESH lt_plfh.

      SELECT objty, objid, psnfh,  mgvgw, mgeinh
        INTO CORRESPONDING FIELDS OF TABLE @lt_plfh
        FROM plfh
        WHERE plnnr = @lr_plod_oper->plnnr
          AND plnal = @lr_plod_oper->plnal
          AND plnty = @lr_plod_oper->plnty
          AND plnkn = @lr_plod_oper->plnkn
          AND datuv <= @sy-datum
          AND loekz = @abap_false.

      IF lt_plfh IS NOT INITIAL.
        LOOP AT lt_plfh REFERENCE INTO DATA(lr_plfh).

          CLEAR ls_crfhd.

          CALL FUNCTION 'CF_RF_ROUT_FHM_MASTER_READ'
            EXPORTING
              objid_imp     = lr_plfh->objid
              objty_imp     = lr_plfh->objty
            IMPORTING
              crfhd_exp     = ls_crfhd
            EXCEPTIONS
              not_found_fhm = 1
              OTHERS        = 2.
          IF sy-subrc <> 0.
* Implement suitable error handling here
          ELSE.
            IF ls_crfhd-fhmar = 'M'.    " Beru pouze M-kov
              ls_oper_prt-aufnr = lr_plod_oper->plnum.
              ls_oper_prt-vornr = lr_plod_oper->vornr.
              ls_oper_prt-psnfh = lr_plfh->psnfh.
              ls_oper_prt-mgsol = lr_plfh->mgvgw.
              ls_oper_prt-mgeinh = lr_plfh->mgeinh.
              ls_oper_prt-matnr = ls_crfhd-matnr.
              ls_oper_prt-maktx = ls_crfhd-fhktx.
              ls_oper_prt-fhmar = ls_crfhd-fhmar.

              APPEND ls_oper_prt TO gt_file_operprodtools.
            ENDIF.
          ENDIF.

        ENDLOOP.

      ENDIF.

    ENDLOOP.

  ENDMETHOD.
  METHOD read_top_material.

*    TYPES: BEGIN OF lty_demand.
*            INCLUDE  TYPE /z/ad_z1pd_preact_demand.
*    TYPES: END OF lty_demand.

    DATA: ls_demand TYPE /z/ad_z1pd_preact_s14,
          lt_demand TYPE TABLE OF /z/ad_z1pd_preact_s14.
*    Data: lr_demand type TABLE OF /z/ad_z1pd_preact_s14.

* Seznam SD-zakzek
    LOOP AT gt_prorders REFERENCE INTO DATA(lr_prorder)
      WHERE kdauf IS NOT INITIAL AND kdpos IS NOT INITIAL.
      ls_demand-vbeln = lr_prorder->kdauf.
      ls_demand-posnr = lr_prorder->kdpos.
      APPEND ls_demand TO lt_demand.
    ENDLOOP.

    LOOP AT gt_plorders REFERENCE INTO DATA(lr_plorder)
      WHERE kdauf IS NOT INITIAL AND kdpos IS NOT INITIAL.
      ls_demand-vbeln = lr_plorder->kdauf.
      ls_demand-posnr = lr_plorder->kdpos.
      APPEND ls_demand TO lt_demand.
    ENDLOOP.

    SORT lt_demand BY vbeln posnr.
    DELETE ADJACENT DUPLICATES FROM lt_demand.

    LOOP AT lt_demand REFERENCE INTO DATA(lr_demand).

      SELECT  a~matnr, a~arktx, a~kwmeng, a~vrkme,
              b~mbdat, b~edatu,
              c~inco1, c~inco2
        UP TO 1 ROWS
        INTO CORRESPONDING FIELDS OF @lr_demand->*
        FROM vbap AS a
        LEFT OUTER JOIN vbep AS b ON  a~vbeln = b~vbeln AND
                                      a~posnr = b~posnr
        LEFT OUTER JOIN vbkd AS c ON  a~vbeln = c~vbeln AND
                                      a~posnr = c~posnr
        WHERE a~vbeln = @lr_demand->vbeln
          AND a~posnr = @lr_demand->posnr.
      ENDSELECT.
*Doplnn 
     SELECT a~zzwuda AS zwuda, a~zzebter AS zebter, a~zzlbter AS zlbter,
       c~fkdat, d~name1 AS kunnr
       UP TO 1 ROWS
       INTO CORRESPONDING FIELDS OF @lr_demand->*
*          ( @lr_demand~zwuda , @lr_demand-zebter,
*           @lr_demand-zlbter, @lr_demand-fkdat, @lr_demand-name1 )
       FROM vbap AS a
       LEFT OUTER JOIN vbpa AS b ON a~vbeln = b~vbeln AND (
       a~posnr = b~posnr OR a~posnr = '000000' ) AND b~parvw = 'ZL'
       LEFT OUTER JOIN vbkd AS c ON a~vbeln = c~vbeln AND (
       a~posnr = c~posnr OR a~posnr = '000000' )
       LEFT OUTER JOIN kna1 AS d ON d~kunnr EQ b~kunnr
     WHERE a~vbeln = @lr_demand->vbeln
       AND  a~posnr = @lr_demand->posnr.
      ENDSELECT.
*Doplnn 
      SELECT d~mcod3 AS mcod3a, d~mcod1 AS mcod1a
        UP TO 1 ROWS
        INTO CORRESPONDING FIELDS OF @lr_demand->*
*        (@ls_demand-mcod3a, @ls_demand-mcod1a)
        FROM vbap AS a
        LEFT OUTER JOIN vbpa AS b ON a~vbeln = b~vbeln AND (
      a~posnr = b~posnr OR b~posnr = '000000' ) AND b~parvw = 'AG'
        LEFT OUTER JOIN kna1 AS d ON d~kunnr EQ b~kunnr
        WHERE a~vbeln = @lr_demand->vbeln
        AND  a~posnr = @lr_demand->posnr.
      ENDSELECT.
*doplnn end customer name, place
      SELECT d~mcod3, d~mcod1
        UP TO 1 ROWS
        INTO CORRESPONDING FIELDS OF @lr_demand->*
*       (@ls_demand-mcod3, @ls_demand-mcod1)
        FROM vbap AS a
        LEFT OUTER JOIN vbpa AS b ON a~vbeln = b~vbeln AND (
      a~posnr = b~posnr OR b~posnr = '000000' ) AND b~parvw = 'EN'
        LEFT OUTER JOIN kna1 AS d ON d~kunnr EQ b~ablad
        WHERE a~vbeln = @lr_demand->vbeln
        AND  a~posnr = @lr_demand->posnr.
      ENDSELECT.
*      APPEND ls_demand TO lt_demand.
      lr_demand->delb0 = 'ZakOdb'.

    ENDLOOP.

*   Doplnn INCO1,2 pokud nenalezeno v tabulce VBKD dle zakzky + pozice
    LOOP AT lt_demand REFERENCE INTO DATA(lr_dm)
      WHERE inco1 IS INITIAL AND inco2 IS INITIAL.

      SELECT  inco1, inco2 UP TO 1 ROWS
        INTO CORRESPONDING FIELDS OF @lr_dm->*
        FROM vbkd
        WHERE vbeln = @lr_dm->vbeln
          AND posnr = '000000'.
      ENDSELECT.

    ENDLOOP.
*
    MOVE-CORRESPONDING lt_demand TO gt_file_demand.

  ENDMETHOD.
  METHOD read_ind_req.

    DATA: ls_demand      TYPE /z/ad_z1pd_preact_s14,
          lt_demand      TYPE TABLE OF /z/ad_z1pd_preact_s14,
          lt_demand_temp TYPE TABLE OF z/ad_z1pd_preact_s14,
          ls_file_demand TYPE /z/ad_z1pd_preact_demand.

    DATA: lt_mdezx TYPE TABLE OF mdez,
          ls_mt61d TYPE mt61d.


** Seznam SD-zakzek
*    LOOP AT gt_prorders REFERENCE INTO DATA(lr_prorder)
*      WHERE kdauf IS NOT INITIAL AND kdpos IS NOT INITIAL.
*      ls_demand-vbeln = lr_prorder->kdauf.
*      ls_demand-posnr = lr_prorder->kdpos.
*      APPEND ls_demand TO lt_demand.
*    ENDLOOP.
*
*    LOOP AT gt_plorders REFERENCE INTO DATA(lr_plorder)
*      WHERE kdauf IS NOT INITIAL AND kdpos IS NOT INITIAL.
*      ls_demand-vbeln = lr_plorder->kdauf.
*      ls_demand-posnr = lr_plorder->kdpos.
*      APPEND ls_demand TO lt_demand.
*    ENDLOOP.
*
*    SORT lt_demand BY vbeln posnr.
*    DELETE ADJACENT DUPLICATES FROM lt_demand.

*    LOOP AT lt_demand REFERENCE INTO DATA(lr_demand).

* Zmnit vbr takto:
* Jt do RESB, kde
*   - xloek, kzear = abap_false
*   - kdauf, kdpos = ...
*   - PBDNR is not initial
* Nsledn nast ppadn data z PBIM, PBED

    REFRESH lt_demand_temp.

*      SELECT a~matnr, b~plnmg, b~meins
*        INTO CORRESPONDING FIELDS OF TABLE @lt_demand_temp
*        FROM pbim AS a
*        INNER JOIN pbed AS b ON a~bdzei = b~bdzei
*        WHERE a~kdauf = @lr_demand->vbeln
*          AND a~kdpos = @lr_demand->posnr
*          AND b~plnmg > 0.

*    SELECT matnr, bdmng, meins
    SELECT matnr
      INTO CORRESPONDING FIELDS OF TABLE @lt_demand_temp
      FROM resb
      WHERE
*              kdauf = @lr_demand->vbeln
*          AND kdpos = @lr_demand->posnr
            werks = @gcv_werk_dsv
        AND xloek = @abap_false
        AND kzear = @abap_false
        AND pbdnr <> ''.

    SELECT matnr
      APPENDING CORRESPONDING FIELDS OF TABLE  @lt_demand_temp
      FROM pbim
      WHERE
            werks = @gcv_werk_dsv
        AND loevr = @abap_false
        AND vervs = @abap_true
*        AND pbdnr <> ''
      .

    SORT lt_demand_temp BY matnr.
    DELETE ADJACENT DUPLICATES FROM lt_demand_temp.

    LOOP AT lt_demand_temp REFERENCE INTO DATA(lr_demand_temp).

      REFRESH lt_mdezx.

      CALL FUNCTION 'MD_STOCK_REQUIREMENTS_LIST_API'
        EXPORTING
*         PLSCN                    =
          matnr                    = lr_demand_temp->matnr
          werks                    = gcv_werk_dsv
*         BERID                    =
*         ERGBZ                    =
*         AFIBZ                    =
*         INPER                    =
*         DISPLAY_LIST_MDPSX       =
*         DISPLAY_LIST_MDEZX       =
*         DISPLAY_LIST_MDSUX       =
*         NOBUF                    =
*         PLAUF                    =
*         I_VRFWE                  =
*         IS_SFILT                 =
*         IS_AFILT                 =
        IMPORTING
          e_mt61d                  = ls_mt61d
*         E_MDKP                   =
*         E_CM61M                  =
*         E_MDSTA                  =
*         E_ERGBZ                  =
        TABLES
*         MDPSX                    =
          mdezx                    = lt_mdezx
*         MDSUX                    =
        EXCEPTIONS
          material_plant_not_found = 1
          plant_not_found          = 2
          OTHERS                   = 3.
      IF sy-subrc <> 0.
* Implement suitable error handling here
      ENDIF.

      LOOP AT lt_mdezx REFERENCE INTO DATA(lr_mdezx) WHERE delkz = 'PP'.

        CLEAR ls_file_demand.

        SPLIT lr_mdezx->extra AT '/' INTO DATA(lv_bedae) DATA(lv_pbdnr).

        ls_file_demand-matnr = ls_mt61d-matnr.
        ls_file_demand-arktx = ls_mt61d-maktx.
        ls_file_demand-kwmeng = abs( lr_mdezx->mng01 ).
        ls_file_demand-vrkme = ls_mt61d-meins.
        ls_file_demand-delb0 = 'PPPot'.
        ls_file_demand-extra = lr_mdezx->extra.
        ls_file_demand-mbdat = lr_mdezx->dat00.
        ls_file_demand-edatu = ''.

        SELECT kdauf, kdpos UP TO 1 ROWS
          INTO ( @ls_file_demand-vbeln, @ls_file_demand-posnr )
          FROM pbim
          WHERE pbdnr = @lv_pbdnr
            AND matnr = @ls_mt61d-matnr
            AND werks = @gcv_werk_dsv.
        ENDSELECT.

        IF sy-subrc = 0.
          SELECT  "a~mbdat,
                  a~edatu,
                  b~inco1, b~inco2
                  UP TO 1 ROWS
INTO ( @ls_file_demand-edatu, @ls_file_demand-inco1 , @ls_file_demand-inco2 )
" @ls_file_demand-mbdat,
FROM vbep AS a
LEFT OUTER JOIN vbkd AS b ON  a~vbeln = b~vbeln AND
     a~posnr = b~posnr
WHERE a~vbeln = @ls_file_demand-vbeln
AND a~posnr = @ls_file_demand-posnr.
          ENDSELECT.

* Doplnn INCO1,2 pokud nenalezeno v tabulce VBKD dle zakzky + pozice
 IF ls_file_demand-inco1 IS INITIAL AND ls_file_demand-inco2 IS INITIAL.
            SELECT  inco1, inco2 UP TO 1 ROWS
               INTO ( @ls_file_demand-inco1 , @ls_file_demand-inco2 )
              FROM vbkd
              WHERE vbeln = @ls_file_demand-vbeln
                AND posnr = '000000'.
            ENDSELECT.
          ENDIF.
        ENDIF.

*Doplnn KUNNR, ZZWUDA, ZZEBTER, ZZLBTER, FKDAT, MCOD3, MCOD1
        SELECT a~zzwuda, a~zzebter, a~zzlbter, c~fkdat, d~name1
          INTO (@ls_file_demand-zwuda, @ls_file_demand-zebter, @ls_file_demand-zlbter,
                @ls_file_demand-fkdat, @ls_file_demand-kunnr )
          FROM vbap AS a
          LEFT OUTER JOIN vbpa AS b ON a~vbeln = b~vbeln AND (
          a~posnr = b~posnr OR a~posnr = '000000' ) AND b~parvw = 'ZL'
          LEFT OUTER JOIN vbkd AS c ON a~vbeln = c~vbeln AND (
          a~posnr = c~posnr OR a~posnr = '000000' )
          LEFT OUTER JOIN kna1 AS d ON d~kunnr EQ b~kunnr
          WHERE a~vbeln = @ls_file_demand-vbeln
          AND  a~posnr = @ls_file_demand-posnr.
        ENDSELECT.
*Doplnn contracting authority name, place
        SELECT d~mcod3, d~mcod1
          INTO (@ls_file_demand-mcod3a, @ls_file_demand-mcod1a)
          FROM vbap AS a
          LEFT OUTER JOIN vbpa AS b ON a~vbeln = b~vbeln AND (
        a~posnr = b~posnr OR b~posnr = '000000' ) AND b~parvw = 'AG'
          LEFT OUTER JOIN kna1 AS d ON d~kunnr EQ b~kunnr
          WHERE
          a~vbeln = @ls_file_demand-vbeln
        AND  a~posnr = @ls_file_demand-posnr.
        ENDSELECT.
*doplnn end customer name, place
        SELECT d~mcod3, d~mcod1
          INTO (@ls_file_demand-mcod3, @ls_file_demand-mcod1)
          FROM vbap AS a
          LEFT OUTER JOIN vbpa AS b ON a~vbeln = b~vbeln AND (
        a~posnr = b~posnr OR b~posnr = '000000' ) AND b~parvw = 'EN'
          LEFT OUTER JOIN kna1 AS d ON d~kunnr EQ b~ablad
          WHERE
          a~vbeln = @ls_file_demand-vbeln
        AND  a~posnr = @ls_file_demand-posnr.
        ENDSELECT.

        APPEND ls_file_demand TO gt_file_demand.

        CLEAR: lv_bedae, lv_pbdnr.
      ENDLOOP.

*      MOVE-CORRESPONDING lr_demand->* TO ls_file_demand.
*      ls_file_demand-matnr = lr_demand_temp->matnr.
*      ls_file_demand-kwmeng = lr_demand_temp->bdmng.
*      ls_file_demand-vrkme = lr_demand_temp->meins.
*      APPEND ls_file_demand TO gt_file_demand.
    ENDLOOP.

*    ENDLOOP.

  ENDMETHOD.
METHOD prepare_orders_data.
*    TYPES: BEGIN OF lty_mat_classif,
*             baugruppe   TYPE num4,
*             u_baugruppe TYPE num2,
*           END OF lty_mat_classif.

    DATA: ls_header    TYPE /z/ad_z1pd_preact_header,
          ls_operation TYPE /z/ad_z1pd_preact_operation,
          ls_bom       TYPE /z/ad_z1pd_preact_bom,
          ls_parameters TYPE /z/ad_z1pd_preact_parameters.
    DATA ls_mat_classif TYPE /z/ad_z1pd_preact_s10.
    DATA lv_brgew TYPE brgew.
    DATA lv_mtart TYPE mtart.
    DATA lv_cuobj TYPE cuobj.
    DATA lv_atflv TYPE atflv.
    DATA: lv_delka TYPE i,
        lv_vbeln TYPE vbap-vbeln,
        lv_schluessel TYPE /zad_z1pl_iut_angnr,
        lv_posnr TYPE vbap-posnr,
        lv_pspnr TYPE vbap-ps_psp_pnr,
        lv_psp_pnr TYPE ps_posid,
        lv_char6(6),
        lv_pocet TYPE i,
        lv_len TYPE i.
    DATA lv_aznor TYPE kapanzahl.
* ---------------------------------------------
*   Table for Headers.csv
* ---------------------------------------------
    LOOP AT gt_prorders REFERENCE INTO DATA(lr_prorder).
      CLEAR: ls_header.
      MOVE-CORRESPONDING lr_prorder->* TO ls_header.
      MOVE-CORRESPONDING lr_prorder->* TO ls_parameters.
      IF lr_prorder->matnr IS INITIAL.
        ls_header-maktx = lr_prorder->ktext.
      ELSE.
        ls_header-maktx = get_maktx( iv_matnr = lr_prorder->matnr ).
      ENDIF.
      ls_header-prord = abap_true.  " Pznak Vrobn zakzka
      ls_header-kennwort = get_kennwort(
                                         iv_vbeln    = lr_prorder->kdauf
                                         iv_posnr    = lr_prorder->kdpos
                                         iv_projn    = lr_prorder->projn
                                        ).

      APPEND ls_header TO gt_file_headers.
      IF lr_prorder->kdauf IS NOT INITIAL.
        APPEND ls_parameters TO gt_file_headerp.
      ENDIF.
    ENDLOOP.
    LOOP AT gt_plorders REFERENCE INTO DATA(lr_plorder).
      CLEAR: ls_header.
      MOVE-CORRESPONDING lr_plorder->* TO ls_header.
      MOVE-CORRESPONDING lr_plorder->* TO ls_parameters.
      ls_header-aufnr = lr_plorder->plnum.
*      ls_header-aufart = lr_plorder->aufart.
      ls_header-gamng = lr_plorder->gsmng.
      ls_header-gmein = lr_plorder->meins.
      ls_header-gstrp = lr_plorder->psttr.
      ls_header-gltrp = lr_plorder->pedtr.
      ls_header-maktx = get_maktx( iv_matnr = lr_plorder->matnr ).
      ls_header-kennwort = get_kennwort(
                                         iv_vbeln    = lr_plorder->kdauf
                                         iv_posnr    = lr_plorder->kdpos
                                         iv_projn    = lr_plorder->projn
                                        ).
    SELECT dzeit INTO ls_header-dzeit UP TO 1 ROWS " Doba vlastn vroby
      FROM marc
      WHERE matnr = lr_plorder->matnr
        AND werks = gcv_werk_dsv
      .
      ENDSELECT.
      APPEND ls_header TO gt_file_headers.
      IF lr_plorder->kdauf IS NOT INITIAL.
        APPEND ls_parameters TO gt_file_headerp.
      ENDIF.
    ENDLOOP.
    LOOP AT gt_file_headers REFERENCE INTO DATA(lr_header).

      lr_header->loginfo = get_loginfo( iv_vbeln   = lr_header->kdauf
                                        iv_posnr   = lr_header->kdpos ).

      CLEAR ls_mat_classif.
      ls_mat_classif = get_mat_classif( iv_matnr = lr_header->matnr ).
      lr_header->baugruppe = ls_mat_classif-baugruppe.
      lr_header->u_baugruppe = ls_mat_classif-u_baugruppe.
*vha materil
      CLEAR lv_brgew.
      get_gross_weight( EXPORTING
                        iv_matnr = lr_header->matnr    " Material Number
                      IMPORTING
                        ev_gewei = lr_header->gewei     " Weight Unit
    ev_brgew = lv_brgew    " Gross Weight, nutn kompatibilita dat.prvk
 ).
*pokud m VZ status ZABL doplnn znaku do do pole
      IF lr_header->sttxt CS 'ZABL'.
        lr_header->statzabl = 'X'.
      ELSE.
        lr_header->statzabl = ''.
      ENDIF.
*naten druhu materilu
      CLEAR lv_mtart.
      get_mtart( EXPORTING
                            iv_matnr = lr_header->matnr
                            IMPORTING
                            ev_mtart = lv_mtart ).
*pokud je materil KMAT - vha ze zakzky expedice - neto
      IF lv_mtart = 'KMAT'.
        get_gross_kmatweight( EXPORTING iv_kdauf = lr_header->kdauf
                                        iv_kdpos = lr_header->kdpos
                                        iv_matnr = lr_header->matnr
                                        IMPORTING
                                        ev_ntgew = lv_brgew ).
      ENDIF.
      lr_header->brgew = lv_brgew.              " pesun z quan na char

      lr_header->prctr = get_profitcenter(  iv_kdauf = lr_header->kdauf
                                          iv_kdpos = lr_header->kdpos ).
* Pvodce poteby
      lr_header->extra = get_pegged_requirements( lr_header ).
      IF lr_header->auart = 'DRIN'.
    lr_header->fertaufnr = get_fertaufnr( iv_aufnr = lr_header->aufnr ).
    lr_header->vornr = get_fertvornr( iv_aufnr = lr_header->aufnr ).

      ENDIF.
* Nahrazen desetinn teky rkou
      TRANSLATE lr_header->gamng USING '.,'. CONDENSE lr_header->gamng.
      TRANSLATE lr_header->gwemg USING '.,'. CONDENSE lr_header->gwemg.
      TRANSLATE lr_header->brgew USING '.,'. CONDENSE lr_header->brgew.
* Odstrann nul na zatku
SHIFT lr_header->aufnr LEFT DELETING LEADING '0'. " CONDENSE lr_header->aufnr.
SHIFT lr_header->ststa LEFT DELETING LEADING '0'. " CONDENSE lr_header->ststa.
      SHIFT lr_header->statu LEFT DELETING LEADING '0'.
      SHIFT lr_header->fevor LEFT DELETING LEADING '0'.
      SHIFT lr_header->dispo LEFT DELETING LEADING '0'.
      SHIFT lr_header->matnr LEFT DELETING LEADING '0'.
      SHIFT lr_header->maktx LEFT DELETING LEADING '0'.
*      SHIFT lr_header->gamng LEFT DELETING LEADING '0'.
*      SHIFT lr_header->gwemg LEFT DELETING LEADING '0'.
      SHIFT lr_header->gmein LEFT DELETING LEADING '0'.
      SHIFT lr_header->kdauf LEFT DELETING LEADING '0'.
      SHIFT lr_header->kdpos LEFT DELETING LEADING '0'.
      SHIFT lr_header->gstrp LEFT DELETING LEADING '0'.
      SHIFT lr_header->gltrp LEFT DELETING LEADING '0'.
      SHIFT lr_header->loginfo LEFT DELETING LEADING '0'.
      SHIFT lr_header->kennwort LEFT DELETING LEADING '0'.
      SHIFT lr_header->aprio LEFT DELETING LEADING '0'.
      SHIFT lr_header->sttxt LEFT DELETING LEADING '0'.
      SHIFT lr_header->prord LEFT DELETING LEADING '0'.
      SHIFT lr_header->baugruppe LEFT DELETING LEADING '0'.
      SHIFT lr_header->u_baugruppe LEFT DELETING LEADING '0'.
*      SHIFT lr_header->brgew LEFT DELETING LEADING '0'.
      SHIFT lr_header->gewei LEFT DELETING LEADING '0'.
      SHIFT lr_header->prctr LEFT DELETING LEADING '0'.
      SHIFT lr_header->fertaufnr LEFT DELETING LEADING '0'.
    ENDLOOP.
* ---------------------------------------------
*   Table for Demand.csv
* ---------------------------------------------
    LOOP AT gt_file_demand REFERENCE INTO DATA(lr_demand).

* Odstrann nul na zatku
      SHIFT lr_demand->vbeln LEFT DELETING LEADING '0'.
      SHIFT lr_demand->posnr LEFT DELETING LEADING '0'.
      SHIFT lr_demand->matnr LEFT DELETING LEADING '0'.

* Nhrada teky za rku
     TRANSLATE lr_demand->kwmeng USING '.,'. CONDENSE lr_demand->kwmeng.

    ENDLOOP.

  ENDMETHOD.
 METHOD create_file.

    DATA: lv_filename         TYPE string,
          lt_text             TYPE truxs_t_text_data,
          lt_data             TYPE truxs_t_text_data,
          lv_file_name        TYPE string,
          ls_file_header_line TYPE gty_csv_line.
    DATA: lv_mess(128) TYPE c.
    DATA: wa LIKE LINE OF lt_text.
    FIELD-SYMBOLS <lt_table_type> TYPE STANDARD TABLE.

    DATA ls_text TYPE gty_csv_line.
*    DATA BEGIN OF ls_data.
*    DATA: line TYPE truxs_t_text_data.
*    DATA END OF ls_data.
* -----------------------------------------------------------
*  File type determination
* -----------------------------------------------------------
    CASE iv_type.
      WHEN 1. " Headers
        lv_file_name = gcv_headers. " Filename
  ASSIGN gt_file_headers TO <lt_table_type>.  " Assing table for headers
      WHEN 2. " Operations
        lv_file_name = gcv_operations.
        ASSIGN gt_file_operations TO <lt_table_type>.
      WHEN 3. " BOMs
        lv_file_name = gcv_boms.
        ASSIGN gt_file_boms TO <lt_table_type>.
      WHEN 4. " ResourceGroups
        lv_file_name = gcv_resourcegroups.
        ASSIGN gt_file_resourcegroups TO <lt_table_type>.
    ENDCASE.
OPEN DATASET lv_filename FOR OUTPUT IN TEXT MODE ENCODING UTF-8 WITH BYTE-ORDER MARK.
      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.
    ENDIF.
  ENDMETHOD.
