*@----------------------------------------------------------------------
*@ Program id    : ZVADEK01
*@ Program Desc  : R & M (Co 9010) Picking List
*@                 Copy and modification of SAP picking list program
*@                 RVADEK01
*@ Transaction Code -
*@ Input files   : ID - none
*@ Output files  : ID - none
*@
*@ Tables Updated: Table -
*@
*@
*@ Author      : CFieulle
*@ Date        : 19990728
*@ Requested by: Buddy Corbett
*@----------------------------------------------------------------------
*@ Algorithm:
*@
*@----------------------------------------------------------------------
** Change History:
** Correction  Mod by   Date       Description
** LABK916992  CFieulle 1999-10-19 Ensure that item description is from
**                                 sales order item descr.
** LABK917228  CFieulle 1999-11-04  Country of origin for 3rd party
**                                  items are not entered in matl
**                                  master, so a text field has been
**                                  created for this. Retrieve 3 pty
**                                  ctry of origin from this field.
**                                  Layoutset changed accordingly.
** LABK918670  CFieulle 2000-03-09  Re user default printer message:
**                                  specify message type 'ZZ', so that
**                                  message VN001 doesn't come up
**                                  when there is a printer error.
** LABK925188  CFieulle 2000-04-06  46B Upgrade.
**                                  1. For sold-to address, use central
**                                  address mgmt table ADRC instead
**                                  of SADR for new picking lists.
**                                  2. Subroutine 'item_print', var
**                                  'e_mbdat': give value 8 spaces to
**                                  correspond to the ref field size.
**                                  (The original 1 space was causing a
**                                  syntax warning.)
** LABK925720  CFieulle 2000-06-02  46B Upgrade
**                                  Put back call to subroutines
**                                  'get_sold_to' and 'get_shipping_
**                                  info' which were overwritten by
**                                  other upgrade applications.
** LABK928655  CFieulle 2000-10-31  User-requested additions:
**                                  Header: Purch Order No, person
**                                  ordering.  Item: HS Code.
** LABK929006  CFieulle 2000-12-07  Get shipto party and address
**                                  in order to get telephone no.
**
** LABK931706  Becky Wang 2002-02-01
**             Use the Country of Origin from the Delivery Notes. If
**             could not find the value, then use the value set in the
**             material Master
*----------------------------------------------------------------------*
*    Print of pickinglist for one single delivery note                 *
*----------------------------------------------------------------------*
REPORT rvadek01 LINE-COUNT 100 MESSAGE-ID vn.

TABLES: vbco3,                         "Communicationarea for view
        vblkk,                         "Headerview
        vblkp,                         "Itemview
        ltak,                          "Transportauftrag
        adrs,                          "Communicationarea for Address
        riserls,                       "Serialnumbers
        komser,                        "Communicationarea Serialnumbers
        tvst, tvstt,                   "Shipping point
        vbkok, vbpok.

*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TABLES: usr01,                         "User master
        tsp03,                         "Spool: Printer
        t005t,                         "Country Names
        makt,                          "Material Descriptions
        marc,                          "Material Master: C Segment
        likp,                          "SD Document: Delivery Header Dat
        thead,                         "SAPscript: Text Header
        thead10,                       "SAPscript: Text Header
        sadr,                          "Address Management
        kna1,                          "Customer Master
        zinvoice01,                    "Bridge between ABAP and Layout
        lfa1,                          "Vendor Master
        vbap,                          "S.O.Item Data      "LABK916992
        vbak.                          "S.O. Header        "LABK928655

TABLES: adrc.                          "Centr Addr Mgmgt   "LABK925188

*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

* Includes
INCLUDE rvadtabl.
*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
INCLUDE zsmaster.                      "Master Macro Module
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

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

DATA: retcode     LIKE sy-subrc,       "Returncode
      xvbeln      LIKE likp-vbeln,
      xkomau      LIKE likp-vbeln,
      xscreen(1)  TYPE c.              "Output on printer or screen

