0% found this document useful (0 votes)
8 views

Source

Uploaded by

Souju Bonthu
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
8 views

Source

Uploaded by

Souju Bonthu
Copyright
© © All Rights Reserved
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 50

REPORT zmr_sto_consignment

MESSAGE-ID z1.

************************************************************************
* PROGRAM NAME: ZMR_STO_CONSIGNMENT CREATE DATE: 03/05/2002 *
* AUTHOR NAME: MANGINIRJ LAST UPDATE: 03/05/2002 *
*
*
* This program allows the user to choose stock transport orders *
* from the Delivery Due List, select consignment stock to convert *
* to own stock to satisfy the orders, then post the stock to our *
* own stock using 411 K movement type. Includes automatic batch *
* and quantity proposal functionality. *
*----------------------------------------------------------------------*
* INCLUDES: ZMR_STO_CONSIGNMENT_GEN_DECL *
* <ICON>
*
* ZYX_UOM_CONVERT
*
*----------------------------------------------------------------------*
* CHANGE HISTORY
*
*----------------------------------------------------------------------*
* DATE | DEVELOPER | DESCRIPTION
*
*----------------------------------------------------------------------*
* 03/05/02 | MANGINIRJ | ORIGINAL DEVELOPMENT *
* | |
*
* 04/02/02 | MANGINIRJ | Check goods issue history for each *
* | [DEVK966931] | PO line item. If goods issued to *
* | | within delivery tolerance, delete *
* | | from list. If partially goods issued *
* | | but not within delivery tolerance, *
* | | reflect remaining quantity still *
* | | unissued.
*
* | |
*
* 07/25/02 | MANGINIRJ | Fix for Halls Warehouse (pass a *
* | [DEVK971355] | required field from the first WM *
* | | posting to the second.
*
* | |
*
* 06/25/07 | KIRKCH | Update FIFO date on quant to match *
* | [DEVK9A0BAD] | original K consign date when moving *
* | | to own.
*
* 03/15/10 | Wislocki sir8906 | Ignore PO lines item flagged for del *
* | |
*
* 04/09/10 | CHUNUKM SIR 9029 | Populate Min. Lot Size and Rounding *
* | DV4K902364 | Value when using Material Move search*
* MM15608 |11/15/13 | Michael Birchbauer | Ignore stock in storage *
* | | DV5K906628 | type 902
*
************************************************************************

TABLES: vetvg, ekpo, mseg,


zmsto_due, zmstk_req, zmstk_cnv.
TABLES: ekbe. "DEVK966931
TABLES: ltap. "DEVK971355
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_vstel FOR vetvg-vstel
NO INTERVALS NO-EXTENSION,
* NO INTERVALS NO-EXTENSION OBLIGATORY,
s_ledat FOR vetvg-ledat.
SELECTION-SCREEN SKIP.
SELECT-OPTIONS:
* S_RESWK FOR VETVG-RESWK,
* S_ROUTE FOR VETVG-ROUTE,
s_werks FOR ekpo-werks,
s_matnr FOR ekpo-matnr.
SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.


PARAMETERS:
p_werks LIKE mseg-werks.
SELECT-OPTIONS:
p_matnr FOR mseg-matnr.
SELECTION-SCREEN END OF BLOCK b2.

DATA: screen_cancelled(1) TYPE c,


screen_back(1) TYPE c,
program_exit(1) TYPE c,
material_move(1) TYPE c.

DATA: error_count TYPE i,


w_index TYPE i,
w_field(30) TYPE c.

DATA: i_sto_due TYPE TABLE OF zmsto_due,


i_stk_req TYPE TABLE OF zmstk_req,
i_stk_cnv TYPE TABLE OF zmstk_cnv.

DATA: BEGIN OF i_stk_mkol OCCURS 0,


matnr TYPE mkol-matnr,
werks TYPE mkol-werks,
lgort TYPE mkol-lgort,
charg TYPE mkol-charg,
lifnr TYPE mkol-lifnr,
ersda TYPE mkol-ersda,
slabs TYPE mkol-slabs,
END OF i_stk_mkol.

DATA :BEGIN OF i_lqua OCCURS 0,


matnr LIKE lqua-matnr,
werks LIKE lqua-werks,
lgtyp LIKE lqua-lgtyp,
einme LIKE lqua-ausme,
verme LIKE lqua-verme,
END OF i_lqua.

DATA : lin TYPE i,


stk_916 LIKE lqua-ausme.

DATA: BEGIN OF i_t320 OCCURS 0.


INCLUDE STRUCTURE t320.
DATA: END OF i_t320.

DATA: BEGIN OF temp_sto_due OCCURS 0.


INCLUDE STRUCTURE zmsto_due.
DATA: END OF temp_sto_due.

DATA: BEGIN OF i_sel_mara OCCURS 0,


matnr LIKE mara-matnr,
END OF i_sel_mara.

DATA: BEGIN OF i_mara OCCURS 0,


matnr LIKE mara-matnr,
meins LIKE mara-meins,
END OF i_mara.

DATA: BEGIN OF i_mbew OCCURS 0,


matnr LIKE mara-matnr,
bwkey LIKE mbew-bwkey,
bwtar LIKE mbew-bwtar,
lbkum LIKE mbew-lbkum,
END OF i_mbew.

DATA: BEGIN OF i_mard OCCURS 0,


lfgja LIKE mard-lfgja,
lfmon LIKE mard-lfmon,
labst LIKE mard-labst,
END OF i_mard.

DATA: temp_matnr LIKE zmsto_due-matnr,


temp_reswk LIKE zmsto_due-reswk,
temp_meins LIKE mara-meins.

DATA: w_conv_qty LIKE zmsto_due-menge,


w_conv_uom LIKE zmsto_due-meins.

DATA: w_slabs LIKE mkol-slabs.


DATA: BEGIN OF bdcdata OCCURS 0.
INCLUDE STRUCTURE bdcdata.
DATA: END OF bdcdata.

*MCC - data declaration "DV4K902364


DATA: w_bstmi LIKE marc-bstmi,
w_bstrf LIKE marc-bstrf,
w_prev_matnr LIKE mara-matnr.

INCLUDE zmr_sto_consignment_gen_decl.

INCLUDE <icon>.

DATA: W_NLQNR LIKE LTAP-NLQNR. "KIRKCH - MM3644.

INITIALIZATION.

*** Default delivery date criteria:


*** Beginning of time through 7 days from today.
*** (Same criteria as transaction VL10.)
REFRESH s_ledat.
CLEAR s_ledat.
MOVE 'I' TO s_ledat-sign.
MOVE 'BT' TO s_ledat-option.
MOVE sy-datum TO s_ledat-high.
ADD 7 TO s_ledat-high.
APPEND s_ledat.
CLEAR s_ledat.

AT SELECTION-SCREEN.

CLEAR material_move.
IF s_vstel IS INITIAL.
IF p_matnr-low IS INITIAL AND
p_werks IS INITIAL.
MESSAGE e044(z2) WITH 'Shipping Point is required'.
ELSE.
MOVE 'X' TO material_move.
IF p_matnr-low IS INITIAL.
MESSAGE e044(z2) WITH 'Plant and Material'
'are required' 'for Material Move'.
ELSEIF p_werks IS INITIAL.
MESSAGE e044(z2) WITH 'Plant and Material'
'are required' 'for Material Move'.
ENDIF.

SELECT matnr meins


INTO (temp_matnr, temp_meins)
FROM mara
WHERE matnr IN p_matnr.
IF sy-subrc <> 0.
MESSAGE e000 WITH 'No Materials' 'found'.
ENDIF.

CLEAR w_slabs.

SELECT SUM( slabs )


FROM mkol
INTO w_slabs
WHERE matnr = temp_matnr
AND werks = p_werks
AND sobkz = 'K'
AND slabs > 0.

REFRESH : i_lqua. CLEAR : i_lqua.

SELECT matnr werks lgtyp einme verme FROM lqua


INTO TABLE i_lqua
WHERE matnr = zmstk_cnv-matnr
AND werks = zmstk_cnv-werks
AND lgtyp = '916'.

CLEAR : lin, stk_916.


DESCRIBE TABLE i_lqua LINES lin.
IF lin > 0.
LOOP AT i_lqua.
stk_916 = stk_916 + i_lqua-einme + i_lqua-verme.

ENDLOOP.
ENDIF.

w_slabs = w_slabs - stk_916.

IF w_slabs > 0.
EXIT.
ENDIF.
ENDSELECT.
IF w_slabs > 0.
ELSE.
MESSAGE e000 WITH 'No consignment stock for material(s)'.
ENDIF.
ENDIF.
ELSE.
IF p_matnr IS INITIAL AND
p_werks IS INITIAL.
ELSE.
MESSAGE e000 WITH 'Enter Either Mass STOs or Material Move'.
ENDIF.
ENDIF.
START-OF-SELECTION.

IF s_werks IS INITIAL.
ELSE.
LOOP AT s_werks.
AUTHORITY-CHECK OBJECT 'M_BEST_WRK'
ID 'ACTVT' DUMMY
ID 'WERKS' FIELD s_werks-low.
IF sy-subrc <> 0.
MESSAGE e044(z2) WITH sy-uname 'is not Authorized'
'to Access Plant' s_werks-low.
ENDIF.
ENDLOOP.
ENDIF.

IF p_werks IS INITIAL.
ELSE.
AUTHORITY-CHECK OBJECT 'M_BEST_WRK'
ID 'ACTVT' DUMMY
ID 'WERKS' FIELD p_werks.
IF sy-subrc <> 0.
MESSAGE e044(z2) WITH sy-uname 'is not Authorized'
'to Access Plant' p_werks.
ENDIF.
ENDIF.

CLEAR program_exit.

IF material_move = 'X'.
PERFORM prepare_screen_200_matnr.
CLEAR screen_back.
PERFORM display_screen_200.
IF program_exit <> space.
EXIT.
ENDIF.

DELETE i_stk_cnv WHERE slabsconv <= 0.

CLEAR error_count.
PERFORM initial_posting_attempt USING 'N'.
LOOP AT i_stk_cnv INTO zmstk_cnv.
* PERFORM DO_POSTING USING 'N'. "already done above
IF zmstk_cnv-rc = 0.
PERFORM do_posting_2 USING 'N'.
ENDIF.
IF zmstk_cnv-rc = 0.
PERFORM do_posting_3 USING 'N'.
ENDIF.
MODIFY i_stk_cnv FROM zmstk_cnv.
ENDLOOP.
IF error_count = 0.
MESSAGE s525.
ELSE.
MESSAGE s526 WITH error_count.
ENDIF.

CALL SCREEN 300.


ELSE.

PERFORM build_sto_due_list.
IF program_exit <> space.
EXIT.
ENDIF.

MOVE 'X' TO screen_back.


WHILE screen_back <> space.
PERFORM display_sto_due_list.
IF program_exit <> space.
EXIT.
ENDIF.
PERFORM prepare_screen_200.
CLEAR screen_back.
PERFORM display_screen_200.
ENDWHILE.
IF program_exit <> space.
EXIT.
ENDIF.

DELETE i_stk_cnv WHERE slabsconv <= 0.

CLEAR error_count.
PERFORM initial_posting_attempt USING 'N'.
LOOP AT i_stk_cnv INTO zmstk_cnv.
* PERFORM DO_POSTING USING 'N'. "already done above
IF zmstk_cnv-rc = 0.
PERFORM do_posting_2 USING 'N'.
ENDIF.
IF zmstk_cnv-rc = 0.
PERFORM do_posting_3 USING 'N'.
ENDIF.
MODIFY i_stk_cnv FROM zmstk_cnv.
ENDLOOP.
IF error_count = 0.
MESSAGE s525.
ELSE.
MESSAGE s526 WITH error_count.
ENDIF.

CALL SCREEN 300.


ENDIF.

*---------------------------------------------------------------------*
* FORM BUILD_STO_DUE_LIST
*
*---------------------------------------------------------------------*
* ........
*
*---------------------------------------------------------------------*
FORM build_sto_due_list.

DATA: w_output_qty TYPE zmsto_due-lbkum.

*** Build the stock transport due list.


* SELECTING LBKUM, JUST TO HAVE THE VALUE AS SOMETHING
* OTHERWISE THE CALL FAILS. THE lbkum VALUE WILL BE
* DETERMINED LATER.
REFRESH i_sto_due.
SELECT vetvg~vstel vetvg~reswk ekpo~werks
vetvg~ledat vetvg~route
ekpo~matnr ekpo~menge ekpo~meins
ekpo~menge AS lbkum
ekpo~ebeln ekpo~ebelp ekpo~txz01
ekpo~untto "DEVK966931
FROM ( vetvg
INNER JOIN ekpv
ON ekpv~ebeln = vetvg~vbeln
AND ekpv~vstel = vetvg~vstel
AND ekpv~lprio = vetvg~lprio
AND ekpv~route = vetvg~route
AND ekpv~spdnr = vetvg~spdnr
AND ekpv~kunnr = vetvg~kunwe
INNER JOIN ekpo
ON ekpo~ebeln = ekpv~ebeln
AND ekpo~ebelp = ekpv~ebelp )
INTO TABLE i_sto_due
WHERE vetvg~vstel IN s_vstel
AND vetvg~ledat IN s_ledat
* AND VETVG~ROUTE IN S_ROUTE
* AND VETVG~RESWK IN S_RESWK
AND ekpv~ledat IN s_ledat
AND ekpo~werks IN s_werks
AND ekpo~matnr IN s_matnr
AND ekpo~loekz = space. "DV4K901885 sir 8906
DELETE i_sto_due WHERE matnr = space.
DELETE i_sto_due WHERE menge <= 0.
SORT i_sto_due BY reswk matnr ledat werks ebeln ebelp.
*** Late change: Per Sheri Gast-Graham, show only those STOs
*** for which there is some consignment stock
*** available. (Duplicate selects.)
LOOP AT i_sto_due INTO zmsto_due.
MOVE 'X' TO zmsto_due-sel_flag.
MODIFY i_sto_due FROM zmsto_due.
ENDLOOP.
PERFORM prepare_screen_200.
SORT i_stk_cnv BY matnr werks.
LOOP AT i_sto_due INTO zmsto_due.

AUTHORITY-CHECK OBJECT 'M_BEST_WRK'


ID 'ACTVT' DUMMY
ID 'WERKS' FIELD zmsto_due-werks.
IF sy-subrc <> 0.
DELETE i_sto_due.
CONTINUE.
ENDIF.

sy-subrc = 0.
READ TABLE i_stk_cnv INTO zmstk_cnv
WITH KEY matnr = zmsto_due-matnr
werks = zmsto_due-reswk
BINARY SEARCH.
IF sy-subrc <> 0.
DELETE i_sto_due.
CONTINUE.
ENDIF.

sy-subrc = 0.
READ TABLE i_stk_req INTO zmstk_req
WITH KEY matnr = zmsto_due-matnr
werks = zmsto_due-reswk
BINARY SEARCH.
IF sy-subrc <> 0.
zmsto_due-lbkum = 0.
ELSE.
zmsto_due-lbkum = zmstk_req-lbkum.
IF zmstk_req-meinsunrest = zmsto_due-meins.
ELSE.
CALL FUNCTION 'UNIT_CONVERSION_SIMPLE'
EXPORTING
input = zmsto_due-lbkum
* NO_TYPE_CHECK = 'X'
* ROUND_SIGN = ' '
unit_in = zmstk_req-meinsunrest
unit_out = zmsto_due-meins
IMPORTING
* ADD_CONST =
* DECIMALS =
* DENOMINATOR =
* NUMERATOR =
output = w_output_qty
EXCEPTIONS
OTHERS = 10.
IF sy-subrc <> 0.
zmsto_due-lbkum = 0.
ELSE.
zmsto_due-lbkum = w_output_qty.
ENDIF.
ENDIF.
ENDIF.

MODIFY i_sto_due FROM zmsto_due.


ENDLOOP.
LOOP AT i_sto_due INTO zmsto_due.
CLEAR zmsto_due-sel_flag.
MODIFY i_sto_due FROM zmsto_due.
ENDLOOP.
***
***
PERFORM check_sto_goods_issues. "DEVK966931
IF i_sto_due[] IS INITIAL.
MESSAGE s520.
MOVE 'X' TO program_exit.
ENDIF.

ENDFORM.

*---------------------------------------------------------------------*
* FORM DISPLAY_STO_DUE_LIST *
*---------------------------------------------------------------------*
* ........
*
*---------------------------------------------------------------------*
FORM display_sto_due_list.

*** Display the stock transport due list in a table control


*** so that the user can select which items he wishes to
*** process. All items are selected by default, but the
*** user can change this.
MOVE 'X' TO screen_back.
WHILE screen_back <> space.
CLEAR screen_back.
MOVE 'X' TO screen_cancelled.
CALL SCREEN 100.
IF screen_cancelled <> space.
MESSAGE s522.
MOVE 'X' TO program_exit.
EXIT.
ENDIF.
LOOP AT i_sto_due INTO zmsto_due WHERE sel_flag <> space.
ENDLOOP.
IF sy-subrc <> 0.
MESSAGE s521.
MOVE 'X' TO screen_back.
ENDIF.
ENDWHILE.

ENDFORM.

*---------------------------------------------------------------------*
* FORM PREPARE_SCREEN_200
*
*---------------------------------------------------------------------*
* ........
*
*---------------------------------------------------------------------*
FORM prepare_screen_200.

DATA: w_sonum(16) TYPE c,


w_lifnr_ext(10) TYPE c,
w_lifnr_int(10) TYPE c.

DATA: w_matnr LIKE marc-matnr,


w_werks LIKE marc-werks,
w_bstmi LIKE marc-bstmi,
w_bstrf LIKE marc-bstrf,
w_clabs LIKE mchb-clabs,
w_slabs LIKE mkol-slabs.

*** Copy the user-selected items of the stock transport due


*** list into a working table.
REFRESH temp_sto_due.
temp_sto_due[] = i_sto_due[].
DELETE temp_sto_due WHERE sel_flag = space.
SORT temp_sto_due BY matnr reswk.

*** Get the base unit of measure from MARA for all
*** materials selected by the user.
REFRESH i_sel_mara.
LOOP AT temp_sto_due.
MOVE temp_sto_due-matnr TO i_sel_mara-matnr.
APPEND i_sel_mara.
ENDLOOP.
SORT i_sel_mara BY matnr.
DELETE ADJACENT DUPLICATES FROM i_sel_mara COMPARING matnr.
REFRESH : i_mara, i_mbew.

IF NOT i_sel_mara[] IS INITIAL.


SELECT matnr meins
FROM mara
INTO TABLE i_mara
FOR ALL ENTRIES IN i_sel_mara
WHERE matnr = i_sel_mara-matnr.
SORT i_mara BY matnr.

ENDIF.

*** For each material/supplying plant, summarize the


*** quantity from all items selected by the user,
*** converting to base unit of measure.
REFRESH i_stk_req.
CLEAR: temp_matnr, temp_reswk, temp_meins, zmstk_req.
LOOP AT temp_sto_due.
IF temp_sto_due-matnr <> temp_matnr
OR temp_sto_due-reswk <> temp_reswk.
IF temp_matnr <> space.
CLEAR: w_bstmi,
w_bstrf.
SELECT SINGLE bstmi bstrf
INTO (w_bstmi, w_bstrf)
FROM marc
WHERE matnr = temp_matnr AND
werks = temp_reswk.

CLEAR w_clabs.
SELECT SUM( clabs ) INTO w_clabs
FROM mchb
WHERE matnr = temp_matnr AND
werks = temp_reswk AND
clabs > 0.

CLEAR w_slabs.
SELECT SUM( slabs )
INTO w_slabs
FROM mkol
WHERE matnr = temp_matnr AND
werks = temp_reswk AND
sobkz = 'K' AND
slabs > 0.
MOVE temp_matnr TO zmstk_req-matnr.
MOVE temp_reswk TO zmstk_req-werks.
MOVE temp_meins TO zmstk_req-meinsreq.
MOVE temp_meins TO zmstk_req-meinsavail.
MOVE w_bstmi TO zmstk_req-bstmi.
MOVE w_bstrf TO zmstk_req-bstrf.
MOVE w_clabs TO zmstk_req-clabs.
zmstk_req-total_stk = w_clabs + w_slabs.
APPEND zmstk_req TO i_stk_req.
CLEAR zmstk_req.
* ENDSELECT.
ENDIF.
ENDIF.

CLEAR i_mara.
READ TABLE i_mara
WITH KEY matnr = temp_sto_due-matnr
BINARY SEARCH.
temp_matnr = temp_sto_due-matnr.
temp_reswk = temp_sto_due-reswk.
temp_meins = i_mara-meins.
CLEAR: w_conv_qty, w_conv_uom.
PERFORM determine_uom_conversion
USING temp_sto_due-menge
temp_sto_due-meins
i_mara-matnr
i_mara-meins
CHANGING w_conv_qty
w_conv_uom.
ADD w_conv_qty TO zmstk_req-slabsreq.

ENDLOOP.

IF temp_matnr <> space.


CLEAR: w_bstmi,
w_bstrf.
SELECT SINGLE bstmi bstrf
INTO (w_bstmi, w_bstrf)
FROM marc
WHERE matnr = temp_matnr AND
werks = temp_reswk.

CLEAR w_clabs.
SELECT SUM( clabs )
INTO w_clabs
FROM mchb
WHERE matnr = temp_matnr AND
werks = temp_reswk AND
clabs > 0.

CLEAR w_slabs.
SELECT SUM( slabs )
INTO w_slabs
FROM mkol
WHERE matnr = temp_matnr AND
werks = temp_reswk AND
sobkz = 'K' AND
slabs > 0.
MOVE w_bstmi TO zmstk_req-bstmi.
MOVE w_bstrf TO zmstk_req-bstrf.
MOVE temp_matnr TO zmstk_req-matnr.
MOVE temp_reswk TO zmstk_req-werks.
MOVE temp_meins TO zmstk_req-meinsreq.
MOVE temp_meins TO zmstk_req-meinsavail.
MOVE w_clabs TO zmstk_req-clabs.
zmstk_req-total_stk = w_clabs + w_slabs.
APPEND zmstk_req TO i_stk_req.
CLEAR zmstk_req.
* ENDSELECT.
ENDIF.

*** Now get the available consignment stock batches:

*** Get the T320 config. table. This table maps each
*** plant/stor.loc. combination to a specific warehouse.
*** If a record does not exist in this table for a
*** particular plant/stor.loc., then it is not warehouse
*** managed, and we will get all stock from MKOL.
*** Also, if there is a record in T320 but T320-OBEST
*** is nonblank, then it is "light" warehouse management.
*** There will be no consignment quants, and so we'll still
*** want to get the stock from MKOL. Otherwise, if there's
*** a record in T320 and OBEST is blank, it's full warehouse
*** management, and we'll get the quants from LQUA.
REFRESH i_t320.
SELECT * FROM t320 INTO TABLE i_t320.
SORT i_t320 BY werks lgort.

*** Get consignment stock from MKOL.


REFRESH i_stk_mkol.
if i_stk_req[] is not initial.
SELECT matnr werks lgort charg lifnr
ersda slabs
FROM mkol
INTO TABLE i_stk_mkol
FOR ALL ENTRIES IN i_stk_req
WHERE matnr = i_stk_req-matnr
AND werks = i_stk_req-werks
AND sobkz = 'K'
AND slabs > 0.

SORT i_stk_mkol BY matnr werks lgort charg lifnr.


endif.

*** Get consignment stock quants from LQUA.


REFRESH i_stk_cnv.
if i_stk_req[] is not initial.
SELECT matnr werks lgort charg sonum
wdatu lgnum lgtyp lgpla verme meins
FROM lqua
INTO TABLE i_stk_cnv
FOR ALL ENTRIES IN i_stk_req
WHERE matnr = i_stk_req-matnr
AND werks = i_stk_req-werks
AND bestq = space
AND sobkz = 'K'
AND verme > 0
and lgtyp <> '916'
and lgtyp <> '902'.
endif.

*** Clear unselected fields (will be used later).


LOOP AT i_stk_cnv INTO zmstk_cnv.
CLEAR: zmstk_cnv-slabsconv,
zmstk_cnv-meinsconv,
zmstk_cnv-fixed,
zmstk_cnv-rc,
zmstk_cnv-icon,
zmstk_cnv-message,
zmstk_cnv-mblnr,
zmstk_cnv-tanum_1,
zmstk_cnv-tanum_2,
zmstk_cnv-temp_lgtyp,
zmstk_cnv-temp_lgpla.
MODIFY i_stk_cnv FROM zmstk_cnv.
ENDLOOP.

*** Get the creation date for each quant batch.


LOOP AT i_stk_cnv INTO zmstk_cnv.
CLEAR: w_sonum, w_lifnr_ext, w_lifnr_int.
WRITE zmstk_cnv-lifnr TO w_sonum
USING EDIT MASK '==ALPHA'.
MOVE w_sonum TO w_lifnr_ext.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = w_lifnr_ext
IMPORTING
output = w_lifnr_int.
CLEAR i_stk_mkol.
READ TABLE i_stk_mkol
WITH KEY matnr = zmstk_cnv-matnr
werks = zmstk_cnv-werks
lgort = zmstk_cnv-lgort
charg = zmstk_cnv-charg
lifnr = w_lifnr_int
BINARY SEARCH.
MOVE i_stk_mkol-ersda TO zmstk_cnv-ersda.
MODIFY i_stk_cnv FROM zmstk_cnv.
ENDLOOP.

*** Add to the quant table the batches from MKOL


*** where there's not warehouse management.
LOOP AT i_stk_mkol.
CLEAR i_t320.
sy-subrc = 0.
READ TABLE i_t320
WITH KEY werks = i_stk_mkol-werks
lgort = i_stk_mkol-lgort
BINARY SEARCH.
IF sy-subrc = 0
AND i_t320-obest = space.
* full warehouse management -- data already read from LQUA
ELSE.
CLEAR zmstk_cnv.
MOVE i_stk_mkol-matnr TO zmstk_cnv-matnr.
MOVE i_stk_mkol-werks TO zmstk_cnv-werks.
MOVE i_stk_mkol-lgort TO zmstk_cnv-lgort.
MOVE i_stk_mkol-charg TO zmstk_cnv-charg.
CLEAR w_sonum.
WRITE i_stk_mkol-lifnr TO w_sonum(10)
USING EDIT MASK '==ALPHA'.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = w_sonum
IMPORTING
output = zmstk_cnv-lifnr.
MOVE i_stk_mkol-ersda TO zmstk_cnv-ersda.
MOVE i_stk_mkol-slabs TO zmstk_cnv-slabsavail.
APPEND zmstk_cnv TO i_stk_cnv.
ENDIF.
ENDLOOP.

*** Sort consignment batches. Put oldest stock at the top so


*** we can get rid of first.
SORT i_stk_cnv BY matnr werks ersda lifnr charg slabsavail lgpla.

*** Units of measure: Use same unit for total qty.


*** and user-selected qty. Also, get base unit of measure
*** from MARA for data that originated in MKOL (non-WM).
LOOP AT i_stk_cnv INTO zmstk_cnv.
CLEAR i_mara.
READ TABLE i_mara
WITH KEY matnr = zmstk_cnv-matnr
BINARY SEARCH.
IF zmstk_cnv-lgnum IS INITIAL.
MOVE i_mara-meins TO zmstk_cnv-meinsavail.
ENDIF.
MOVE zmstk_cnv-meinsavail TO zmstk_cnv-meinsconv.
MODIFY i_stk_cnv FROM zmstk_cnv.
SELECT bstmi bstrf
INTO (w_bstmi, w_bstrf)
FROM marc
WHERE matnr = zmstk_cnv-matnr AND
werks = zmstk_cnv-werks.
MOVE w_bstmi TO zmstk_cnv-bstmi.
MOVE w_bstrf TO zmstk_cnv-bstrf.
MODIFY i_stk_cnv FROM zmstk_cnv.
ENDSELECT.
ENDLOOP.

*** Update the available consignemnt stock into I_STK_REQ.


LOOP AT i_stk_cnv INTO zmstk_cnv.

READ TABLE i_stk_req INTO zmstk_req


WITH KEY matnr = zmstk_cnv-matnr
werks = zmstk_cnv-werks
BINARY SEARCH.
CLEAR: w_conv_qty, w_conv_uom.

* MBEW does not take into account blocked stock

* select single lbkum from mbew into zmstk_req-lbkum


* where matnr = zmstk_cnv-matnr
* and bwkey = zmstk_cnv-werks.

CLEAR i_mard.
REFRESH i_mard.

SELECT lfgja lfmon SUM( labst ) AS labst


FROM mard INTO TABLE i_mard
* into zmstk_req-lbkum
WHERE matnr = zmstk_cnv-matnr
AND werks = zmstk_cnv-werks
GROUP by lfgja lfmon
ORDER BY lfgja lfmon.

CLEAR zmstk_req-lbkum.

SORT i_mard BY lfgja DESCENDING lfmon DESCENDING.

LOOP AT i_mard.
zmstk_req-lbkum = i_mard-labst.
EXIT.
ENDLOOP.

REFRESH : i_lqua. CLEAR : i_lqua.


SELECT matnr werks lgtyp einme verme FROM lqua INTO TABLE i_lqua
WHERE matnr = zmstk_cnv-matnr
AND werks = zmstk_cnv-werks
AND lgtyp = '916'.

CLEAR : lin, stk_916.


DESCRIBE TABLE i_lqua LINES lin.
IF lin > 0.
LOOP AT i_lqua.
stk_916 = stk_916 + i_lqua-einme + i_lqua-verme.

ENDLOOP.
ENDIF.

zmstk_req-lbkum = zmstk_req-lbkum - stk_916.

MOVE zmstk_req-meinsreq TO zmstk_req-meinsunrest.

PERFORM determine_uom_conversion
USING zmstk_cnv-slabsavail
zmstk_cnv-meinsavail
zmstk_cnv-matnr
zmstk_req-meinsreq
CHANGING w_conv_qty
w_conv_uom.
ADD w_conv_qty TO zmstk_req-slabsavail.
MODIFY i_stk_req FROM zmstk_req INDEX sy-tabix.
ENDLOOP.

*** Generate initial consignment stock conversion proposal.


*** The user can manipulate this later, in Screen 200.
* PERFORM GENERATE_STK_CONV_PROPOSAL.

ENDFORM.

*---------------------------------------------------------------------*
* FORM PREPARE_SCREEN_200_MATNR *
*---------------------------------------------------------------------*
* DO screen 200 for only one Material and plant *
*---------------------------------------------------------------------*
FORM prepare_screen_200_matnr.

REFRESH : i_mara, i_mbew.


REFRESH i_stk_req.
REFRESH i_stk_cnv.

SELECT matnr meins


INTO (temp_matnr, temp_meins)
FROM mara
WHERE matnr IN p_matnr.

CLEAR w_slabs.

SELECT SUM( slabs )


FROM mkol
INTO w_slabs
WHERE matnr = temp_matnr
AND werks = p_werks
AND sobkz = 'K'
AND slabs > 0.

REFRESH : i_lqua. CLEAR : i_lqua.

SELECT matnr werks lgtyp einme verme FROM lqua


INTO TABLE i_lqua
WHERE matnr = zmstk_cnv-matnr
AND werks = zmstk_cnv-werks
AND ( lgtyp = '916' or
lgtyp = '902' ).

CLEAR : lin, stk_916.


DESCRIBE TABLE i_lqua LINES lin.
IF lin > 0.
LOOP AT i_lqua.
stk_916 = stk_916 + i_lqua-einme + i_lqua-verme.
ENDLOOP.
ENDIF.

w_slabs = w_slabs - stk_916.

* Only want to build for materials that have consignment.


IF w_slabs > 0.
PERFORM get_each_material.
PERFORM get_material_consignment.
ENDIF.

ENDSELECT.
ENDFORM.

*---------------------------------------------------------------------*
* FORM GET_EACH_MATERIAL
*
*---------------------------------------------------------------------*
* ........
*
*---------------------------------------------------------------------*
FORM get_each_material.

*** For each material/supplying plant, summarize the


*** quantity from all items selected by the user,
*** converting to base unit of measure.
CLEAR: temp_reswk, zmstk_req.

* CLEAR: W_CONV_QTY, W_CONV_UOM.


* PERFORM DETERMINE_UOM_CONVERSION
* USING TEMP_STO_DUE-MENGE
* TEMP_STO_DUE-MEINS
* I_MARA-MATNR
* I_MARA-MEINS
* CHANGING W_CONV_QTY
* W_CONV_UOM.
* ADD W_CONV_QTY TO ZMSTK_REQ-SLABSREQ.

w_conv_qty = 0.
w_conv_uom = temp_meins.
temp_reswk = p_werks.

*Add min. lot size (bstmi) and rounding value (bstrf) "DV4K902364
IF temp_matnr = w_prev_matnr.
MOVE w_bstmi TO zmstk_req-bstmi.
MOVE w_bstrf TO zmstk_req-bstrf.

ELSE.
CLEAR: w_bstmi,
w_bstrf.
MOVE temp_matnr to w_prev_matnr.
SELECT SINGLE bstmi bstrf
INTO (w_bstmi, w_bstrf)
FROM marc
WHERE matnr = temp_matnr AND
werks = temp_reswk.
ENDIF.
MOVE w_bstmi TO zmstk_req-bstmi.
MOVE w_bstrf TO zmstk_req-bstrf.
*end of code "DV4K902364
MOVE temp_matnr TO zmstk_req-matnr.
MOVE temp_reswk TO zmstk_req-werks.
MOVE temp_meins TO zmstk_req-meinsreq.
MOVE temp_meins TO zmstk_req-meinsavail.
APPEND zmstk_req TO i_stk_req.
CLEAR zmstk_req.
ENDFORM.

*---------------------------------------------------------------------*
* FORM GET_MATERIAL_CONSIGNMENT *
*---------------------------------------------------------------------*
* ........
*
*---------------------------------------------------------------------*
FORM get_material_consignment.
*** Now get the available consignment stock batches:
DATA: w_sonum(16) TYPE c,
w_lifnr_ext(10) TYPE c,
w_lifnr_int(10) TYPE c.

*** Get the T320 config. table. This table maps each
*** plant/stor.loc. combination to a specific warehouse.
*** If a record does not exist in this table for a
*** particular plant/stor.loc., then it is not warehouse
*** managed, and we will get all stock from MKOL.
*** Also, if there is a record in T320 but T320-OBEST
*** is nonblank, then it is "light" warehouse management.
*** There will be no consignment quants, and so we'll still
*** want to get the stock from MKOL. Otherwise, if there's
*** a record in T320 and OBEST is blank, it's full warehouse
*** management, and we'll get the quants from LQUA.
REFRESH i_t320.
SELECT * FROM t320 INTO TABLE i_t320.
SORT i_t320 BY werks lgort.

*** Get consignment stock from MKOL.


REFRESH i_stk_mkol.
SELECT matnr werks lgort charg lifnr
ersda slabs
FROM mkol
INTO TABLE i_stk_mkol
FOR ALL ENTRIES IN i_stk_req
WHERE matnr = i_stk_req-matnr
AND werks = i_stk_req-werks
AND sobkz = 'K'
AND slabs > 0.
SORT i_stk_mkol BY matnr werks lgort charg lifnr.

*** Get consignment stock quants from LQUA.


SELECT matnr werks lgort charg sonum
wdatu lgnum lgtyp lgpla verme meins
FROM lqua
INTO TABLE i_stk_cnv
FOR ALL ENTRIES IN i_stk_req
WHERE matnr = i_stk_req-matnr
AND werks = i_stk_req-werks
AND bestq = space
AND sobkz = 'K'
and lgtyp <> '916'
and lgtyp <> '902'
AND verme > 0.

*** Clear unselected fields (will be used later).


LOOP AT i_stk_cnv INTO zmstk_cnv.
CLEAR: zmstk_cnv-slabsconv,
zmstk_cnv-meinsconv,
zmstk_cnv-fixed,
zmstk_cnv-rc,
zmstk_cnv-icon,
zmstk_cnv-message,
zmstk_cnv-mblnr,
zmstk_cnv-tanum_1,
zmstk_cnv-tanum_2,
zmstk_cnv-temp_lgtyp,
zmstk_cnv-temp_lgpla.
MODIFY i_stk_cnv FROM zmstk_cnv.
ENDLOOP.

*** Get the creation date for each quant batch.


LOOP AT i_stk_cnv INTO zmstk_cnv.
CLEAR: w_sonum, w_lifnr_ext, w_lifnr_int.
WRITE zmstk_cnv-lifnr TO w_sonum
USING EDIT MASK '==ALPHA'.
MOVE w_sonum TO w_lifnr_ext.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = w_lifnr_ext
IMPORTING
output = w_lifnr_int.
CLEAR i_stk_mkol.
READ TABLE i_stk_mkol
WITH KEY matnr = zmstk_cnv-matnr
werks = zmstk_cnv-werks
lgort = zmstk_cnv-lgort
charg = zmstk_cnv-charg
lifnr = w_lifnr_int
BINARY SEARCH.
MOVE i_stk_mkol-ersda TO zmstk_cnv-ersda.
MODIFY i_stk_cnv FROM zmstk_cnv.
ENDLOOP.

*** Add to the quant table the batches from MKOL


*** where there's not warehouse management.
LOOP AT i_stk_mkol.
CLEAR i_t320.
sy-subrc = 0.
READ TABLE i_t320
WITH KEY werks = i_stk_mkol-werks
lgort = i_stk_mkol-lgort
BINARY SEARCH.
IF sy-subrc = 0
AND i_t320-obest = space.
* full warehouse management -- data already read from LQUA
ELSE.
CLEAR zmstk_cnv.
MOVE i_stk_mkol-matnr TO zmstk_cnv-matnr.
MOVE i_stk_mkol-werks TO zmstk_cnv-werks.
MOVE i_stk_mkol-lgort TO zmstk_cnv-lgort.
MOVE i_stk_mkol-charg TO zmstk_cnv-charg.
CLEAR w_sonum.
WRITE i_stk_mkol-lifnr TO w_sonum(10)
USING EDIT MASK '==ALPHA'.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = w_sonum
IMPORTING
output = zmstk_cnv-lifnr.
MOVE i_stk_mkol-ersda TO zmstk_cnv-ersda.
MOVE i_stk_mkol-slabs TO zmstk_cnv-slabsavail.
APPEND zmstk_cnv TO i_stk_cnv.
ENDIF.
ENDLOOP.

*** Sort consignment batches. Put oldest stock at the top so


*** we can get rid of first.
SORT i_stk_cnv BY matnr werks ersda lifnr charg slabsavail lgpla.

*** Units of measure: Use same unit for total qty.


*** and user-selected qty. Also, get base unit of measure
*** from MARA for data that originated in MKOL (non-WM).
LOOP AT i_stk_cnv INTO zmstk_cnv.
CLEAR i_mara.
READ TABLE i_mara
WITH KEY matnr = zmstk_cnv-matnr
BINARY SEARCH.
IF zmstk_cnv-lgnum IS INITIAL.
MOVE i_mara-meins TO zmstk_cnv-meinsavail.
ENDIF.
MOVE zmstk_cnv-meinsavail TO zmstk_cnv-meinsconv.
MODIFY i_stk_cnv FROM zmstk_cnv.
ENDLOOP.

*Output min. lot size and rounding lot size in Material Move "DV4K902364
LOOP AT i_stk_cnv INTO zmstk_cnv.
READ TABLE i_stk_req INTO zmstk_req
WITH KEY matnr = zmstk_cnv-matnr
werks = zmstk_cnv-werks
BINARY SEARCH.
if sy-subrc = 0.
zmstk_cnv-bstmi = zmstk_req-bstmi.
zmstk_cnv-bstrf = zmstk_req-bstrf.
modify i_stk_cnv from zmstk_cnv TRANSPORTING bstrf bstmi.
endif.
endloop.

*** Update the available consignemnt stock into I_STK_REQ.


LOOP AT i_stk_cnv INTO zmstk_cnv.
READ TABLE i_stk_req INTO zmstk_req
WITH KEY matnr = zmstk_cnv-matnr
werks = zmstk_cnv-werks
BINARY SEARCH.
CLEAR: w_conv_qty, w_conv_uom.
* removed because MBEW has blocked stock in LBKUM
*
* select single lbkum from mbew into zmstk_req-lbkum
* where matnr = zmstk_cnv-matnr
* and bwkey = zmstk_cnv-werks.

CLEAR i_mard.
REFRESH i_mard.

SELECT lfgja lfmon SUM( labst ) AS labst


FROM mard INTO TABLE i_mard
* into zmstk_req-lbkum
WHERE matnr = zmstk_cnv-matnr
AND werks = zmstk_cnv-werks
GROUP by lfgja lfmon
ORDER BY lfgja lfmon.

CLEAR zmstk_req-lbkum.

SORT i_mard BY lfgja DESCENDING lfmon DESCENDING.

LOOP AT i_mard.
zmstk_req-lbkum = i_mard-labst.
EXIT.
ENDLOOP.

REFRESH : i_lqua. CLEAR : i_lqua.


SELECT matnr werks lgtyp einme verme FROM lqua INTO TABLE i_lqua
WHERE matnr = zmstk_cnv-matnr
AND werks = zmstk_cnv-werks
AND ( lgtyp = '916' or
lgtyp = '902' ).

CLEAR : lin, stk_916.


DESCRIBE TABLE i_lqua LINES lin.
IF lin > 0.
LOOP AT i_lqua.
stk_916 = stk_916 + i_lqua-einme + i_lqua-verme.

ENDLOOP.
ENDIF.

zmstk_req-lbkum = zmstk_req-lbkum - stk_916.

MOVE zmstk_req-meinsreq TO zmstk_req-meinsunrest.

PERFORM determine_uom_conversion
USING zmstk_cnv-slabsavail
zmstk_cnv-meinsavail
zmstk_cnv-matnr
zmstk_req-meinsreq
CHANGING w_conv_qty
w_conv_uom.
ADD w_conv_qty TO zmstk_req-slabsavail.
MODIFY i_stk_req FROM zmstk_req INDEX sy-tabix.
ENDLOOP.

*** Generate initial consignment stock conversion proposal.


*** The user can manipulate this later, in Screen 200.
* PERFORM GENERATE_STK_CONV_PROPOSAL.

ENDFORM.

*---------------------------------------------------------------------*
* FORM DISPLAY_SCREEN_200
*
*---------------------------------------------------------------------*
* ........
*
*---------------------------------------------------------------------*
FORM display_screen_200.

*** Display screen to allow user to review total


*** STO requirements, consignment stock availability,
*** and view and possibly override the conversion proposal.
MOVE 'X' TO screen_cancelled.
REFRESH CONTROL 'STK_R' FROM SCREEN '0200'.
REFRESH CONTROL 'STK_C' FROM SCREEN '0200'.
CALL SCREEN 200.
IF screen_cancelled <> space.
CLEAR screen_cancelled.
MOVE 'X' TO screen_back.
EXIT.
ENDIF.
LOOP AT i_stk_cnv INTO zmstk_cnv WHERE slabsconv > 0.
ENDLOOP.
IF sy-subrc <> 0.
MESSAGE s523.
MOVE 'X' TO screen_back.
ENDIF.

ENDFORM.

*---------------------------------------------------------------------*
* FORM CHECK_STO_GOODS_ISSUES *
*---------------------------------------------------------------------*
* ........
*
*---------------------------------------------------------------------*
FORM check_sto_goods_issues.

DATA: w_gi LIKE ekpo-menge,


w_min LIKE ekpo-menge.

LOOP AT i_sto_due INTO zmsto_due.


w_gi = 0.
SELECT ebeln ebelp zekkn vgabe gjahr belnr buzei
menge shkzg
FROM ekbe
INTO CORRESPONDING FIELDS OF ekbe
WHERE ebeln = zmsto_due-ebeln
AND ebelp = zmsto_due-ebelp
AND vgabe = '6'.
IF ekbe-shkzg = 'H'.
ADD ekbe-menge TO w_gi.
ELSE.
SUBTRACT ekbe-menge FROM w_gi.
ENDIF.
ENDSELECT.
w_min = zmsto_due-menge
- ( zmsto_due-untto * zmsto_due-menge / 100 ).
IF w_gi < w_min.
SUBTRACT w_gi FROM zmsto_due-menge.
MODIFY i_sto_due FROM zmsto_due.
ELSE.
DELETE i_sto_due.
ENDIF.
ENDLOOP.

ENDFORM.
*---------------------------------------------------------------------*
* FORM GENERATE_STK_CONV_PROPOSAL *
*---------------------------------------------------------------------*
* ........
*
*---------------------------------------------------------------------*
FORM generate_stk_conv_proposal.

*** Clear out batches whose quantity is not 'fixed'. These will
*** be re-proposed.
LOOP AT i_stk_cnv INTO zmstk_cnv WHERE fixed = space.
CLEAR zmstk_cnv-slabsconv.
MODIFY i_stk_cnv FROM zmstk_cnv.
ENDLOOP.

*** Compute the net requirement (total req - fixed user entries)
*** Then go batch-by-batch and apply the requirements to actual
*** batches.
LOOP AT i_stk_req INTO zmstk_req.
LOOP AT i_stk_cnv INTO zmstk_cnv
WHERE matnr = zmstk_req-matnr
AND werks = zmstk_req-werks
AND fixed <> space.
SUBTRACT zmstk_cnv-slabsconv FROM zmstk_req-slabsreq.
ENDLOOP.
CHECK zmstk_req-slabsreq > 0.
LOOP AT i_stk_cnv INTO zmstk_cnv
WHERE matnr = zmstk_req-matnr
AND werks = zmstk_req-werks
AND fixed = space.
IF zmstk_cnv-slabsavail < zmstk_req-slabsreq.
MOVE zmstk_cnv-slabsavail TO zmstk_cnv-slabsconv.
ELSE.
MOVE zmstk_req-slabsreq TO zmstk_cnv-slabsconv.
ENDIF.
SUBTRACT zmstk_cnv-slabsconv FROM zmstk_req-slabsreq.
MODIFY i_stk_cnv FROM zmstk_cnv.
ENDLOOP.
ENDLOOP.

ENDFORM.

*---------------------------------------------------------------------*
* FORM INITIAL_POSTING_ATTEMPT *
*---------------------------------------------------------------------*
* In the initial posting attempt, consolidate similar *
* MB1B 411-K's into a single document as multiple line items. *
*---------------------------------------------------------------------*
* --> P_MODE
*
*---------------------------------------------------------------------*
FORM initial_posting_attempt USING p_mode TYPE c.

DATA: BEGIN OF i_xfer_doc OCCURS 0,


matnr LIKE zmstk_cnv-matnr,
werks LIKE zmstk_cnv-werks,
lgort LIKE zmstk_cnv-lgort,
lifnr LIKE zmstk_cnv-lifnr,
meinsconv LIKE zmstk_cnv-meinsconv,
END OF i_xfer_doc.

DATA: w_mode(1) TYPE c,


w_matnr(18) TYPE c,
w_erfmg(18) TYPE c,
w_erfme(3) TYPE c,
w_lifnr(10) TYPE c,
w_comment(18) TYPE c.

DATA: w_msgno(3) TYPE c,


w_mblnr(10) TYPE c.

DATA: BEGIN OF i_mkpf OCCURS 0,


mblnr LIKE mkpf-mblnr,
mjahr LIKE mkpf-mjahr,
END OF i_mkpf.

REFRESH i_xfer_doc.

LOOP AT i_stk_cnv INTO zmstk_cnv.


MOVE-CORRESPONDING zmstk_cnv TO i_xfer_doc.
APPEND i_xfer_doc.
ENDLOOP.

SORT i_xfer_doc BY matnr werks lgort lifnr meinsconv.


DELETE ADJACENT DUPLICATES FROM i_xfer_doc
COMPARING matnr werks lgort lifnr meinsconv.

LOOP AT i_xfer_doc.

CLEAR: w_mode, w_matnr, w_erfme, w_lifnr.


MOVE p_mode TO w_mode.
WRITE i_xfer_doc-matnr TO w_matnr USING EDIT MASK '==MATN1'.
WRITE i_xfer_doc-meinsconv TO w_erfme USING EDIT MASK '==CUNIT'.
WRITE i_xfer_doc-lifnr TO w_lifnr USING EDIT MASK '==ALPHA'.

REFRESH bdcdata.
PERFORM bdc_dynpro USING: 'SAPMM07M' '0400'.
PERFORM bdc_field USING: 'RM07M-BWARTWA' '411',
'RM07M-SOBKZ' 'K',
'RM07M-WERKS' i_xfer_doc-werks,
'RM07M-GRUND' space,
'RM07M-LGORT' i_xfer_doc-lgort,
'XFULL' space.

LOOP AT i_stk_cnv INTO zmstk_cnv


WHERE matnr = i_xfer_doc-matnr
AND werks = i_xfer_doc-werks
AND lgort = i_xfer_doc-lgort
AND lifnr = i_xfer_doc-lifnr
AND meinsconv = i_xfer_doc-meinsconv.

CLEAR: w_erfmg, w_comment.


WRITE zmstk_cnv-slabsconv TO w_erfmg unit zmstk_cnv-meinsconv.
SHIFT w_erfmg LEFT DELETING LEADING space.
IF NOT zmstk_cnv-lgnum IS INITIAL.
MOVE zmstk_cnv-lgnum TO w_comment+0(3).
MOVE '/' TO w_comment+3(1).
MOVE zmstk_cnv-lgtyp TO w_comment+4(3).
MOVE '/' TO w_comment+7(1).
MOVE zmstk_cnv-lgpla TO w_comment+8(10).
ENDIF.

PERFORM bdc_field USING: 'BDC_OKCODE' '=NPE'.


PERFORM bdc_dynpro USING: 'SAPMM07M' '0410'.
PERFORM bdc_field USING: 'MSEG-MATNR' w_matnr,
'MSEG-ERFMG' w_erfmg,
'MSEG-ERFME' w_erfme,
'MSEG-WERKS' zmstk_cnv-werks,
'MSEG-LGORT' zmstk_cnv-lgort,
'MSEG-CHARG' zmstk_cnv-charg,
'MSEG-LIFNR' w_lifnr,
'MSEG-SGTXT' w_comment.

ENDLOOP.
CLEAR zmstk_cnv.

PERFORM bdc_field USING: 'BDC_OKCODE' '=BU'.

sy-subrc = 0.
CALL TRANSACTION 'MB1B' USING bdcdata
MODE w_mode UPDATE 'S'.
MOVE sy-subrc TO zmstk_cnv-rc.
IF zmstk_cnv-rc <> 0.
MOVE 1001 TO zmstk_cnv-rc.
ENDIF.
CLEAR zmstk_cnv-message.
MOVE sy-msgno TO w_msgno.
CALL FUNCTION 'RH_MESSAGE_GET'
EXPORTING
arbgb = sy-msgid
msgnr = w_msgno
msgv1 = sy-msgv1
msgv2 = sy-msgv2
msgv3 = sy-msgv3
msgv4 = sy-msgv4
IMPORTING
msgtext = zmstk_cnv-message
EXCEPTIONS
message_not_found = 1
OTHERS = 2.
IF zmstk_cnv-rc = 0.
MOVE icon_green_light TO zmstk_cnv-icon.
ELSE.
MOVE icon_red_light TO zmstk_cnv-icon.
ADD 1 TO error_count.
ENDIF.
CLEAR: zmstk_cnv-mblnr,
zmstk_cnv-tanum_1,
zmstk_cnv-tanum_2,
zmstk_cnv-temp_lgtyp,
zmstk_cnv-temp_lgpla.
IF zmstk_cnv-rc = 0.
CLEAR w_mblnr.
MOVE sy-msgv1 TO w_mblnr.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = w_mblnr
IMPORTING
output = zmstk_cnv-mblnr.
REFRESH i_mkpf.
SELECT mblnr mjahr
FROM mkpf
INTO TABLE i_mkpf
WHERE mblnr = zmstk_cnv-mblnr.
SORT i_mkpf BY mjahr DESCENDING.
IF NOT i_mkpf[] IS INITIAL.
READ TABLE i_mkpf INDEX 1.
SELECT SINGLE lgtyp lgpla
FROM mseg
INTO (zmstk_cnv-temp_lgtyp, zmstk_cnv-temp_lgpla)
WHERE mblnr = i_mkpf-mblnr
AND mjahr = i_mkpf-mjahr
AND zeile = '0001'.
ENDIF.
ENDIF.

MODIFY i_stk_cnv FROM zmstk_cnv


TRANSPORTING rc icon message
mblnr tanum_1 tanum_2
temp_lgtyp temp_lgpla
WHERE matnr = i_xfer_doc-matnr
AND werks = i_xfer_doc-werks
AND lgort = i_xfer_doc-lgort
AND lifnr = i_xfer_doc-lifnr
AND meinsconv = i_xfer_doc-meinsconv.
ENDLOOP.

LOOP AT i_stk_cnv INTO zmstk_cnv


WHERE rc <> 0.
ADD 1 TO error_count.
ENDLOOP.

CLEAR zmstk_cnv.

ENDFORM.

*---------------------------------------------------------------------*
* FORM DO_POSTING
*
*---------------------------------------------------------------------*
* First posting: Inventory Management transfer posting, movement *
* type 411 K, via transaction MB1B *
*---------------------------------------------------------------------*
* --> P_MODE
*
*---------------------------------------------------------------------*
FORM do_posting USING p_mode TYPE c.

DATA: w_mode(1) TYPE c,


w_matnr(18) TYPE c,
w_erfmg(18) TYPE c,
w_erfme(3) TYPE c,
w_lifnr(10) TYPE c,
w_comment(18) TYPE c.

DATA: w_msgno(3) TYPE c,


w_mblnr(10) TYPE c.

DATA: BEGIN OF i_mkpf OCCURS 0,


mblnr LIKE mkpf-mblnr,
mjahr LIKE mkpf-mjahr,
END OF i_mkpf.

CLEAR: w_mode, w_matnr, w_erfmg, w_erfme, w_lifnr, w_comment.

MOVE p_mode TO w_mode.


WRITE zmstk_cnv-matnr TO w_matnr USING EDIT MASK '==MATN1'.
WRITE zmstk_cnv-slabsconv TO w_erfmg unit zmstk_cnv-meinsconv.
SHIFT w_erfmg LEFT DELETING LEADING space.
WRITE zmstk_cnv-meinsconv TO w_erfme USING EDIT MASK '==CUNIT'.
WRITE zmstk_cnv-lifnr TO w_lifnr USING EDIT MASK '==ALPHA'.
IF NOT zmstk_cnv-lgnum IS INITIAL.
MOVE zmstk_cnv-lgnum TO w_comment+0(3).
MOVE '/' TO w_comment+3(1).
MOVE zmstk_cnv-lgtyp TO w_comment+4(3).
MOVE '/' TO w_comment+7(1).
MOVE zmstk_cnv-lgpla TO w_comment+8(10).
ENDIF.

REFRESH bdcdata.

PERFORM bdc_dynpro USING: 'SAPMM07M' '0400'.


PERFORM bdc_field USING: 'RM07M-BWARTWA' '411',
'RM07M-SOBKZ' 'K',
'RM07M-WERKS' zmstk_cnv-werks,
'RM07M-GRUND' space,
'RM07M-LGORT' zmstk_cnv-lgort,
'XFULL' space,
'BDC_OKCODE' '=NPE'.

PERFORM bdc_dynpro USING: 'SAPMM07M' '0410'.


PERFORM bdc_field USING: 'MSEG-MATNR' w_matnr,
'MSEG-ERFMG' w_erfmg,
'MSEG-ERFME' w_erfme,
'MSEG-WERKS' zmstk_cnv-werks,
'MSEG-LGORT' zmstk_cnv-lgort,
'MSEG-CHARG' zmstk_cnv-charg,
'MSEG-LIFNR' w_lifnr,
'MSEG-SGTXT' w_comment,
'BDC_OKCODE' '=BU'.

sy-subrc = 0.
CALL TRANSACTION 'MB1B' USING bdcdata
MODE w_mode UPDATE 'S'.
MOVE sy-subrc TO zmstk_cnv-rc.
IF zmstk_cnv-rc <> 0.
MOVE 1001 TO zmstk_cnv-rc.
ENDIF.
CLEAR zmstk_cnv-message.
MOVE sy-msgno TO w_msgno.
CALL FUNCTION 'RH_MESSAGE_GET'
EXPORTING
arbgb = sy-msgid
msgnr = w_msgno
msgv1 = sy-msgv1
msgv2 = sy-msgv2
msgv3 = sy-msgv3
msgv4 = sy-msgv4
IMPORTING
msgtext = zmstk_cnv-message
EXCEPTIONS
message_not_found = 1
OTHERS = 2.
IF zmstk_cnv-rc = 0.
MOVE icon_green_light TO zmstk_cnv-icon.
ELSE.
MOVE icon_red_light TO zmstk_cnv-icon.
ADD 1 TO error_count.
ENDIF.
CLEAR: zmstk_cnv-mblnr,
zmstk_cnv-tanum_1,
zmstk_cnv-tanum_2,
zmstk_cnv-temp_lgtyp,
zmstk_cnv-temp_lgpla.
IF zmstk_cnv-rc = 0.
CLEAR w_mblnr.
MOVE sy-msgv1 TO w_mblnr.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = w_mblnr
IMPORTING
output = zmstk_cnv-mblnr.
REFRESH i_mkpf.
SELECT mblnr mjahr
FROM mkpf
INTO TABLE i_mkpf
WHERE mblnr = zmstk_cnv-mblnr.
SORT i_mkpf BY mjahr DESCENDING.
IF NOT i_mkpf[] IS INITIAL.
READ TABLE i_mkpf INDEX 1.
SELECT SINGLE lgtyp lgpla
FROM mseg
INTO (zmstk_cnv-temp_lgtyp, zmstk_cnv-temp_lgpla)
WHERE mblnr = i_mkpf-mblnr
AND mjahr = i_mkpf-mjahr
AND zeile = '0001'.
ENDIF.
ENDIF.

ENDFORM.

*---------------------------------------------------------------------*
* FORM DO_POSTING_2
*
*---------------------------------------------------------------------*
* Second posting: Warehouse management transfer order, movement type *
* 999 K, via transaction LT01. *
*---------------------------------------------------------------------*
* --> P_MODE
*
*---------------------------------------------------------------------*
FORM do_posting_2 USING p_mode TYPE c.

DATA: w_mode(1) TYPE c,


w_matnr(18) TYPE c,
w_erfmg(18) TYPE c,
w_erfme(3) TYPE c,
w_lifnr(10) TYPE c.

DATA: w_msgno(3) TYPE c,


w_tanum(10) TYPE c.
DATA: BEGIN OF i_mkpf OCCURS 0,
mblnr LIKE mkpf-mblnr,
mjahr LIKE mkpf-mjahr,
END OF i_mkpf.

*** Do only for full warehouse management (quants from LQUA).


CHECK: NOT zmstk_cnv-lgnum IS INITIAL.

CLEAR: w_mode, w_matnr, w_erfmg, w_erfme, w_lifnr.

MOVE p_mode TO w_mode.


WRITE zmstk_cnv-matnr TO w_matnr USING EDIT MASK '==MATN1'.
WRITE zmstk_cnv-slabsconv TO w_erfmg unit zmstk_cnv-meinsconv.
SHIFT w_erfmg LEFT DELETING LEADING space.
WRITE zmstk_cnv-meinsconv TO w_erfme USING EDIT MASK '==CUNIT'.
WRITE zmstk_cnv-lifnr TO w_lifnr USING EDIT MASK '==ALPHA'.

REFRESH bdcdata.

PERFORM bdc_dynpro USING: 'SAPML03T' '0101'.


PERFORM bdc_field USING: 'LTAK-LGNUM' zmstk_cnv-lgnum,
'LTAK-BWLVS' '999',
'LTAP-MATNR' w_matnr,
'RL03T-ANFME' w_erfmg,
'LTAP-ALTME' w_erfme,
'LTAP-WERKS' zmstk_cnv-werks,
'LTAP-LGORT' zmstk_cnv-lgort,
'LTAP-SOBKZ' 'K',
'RL03T-LSONR' w_lifnr,
'LTAP-CHARG' zmstk_cnv-charg,
'RL03T-DUNKL' 'H',
'BDC_OKCODE' '=TAE'.

PERFORM bdc_dynpro USING: 'SAPML03T' '0102'.


PERFORM bdc_field USING: 'LTAP-VLTYP' zmstk_cnv-lgtyp,
'LTAP-VLPLA' zmstk_cnv-lgpla,
'LTAP-NLTYP' zmstk_cnv-temp_lgtyp,
'LTAP-NLPLA' zmstk_cnv-temp_lgpla,
'BDC_OKCODE' '/00'.

CLEAR: sy-msgid, sy-msgty, sy-msgno,


sy-msgv1, sy-msgv2, sy-msgv3, sy-msgv4.
sy-subrc = 0.
CALL TRANSACTION 'LT01' USING bdcdata
MODE w_mode UPDATE 'S'.
MOVE sy-subrc TO zmstk_cnv-rc.
IF zmstk_cnv-rc <> 0.
MOVE 1002 TO zmstk_cnv-rc.
ENDIF.
CLEAR zmstk_cnv-message.
MOVE sy-msgno TO w_msgno.
CALL FUNCTION 'RH_MESSAGE_GET'
EXPORTING
arbgb = sy-msgid
msgnr = w_msgno
msgv1 = sy-msgv1
msgv2 = sy-msgv2
msgv3 = sy-msgv3
msgv4 = sy-msgv4
IMPORTING
msgtext = zmstk_cnv-message
EXCEPTIONS
message_not_found = 1
OTHERS = 2.
IF zmstk_cnv-rc = 0.
MOVE icon_green_light TO zmstk_cnv-icon.
ELSE.
MOVE icon_red_light TO zmstk_cnv-icon.
ADD 1 TO error_count.
ENDIF.
IF zmstk_cnv-rc = 0.
CLEAR w_tanum.
MOVE sy-msgv1 TO w_tanum.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = w_tanum
IMPORTING
output = zmstk_cnv-tanum_1.
ENDIF.

ENDFORM.

*---------------------------------------------------------------------*
* FORM DO_POSTING_3
*
*---------------------------------------------------------------------*
* Third posting: Warehouse management transfer order, movement type *
* 999, via transaction LT01.
*
*---------------------------------------------------------------------*
* --> P_MODE
*
*---------------------------------------------------------------------*
FORM do_posting_3 USING p_mode TYPE c.

DATA: w_mode(1) TYPE c,


w_matnr(18) TYPE c,
w_erfmg(18) TYPE c,
w_erfme(3) TYPE c,
w_lifnr(10) TYPE c.

DATA: w_msgno(3) TYPE c,


w_tanum(10) TYPE c.
DATA: BEGIN OF i_mkpf OCCURS 0,
mblnr LIKE mkpf-mblnr,
mjahr LIKE mkpf-mjahr,
END OF i_mkpf.

*** Do only for full warehouse management (quants from LQUA).


CHECK: NOT zmstk_cnv-lgnum IS INITIAL.
"DEVK971355
CLEAR ltap. "DEVK971355
SELECT SINGLE * FROM ltap "DEVK971355
WHERE lgnum = zmstk_cnv-lgnum "DEVK971355
AND tanum = zmstk_cnv-tanum_1. "DEVK971355

CLEAR: w_mode, w_matnr, w_erfmg, w_erfme, w_lifnr.

MOVE p_mode TO w_mode.


WRITE zmstk_cnv-matnr TO w_matnr USING EDIT MASK '==MATN1'.
WRITE zmstk_cnv-slabsconv TO w_erfmg unit zmstk_cnv-meinsconv.
SHIFT w_erfmg LEFT DELETING LEADING space.
WRITE zmstk_cnv-meinsconv TO w_erfme USING EDIT MASK '==CUNIT'.
WRITE zmstk_cnv-lifnr TO w_lifnr USING EDIT MASK '==ALPHA'.

REFRESH bdcdata.

PERFORM bdc_dynpro USING: 'SAPML03T' '0101'.


PERFORM bdc_field USING: 'LTAK-LGNUM' zmstk_cnv-lgnum,
'LTAK-BWLVS' '999',
'LTAP-MATNR' w_matnr,
'LTAP-LETYP' ltap-letyp, "DEVK971355
'RL03T-ANFME' w_erfmg,
'LTAP-ALTME' w_erfme,
'LTAP-WERKS' zmstk_cnv-werks,
'LTAP-LGORT' zmstk_cnv-lgort,
'LTAP-SOBKZ' space,
'RL03T-LSONR' space,
'LTAP-CHARG' zmstk_cnv-charg,
'RL03T-DUNKL' 'H',
'BDC_OKCODE' '=TAE'.

PERFORM bdc_dynpro USING: 'SAPML03T' '0102'.


PERFORM bdc_field USING: 'LTAP-VLTYP' zmstk_cnv-temp_lgtyp,
'LTAP-VLPLA' zmstk_cnv-temp_lgpla,
'LTAP-NLTYP' zmstk_cnv-lgtyp,
'LTAP-NLPLA' zmstk_cnv-lgpla,
'BDC_OKCODE' '/00'.

CLEAR: sy-msgid, sy-msgty, sy-msgno,


sy-msgv1, sy-msgv2, sy-msgv3, sy-msgv4.
sy-subrc = 0.
CALL TRANSACTION 'LT01' USING bdcdata
MODE w_mode UPDATE 'S'.
MOVE sy-subrc TO zmstk_cnv-rc.
IF zmstk_cnv-rc <> 0.
MOVE 1003 TO zmstk_cnv-rc.
ENDIF.
CLEAR zmstk_cnv-message.
MOVE sy-msgno TO w_msgno.
CALL FUNCTION 'RH_MESSAGE_GET'
EXPORTING
arbgb = sy-msgid
msgnr = w_msgno
msgv1 = sy-msgv1
msgv2 = sy-msgv2
msgv3 = sy-msgv3
msgv4 = sy-msgv4
IMPORTING
msgtext = zmstk_cnv-message
EXCEPTIONS
message_not_found = 1
OTHERS = 2.
IF zmstk_cnv-rc = 0.
MOVE icon_green_light TO zmstk_cnv-icon.
ELSE.
MOVE icon_red_light TO zmstk_cnv-icon.
ADD 1 TO error_count.
ENDIF.
IF zmstk_cnv-rc = 0.
CLEAR w_tanum.
MOVE sy-msgv1 TO w_tanum.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = w_tanum
IMPORTING
output = zmstk_cnv-tanum_2.
ENDIF.

IF zmstk_cnv-rc = 0.
CLEAR zmstk_cnv-message.
MOVE '527' TO w_msgno.
CALL FUNCTION 'RH_MESSAGE_GET'
EXPORTING
arbgb = 'Z1'
msgnr = w_msgno
msgv1 = zmstk_cnv-mblnr
msgv2 = zmstk_cnv-tanum_1
msgv3 = zmstk_cnv-tanum_2
msgv4 = space
IMPORTING
msgtext = zmstk_cnv-message
EXCEPTIONS
message_not_found = 1
OTHERS = 2.
ENDIF.
** KIRKCH - MM3644 - Update quant date to match original
** consignment create date - Proj.3826 -
** done Dec 2007.
IF zmstk_cnv-rc = 0.
Clear W_NLQNR.
Select NLQNR from LTAP
into W_NLQNR
where LGNUM = zmstk_cnv-lgnum
and TANUM = zmstk_cnv-tanum_2.
endselect.
If sy-subrc = 0.
UPDATE LQUA
SET WDATU = zmstk_cnv-ersda
WENUM = zmstk_cnv-mblnr
where LGNUM = zmstk_cnv-lgnum
and LQNUM = W_NLQNR.

ENDIF.
ENDIF.
** End of KIRKCH - MM3644.

ENDFORM.

*---------------------------------------------------------------------*
* FORM BDC_DYNPRO
*
*---------------------------------------------------------------------*
* ........
*
*---------------------------------------------------------------------*
* --> P_PROGRAM
*
* --> P_DYNPRO
*
*---------------------------------------------------------------------*
FORM bdc_dynpro USING p_program p_dynpro.

CLEAR bdcdata.
MOVE p_program TO bdcdata-program.
MOVE p_dynpro TO bdcdata-dynpro.
MOVE 'X' TO bdcdata-dynbegin.
APPEND bdcdata.
CLEAR bdcdata.

ENDFORM.

*---------------------------------------------------------------------*
* FORM BDC_FIELD
*
*---------------------------------------------------------------------*
* ........
*
*---------------------------------------------------------------------*
* --> P_FNAM
*
* --> P_FVAL
*
*---------------------------------------------------------------------*
FORM bdc_field USING p_fnam p_fval.

CLEAR bdcdata.
MOVE p_fnam TO bdcdata-fnam.
MOVE p_fval TO bdcdata-fval.
APPEND bdcdata.
CLEAR bdcdata.

ENDFORM.

INCLUDE zyx_uom_convert.

* OUTPUT MODULE FOR TABLECONTROL 'STO_D':


* GET LINES OF TABLECONTROL
MODULE sto_d_get_lines OUTPUT.
g_sto_d_lines = sy-loopc.
ENDMODULE.

* INPUT MODULE FOR TABLECONTROL 'STO_D': MARK TABLE


MODULE sto_d_mark INPUT.
MODIFY i_sto_due
FROM zmsto_due
INDEX sto_d-current_line
TRANSPORTING sel_flag.
ENDMODULE.

* INPUT MODULE FOR TABLECONTROL 'STO_D': PROCESS USER COMMAND


MODULE sto_d_user_command INPUT.
PERFORM user_ok_tc USING 'STO_D'
'I_STO_DUE'
'SEL_FLAG'
CHANGING ok_code.
ENDMODULE.

*&---------------------------------------------------------------------*
*& Form USER_OK_TC
*
*&---------------------------------------------------------------------*
FORM user_ok_tc USING p_tc_name TYPE dynfnam
p_table_name
p_mark_name
CHANGING p_ok LIKE sy-ucomm.

*-BEGIN OF LOCAL DATA--------------------------------------------------*


DATA: l_ok TYPE sy-ucomm,
l_offset TYPE i.
*-END OF LOCAL DATA----------------------------------------------------*

* Table control specific operations


*
* evaluate TC name and operations
*
SEARCH p_ok FOR p_tc_name.
IF sy-subrc <> 0.
EXIT.
ENDIF.
l_offset = strlen( p_tc_name ) + 1.
l_ok = p_ok+l_offset.
* execute general and TC specific operations *
CASE l_ok.
WHEN 'INSR'. "insert row
PERFORM fcode_insert_row USING p_tc_name
p_table_name.
CLEAR p_ok.

WHEN 'DELE'. "delete row


PERFORM fcode_delete_row USING p_tc_name
p_table_name
p_mark_name.
CLEAR p_ok.

WHEN 'P--' OR "top of list


'P-' OR "previous page
'P+' OR "next page
'P++'. "bottom of list
PERFORM compute_scrolling_in_tc USING p_tc_name
l_ok.
CLEAR p_ok.
* WHEN 'L--'. "total left
* PERFORM FCODE_TOTAL_LEFT USING P_TC_NAME.
*
* WHEN 'L-'. "column left
* PERFORM FCODE_COLUMN_LEFT USING P_TC_NAME.
*
* WHEN 'R+'. "column right
* PERFORM FCODE_COLUMN_RIGHT USING P_TC_NAME.
*
* WHEN 'R++'. "total right
* PERFORM FCODE_TOTAL_RIGHT USING P_TC_NAME.
*
WHEN 'MARK'. "mark all filled lines
PERFORM fcode_tc_mark_lines USING p_tc_name
p_table_name
p_mark_name .
CLEAR p_ok.
WHEN 'DMRK'. "demark all filled lines
PERFORM fcode_tc_demark_lines USING p_tc_name
p_table_name
p_mark_name .
CLEAR p_ok.

* WHEN 'SASCEND' OR
* 'SDESCEND'. "sort column
* PERFORM FCODE_SORT_TC USING P_TC_NAME
* l_ok.

ENDCASE.

ENDFORM. " USER_OK_TC

*&---------------------------------------------------------------------*
*& Form FCODE_INSERT_ROW
*
*&---------------------------------------------------------------------*
FORM fcode_insert_row
USING p_tc_name TYPE dynfnam
p_table_name .

*-BEGIN OF LOCAL DATA--------------------------------------------------*


DATA l_lines_name LIKE feld-name.
DATA l_selline LIKE sy-stepl.
DATA l_lastline TYPE i.
DATA l_line TYPE i.
DATA l_table_name LIKE feld-name.
FIELD-SYMBOLS <tc> TYPE cxtab_control.
FIELD-SYMBOLS <table> TYPE STANDARD TABLE.
FIELD-SYMBOLS <lines> TYPE i.
*-END OF LOCAL DATA----------------------------------------------------*

ASSIGN (p_tc_name) TO <tc>.

* get the table, which belongs to the tc *


CONCATENATE p_table_name '[]' INTO l_table_name. "table body
ASSIGN (l_table_name) TO <table>. "not headerline

* get looplines of TableControl


CONCATENATE 'G_' p_tc_name '_LINES' INTO l_lines_name.
ASSIGN (l_lines_name) TO <lines>.

* get current line


GET CURSOR LINE l_selline.
IF sy-subrc <> 0. " append line to table
l_selline = <tc>-lines + 1.
* set top line and new cursor line
*
IF l_selline > <lines>.
<tc>-top_line = l_selline - <lines> + 1 .
l_line = 1.
ELSE.
<tc>-top_line = 1.
l_line = l_selline.
ENDIF.
ELSE. " insert line into table
l_selline = <tc>-top_line + l_selline - 1.
* set top line and new cursor line
*
l_lastline = l_selline + <lines> - 1.
IF l_lastline <= <tc>-lines.
<tc>-top_line = l_selline.
l_line = 1.
ELSEIF <lines> > <tc>-lines.
<tc>-top_line = 1.
l_line = l_selline.
ELSE.
<tc>-top_line = <tc>-lines - <lines> + 2 .
l_line = l_selline - <tc>-top_line + 1.
ENDIF.
ENDIF.
* insert initial line
INSERT INITIAL LINE INTO <table> INDEX l_selline.
<tc>-lines = <tc>-lines + 1.
* set cursor
SET CURSOR LINE l_line.

ENDFORM. " FCODE_INSERT_ROW

*&---------------------------------------------------------------------*
*& Form FCODE_DELETE_ROW
*
*&---------------------------------------------------------------------*
FORM fcode_delete_row
USING p_tc_name TYPE dynfnam
p_table_name
p_mark_name .

*-BEGIN OF LOCAL DATA--------------------------------------------------*


DATA l_table_name LIKE feld-name.

FIELD-SYMBOLS <tc> TYPE cxtab_control.


FIELD-SYMBOLS <table> TYPE STANDARD TABLE.
FIELD-SYMBOLS <wa>.
FIELD-SYMBOLS <mark_field>.
*-END OF LOCAL DATA----------------------------------------------------*

ASSIGN (p_tc_name) TO <tc>.

* get the table, which belongs to the tc *


CONCATENATE p_table_name '[]' INTO l_table_name. "table body
ASSIGN (l_table_name) TO <table>. "not headerline
* delete marked lines
*
DESCRIBE TABLE <table> LINES <tc>-lines.

LOOP AT <table> ASSIGNING <wa>.

* access to the component 'FLAG' of the table header *


ASSIGN COMPONENT p_mark_name OF STRUCTURE <wa> TO <mark_field>.

IF <mark_field> = 'X'.
DELETE <table> INDEX syst-tabix.
IF sy-subrc = 0.
<tc>-lines = <tc>-lines - 1.
ENDIF.
ENDIF.
ENDLOOP.

ENDFORM. " FCODE_DELETE_ROW

*&---------------------------------------------------------------------*
*& Form COMPUTE_SCROLLING_IN_TC
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_TC_NAME name of tablecontrol
* -->P_OK ok code
*----------------------------------------------------------------------*
FORM compute_scrolling_in_tc USING p_tc_name
p_ok.
*-BEGIN OF LOCAL DATA--------------------------------------------------*
DATA l_tc_new_top_line TYPE i.
DATA l_tc_name LIKE feld-name.
DATA l_tc_lines_name LIKE feld-name.
DATA l_tc_field_name LIKE feld-name.

FIELD-SYMBOLS <tc> TYPE cxtab_control.


FIELD-SYMBOLS <lines> TYPE i.
*-END OF LOCAL DATA----------------------------------------------------*

ASSIGN (p_tc_name) TO <tc>.


* get looplines of TableControl
CONCATENATE 'G_' p_tc_name '_LINES' INTO l_tc_lines_name.
ASSIGN (l_tc_lines_name) TO <lines>.

* is no line filled?
*
IF <tc>-lines = 0.
* yes, ...
*
l_tc_new_top_line = 1.
ELSE.
* no, ...
*
CALL FUNCTION 'SCROLLING_IN_TABLE'
EXPORTING
entry_act = <tc>-top_line
entry_from = 1
entry_to = <tc>-lines
last_page_full = 'X'
loops = <lines>
ok_code = p_ok
overlapping = 'X'
IMPORTING
entry_new = l_tc_new_top_line
EXCEPTIONS
no_entry_or_page_act = 01
no_entry_to = 02
no_ok_code_or_page_go = 03
OTHERS = 99.
ENDIF.

* get actual tc and column


*
GET CURSOR FIELD l_tc_field_name
AREA l_tc_name.

IF syst-subrc = 0.
IF l_tc_name = p_tc_name.
* set actual column
*
SET CURSOR FIELD l_tc_field_name LINE 1.
ENDIF.
ENDIF.

* set the new top line


*
<tc>-top_line = l_tc_new_top_line.

ENDFORM. " COMPUTE_SCROLLING_IN_TC

*&---------------------------------------------------------------------*
*& Form FCODE_TC_MARK_LINES
*&---------------------------------------------------------------------*
* marks all TableControl lines
*----------------------------------------------------------------------*
* -->P_TC_NAME name of tablecontrol
*----------------------------------------------------------------------*
FORM fcode_tc_mark_lines USING p_tc_name
p_table_name
p_mark_name.
*-BEGIN OF LOCAL DATA--------------------------------------------------*
DATA l_table_name LIKE feld-name.

FIELD-SYMBOLS <tc> TYPE cxtab_control.


FIELD-SYMBOLS <table> TYPE STANDARD TABLE.
FIELD-SYMBOLS <wa>.
FIELD-SYMBOLS <mark_field>.
*-END OF LOCAL DATA----------------------------------------------------*

ASSIGN (p_tc_name) TO <tc>.

* get the table, which belongs to the tc *


CONCATENATE p_table_name '[]' INTO l_table_name. "table body
ASSIGN (l_table_name) TO <table>. "not headerline

* mark all filled lines


*
LOOP AT <table> ASSIGNING <wa>.

* access to the component 'FLAG' of the table header *


ASSIGN COMPONENT p_mark_name OF STRUCTURE <wa> TO <mark_field>.

<mark_field> = 'X'.
ENDLOOP.
ENDFORM. "fcode_tc_mark_lines

*&---------------------------------------------------------------------*
*& Form FCODE_TC_DEMARK_LINES
*&---------------------------------------------------------------------*
* demarks all TableControl lines
*----------------------------------------------------------------------*
* -->P_TC_NAME name of tablecontrol
*----------------------------------------------------------------------*
FORM fcode_tc_demark_lines USING p_tc_name
p_table_name
p_mark_name .
*-BEGIN OF LOCAL DATA--------------------------------------------------*
DATA l_table_name LIKE feld-name.

FIELD-SYMBOLS <tc> TYPE cxtab_control.


FIELD-SYMBOLS <table> TYPE STANDARD TABLE.
FIELD-SYMBOLS <wa>.
FIELD-SYMBOLS <mark_field>.
*-END OF LOCAL DATA----------------------------------------------------*

ASSIGN (p_tc_name) TO <tc>.

* get the table, which belongs to the tc *


CONCATENATE p_table_name '[]' INTO l_table_name. "table body
ASSIGN (l_table_name) TO <table>. "not headerline

* demark all filled lines


*
LOOP AT <table> ASSIGNING <wa>.

* access to the component 'FLAG' of the table header *


ASSIGN COMPONENT p_mark_name OF STRUCTURE <wa> TO <mark_field>.

<mark_field> = space.
ENDLOOP.
ENDFORM. "fcode_tc_mark_lines

*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS 'SCREEN0100'.
SET TITLEBAR '100'.
CLEAR ok_code.

ENDMODULE. " STATUS_0100 OUTPUT

*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

IF ok_code = 'PROPOSE'.
CLEAR ok_code.
CLEAR screen_cancelled.
SET SCREEN 0.
LEAVE SCREEN.
ELSEIF ok_code = 'CANCEL'.
CLEAR ok_code.
SET SCREEN 0.
LEAVE SCREEN.
ENDIF.

CLEAR ok_code.

ENDMODULE. " USER_COMMAND_0100 INPUT

* OUTPUT MODULE FOR TABLECONTROL 'STK_R':


* GET LINES OF TABLECONTROL
MODULE stk_r_get_lines OUTPUT.
g_stk_r_lines = sy-loopc.
ENDMODULE.

* INPUT MODULE FOR TABLECONTROL 'STK_R': PROCESS USER COMMAND


MODULE stk_r_user_command INPUT.
IF ok_code = 'CANCEL'.
program_exit = 'X'.
SET SCREEN 0.
LEAVE SCREEN.
ENDIF.

PERFORM user_ok_tc USING 'STK_R'


'I_STK_REQ'
' '
CHANGING ok_code.
ENDMODULE.

* OUTPUT MODULE FOR TABLECONTROL 'STK_C':


* GET LINES OF TABLECONTROL
MODULE stk_c_get_lines OUTPUT.
g_stk_c_lines = sy-loopc.
ENDMODULE.

* INPUT MODULE FOR TABLECONTROL 'STK_C': MODIFY TABLE


MODULE stk_c_modify INPUT.

IF zmstk_cnv-slabsconv > zmstk_cnv-slabsavail


OR zmstk_cnv-slabsconv < 0.
CLEAR ok_code.
MESSAGE e524.
ENDIF.

IF material_move = 'X'.
ELSE.
LOOP AT i_stk_req INTO zmstk_req.

IF zmstk_req-matnr = zmstk_cnv-matnr AND


zmstk_req-werks = zmstk_cnv-werks.
IF zmstk_req-slabsreq > zmstk_req-lbkum.
ELSE.
IF zmstk_cnv-slabsconv IS INITIAL.
ELSE.
CLEAR ok_code.
MESSAGE e000 WITH zmstk_req-matnr
'- Use Available Quantiy,'
'no stock transfer possible'.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.

MODIFY i_stk_cnv
FROM zmstk_cnv
INDEX stk_c-current_line.
ENDMODULE.
* INPUT MODULE FOR TABLECONTROL 'STK_C': PROCESS USER COMMAND
MODULE stk_c_user_command INPUT.
PERFORM user_ok_tc USING 'STK_C'
'I_STK_CNV'
' '
CHANGING ok_code.
ENDMODULE.

*&---------------------------------------------------------------------*
*& Module STATUS_0200 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0200 OUTPUT.

SET PF-STATUS 'SCREEN0200'.


SET TITLEBAR '200'.
CLEAR ok_code.

ENDMODULE. " STATUS_0200 OUTPUT

*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0200 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0200 INPUT.

IF ok_code = 'PROCESS'.
CLEAR ok_code.
CLEAR screen_cancelled.
SET SCREEN 0.
LEAVE SCREEN.
ELSEIF ok_code = 'REPROPOSE'.
CLEAR ok_code.
PERFORM generate_stk_conv_proposal.
ELSEIF ok_code = 'CANCEL'.
CLEAR ok_code.
SET SCREEN 0.
LEAVE SCREEN.
ELSEIF ok_code = 'PICK0200'.
CLEAR ok_code.
CLEAR w_field.
GET CURSOR FIELD w_field.
CLEAR w_index.
GET CURSOR LINE w_index.
SUBTRACT 1 FROM w_index.
IF w_field CS 'ZMSTK_REQ'.
ADD stk_r-top_line TO w_index.
CLEAR zmstk_req.
READ TABLE i_stk_req INTO zmstk_req INDEX w_index.
SET PARAMETER ID 'MAT' FIELD zmstk_req-matnr.
SET PARAMETER ID 'WRK' FIELD zmstk_req-werks.
SET PARAMETER ID 'BERID' FIELD zmstk_req-werks.
SET PARAMETER ID 'PRR' FIELD 'ZI'.
CALL TRANSACTION 'CO09' AND SKIP FIRST SCREEN.
ELSEIF w_field CS 'ZMSTK_CNV'.
ADD stk_c-top_line TO w_index.
CLEAR zmstk_cnv.
READ TABLE i_stk_cnv INTO zmstk_cnv INDEX w_index.
SET PARAMETER ID 'MAT' FIELD zmstk_cnv-matnr.
SET PARAMETER ID 'WRK' FIELD zmstk_cnv-werks.
SET PARAMETER ID 'BERID' FIELD zmstk_cnv-werks.
SET PARAMETER ID 'PRR' FIELD 'ZI'.
CALL TRANSACTION 'CO09' AND SKIP FIRST SCREEN.
ENDIF.
ENDIF.

CLEAR ok_code.

ENDMODULE. " USER_COMMAND_0200 INPUT

* OUTPUT MODULE FOR TABLECONTROL 'STK_P':


* GET LINES OF TABLECONTROL
MODULE stk_p_get_lines OUTPUT.
g_stk_p_lines = sy-loopc.
ENDMODULE.

* INPUT MODULE FOR TABLECONTROL 'STK_P': PROCESS USER COMMAND


MODULE stk_p_user_command INPUT.
PERFORM user_ok_tc USING 'STK_P'
'I_STK_CNV'
' '
CHANGING ok_code.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module STATUS_0300 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0300 OUTPUT.

SET PF-STATUS 'SCREEN0300'.


SET TITLEBAR '300'.
CLEAR ok_code.

ENDMODULE. " STATUS_0300 OUTPUT


*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0300 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0300 INPUT.
IF ok_code = 'CANCEL'.
CLEAR ok_code.
SET SCREEN 0.
LEAVE SCREEN.
ELSEIF ok_code = 'PICK0300'.
CLEAR ok_code.
CLEAR w_index.
GET CURSOR LINE w_index.
SUBTRACT 1 FROM w_index.
ADD stk_p-top_line TO w_index.
CLEAR zmstk_cnv.
READ TABLE i_stk_cnv INTO zmstk_cnv INDEX w_index.
CASE zmstk_cnv-rc.
WHEN 1001.
PERFORM do_posting USING 'A'.
IF zmstk_cnv-rc = 0.
PERFORM do_posting_2 USING 'N'.
ENDIF.
IF zmstk_cnv-rc = 0.
PERFORM do_posting_3 USING 'N'.
ENDIF.
WHEN 1002.
PERFORM do_posting_2 USING 'A'.
IF zmstk_cnv-rc = 0.
PERFORM do_posting_3 USING 'N'.
ENDIF.
WHEN 1003.
PERFORM do_posting_3 USING 'A'.
ENDCASE.
MODIFY i_stk_cnv FROM zmstk_cnv INDEX w_index.
ENDIF.

CLEAR ok_code.

ENDMODULE. " USER_COMMAND_0300 INPUT

*&---------------------------------------------------------------------*
*& Module STK_R_MODIFY INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE stk_r_modify INPUT.

IF zmstk_req-slabsreq < 0.
CLEAR ok_code.
MESSAGE e524.
ENDIF.

MODIFY i_stk_req
FROM zmstk_req
INDEX stk_r-current_line.
ENDMODULE. " STK_R_MODIFY INPUT

You might also like