Hello,
i encounter some problems,
when i do a batch input
on mb11
ok the strange thing is:
when i enter the transaction MB11 with a production order
i see 16 positions.
when i enter it during the batch, there are only 15 positions on the screen.
if i check the resb, i can see 16 articles being linked to the production order.
"magic" input?
well, perhaps i missed a check or something like that,
but why are 15 positions visible if i enter the transaction in batch mode and 16 if i enter it normally?
to make the whole thing clear to you, i post the complete code of my abap below:
REPORT zj_gl_pp_orders_mb11_batch .
CONSTANTS: c_autyp10 TYPE t003o-autyp VALUE 10,
c_num_of_tv_lines type i VALUE 24.
TYPES: BEGIN OF s_auart,
auart TYPE t003o-auart,
END OF s_auart,
BEGIN OF s_auftraege,
aufnr TYPE aufk-aufnr,
objnr TYPE aufk-objnr,
rsnum type afko-rsnum,
erdat TYPE aufk-erdat,
auart TYPE aufk-auart,
END OF s_auftraege,
*********************
BEGIN OF s_sel,
sign(1),
option(2),
low(8) TYPE c,
high(8) TYPE c,
END OF s_sel,
BEGIN OF s_lgort,
matnr TYPE mard-matnr,
lgort TYPE mard-lgort,
labst type mard-labst,
END OF s_lgort,
table_lgort TYPE TABLE OF s_lgort,
table_sel TYPE STANDARD TABLE OF s_sel WITH DEFAULT KEY,
table_auart TYPE STANDARD TABLE OF s_auart WITH DEFAULT KEY,
table_auftraege TYPE STANDARD TABLE OF s_auftraege WITH DEFAULT
KEY,
line_lgort TYPE LINE OF table_lgort.
*data objects.
DATA: gt_batch LIKE bdcdata OCCURS 0 WITH HEADER LINE,
gt_resb like table of resb,
gt_lgort TYPE table_lgort,
gt_auftraege type table_auftraege,
gt_auart type table_auart,
sel_auart TYPE table_sel,
messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
DATA: wa_batch LIKE LINE OF gt_batch,
wa_auftraege like line of gt_auftraege,
wa_resb like line of gt_resb,
wa_auart like line of gt_auart,
wa_sel_auart TYPE LINE OF table_sel,
wa_lgort TYPE line_lgort.
Field-Symbols: <table> type any table,
<wa> type any,
<field> type any.
*PARAMETERS: p_aufnr TYPE afko-aufnr.
*******************SCREEN LAYOUT
SELECT-OPTIONS:
so_auart FOR wa_auftraege-auart,
so_aufnr FOR wa_auftraege-aufnr,
so_erdat FOR wa_auftraege-erdat,
so_objnr FOR wa_auftraege-objnr.
**********************************
START-OF-SELECTION.
PERFORM get_relevant_orders.
if not gt_auftraege[] is initial.
PERFORM select_data.
PERFORM fill_batch.
perform output_messtab.
endif.
END-OF-SELECTION.
*---------------------------------------------------------------------*
* FORM bdc_field *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> p_fnam *
* --> p_fval *
*---------------------------------------------------------------------*
FORM bdc_field USING p_fnam p_fval.
IF p_fval <> '/'.
CLEAR gt_batch.
gt_batch-fnam = p_fnam.
gt_batch-fval = p_fval.
APPEND gt_batch.
ENDIF.
CLEAR gt_batch.
ENDFORM.
*---------------------------------------------------------------------*
* FORM bdc_dynpro *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> p_program *
* --> p_screennumber *
*---------------------------------------------------------------------*
FORM bdc_dynpro USING p_program p_screennumber.
gt_batch-program = p_program.
gt_batch-dynpro = p_screennumber.
gt_batch-dynbegin = 'X'.
APPEND gt_batch.
ENDFORM.
*---------------------------------------------------------------------*
* FORM fill_batch *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM fill_batch.
DATA: dref TYPE REF TO data,
l_auftrag TYPE string,
l_fldname TYPE string,
l_remainder type i, "modulorest des end_of_page checks
l_lines TYPE sy-tabix,
l_wert type string,
l_pos(2) type n,
counter type i,
supercount type i.
FIELD-SYMBOLS: <wa_messtab> TYPE ANY,
<fldname> TYPE ANY,
<wert> type any.
ASSIGN gt_auftraege TO <table>.
CREATE DATA dref LIKE LINE OF <table>.
ASSIGN dref->* TO <wa>.
LOOP AT <table> INTO <wa>.
IF NOT gt_batch[] IS INITIAL.
FREE gt_batch.
ENDIF.
ASSIGN COMPONENT 'AUFNR' OF STRUCTURE <wa> TO <field>.
l_auftrag = <field>.
********************batch
PERFORM bdc_dynpro USING 'SAPMM07M' '0400'.
PERFORM bdc_field USING 'BDC_CURSOR'
'RM07M-BWARTWA'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=NFAL'.
PERFORM bdc_field USING 'RM07M-BWARTWA'
''.
PERFORM bdc_field USING 'RM07M-XNUVR'
'X'.
PERFORM bdc_dynpro USING 'SAPMM07M' '1405'.
PERFORM bdc_field USING 'BDC_CURSOR'
'RM07M-AUFNR(01)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=OK'.
PERFORM bdc_field USING 'RM07M-AUFNR(01)'
l_auftrag.
PERFORM bdc_dynpro USING 'SAPMM07M' '0421'.
**************hier die felder des table views fuellen.
clear counter.
ASSIGN COMPONENT 'RSNUM' OF STRUCTURE <wa> TO <field>.
l_wert = <field>.
*********BEGINN DES DURCHLAUFS
loop at gt_resb into wa_resb where rsnum = l_wert.
supercount = supercount + 1.
counter = counter + 1.
clear l_fldname.
clear l_pos.
read table gt_lgort into wa_lgort with key matnr = wa_resb-matnr.
if sy-subrc = 0. "also wenn bestand existiert.
********Die maximale Anzahl der Zeilen betraegt 24.
********Insofern wird wenn die l_pos modulo 24 = 0
********ist, ein "=p+" durchgefuehrt, und l_pos danach wieder auf 01
********gesetzt
l_pos = counter.
*************markieren zum Verbrauch
concatenate 'RM07M-XSELK(' l_pos ')' into l_fldname.
PERFORM bdc_field USING 'BDC_CURSOR'
l_fldname.
PERFORM bdc_field USING l_fldname
'X'.
clear l_fldname.
************zu verbrauchende Menge**************************
concatenate 'MSEG-ERFMG(' l_pos ')' into l_fldname.
PERFORM bdc_field USING 'BDC_CURSOR'
l_fldname.
PERFORM bdc_field USING l_fldname
'1'.
clear l_fldname.
************Lagerort des Materials***************************
concatenate 'MSEG-LGORT(' l_pos ')' into l_fldname.
PERFORM bdc_field USING 'BDC_CURSOR'
l_fldname.
PERFORM bdc_field USING l_fldname
wa_lgort-lgort.
clear l_fldname.
endif.
****end_of_page check
l_remainder = counter mod c_num_of_tv_lines.
check l_remainder = 0.
****naechste seite.
PERFORM bdc_field USING 'BDC_OKCODE'
'=P+'.
PERFORM bdc_field USING 'BDC_SUBSCR'
'SAPMM07M'.
PERFORM bdc_field USING 'BDC_SUBSCR'
'SAPLKACB'.
PERFORM bdc_dynpro USING 'SAPLKACB'
'0002'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/EENTE'.
PERFORM bdc_field USING 'BDC_CURSOR'
'COBL-GSBER'.
PERFORM bdc_field USING 'BDC_SUBSCR'
'SAPLKACB'.
PERFORM bdc_dynpro USING 'SAPMM07M'
'0421'.
****counter auf 0 zuruecksetzen.
counter = 0.
endloop.
*****************ENDE DES DURCHLAUFS
*ABSCHLIESSENDE VERBUCHUNG (so oft enter ausfuehren, wie positionen
*existieren, plus eine weitere ausfuehrung zur abschliessenden
*bestaetigung)
supercount = supercount + 1.
PERFORM bdc_field USING 'BDC_OKCODE'
'=BU'.
PERFORM bdc_field USING 'BDC_SUBSCR'
'SAPMM07M'.
PERFORM bdc_field USING 'BDC_SUBSCR'
'SAPLKACB'.
do supercount times.
PERFORM bdc_dynpro USING 'SAPLKACB' '0002'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/EENTE'.
PERFORM bdc_field USING 'BDC_CURSOR'
'COBL-GSBER'.
PERFORM bdc_field USING 'BDC_SUBSCR'
'SAPLKACB'.
enddo.
CALL TRANSACTION 'MB11' USING gt_batch
MODE 'N'
UPDATE 'S'
MESSAGES INTO messtab.
CLEAR l_fldname.
free gt_batch.
CONCATENATE l_auftrag ' ' INTO l_fldname.
messtab-fldname = l_fldname.
DESCRIBE TABLE messtab LINES l_lines.
READ TABLE messtab INDEX l_lines ASSIGNING <wa_messtab>.
ASSIGN COMPONENT 'FLDNAME' OF STRUCTURE <wa_messtab> TO <fldname>.
<fldname> = l_fldname.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SELECT_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM select_data.
DATA: lt_resb LIKE TABLE OF resb,
wa_resb LIKE LINE OF lt_resb.
DATA: BEGIN OF materials OCCURS 0,
matnr TYPE mard-matnr,
END OF materials.
Data: l_value type string.
Field-Symbols: <wa> type any,
<field> type any.
SELECT *
FROM afko
INNER JOIN
resb
ON afko~rsnum = resb~rsnum
INTO CORRESPONDING FIELDS
OF TABLE lt_resb
for all entries in
gt_auftraege
WHERE afko~aufnr = gt_auftraege-aufnr
* AND resb~bdmng > resb~enmng
AND resb~XWAOK = 'X'
AND resb~KZEAR = 'X'.
*Wichtig:
*Hat ein Material einen Bestand in einem Lagerort
*der zu dem Werk passt, zu dem es zugeordnet ist?
*Nur diese Materialien werden in der MB11 verbraucht.
*in mard den relevanten lagerort abfragen
*entsprechend dem korrekten LABST ( x > 0 ).
check not lt_resb is initial.
SELECT matnr
lgort
labst
FROM
mard
INTO TABLE gt_lgort
FOR ALL ENTRIES IN lt_resb
WHERE matnr = lt_resb-matnr
and werks = lt_resb-werks
AND labst > 0.
sort gt_lgort by matnr labst descending.
if sy-subrc = 0.
DELETE ADJACENT DUPLICATES FROM gt_lgort COMPARING matnr.
*korrekten lagerort eintragen.
loop at gt_lgort into wa_lgort.
read table lt_resb with key matnr = wa_lgort-matnr assigning <wa>.
if sy-subrc = 0.
assign component 'LGORT' of structure <wa> to <field>.
<field> = wa_lgort-lgort.
endif.
endloop.
gt_resb[] = lt_resb[].
endif.
ENDFORM. " SELECT_STORAGE_DATA
*---------------------------------------------------------------------*
* FORM output_messtab *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM output_messtab. "
DATA: len TYPE i.
DATA: flag.
DATA: c_msg LIKE t100-text.
DATA: data_temp TYPE REF TO data.
FIELD-SYMBOLS: <fs> TYPE c, <wa> TYPE ANY, <l_field> TYPE ANY.
delete adjacent duplicates from messtab comparing FLDNAME.
CREATE DATA data_temp TYPE t100.
ASSIGN data_temp->* TO <wa>.
* SKIP.
delete messtab where msgtyp = 'S'
and msgnr = '654'.
LOOP AT messtab.
* IF ( messtab-msgid = 'IW' AND messtab-msgnr = '085' ) or
* ( messtab-msgid = 'IW' AND messtab-msgnr = '080' ).
* inp-bem = text-133.
* ENDIF.
SELECT SINGLE * FROM t100
INTO <wa> "T100
WHERE sprsl = messtab-msgspra AND
arbgb = messtab-msgid AND
msgnr = messtab-msgnr.
CHECK sy-subrc EQ 0.
ASSIGN COMPONENT 'TEXT' OF STRUCTURE <wa> TO <l_field>.
c_msg = <l_field>.
IF NOT messtab-msgv1 IS INITIAL.
len = strlen( messtab-msgv1 ).
ASSIGN messtab-msgv1+0(len) TO <fs>.
REPLACE '&1' WITH <fs> INTO c_msg.
IF sy-subrc NE 0.
REPLACE '&' WITH <fs> INTO c_msg.
ENDIF.
ENDIF.
IF NOT messtab-msgv2 IS INITIAL.
len = strlen( messtab-msgv2 ).
ASSIGN messtab-msgv2+0(len) TO <fs>.
REPLACE '&2' WITH <fs> INTO c_msg.
IF sy-subrc NE 0.
REPLACE '&' WITH <fs> INTO c_msg.
ENDIF.
ENDIF.
IF NOT messtab-msgv3 IS INITIAL.
len = strlen( messtab-msgv3 ).
ASSIGN messtab-msgv3+0(len) TO <fs>.
REPLACE '&3' WITH <fs> INTO c_msg.
IF sy-subrc NE 0.
REPLACE '&' WITH <fs> INTO c_msg.
ENDIF.
ENDIF.
IF NOT messtab-msgv4 IS INITIAL.
len = strlen( messtab-msgv4 ).
ASSIGN messtab-msgv4+0(len) TO <fs>.
REPLACE '&4' WITH <fs> INTO c_msg.
IF sy-subrc NE 0.
REPLACE '&' WITH <fs> INTO c_msg.
ENDIF.
ENDIF.
CASE messtab-msgtyp.
WHEN 'W'.
FORMAT COLOR 3. "gelb
IF flag = 'X'.
FORMAT INTENSIFIED ON.
CLEAR flag.
ELSE.
FORMAT INTENSIFIED OFF.
flag = 'X'.
ENDIF.
WHEN 'E' OR 'A'.
FORMAT COLOR 6. "rot
IF flag = 'X'.
FORMAT INTENSIFIED ON.
CLEAR flag.
ELSE.
FORMAT INTENSIFIED OFF.
flag = 'X'.
ENDIF.
WHEN OTHERS.
FORMAT COLOR 5. "grün
IF flag = 'X'.
FORMAT INTENSIFIED ON.
CLEAR flag.
ELSE.
FORMAT INTENSIFIED OFF.
flag = 'X'.
ENDIF.
ENDCASE.
WRITE: /4 messtab-msgtyp(1), messtab-msgid(4), messtab-msgnr(3),
messtab-fldname(15), c_msg.
* WRITE: /4 c_msg, order-aufnr.
FORMAT RESET.
ENDLOOP.
* CLEAR messtab.
* REFRESH messtab.
ENDFORM. " OUTPUT_MESSTAB
*&---------------------------------------------------------------------*
*& Form GET_RELEVANT_ORDERS
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form get_relevant_orders.
*selektiere alle auftragsarten vom Typ PPS-Fertigungsauftrag
if so_auart[] is initial and so_aufnr[] is initial.
PERFORM get_pps_auftragsarten.
endif.
*selektiere alle auftraege aus der AUFK, die den PPS-Auftragsarten
*zugeordnet wurden.
PERFORM get_pps_auftraege.
if not gt_auftraege[] is initial.
perform check_resb.
endif.
endform. " GET_RELEVANT_ORDERS
FORM get_pps_auftragsarten.
IF so_auart[] IS INITIAL.
SELECT
auart
FROM t003o
INTO TABLE
gt_auart
WHERE autyp = c_autyp10.
IF sy-subrc = 0.
LOOP AT gt_auart INTO wa_auart.
wa_sel_auart-sign = 'I'.
wa_sel_auart-option = 'EQ'.
wa_sel_auart-low = wa_auart-auart.
*pruefen, ob vom user etwas eingegeben wurde.
* read table so_auart with key LOW = wa_auart-auart assigning
*<wa>
*. if sy-subrc = 0.
* wa_sel_auart = <wa>.
* endif.
APPEND wa_sel_auart TO sel_auart.
ENDLOOP.
ENDIF.
ELSE.
LOOP AT so_auart ASSIGNING <wa>.
APPEND <wa> TO sel_auart.
ENDLOOP.
ENDIF.
ENDFORM. " GET_PPS_AUFTRAGSARTEN
*---------------------------------------------------------------------*
* FORM get_pps_auftraege *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM get_pps_auftraege.
DATA: lt_auftraege LIKE gt_auftraege,
wa_auftraege LIKE LINE OF lt_auftraege,
lt_jest3 LIKE TABLE OF jest,
wa_jest LIKE jest,
l_pointer TYPE sy-tabix.
DATA: old_idx LIKE sy-tabix.
DATA: BEGIN OF lt_jest OCCURS 0.
INCLUDE STRUCTURE jest.
DATA: END OF lt_jest.
DATA: BEGIN OF lt_jest2 OCCURS 0.
INCLUDE STRUCTURE jest.
DATA: END OF lt_jest2.
DATA: BEGIN OF jest_wa.
INCLUDE STRUCTURE jest.
DATA: END OF jest_wa.
DATA: BEGIN OF valid_jest OCCURS 0,
objnr LIKE jest-objnr.
DATA: END OF valid_jest.
DATA: old_obj LIKE jest-objnr.
DATA: valid, object_done.
FIELD-SYMBOLS: <wa> TYPE ANY.
SELECT aufk~aufnr
aufk~objnr
afko~rsnum
aufk~erdat
aufk~auart
FROM aufk inner join afko
on aufk~aufnr = afko~aufnr
INTO TABLE gt_auftraege
WHERE aufk~aufnr IN so_aufnr
AND auart IN sel_auart
AND erdat IN so_erdat.
CHECK NOT gt_auftraege[] IS INITIAL.
**alle abhaengigen objektnummern plus stati lesen
SELECT * FROM jest
INTO TABLE lt_jest
FOR ALL ENTRIES
IN gt_auftraege
WHERE objnr = gt_auftraege-objnr.
* and stat = 'I0002'
* or stat = 'I0009'
* or stat = 'I0076'.
LOOP AT lt_jest INTO jest_wa.
IF
(
jest_wa-stat = 'I0002'
AND jest_wa-inact = space
)
OR
(
jest_wa-stat = 'I0076'
)
OR jest_wa-stat = 'I0013'.
APPEND jest_wa TO lt_jest2.
ENDIF.
ENDLOOP.
FREE lt_jest.
lt_jest[] = lt_jest2[].
SORT lt_jest BY objnr stat ASCENDING.
LOOP AT lt_jest.
old_idx = sy-tabix.
IF lt_jest-objnr NE old_obj.
valid = 'X'.
CLEAR object_done.
ENDIF.
IF valid = 'X' AND object_done = space.
READ TABLE lt_jest INTO jest_wa WITH KEY objnr = lt_jest-objnr
stat = 'I0002'
inact = space.
IF sy-subrc NE 0.
*Objekt ist nicht freigegeben also ungueltig.
CLEAR valid.
ELSE.
*Objekt OK. (Vorausgesetzt kein LOESCHVERMERK oder Archivloeschen)
*AUFTRAG NOCH NICHT RUECKGEMELDET. OBJEKT GUELTIG
*falls LOESCHVORMERKUNG INAKTIV
READ TABLE lt_jest INTO jest_wa WITH KEY objnr = lt_jest-objnr
stat = 'I0076'.
IF sy-subrc NE 0.
valid = 'X'.
ELSE.
IF jest_wa-inact = space.
CLEAR valid.
ELSE.
valid = 'X'.
ENDIF.
ENDIF.
READ TABLE lt_jest INTO jest_wa WITH KEY objnr = lt_jest-objnr
stat = 'I0013'.
IF sy-subrc EQ 0.
IF jest_wa-inact = 'X'.
valid = 'X'.
ENDIF.
ENDIF.
IF valid = 'X'.
sy-tabix = old_idx.
old_obj = lt_jest-objnr.
object_done = 'X'.
MOVE lt_jest-objnr TO valid_jest-objnr.
COLLECT valid_jest.
CONTINUE.
ENDIF. "Objekt gueltig. addiere zur gueltigen tabelle
ENDIF. "Objekt nicht freigegeben
ENDIF.
sy-tabix = old_idx.
old_obj = lt_jest-objnr.
ENDLOOP.
* DESCRIBE TABLE valid_jest LINES old_idx.
* WRITE: / old_idx, 'entries found.'.
*Map the remaining objects to the orders
LOOP AT valid_jest.
READ TABLE gt_auftraege
WITH KEY objnr = valid_jest-objnr
INTO wa_auftraege.
IF sy-subrc = 0.
APPEND wa_auftraege TO lt_auftraege.
ENDIF.
ENDLOOP.
FREE gt_auftraege.
gt_auftraege[] = lt_auftraege[].
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CHECK_RESB
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form check_resb.
data: lt_resb type table of resb,
wa_resb like line of lt_resb,
old_idx type sy-tabix,
old_rsnum type resb-rsnum,
valid,
object_done.
DATA: BEGIN OF valid_resb OCCURS 0,
rsnum LIKE resb-rsnum.
DATA: END OF valid_resb.
data: lt_auftraege type table_auftraege.
select *
from resb
into table lt_resb
for all entries in gt_auftraege
where rsnum = gt_auftraege-rsnum
and BDART <> 'BB'.
check not lt_resb[] is initial.
sort lt_resb by rsnum ascending.
loop at lt_resb into wa_resb.
old_idx = sy-tabix.
if wa_resb-rsnum ne old_rsnum.
"wenn wir also eine neue rsnum haben
valid = 'X'.
clear object_done.
endif.
if valid = 'X' and object_done = space.
read table lt_resb into wa_resb with key
rsnum = wa_resb-rsnum
RGEKZ = 'X'.
if sy-subrc = 0.
sy-tabix = old_idx.
clear valid.
clear object_done.
old_rsnum = wa_resb-rsnum.
continue.
else. "keine retrograde entnahme also ok
sy-tabix = old_idx.
valid = 'X'.
object_done = 'X'.
old_rsnum = wa_resb-rsnum.
move old_rsnum to valid_resb-rsnum.
collect valid_resb.
endif.
endif.
endloop.
*remap found objects
loop at valid_resb.
read table gt_auftraege with key rsnum = valid_resb-rsnum
into wa_auftraege.
if sy-subrc = 0.
append wa_auftraege to lt_auftraege.
endif.
endloop.
gt_auftraege[] = lt_auftraege[].
sort gt_auftraege by aufnr rsnum ascending.
*write:/ 'AUFTRAG', 'RSNUM'.
*
*loop at gt_auftraege into wa_auftraege.
* write:/ wa_auftraege-aufnr, wa_auftraege-rsnum.
*endloop.
*
endform. " CHECK_RESB