DATA: BEGIN OF tvblkp OCCURS 0.        "Internal table for items
        INCLUDE STRUCTURE vblkp.
DATA: END OF tvblkp.

DATA: BEGIN OF tsernr OCCURS 0.        "Internal table for serialnumbers
        INCLUDE STRUCTURE riserls.
DATA: END OF tsernr.

DATA: BEGIN OF tsernr_print OCCURS 0.
        INCLUDE STRUCTURE komser.
DATA: END   OF tsernr_print.

DATA:  BEGIN OF tltap OCCURS 50.       "TA-Positionen
        INCLUDE STRUCTURE ltap.
        INCLUDE STRUCTURE ltap1.
DATA:  END OF tltap.

DATA: BEGIN OF svblkp.
        INCLUDE STRUCTURE vblkp.
DATA: END OF svblkp.

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

INCLUDE vblpdata.
INCLUDE vbfadata.
INCLUDE vbukdata.
INCLUDE vbupdata.
INCLUDE vbbddata.
INCLUDE vbpadata.
INCLUDE sadrdata.
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*>LABK917228>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
** Macro
data: g_name like thead-tdname,
      i_line   like tline occurs 10 with header line,
      i_inline like tline occurs 10 with header line.

define m_zvrmpick_get_text.

  refresh i_line.  clear i_line.
  refresh i_inline. clear i_inline.
  g_name = &1.

  call function 'READ_TEXT_INLINE'
       exporting
            id              = &2
            inline_count    = 1
            language        = 'E'
            name            = g_name
            object          = &3
       tables
            inlines         = i_inline
            lines           = i_line
       exceptions
            id              = 1
            language        = 2
            name            = 3
            not_found       = 4
            object          = 5
            reference_check = 6
            others          = 7.

    &4 = i_inline-tdline.

end-of-definition.

** >> Start Insert LABK928655
* Get Delivery Note details (Purch order, sales order no. etc.)

define m_get_delivery_details.

tables: vbdkl,                        "Headerview
        vbdpl.                        "Itemview


data: begin of tvbdpl occurs 0.       "Internal table for items
        include structure vbdpl.
data: end of tvbdpl.

clear vbco3.

vbco3-spras = nast-spras.
vbco3-vbeln = nast-objky.
call function 'RV_DELIVERY_PRINT_VIEW'
     exporting
          comwa = vbco3
     importing
          kopf  = vbdkl
     tables
          pos   = tvbdpl.

clear vbco3.

end-of-definition.

** >> End Insert LABK928655
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

*---------------------------------------------------------------------*
*       FORM ENTRY                                                    *
*---------------------------------------------------------------------*
*       Steuerung des Drucks                                          *
*---------------------------------------------------------------------*
FORM entry USING return_code us_screen.

  CLEAR retcode.
  xscreen = us_screen.
  PERFORM processing USING us_screen.
  IF retcode NE 0.
    return_code = 1.
  ELSE.
* Kommimengen an Lieferungen zurückgeben, aber nicht bei Druckansicht
    IF xscreen = ' '.
      PERFORM delivery_update.
    ENDIF.
    return_code = 0.
  ENDIF.

ENDFORM.

*---------------------------------------------------------------------*
*       FORM PROCESSING                                               *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  PROC_SCREEN                                                   *
*---------------------------------------------------------------------*
FORM processing USING proc_screen.

  REFRESH: xlips,
           xvbfa,
           xvbuk,
           xvbup,
           yvbfa,
           yvbuk,
           yvbup.

  PERFORM get_data.
  CHECK retcode = 0.
  PERFORM form_open USING proc_screen tvst-aland.
  CHECK retcode = 0.
  PERFORM formheader_print.
  CHECK retcode = 0.
  PERFORM get_sold_to.                                     "LABK925720
  CHECK retcode = 0.                                       "LABK925720
  PERFORM get_additional_header_info.                      "LABK928655
  CHECK retcode = 0.                                       "LABK928655
  PERFORM get_shipping_info.                               "LABK925720
  CHECK retcode = 0.                                       "LABK925720
  PERFORM item_print.
  CHECK retcode = 0.
  perform get_ship_to.                                     "LABK929006
  check retcode = 0.                                       "LABK929006
  PERFORM form_close.
  CHECK retcode = 0.

ENDFORM.

***********************************************************************
*       S U B R O U T I N E S                                         *
***********************************************************************

*---------------------------------------------------------------------*
*       FORM DELIVERY_UPDATE                                          *
*---------------------------------------------------------------------*
*       Ergänzen Lieferung um Kommissionierinformation                *
*---------------------------------------------------------------------*

* Ergänzen der Lieferungen um Kommissionierinformation
FORM delivery_update.

  DATA: BEGIN OF hvbpok OCCURS 10.     "Lieferpositionen Kommiss.
          INCLUDE STRUCTURE vbpok.
  DATA: END OF hvbpok.

  DATA: BEGIN OF sav_nast.
          INCLUDE STRUCTURE nast.
  DATA: END OF sav_nast.

* DATA: SYNC_FLAG TYPE C.             "synchrone Verbuchung?

* Füllen Lieferkopfdaten für Kommi-Update
  vbkok-vbeln_vl = xvbeln.
  vbkok-vbeln = vblkk-komau.

* Füllen Positionsdaten zu Liefernr.
  LOOP AT tvblkp.
    hvbpok-vbeln_vl = tvblkp-vbeln.
    hvbpok-posnr_vl = tvblkp-posnr.
    hvbpok-posnn = tvblkp-posnr.
    hvbpok-vbeln = vblkk-komau.
    hvbpok-vbtyp_n = 'Q'.
    hvbpok-pikmg = tvblkp-komng.
    hvbpok-meins = tvblkp-meins.
    hvbpok-ndifm = 0.
    hvbpok-taqui = ' '.
    hvbpok-charg = tvblkp-charg.
    hvbpok-matnr = tvblkp-matnr.
    hvbpok-brgew = tvblkp-brgew.
    hvbpok-gewei = tvblkp-gewei.
    hvbpok-volum = tvblkp-volum.
    hvbpok-voleh = tvblkp-voleh.
    hvbpok-orpos = 0.
    APPEND hvbpok.
  ENDLOOP.

* IF NAST-VSZTP <> 4.
*    SYNC_FLAG = 'X'.
* ELSE.
*    SYNC_FLAG = ' '.
* ENDIF.

  sav_nast = nast.
  CALL FUNCTION 'SD_DELIVERY_UPDATE_PICKING'
       EXPORTING
            no_messages_update = 'X'                        "P30K094097
            nicht_sperren      = 'X'
            vbkok_wa           = vbkok
       TABLES
            vbpok_tab          = hvbpok.
  nast = sav_nast.

* Freigabe an Datenbank
* COMMIT WORK.

ENDFORM.


*---------------------------------------------------------------------*
*       FORM FORM_CLOSE                                               *
*---------------------------------------------------------------------*
*       End of printing the form                                      *
*---------------------------------------------------------------------*

FORM form_close.

  CALL FUNCTION 'CLOSE_FORM'           "...Ende Formulardruck
       EXCEPTIONS OTHERS = 1.
  IF sy-subrc NE 0.
    PERFORM protocol_update.
    retcode = 1.
  ENDIF.
  SET COUNTRY space.

ENDFORM.

*---------------------------------------------------------------------*
*       FORM FORM_OPEN                                                *
*---------------------------------------------------------------------*
*       Start of printing the form                                    *
*---------------------------------------------------------------------*
*  -->  US_SCREEN  Output on screen                                   *
*                  ' ' = printer                                      *
*                  'X' = screen                                       *
*  -->  US_COUNTRY County for telecommunication and SET COUNTRY       *
*---------------------------------------------------------------------*

FORM form_open USING us_screen us_country.

*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
* Logic to recognise 'DFLT' designated printer
  if nast-ldest = 'DFLT'.    "Use the user default printer.
    select single * from usr01 where bname = sy-uname.
    select single * from tsp03 where padest = usr01-spld.
    if sy-subrc = 0.
      nast-ldest = usr01-spld.
    else.
*     message e001 with 'Unable to find user default printer.'.
      message e001(zz) with                                 "LABK918670
              'Unable to find user default printer.'.       "LABK918670
    endif.
  endif.
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

  INCLUDE rvadopfo.

ENDFORM.

*---------------------------------------------------------------------*
*       FORM FORMHEADER_PRINT                                         *
*---------------------------------------------------------------------*
*       Printing Formheader                                           *
*---------------------------------------------------------------------*

FORM formheader_print.

  PERFORM sender.

ENDFORM.

*---------------------------------------------------------------------*
*       FORM GET_DATA                                                 *
*---------------------------------------------------------------------*
*       General provision of data for the form                        *
*---------------------------------------------------------------------*

FORM get_data.

  DATA: vblkp_lines      TYPE p.

* Beschaffen View
  xvbeln = nast-objky.
  CALL FUNCTION 'RV_DELIVERY_PICK_VIEW'
       EXPORTING
            vbeln     = xvbeln
            zweck     = 'D'
            spras     = nast-spras
       IMPORTING
            vblkk_wa  = vblkk
       TABLES
            vblkp_tab = tvblkp
       EXCEPTIONS
            OTHERS    = 1.
  IF sy-subrc NE 0.
    PERFORM protocol_update.
  ENDIF.

* gibt es zu kommissionierende Positionen, ggf. sortieren
  DESCRIBE TABLE tvblkp LINES vblkp_lines.
  IF vblkp_lines GT 0.

* Nummernvergabe Kommissionierauftrag
    CLEAR vblkk-komau.
    CALL FUNCTION 'NUMBER_GET_NEXT'
         EXPORTING
              nr_range_nr = '01'
              object      = 'SD_PICKING'
         IMPORTING
              number      = vblkk-komau
         EXCEPTIONS
              OTHERS      = 1.
    IF sy-subrc NE 0.
    ENDIF.

    IF vblkk-komau IS INITIAL.
      vblkk-komau = sy-datum+2.
      vblkk-komau+6(4) = sy-uzeit(4).
    ENDIF.

    PERFORM sort_pick_list.
    retcode = 0.
  ELSE.
    retcode = 4.
    syst-msgid = 'VN'.
    syst-msgno = '202'.
    syst-msgty = 'E'.
    syst-msgv1 = vblkk-vbeln.
    PERFORM protocol_update.
    CHECK 1 = 2.
  ENDIF.

* Lesen Versandstelle
  IF vblkk-vstel EQ space.
    CLEAR: tvst, tvstt.
  ELSE.
    SELECT SINGLE * FROM tvst WHERE vstel EQ vblkk-vstel.
    IF sy-subrc NE 0.
      CLEAR tvst.
      syst-msgid = 'VN'.
      syst-msgno = '203'.
      syst-msgty = 'E'.
      syst-msgv1 = 'TVST'.
      syst-msgv2 = syst-subrc.
      PERFORM protocol_update.
    ENDIF.
    SELECT SINGLE * FROM tvstt WHERE spras EQ nast-spras
                                 AND vstel EQ vblkk-vstel.
    IF sy-subrc NE 0.
      CLEAR tvstt.
      syst-msgid = 'VN'.
      syst-msgno = '203'.
      syst-msgty = 'E'.
      syst-msgv1 = 'TVSTT'.
      syst-msgv2 = syst-subrc.
      PERFORM protocol_update.
    ENDIF.
  ENDIF.

ENDFORM.

*---------------------------------------------------------------------*
*       FORM GET_SERIAL_NO                                            *
*---------------------------------------------------------------------*
*       In this routine the serialnumbers are fetched from the        *
*       database.                                                     *
*---------------------------------------------------------------------*

FORM get_serial_no.

  REFRESH tsernr.
  REFRESH tsernr_print.
  CHECK vblkp-anzsn > 0.
* Read the Serialnumbers of a Position.
  CALL FUNCTION 'SERIAL_LS_PRINT'
       EXPORTING
            vbeln  = vblkp-vbeln
            posnr  = vblkp-posnr
       TABLES
            iserls = tsernr.

* Process the stringtable for Printing.
  CALL FUNCTION 'PROCESS_SERIALS_FOR_PRINT'
       EXPORTING
            i_boundary_left             = '(_'
            i_boundary_right            = '_)'
            i_sep_char_strings          = ',_'
            i_sep_char_interval         = '_-_'
            i_use_interval              = 'X'
            i_boundary_method           = 'C'
            i_line_length               = 50
            i_no_zero                   = 'X'
            i_alphabet                  = sy-abcde
            i_digits                    = '0123456789'
            i_special_chars             = '-'
            i_with_second_digit         = ' '
       TABLES
            serials                     = tsernr
            serials_print               = tsernr_print
       EXCEPTIONS
            boundary_missing            = 01
            interval_separation_missing = 02
            length_to_small             = 03
            internal_error              = 04
            wrong_method                = 05
            wrong_serial                = 06
            two_equal_serials           = 07
            serial_with_wrong_char      = 08
            serial_separation_missing   = 09.

  IF sy-subrc NE 0.
    PERFORM protocol_update.
  ENDIF.

ENDFORM.
*---------------------------------------------------------------------*
*       FORM ITEM_PRINT                                               *
*---------------------------------------------------------------------*
*       Printout of the items                                         *
*---------------------------------------------------------------------*

FORM item_print.

  DATA: e_werks LIKE tvblkp-werks VALUE ' ',
        e_lgort LIKE tvblkp-lgort VALUE ' ',
        e_lgnum LIKE tvblkp-lgnum VALUE ' ',
*>LABK925188>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
*       e_mbdat LIKE tvblkp-mbdat VALUE ' '.
        e_mbdat like tvblkp-mbdat value '        '.
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

* Start LABK931706
  Data: l_wa_eipo like eipo,
        l_wa_likp like likp.
* End LABK931706

  CALL FUNCTION 'WRITE_FORM'           "Activate header
       EXPORTING  element = 'ITEM_HEADER'
                  type    = 'TOP'
       EXCEPTIONS OTHERS  = 1.
  IF sy-subrc NE 0.
    PERFORM protocol_update.
  ENDIF.

  LOOP AT tvblkp.
    vblkp = tvblkp.
*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
* Users don't want new page when there's a different storage location
* number or plant number etc., because everything is stored in the
* same location even thought with a different number
**  neue Seite bei Wechsel Werk/Lagerort/Kommidatum/WM-Lager
*    IF e_werks NE tvblkp-werks OR
*       e_lgort NE tvblkp-lgort OR
*       e_lgnum NE tvblkp-lgnum OR
*       e_mbdat NE tvblkp-mbdat.
*      IF sy-tabix > 1.
*        MOVE svblkp TO vblkp.
*        CALL FUNCTION 'CONTROL_FORM'
*             EXPORTING
*                  command = 'NEW-PAGE'.
*        MOVE tvblkp TO vblkp.
*      ENDIF.
*      e_werks = tvblkp-werks.
*      e_lgort = tvblkp-lgort.
*      e_lgnum = tvblkp-lgnum.
*      e_mbdat = tvblkp-mbdat.
*    ENDIF.
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
* Druck WM-Angaben falls vorhanden
    IF tvblkp-lgpla NE space.
      tvblkp-lgpbe = tvblkp-lgpla.
      vblkp-lgpbe = tvblkp-lgpla.
    ENDIF.

*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
* Get Country of Origin
    select single * from marc where matnr = vblkp-matnr
                                and werks = vblkp-werks.
*    IF MARC-HERKL = ' '.
*      MARC-HERKL = 'CA'.
*    ENDIF.


**** Start of LABK931706
*    if sy-subrc = 0.
*      select single * from t005t where spras = 'E'
*                                   and land1 = marc-herkl.
*    endif.

     if sy-subrc = 0.
       clear: l_wa_eipo, l_wa_likp.
       select single * from likp into l_wa_likp
         where vbeln = tvblkp-vbeln.
       if sy-subrc = 0.
         select single * from eipo into l_wa_eipo
           where exnum = l_wa_likp-exnum
           and expos = tvblkp-posnr.
         if sy-subrc = 0 and ( not l_wa_eipo-herkl is initial ).
           select single * from t005t where spras = 'E'
                                   and land1 = l_wa_eipo-herkl.
         else.
           select single * from t005t where spras = 'E'
                                   and land1 = marc-herkl.
         endif.
       else.
         select single * from t005t where spras = 'E'
                                   and land1 = marc-herkl.
       endif.
     endif.
**** End of LABK931706

* Get Country of Origin for 3rd party material             "LABK917228
    clear: vbap, vblkp-tdname, zinvoice01-descline1.       "LABK917228
    select single * from vbap where vbeln = vblkp-vgbel    "LABK917228
                                and posnr = vblkp-vgpos.   "LABK917228
    if vbap-pstyv = 'ZYAS' and                             "LABK917228
       vbap-matnr <> '000000000000300006'.                 "LABK917228
      concatenate vblkp-vbeln vblkp-posnr                  "LABK917228
                        into vblkp-tdname.                 "LABK917228
      m_zvrmpick_get_text vblkp-tdname '9005' 'VBBP'       "LABK917228
                               zinvoice01-descline1.       "LABK917228
* Get HS Code for freight 3rd party material               "LABK928655
      m_zvrmpick_get_text vblkp-tdname '9004' 'VBBP'       "LABK928655
                          zinvoice01-hdisc_desc.           "LABK928655
    endif.                                                 "LABK917228


* Get US material description
    clear makt.
    select single * from makt where matnr = vblkp-matnr
                                and spras = 'Z'.

* Get 'Special Instructions' text from material master
    clear thead-tdname.
    select single * from likp where vbeln = vblkk-vbeln.
    select single * from lips where vbeln = vblkp-vbeln
         and posnr = vblkp-posnr.
    concatenate vblkp-matnr likp-vkorg lips-vtweg
         into thead-tdname.

* Get S.O. item text                                       "LABK916992
    clear: vbap, vblkp-arktx.                              "LABK916992
    select single * from vbap where vbeln = vblkp-vgbel    "LABK916992
                                and posnr = vblkp-vgpos.   "LABK916992
    if sy-subrc = 0.                                       "LABK916992
      move vbap-arktx to vblkp-arktx.                      "LABK916992
    endif.                                                 "LABK916992
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

* Druck der einzelnen Zeile
    CALL FUNCTION 'WRITE_FORM'
         EXPORTING
              element = 'ITEM_LINE'.
    IF NOT tvblkp-charg IS INITIAL.
      CALL FUNCTION 'WRITE_FORM'
           EXPORTING
                element = 'CHARGE'
           EXCEPTIONS
                OTHERS  = 1.
      IF sy-subrc NE 0.
        PERFORM protocol_update.
      ENDIF.
    ENDIF.
    PERFORM get_serial_no.
    PERFORM item_serial_no_print.
    svblkp = tvblkp.
  ENDLOOP.

*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
*  CALL FUNCTION 'WRITE_FORM'           "Deactivate Header
*       EXPORTING  element  = 'ITEM_HEADER'
*                  function = 'DELETE'
*                  type     = 'TOP'
*       EXCEPTIONS OTHERS   = 1.
  mac_delete_top_element 'ITEM_HEADER'.      "Deactivate Header
  if sy-subrc ne 0.
    perform protocol_update.
  endif.
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  IF sy-subrc NE 0.
    PERFORM protocol_update.
  ENDIF.

ENDFORM.

*---------------------------------------------------------------------*
*       FORM ITEM_SERIAL_NO_PRINT                                     *
*---------------------------------------------------------------------*
*       Printout of the item serialnumbers                            *
*---------------------------------------------------------------------*

FORM item_serial_no_print.

  LOOP AT tsernr_print.
    komser = tsernr_print.
    IF sy-tabix = 1.
*     Output of the Headerline
*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
*      CALL FUNCTION 'WRITE_FORM'
*           EXPORTING
*                element = 'ITEM_LINE_SERIAL_NO_HEADER'
*           EXCEPTIONS
*                element = 1
*                window  = 2.
      mac_write_form_main 'ITEM_LINE_SERIAL_NO_HEADER'.
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      IF sy-subrc NE 0.
        PERFORM protocol_update.
      ENDIF.
    ELSE.
*     Output of the following printlines
*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
*      CALL FUNCTION 'WRITE_FORM'
*           EXPORTING
*                element = 'ITEM_LINE_SERIAL_NO'
*           EXCEPTIONS
*                element = 1
*                window  = 2.
      mac_write_form_main 'ITEM_LINE_SERIAL_NO'.
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      IF sy-subrc NE 0.
        PERFORM protocol_update.
      ENDIF.
    ENDIF.
    AT LAST.
*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
*      CALL FUNCTION 'CONTROL_FORM'
*           EXPORTING
*                command = 'NEW-LINE'.
      mac_control_form 'NEW-LINE'.
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      IF sy-subrc NE 0.
        PERFORM protocol_update.
      ENDIF.
    ENDAT.
  ENDLOOP.

ENDFORM.

*---------------------------------------------------------------------*
*       FORM PROTOCOL_UPDATE                                          *
*---------------------------------------------------------------------*
*       The messages are collected for the processing protocol.       *
*---------------------------------------------------------------------*

FORM protocol_update.

  CHECK xscreen = space.
  CALL FUNCTION 'NAST_PROTOCOL_UPDATE'
       EXPORTING
            msg_arbgb = syst-msgid
            msg_nr    = syst-msgno
            msg_ty    = syst-msgty
            msg_v1    = syst-msgv1
            msg_v2    = syst-msgv2
            msg_v3    = syst-msgv3
            msg_v4    = syst-msgv4
       EXCEPTIONS
            OTHERS    = 1.

ENDFORM.

*---------------------------------------------------------------------*
*       FORM SENDER                                                   *
*---------------------------------------------------------------------*
*       This routine determines the address of the sender (Table VBUR)*
*---------------------------------------------------------------------*

FORM sender.


ENDFORM.

INCLUDE mv50bfz1.

*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
*&---------------------------------------------------------------------*
*&      Form  GET_SOLD_TO
*&---------------------------------------------------------------------*
form get_sold_to.

  select single * from vbpa where       "Sales Document Partner
           parvw = 'AG' and
           posnr = '000000' and
           vbeln = vblkk-vbeln.

  if vbpa-adrnr ne ' '.
* Sold to party information has been altered.
    select single * from adrc where                         "LABK925188
       addrnumber = vbpa-adrnr  and                         "LABK925188
       date_from le sy-datum    and                         "LABK925188
       nation     = ' '.                                    "LABK925188
    if sy-subrc = 0.                                        "LABK925188
      move: adrc-name1      to vbadr-name1,                 "LABK925188
            adrc-name2      to vbadr-name2,                 "LABK925188
            adrc-name3      to vbadr-name3,                 "LABK925188
            adrc-name4      to vbadr-name4,                 "LABK925188
            adrc-street     to vbadr-stras,                 "LABK925188
            adrc-po_box     to vbadr-pfach,                 "LABK925188
            adrc-post_code2 to vbadr-pstl2,                 "LABK925188
            adrc-po_box_loc to vbadr-pfort,                 "LABK925188
            adrc-city1      to vbadr-ort01,                 "LABK925188
            adrc-city2      to vbadr-ort02,                 "LABK925188
            adrc-post_code1 to vbadr-pstlz,                 "LABK925188
            adrc-country    to vbadr-land1,                 "LABK925188
            adrc-region     to vbadr-regio.                 "LABK925188
      clear adrc.                                           "LABK925188
    else.                                                   "LABK925188
      select single * from sadr where
           adrnr = vbpa-adrnr and
           natio = ' '.
      if sy-subrc = 0.
        move-corresponding sadr to vbadr.
      endif.
    endif.                                                  "LABK925188
  else.
* If Sold to party not altered.
    select single * from kna1 where kunnr = vbpa-kunnr.
    move-corresponding kna1 to vbadr.
  endif.


endform.                    " GET_SOLD_TO

*&---------------------------------------------------------------------*
*&      Form  GET_SHIPPING_INFO
*&---------------------------------------------------------------------*
form get_shipping_info.

* Shipping instructions
  move vblkk-vbeln to thead10-tdname.

* Carrier
  select single * from vbpa where vbeln = vblkk-vbeln
                              and posnr = '000000'
                              and parvw = 'SP'.
  check sy-subrc = 0.
  select single * from lfa1 where lifnr = vbpa-lifnr.


endform.                    " GET_SHIPPING_INFO

* >> Start Insert LABK928655 >>
*&---------------------------------------------------------------------*
*&      Form  GET_ADDITIONAL_HEADER_INFO
*&---------------------------------------------------------------------*
FORM GET_ADDITIONAL_HEADER_INFO.

* Get delivery details (includes Order no. VBDKL-VBELN_VAUF )
  m_get_delivery_details.

* Get Order details
  select single * from vbak where vbeln = vbdkl-vbeln_vauf.


ENDFORM.                    " GET_ADDITIONAL_HEADER_INFO

* >> End Insert LABK928655 >>


*<< Start Insert LABK929006 >>
*&---------------------------------------------------------------------*
*&      Form  GET_SHIP_TO
*&---------------------------------------------------------------------*
FORM GET_SHIP_TO.

* Ship to address
  select single * from vbpa where vbeln = vblkk-vbeln
                              and posnr = '000000'
                              and ( parvw = 'SH' or parvw = 'WE' ).
  check sy-subrc = 0.

  if vbpa-adrnr ne ' '.
     select single * from adrc where
        addrnumber  = vbpa-adrnr  and
        nation      = ' '.
    if sy-subrc ne 0.
      select single * from sadr where
             adrnr = vbpa-adrnr and
             natio = ' '.
    endif.
  endif.

  clear zinvoice01-descline2.
  if adrc-tel_number ne ' '.
    move adrc-tel_number to zinvoice01-descline2.
  elseif sadr-telf1 ne ' '.
    move sadr-telf1 to zinvoice01-descline2.
  else.
    if vbak-telf1 ne ' '.
      move vbak-telf1 to zinvoice01-descline2.
    else.
      select single * from kna1 where
            kunnr = vbpa-kunnr.
      if sy-subrc = 0.
        move kna1-telf1 to zinvoice01-descline2.
      endif.
    endif.
  endif.

ENDFORM.                    " GET_SHIP_TO
*<< End Insert LABK929006 >>



*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<