• 取消检验批过账(取消检验批UD判定到Rerel,再把非限性库存转到质检库存,然后就可以取101收货了)


    直接取消101收货时,出现以下提示:

     

    (1)第一种方法:先把主数据的QM视图的QM相关信息取消,如下图:

      

    取消QM采购激活及检验设置后,通过传输过账,把数量从非限库存转到质检库存。

    过账完成后,数量从非限定到质检。再过SE16N把删除检验批与物料凭证的关联关系(记得在查询前在命令窗口输入/h,再回车):

     

    然后,选中,删除,保存即可。

    再取消101收货即可,

     

     (2)第二种方法,就打Notes(SAP Notes 74638).通过检验批取消UD转到为Rerel(zqevac40)。再通过检验批把非限定性库存转为质检库存(zrqevac50)。

    对用户来讲,只需输入事务码:ZMMXX8 (可以把权限直接给仓库主管即可),然后输入检验批,执行即可以。

    执行完成后,直接 MIGO,取消相应的物料凭证即可。

     具体代码如下:

     以下代码调用两步(UD转REREL\非限定库存转质检库存),可以定一个事务码:ZMMXX8,程序ZQMR_CANCEL_Q。

    1. *&---------------------------------------------------------------------*
    2. *& Report ZQMR_CANCEL_Q
    3. *&
    4. *&---------------------------------------------------------------------*
    5. *&
    6. *&
    7. *&---------------------------------------------------------------------*
    8. REPORT ZQMR_CANCEL_Q.
    9. PARAMETERS:
    10. prueflos LIKE qals-prueflos OBLIGATORY MEMORY ID qls.
    11. START-OF-SELECTION.
    12. SUBMIT zqevac40 WITH prueflos = prueflos AND RETURN.
    13. WAIT UP TO 1 SECONDS.
    14. SUBMIT zrqevac50 WITH prueflos = prueflos AND RETURN.

     取消检验批UD转rerel,代码如下:

    1. *&---------------------------------------------------------------------*
    2. *& Report ZQEVAC40
    3. *&
    4. *&---------------------------------------------------------------------*
    5. *&
    6. *&
    7. *&---------------------------------------------------------------------*
    8. REPORT zqevac40.
    9. *----------------------------------------------------------------------*
    10. * Datendefinitionen
    11. *----------------------------------------------------------------------*
    12. * Tabellen
    13. *----------------------------------------------------------------------*
    14. TABLES sscrfields.
    15. TABLES qals.
    16. TABLES qave.
    17. *----------------------------------------------------------------------*
    18. * Konstanten
    19. CONSTANTS:
    20. c_rc_0 LIKE sy-subrc VALUE 0,
    21. c_rc_4 LIKE sy-subrc VALUE 4,
    22. c_rc_20 LIKE sy-subrc VALUE 20,
    23. *
    24. c_kreuz LIKE qm00-qkz VALUE 'X'.
    25. *
    26. *----------------------------------------------------------------------*
    27. * Eingabebildschirm
    28. SELECTION-SCREEN SKIP 2.
    29. PARAMETERS prueflos LIKE qals-prueflos MATCHCODE OBJECT qals
    30. MEMORY ID qls .
    31. SELECTION-SCREEN SKIP 1.
    32. SELECTION-SCREEN BEGIN OF BLOCK search WITH FRAME.
    33. SELECTION-SCREEN BEGIN OF LINE.
    34. SELECTION-SCREEN PUSHBUTTON 3(20) TEXT-s01 USER-COMMAND sear.
    35. SELECTION-SCREEN PUSHBUTTON 40(20) TEXT-s02 USER-COMMAND show.
    36. SELECTION-SCREEN END OF LINE.
    37. SELECTION-SCREEN END OF BLOCK search.
    38. *----------------------------------------------------------------------*
    39. AT SELECTION-SCREEN.
    40. IF sscrfields-ucomm EQ 'SEAR'
    41. OR prueflos IS INITIAL.
    42. CALL FUNCTION 'QELA_START_SELECTION_OF_LOTS'
    43. EXPORTING
    44. i_selid = ' '
    45. i_stat_aenderung = 'X'
    46. i_stat_ero = 'X'
    47. i_stat_frei = 'X'
    48. i_stat_ve = ' '
    49. IMPORTING
    50. e_prueflos = prueflos
    51. EXCEPTIONS
    52. no_entry = 1
    53. no_selected = 2
    54. OTHERS = 3.
    55. ENDIF.
    56. IF sscrfields-ucomm EQ 'SHOW'.
    57. CALL FUNCTION 'QSS1_LOT_SHOW'
    58. EXPORTING
    59. i_prueflos = prueflos.
    60. ENDIF.
    61. CHECK sscrfields-ucomm EQ 'ONLI'.
    62. * ab hier mu Pr黤losnummer gef黮lt sein.
    63. IF prueflos IS INITIAL.
    64. MESSAGE e164(qa).
    65. ENDIF.
    66. * Lesen Los
    67. CALL FUNCTION 'ENQUEUE_EQQALS1'
    68. EXPORTING
    69. prueflos = prueflos.
    70. CALL FUNCTION 'QPSE_LOT_READ'
    71. EXPORTING
    72. i_prueflos = prueflos
    73. IMPORTING
    74. e_qals = qals
    75. EXCEPTIONS
    76. no_lot = 1.
    77. IF NOT sy-subrc IS INITIAL.
    78. MESSAGE e102(qa).
    79. ENDIF.
    80. *-----------------
    81. * Pr黤en Status
    82. CALL FUNCTION 'QAST_STATUS_CHECK'
    83. EXPORTING
    84. i_objnr = qals-objnr
    85. i_status = 'I0218' "Status VE getroffen
    86. EXCEPTIONS
    87. status_not_activ = 1.
    88. IF NOT sy-subrc IS INITIAL.
    89. MESSAGE e102(qv) WITH qals-prueflos.
    90. ENDIF.
    91. *
    92. CALL FUNCTION 'QEVA_UD_READ'
    93. EXPORTING
    94. i_prueflos = qals-prueflos
    95. IMPORTING
    96. e_qave = qave.
    97. *---------------------------------------------------------------------*
    98. START-OF-SELECTION.
    99. * Vorgaben sind ok. 1. Material Umlagern und Los 鋘dern
    100. PERFORM qals_aendern.
    101. ************************************************************************
    102. *----------------------------------------------------------------------*
    103. * FORM QALS_aendern
    104. *----------------------------------------------------------------------*
    105. FORM qals_aendern.
    106. *
    107. PERFORM status_fix_setzen USING 'I0002' c_kreuz.
    108. PERFORM status_fix_setzen USING 'I0216' space.
    109. PERFORM status_fix_setzen USING 'I0217' space.
    110. PERFORM status_fix_setzen USING 'I0218' space.
    111. CLEAR: qals-stat14.
    112. CLEAR: qals-stat35.
    113. CLEAR: qave-vauswahlmg,
    114. qave-vwerks,
    115. qave-versionam,
    116. qave-vcodegrp,
    117. qave-vcode,
    118. qave-vbewertung,
    119. qave-versioncd,
    120. qave-vfolgeakti,
    121. qave-qkennzahl.
    122. *--... verbuchen
    123. CALL FUNCTION 'QEVA_UD_UPDATE' IN UPDATE TASK
    124. EXPORTING
    125. qals_new = qals
    126. qave_new = qave.
    127. COMMIT WORK.
    128. MESSAGE s101(qa) WITH qals-prueflos.
    129. CALL FUNCTION 'DEQUEUE_EQQALS1'
    130. EXPORTING
    131. prueflos = prueflos.
    132. ENDFORM. "qals_aendern
    133. *----------------------------------------------------------------------*
    134. * Form STATUS_FIX_SETZEN
    135. *----------------------------------------------------------------------*
    136. * Setzen eines Status aufgrund von Voreinstellungen wie QMAT etc. *
    137. *----------------------------------------------------------------------*
    138. * --> STATUS Status der gesetzt werden soll
    139. * --> AKTIV Status wird aktiviert sonst deaktiviert
    140. *----------------------------------------------------------------------*
    141. FORM status_fix_setzen USING
    142. VALUE(status) LIKE tj02-istat
    143. VALUE(aktiv) LIKE c_kreuz.
    144. * lokale Tabelle fuer Statusfortschreibung
    145. DATA: BEGIN OF l_stattab OCCURS 0.
    146. INCLUDE STRUCTURE jstat.
    147. DATA END OF l_stattab.
    148. *
    149. * Falls Objektnr. nicht gef黮lt. --> Fehlermeldung !!!
    150. IF qals-objnr EQ space.
    151. MESSAGE e013(qv).
    152. * Fehlende Objektnr.: Problem f script>document.write('\r\n');
    153. ENDIF.
    154. MOVE status TO l_stattab-stat.
    155. IF aktiv EQ space.
    156. MOVE c_kreuz TO l_stattab-inact.
    157. ENDIF.
    158. *
    159. APPEND l_stattab.
    160. *
    161. CALL FUNCTION 'STATUS_CHANGE_INTERN'
    162. EXPORTING
    163. check_only = space
    164. objnr = qals-objnr
    165. TABLES
    166. status = l_stattab.
    167. ENDFORM. " STATUS_FIX_SETZEN

    把非限定性库存转质检库存代码如下:

    1. *&---------------------------------------------------------------------*
    2. *& Report ZRQEVAC50
    3. *&
    4. *&---------------------------------------------------------------------*
    5. *&
    6. *&
    7. *&---------------------------------------------------------------------*
    8. REPORT zrqevac50 MESSAGE-ID qa.
    9. TYPES:
    10. t_mkpf_tab LIKE mkpf OCCURS 0,
    11. t_mseg_tab LIKE mseg OCCURS 0.
    12. PARAMETERS:
    13. prueflos LIKE qals-prueflos OBLIGATORY MEMORY ID qls.
    14. DATA:
    15. g_msgv1 LIKE sy-msgv1,
    16. g_qals LIKE qals,
    17. g_qals_leiste LIKE qals,
    18. g_qamb_tab TYPE qambtab,
    19. g_qamb_vb_tab TYPE qambtab,
    20. g_mkpf_tab TYPE t_mkpf_tab,
    21. g_mseg_tab TYPE t_mseg_tab,
    22. g_subrc LIKE sy-subrc.
    23. START-OF-SELECTION.
    24. PERFORM enqueue_qals USING prueflos
    25. g_subrc.
    26. IF NOT g_subrc IS INITIAL.
    27. MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
    28. WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    29. SUBMIT (sy-repid) VIA SELECTION-SCREEN.
    30. ENDIF.
    31. PERFORM read_qals USING prueflos
    32. g_qals
    33. g_qals_leiste
    34. g_subrc.
    35. IF NOT g_subrc IS INITIAL.
    36. MESSAGE ID 'QA' TYPE 'S' NUMBER '102'
    37. WITH prueflos.
    38. SUBMIT (sy-repid) VIA SELECTION-SCREEN.
    39. ENDIF.
    40. PERFORM check_lot USING g_qals
    41. g_subrc.
    42. IF NOT g_subrc IS INITIAL.
    43. CASE g_subrc.
    44. WHEN 256.
    45. g_msgv1 = 'Lot & does not refer to a material doc'.
    46. WHEN 128.
    47. g_msgv1 = 'Material & is serialized'.
    48. REPLACE '&' WITH g_qals-matnr INTO g_msgv1.
    49. WHEN 64.
    50. g_msgv1 = 'Lot & is not stock relevant'.
    51. WHEN 32.
    52. g_msgv1 = 'Lot &: No stock transferred'.
    53. WHEN 16.
    54. g_msgv1 = 'Lot & is cancelled'.
    55. WHEN 8.
    56. g_msgv1 = 'Lot & is archived'.
    57. WHEN 4.
    58. g_msgv1 = 'Lot & is blocked'.
    59. WHEN 2.
    60. g_msgv1 = 'Lot & is HU managed'.
    61. ENDCASE.
    62. REPLACE '&' WITH prueflos INTO g_msgv1.
    63. MESSAGE ID '00' TYPE 'S' NUMBER '208'
    64. WITH g_msgv1.
    65. SUBMIT (sy-repid) VIA SELECTION-SCREEN.
    66. ENDIF.
    67. PERFORM read_qamb USING g_qals
    68. g_qamb_tab
    69. g_subrc.
    70. IF NOT g_subrc IS INITIAL.
    71. MESSAGE ID 'QA' TYPE 'S' NUMBER '068'
    72. WITH prueflos.
    73. SUBMIT (sy-repid) VIA SELECTION-SCREEN.
    74. ENDIF.
    75. PERFORM read_mkpf USING g_qamb_tab
    76. g_mkpf_tab
    77. g_subrc.
    78. IF NOT g_subrc IS INITIAL.
    79. MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
    80. WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    81. SUBMIT (sy-repid) VIA SELECTION-SCREEN.
    82. ENDIF.
    83. PERFORM check_mkpf USING g_mkpf_tab
    84. g_subrc.
    85. IF NOT g_subrc IS INITIAL.
    86. MESSAGE ID 'QA' TYPE 'S' NUMBER '068'
    87. WITH prueflos.
    88. SUBMIT (sy-repid) VIA SELECTION-SCREEN.
    89. ENDIF.
    90. PERFORM read_mseg USING g_mkpf_tab
    91. g_mseg_tab
    92. g_subrc.
    93. IF NOT g_subrc IS INITIAL.
    94. MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
    95. WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    96. SUBMIT (sy-repid) VIA SELECTION-SCREEN.
    97. ENDIF.
    98. PERFORM check_mseg USING g_mseg_tab
    99. g_qamb_tab
    100. g_subrc.
    101. IF NOT g_subrc IS INITIAL.
    102. MESSAGE ID 'QA' TYPE 'S' NUMBER '068'
    103. WITH prueflos.
    104. SUBMIT (sy-repid) VIA SELECTION-SCREEN.
    105. ENDIF.
    106. PERFORM create_goods_movement USING g_qals
    107. g_mseg_tab
    108. g_subrc.
    109. IF NOT g_subrc IS INITIAL.
    110. MESSAGE ID 'QA' TYPE 'S' NUMBER '068'
    111. WITH prueflos.
    112. SUBMIT (sy-repid) VIA SELECTION-SCREEN.
    113. ENDIF.
    114. PERFORM post_goods_movement.
    115. PERFORM post_data USING g_qals
    116. g_qals_leiste
    117. g_qamb_tab
    118. g_qamb_vb_tab
    119. g_subrc.
    120. IF NOT g_subrc IS INITIAL.
    121. MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
    122. WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    123. SUBMIT (sy-repid) VIA SELECTION-SCREEN.
    124. ELSE.
    125. COMMIT WORK AND WAIT.
    126. g_msgv1 = 'inspection lot &'.
    127. REPLACE '&' WITH prueflos INTO g_msgv1.
    128. MESSAGE ID '00' TYPE 'S' NUMBER '368'
    129. WITH 'Stock posting reversed for ' g_msgv1.
    130. * SUBMIT (SY-REPID) VIA SELECTION-SCREEN.
    131. ENDIF.
    132. *----------------------------------------------------------------------*
    133. * Form ENQUEUE_QALS *
    134. *----------------------------------------------------------------------*
    135. * Los sperren *
    136. *----------------------------------------------------------------------*
    137. FORM enqueue_qals USING p_prueflos LIKE qals-prueflos
    138. p_subrc LIKE sy-subrc.
    139. CLEAR: p_subrc.
    140. CALL FUNCTION 'ENQUEUE_EQQALS1'
    141. EXPORTING
    142. prueflos = p_prueflos
    143. EXCEPTIONS
    144. foreign_lock = 1
    145. system_failure = 2
    146. OTHERS = 3.
    147. p_subrc = sy-subrc.
    148. ENDFORM. " ENQUEUE_QALS
    149. *----------------------------------------------------------------------*
    150. * Form READ_QALS *
    151. *----------------------------------------------------------------------*
    152. * Pr黤los lesen *
    153. *----------------------------------------------------------------------*
    154. FORM read_qals USING p_prueflos LIKE qals-prueflos
    155. p_qals LIKE qals
    156. p_qals_leiste LIKE qals
    157. p_subrc LIKE sy-subrc.
    158. CLEAR: p_subrc.
    159. CALL FUNCTION 'QPSE_LOT_READ'
    160. EXPORTING
    161. i_prueflos = p_prueflos
    162. i_reset_lot = 'X'
    163. IMPORTING
    164. e_qals = p_qals
    165. EXCEPTIONS
    166. no_lot = 1.
    167. p_subrc = sy-subrc.
    168. IF p_subrc IS INITIAL.
    169. p_qals_leiste = p_qals.
    170. ELSE.
    171. CLEAR: p_qals,
    172. p_qals_leiste.
    173. ENDIF.
    174. ENDFORM. " READ_QALS
    175. *----------------------------------------------------------------------*
    176. * Form CHECK_LOT *
    177. *----------------------------------------------------------------------*
    178. * Pr黤los pr黤en *
    179. *----------------------------------------------------------------------*
    180. FORM check_lot USING p_qals LIKE qals
    181. p_subrc LIKE sy-subrc.
    182. DATA:
    183. l_stat LIKE jstat,
    184. l_stat_tab LIKE jstat OCCURS 0 WITH HEADER LINE.
    185. p_subrc = 256.
    186. */No reference to material document
    187. IF p_qals-zeile IS INITIAL.
    188. EXIT.
    189. ELSE.
    190. p_subrc = 128.
    191. ENDIF.
    192. */Serialized Material
    193. IF NOT p_qals-sernp IS INITIAL.
    194. EXIT.
    195. ELSE.
    196. p_subrc = 64.
    197. ENDIF.
    198. */BERF
    199. CALL FUNCTION 'STATUS_CHECK'
    200. EXPORTING
    201. objnr = p_qals-objnr
    202. status = 'I0203'
    203. EXCEPTIONS
    204. status_not_active = 2.
    205. IF NOT sy-subrc IS INITIAL.
    206. EXIT.
    207. ELSE.
    208. p_subrc = 32.
    209. ENDIF.
    210. */BTEI & BEND
    211. CLEAR l_stat. CLEAR l_stat_tab. REFRESH l_stat_tab.
    212. l_stat-stat = 'I0219'. APPEND l_stat TO l_stat_tab. "BTEI
    213. l_stat-stat = 'I0220'. APPEND l_stat TO l_stat_tab. "BEND
    214. CALL FUNCTION 'STATUS_OBJECT_CHECK_MULTI'
    215. EXPORTING
    216. objnr = p_qals-objnr
    217. TABLES
    218. status_check = l_stat_tab.
    219. IF l_stat_tab[] IS INITIAL.
    220. EXIT.
    221. ELSE.
    222. p_subrc = 16.
    223. ENDIF.
    224. */LSTO & LSTV
    225. CLEAR l_stat. CLEAR l_stat_tab. REFRESH l_stat_tab.
    226. l_stat-stat = 'I0224'. APPEND l_stat TO l_stat_tab. "LSTO
    227. l_stat-stat = 'I0232'. APPEND l_stat TO l_stat_tab. "LSTV
    228. CALL FUNCTION 'STATUS_OBJECT_CHECK_MULTI'
    229. EXPORTING
    230. objnr = p_qals-objnr
    231. TABLES
    232. status_check = l_stat_tab.
    233. IF NOT l_stat_tab[] IS INITIAL.
    234. EXIT.
    235. ELSE.
    236. p_subrc = 8.
    237. ENDIF.
    238. */ARSP & ARCH & REO1 & REO2 & REO3
    239. CLEAR l_stat. CLEAR l_stat_tab. REFRESH l_stat_tab.
    240. l_stat-stat = 'I0225'. APPEND l_stat TO l_stat_tab. "ARSP
    241. l_stat-stat = 'I0226'. APPEND l_stat TO l_stat_tab. "ARCH
    242. l_stat-stat = 'I0227'. APPEND l_stat TO l_stat_tab. "REO3
    243. l_stat-stat = 'I0228'. APPEND l_stat TO l_stat_tab. "REO2
    244. l_stat-stat = 'I0229'. APPEND l_stat TO l_stat_tab. "REO1
    245. CALL FUNCTION 'STATUS_OBJECT_CHECK_MULTI'
    246. EXPORTING
    247. objnr = p_qals-objnr
    248. TABLES
    249. status_check = l_stat_tab.
    250. IF NOT l_stat_tab[] IS INITIAL.
    251. EXIT.
    252. ELSE.
    253. p_subrc = 4.
    254. ENDIF.
    255. */SPER
    256. CALL FUNCTION 'STATUS_CHECK'
    257. EXPORTING
    258. objnr = p_qals-objnr
    259. status = 'I0043'
    260. EXCEPTIONS
    261. status_not_active = 2.
    262. IF sy-subrc IS INITIAL.
    263. EXIT.
    264. ELSE.
    265. p_subrc = 2.
    266. ENDIF.
    267. */HUM
    268. CALL FUNCTION 'STATUS_CHECK'
    269. EXPORTING
    270. objnr = p_qals-objnr
    271. status = 'I0443'
    272. EXCEPTIONS
    273. status_not_active = 2.
    274. IF sy-subrc IS INITIAL.
    275. EXIT.
    276. ELSE.
    277. p_subrc = 0.
    278. ENDIF.
    279. ENDFORM. " CHECK_LOT
    280. *----------------------------------------------------------------------*
    281. * Form READ_QAMB *
    282. *----------------------------------------------------------------------*
    283. * QAMBs lesen *
    284. *----------------------------------------------------------------------*
    285. FORM read_qamb USING p_qals LIKE qals
    286. p_qamb_tab TYPE qambtab
    287. p_subrc LIKE sy-subrc.
    288. CLEAR: p_subrc.
    289. SELECT * FROM qamb INTO TABLE p_qamb_tab
    290. WHERE prueflos = p_qals-prueflos
    291. AND typ = '3'.
    292. p_subrc = sy-subrc.
    293. ENDFORM. " READ_QAMB
    294. *----------------------------------------------------------------------*
    295. * Form READ_MKPF *
    296. *----------------------------------------------------------------------*
    297. * Read material document header *
    298. *----------------------------------------------------------------------*
    299. FORM read_mkpf USING p_qamb_tab TYPE qambtab
    300. p_mkpf_tab TYPE t_mkpf_tab
    301. p_subrc LIKE sy-subrc.
    302. DATA:
    303. BEGIN OF l_mkpf_key_tab OCCURS 0,
    304. mblnr LIKE mkpf-mblnr,
    305. mjahr LIKE mkpf-mjahr,
    306. END OF l_mkpf_key_tab.
    307. DATA:
    308. l_qamb LIKE qamb,
    309. l_mkpf LIKE mkpf,
    310. l_trtyp LIKE t158-trtyp VALUE 'A',
    311. l_vgart LIKE t158-vgart VALUE 'WQ',
    312. l_xexit LIKE qm00-qkz.
    313. p_subrc = 4.
    314. LOOP AT p_qamb_tab INTO l_qamb.
    315. l_mkpf_key_tab-mblnr = l_qamb-mblnr.
    316. l_mkpf_key_tab-mjahr = l_qamb-mjahr.
    317. COLLECT l_mkpf_key_tab.
    318. ENDLOOP.
    319. LOOP AT l_mkpf_key_tab.
    320. CALL FUNCTION 'ENQUEUE_EMMKPF'
    321. EXPORTING
    322. mblnr = l_mkpf_key_tab-mblnr
    323. mjahr = l_mkpf_key_tab-mjahr
    324. EXCEPTIONS
    325. foreign_lock = 1
    326. system_failure = 2
    327. OTHERS = 3.
    328. IF NOT sy-subrc IS INITIAL.
    329. l_xexit = 'X'.
    330. EXIT.
    331. ENDIF.
    332. CLEAR: l_mkpf.
    333. CALL FUNCTION 'MB_READ_MATERIAL_HEADER'
    334. EXPORTING
    335. mblnr = l_mkpf_key_tab-mblnr
    336. mjahr = l_mkpf_key_tab-mjahr
    337. trtyp = l_trtyp
    338. vgart = l_vgart
    339. IMPORTING
    340. kopf = l_mkpf
    341. EXCEPTIONS
    342. error_message = 1.
    343. IF NOT sy-subrc IS INITIAL.
    344. l_xexit = 'X'.
    345. EXIT.
    346. ELSE.
    347. APPEND l_mkpf TO p_mkpf_tab.
    348. ENDIF.
    349. ENDLOOP.
    350. IF NOT l_xexit IS INITIAL.
    351. EXIT.
    352. ELSE.
    353. p_subrc = 0.
    354. ENDIF.
    355. ENDFORM. " READ_MKPF
    356. *----------------------------------------------------------------------*
    357. * Form READ_MSEG *
    358. *----------------------------------------------------------------------*
    359. * MSEGs lesen *
    360. *----------------------------------------------------------------------*
    361. FORM read_mseg USING p_mkpf_tab TYPE t_mkpf_tab
    362. p_mseg_tab TYPE t_mseg_tab
    363. p_subrc LIKE sy-subrc.
    364. DATA:
    365. l_mkpf LIKE mkpf,
    366. l_mseg_tab LIKE mseg OCCURS 0 WITH HEADER LINE,
    367. l_trtyp LIKE t158-trtyp VALUE 'A',
    368. l_xexit LIKE qm00-qkz.
    369. p_subrc = 4.
    370. LOOP AT p_mkpf_tab INTO l_mkpf.
    371. CLEAR: l_mseg_tab. REFRESH: l_mseg_tab.
    372. CALL FUNCTION 'MB_READ_MATERIAL_POSITION'
    373. EXPORTING
    374. mblnr = l_mkpf-mblnr
    375. mjahr = l_mkpf-mjahr
    376. trtyp = l_trtyp
    377. */ ZEILB = P_ZEILE
    378. */ ZEILE = P_ZEILE
    379. TABLES
    380. seqtab = l_mseg_tab
    381. EXCEPTIONS
    382. error_message = 1.
    383. IF NOT sy-subrc IS INITIAL.
    384. l_xexit = 'X'.
    385. EXIT.
    386. ELSE.
    387. APPEND LINES OF l_mseg_tab TO p_mseg_tab.
    388. ENDIF.
    389. ENDLOOP.
    390. IF NOT l_xexit IS INITIAL.
    391. EXIT.
    392. ELSE.
    393. */ XAuto-Zeilen und Chargenzustands鋘derung werden gel鰏cht
    394. DELETE p_mseg_tab WHERE xauto NE space
    395. OR bwart EQ '341'
    396. OR bwart EQ '342'.
    397. p_subrc = 0.
    398. ENDIF.
    399. ENDFORM. " READ_MSEG
    400. *----------------------------------------------------------------------*
    401. * Form CREATE_GOODS_MOVEMENT *
    402. *----------------------------------------------------------------------*
    403. * Warenbewegung anlegen *
    404. *----------------------------------------------------------------------*
    405. FORM create_goods_movement USING p_qals LIKE qals
    406. p_mseg_tab TYPE t_mseg_tab
    407. p_subrc LIKE sy-subrc.
    408. DATA:
    409. l_lmengezub LIKE qals-lmengezub,
    410. l_lmengegeb LIKE qals-lmengezub,
    411. l_mbqss LIKE mbqss,
    412. l_imkpf LIKE imkpf,
    413. l_imseg LIKE imseg,
    414. l_imseg_tab LIKE imseg OCCURS 1,
    415. l_emkpf LIKE emkpf,
    416. l_emseg LIKE emseg,
    417. l_emseg_tab LIKE emseg OCCURS 1,
    418. l_mseg LIKE mseg,
    419. l_mseg_tab LIKE mseg OCCURS 1,
    420. l_tcode LIKE sy-tcode VALUE 'QA11',
    421. l_tabix LIKE sy-tabix VALUE 1,
    422. l_xstbw LIKE t156-xstbw.
    423. CLEAR: p_subrc.
    424. */QAMB initialisieren
    425. CALL FUNCTION 'QAMB_REFRESH_DATA'.
    426. */Kopf f黮len
    427. l_imkpf-bldat = sy-datlo.
    428. l_imkpf-budat = sy-datlo.
    429. l_imkpf-bktxt = 'Cancellation of QM UD postings'.
    430. */Urspr黱gliche zu buchende Menge merken + inkrementieren
    431. l_lmengezub = p_qals-lmengezub.
    432. l_lmengegeb = p_qals-lmenge01
    433. + p_qals-lmenge02
    434. + p_qals-lmenge03
    435. + p_qals-lmenge04
    436. + p_qals-lmenge05
    437. + p_qals-lmenge06
    438. + p_qals-lmenge07
    439. + p_qals-lmenge08
    440. + p_qals-lmenge09.
    441. */Zeilen aufbauen
    442. l_mseg_tab[] = p_mseg_tab[].
    443. LOOP AT l_mseg_tab INTO l_mseg.
    444. MOVE-CORRESPONDING l_mseg TO l_mbqss.
    445. MOVE-CORRESPONDING l_mbqss TO l_imseg.
    446. */ Referenzbeleg 黚ergeben, falls Bestellnummer gef黮lt
    447. IF NOT l_mseg-ebeln IS INITIAL.
    448. MOVE: l_mseg-lfbnr TO l_imseg-lfbnr,
    449. l_mseg-lfbja TO l_imseg-lfbja,
    450. l_mseg-lfpos TO l_imseg-lfpos.
    451. ENDIF.
    452. MOVE l_mseg-kdauf TO l_imseg-kdauf.
    453. MOVE l_mseg-kdpos TO l_imseg-kdpos.
    454. MOVE l_mseg-ps_psp_pnr TO l_imseg-ps_psp_pnr.
    455. */ Umlagerungsfelder setzen
    456. MOVE:
    457. l_mseg-ummat TO l_imseg-ummat,
    458. l_mseg-umwrk TO l_imseg-umwrk,
    459. l_mseg-umlgo TO l_imseg-umlgo,
    460. l_mseg-umcha TO l_imseg-umcha.
    461. */ Storno-Beleg setzen
    462. MOVE: l_mseg-mjahr TO l_imseg-sjahr,
    463. l_mseg-mblnr TO l_imseg-smbln,
    464. l_mseg-zeile TO l_imseg-smblp.
    465. */ Falsch gef黮lte Felder initialisieren
    466. CLEAR: l_imseg-mblnr,
    467. l_imseg-menge,
    468. l_imseg-meins.
    469. */ Bewegungsart lesen
    470. SELECT SINGLE xstbw FROM t156 INTO l_xstbw
    471. WHERE bwart = l_imseg-bwart.
    472. IF NOT sy-subrc IS INITIAL.
    473. p_subrc = 4.
    474. EXIT.
    475. ENDIF.
    476. */ Werk/Lagerort f黮len
    477. IF p_qals-stat11 IS INITIAL.
    478. IF l_xstbw IS INITIAL.
    479. MOVE p_qals-lagortvorg TO l_imseg-lgort.
    480. ELSE.
    481. MOVE p_qals-lagortvorg TO l_imseg-umlgo.
    482. ENDIF.
    483. ENDIF.
    484. IF l_xstbw IS INITIAL.
    485. MOVE p_qals-werkvorg TO l_imseg-werks.
    486. ELSE.
    487. MOVE p_qals-werkvorg TO l_imseg-umwrk.
    488. ENDIF.
    489. */ Zus鋞zliche Felder
    490. MOVE p_qals-mengeneinh TO l_imseg-erfme.
    491. "MOVE P_GRUND TO L_IMSEG-GRUND.
    492. "MOVE P_ELIKZ TO L_IMSEG-ELIKZ.
    493. */ Kennzeichen Storno-Buchung setzen
    494. MOVE 'X' TO l_imseg-xstob.
    495. MOVE p_qals-prueflos TO l_imseg-qplos.
    496. APPEND l_imseg TO l_imseg_tab.
    497. IF p_qals-stat11 IS INITIAL.
    498. ADD l_imseg-erfmg TO l_lmengezub.
    499. SUBTRACT l_imseg-erfmg FROM l_lmengegeb.
    500. ELSE.
    501. IF l_imseg-kzbew EQ space
    502. AND l_imseg-werks NE space
    503. AND l_imseg-lgort NE space
    504. AND l_imseg-umwrk NE space
    505. AND l_imseg-umlgo NE space
    506. AND l_imseg-werks EQ l_imseg-umwrk
    507. AND l_imseg-umlgo EQ l_imseg-umlgo.
    508. */ Dummy Buchung bei WE-Sperrbestand & Stichprobe
    509. ELSE.
    510. ADD l_imseg-erfmg TO l_lmengezub.
    511. SUBTRACT l_imseg-erfmg FROM l_lmengegeb.
    512. ENDIF.
    513. ENDIF.
    514. ENDLOOP.
    515. IF NOT p_qals-stat11 IS INITIAL.
    516. */ Bei WE-Sperrbestand und Stichprobenbuchung Zeilen tauschen
    517. DO.
    518. READ TABLE l_imseg_tab INDEX sy-index INTO l_imseg.
    519. IF sy-subrc IS INITIAL
    520. AND l_imseg-kzbew EQ space
    521. AND l_imseg-werks NE space
    522. AND l_imseg-lgort NE space
    523. AND l_imseg-umwrk NE space
    524. AND l_imseg-umlgo NE space
    525. AND l_imseg-werks EQ l_imseg-umwrk
    526. AND l_imseg-umlgo EQ l_imseg-umlgo.
    527. IF sy-tabix NE l_tabix.
    528. DELETE l_imseg_tab INDEX sy-tabix.
    529. INSERT l_imseg INTO l_imseg_tab INDEX l_tabix.
    530. l_tabix = l_tabix + 1.
    531. ELSE.
    532. l_tabix = l_tabix + 1.
    533. CONTINUE.
    534. ENDIF.
    535. ELSEIF sy-subrc IS INITIAL.
    536. CONTINUE.
    537. ELSE.
    538. EXIT. "from do
    539. ENDIF.
    540. ENDDO.
    541. ENDIF.
    542. */QM deaktivieren
    543. CALL FUNCTION 'QAAT_QM_ACTIVE_INACTIVE'
    544. EXPORTING
    545. aktiv = space.
    546. */Buchen
    547. CALL FUNCTION 'MB_CREATE_GOODS_MOVEMENT'
    548. EXPORTING
    549. imkpf = l_imkpf
    550. xallp = 'X'
    551. xallr = 'X'
    552. ctcod = l_tcode
    553. xqmcl = ' '
    554. IMPORTING
    555. emkpf = l_emkpf
    556. TABLES
    557. imseg = l_imseg_tab
    558. emseg = l_emseg_tab.
    559. */QM wieder aktivieren
    560. CALL FUNCTION 'QAAT_QM_ACTIVE_INACTIVE'
    561. EXPORTING
    562. aktiv = 'X'.
    563. */Buchung auswerten
    564. IF l_emkpf-subrc GT 1.
    565. IF l_emkpf-msgid NE space.
    566. */ Fehler auf Kopfebene
    567. MESSAGE ID l_emkpf-msgid TYPE 'S'
    568. NUMBER l_emkpf-msgno
    569. WITH l_emkpf-msgv1 l_emkpf-msgv2
    570. l_emkpf-msgv3 l_emkpf-msgv4.
    571. SUBMIT (sy-repid) VIA SELECTION-SCREEN.
    572. ELSE.
    573. */ Fehler auf Zeilenebene (Ausgabe des ersten Fehlers)
    574. LOOP AT l_emseg_tab INTO l_emseg.
    575. IF l_emseg-msgid NE space.
    576. MESSAGE ID l_emseg-msgid TYPE 'S'
    577. NUMBER l_emseg-msgno
    578. WITH l_emseg-msgv1 l_emseg-msgv2
    579. l_emseg-msgv3 l_emseg-msgv4.
    580. SUBMIT (sy-repid) VIA SELECTION-SCREEN.
    581. ENDIF.
    582. ENDLOOP.
    583. ENDIF.
    584. ENDIF.
    585. LOOP AT l_emseg_tab INTO l_emseg.
    586. CALL FUNCTION 'QAMB_COLLECT_RECORD'
    587. EXPORTING
    588. lotnumber = p_qals-prueflos
    589. docyear = l_emkpf-mjahr
    590. docnumber = l_emkpf-mblnr
    591. docposition = l_emseg-mblpo
    592. type = '7'.
    593. ENDLOOP.
    594. */Sonderkorrektur f黵 Frei-An-Frei & WE-Sperr-An-We-Sperr
    595. IF NOT p_qals-stat11 IS INITIAL.
    596. IF p_qals-lmenge04 EQ l_lmengegeb.
    597. ADD p_qals-lmenge04 TO l_lmengezub.
    598. SUBTRACT p_qals-lmenge04 FROM l_lmengegeb.
    599. ENDIF.
    600. ELSEIF p_qals-insmk IS INITIAL.
    601. IF p_qals-lmenge01 GE l_lmengegeb
    602. AND NOT p_qals-lmenge01 IS INITIAL.
    603. ADD l_lmengegeb TO l_lmengezub.
    604. SUBTRACT l_lmengegeb FROM l_lmengegeb.
    605. ENDIF.
    606. ENDIF.
    607. CLEAR: p_qals-stat34,
    608. p_qals-matnrneu,
    609. p_qals-chargneu,
    610. p_qals-lmenge01,
    611. p_qals-lmenge02,
    612. p_qals-lmenge03,
    613. p_qals-lmenge04,
    614. p_qals-lmenge05,
    615. p_qals-lmenge06,
    616. p_qals-lmenge07,
    617. p_qals-lmenge08,
    618. p_qals-lmenge09.
    619. p_qals-lmengezub = l_lmengezub.
    620. IF NOT l_lmengegeb IS INITIAL.
    621. p_subrc = 4.
    622. ENDIF.
    623. ENDFORM. " CREATE_GOODS_MOVEMENT
    624. *----------------------------------------------------------------------*
    625. * Form POST_GOODS_MOVEMENT *
    626. *----------------------------------------------------------------------*
    627. * Warenbewegung buchen *
    628. *----------------------------------------------------------------------*
    629. FORM post_goods_movement.
    630. CALL FUNCTION 'MB_POST_GOODS_MOVEMENT'.
    631. ENDFORM. " POST_GOODS_MOVEMENT
    632. *----------------------------------------------------------------------*
    633. * Form POST_DATA *
    634. *----------------------------------------------------------------------*
    635. * QM-Daten verbuchen *
    636. *----------------------------------------------------------------------*
    637. FORM post_data USING p_qals LIKE qals
    638. p_qals_leiste LIKE qals
    639. p_qamb_tab TYPE qambtab
    640. p_qamb_vb_tab TYPE qambtab
    641. p_subrc LIKE sy-subrc.
    642. DATA:
    643. l_stat LIKE jstat,
    644. l_stat_tab LIKE jstat OCCURS 0,
    645. l_qamb LIKE qamb,
    646. l_updkz LIKE qalsvb-upsl VALUE 'U'.
    647. */QAMBs umsetzen (7 = VE-Buchung storniert)
    648. LOOP AT p_qamb_tab INTO l_qamb.
    649. l_qamb-typ = '7'.
    650. APPEND l_qamb TO p_qamb_vb_tab.
    651. ENDLOOP.
    652. */BERF & BTEI zur點knehmen
    653. CLEAR l_stat. CLEAR l_stat_tab.
    654. l_stat-inact = 'X'.
    655. l_stat-stat = 'I0219'. APPEND l_stat TO l_stat_tab. "BTEI
    656. l_stat-stat = 'I0220'. APPEND l_stat TO l_stat_tab. "BEND
    657. CALL FUNCTION 'STATUS_CHANGE_INTERN'
    658. EXPORTING
    659. objnr = p_qals-objnr
    660. TABLES
    661. status = l_stat_tab
    662. EXCEPTIONS
    663. error_message = 1.
    664. IF sy-subrc <> 0.
    665. MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
    666. WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    667. SUBMIT (sy-repid) VIA SELECTION-SCREEN.
    668. ENDIF.
    669. */Pr黤los aktualisieren
    670. CALL FUNCTION 'QPL1_UPDATE_MEMORY'
    671. EXPORTING
    672. i_qals = p_qals
    673. i_updkz = l_updkz.
    674. CALL FUNCTION 'QPL1_INSPECTION_LOTS_POSTING'
    675. EXPORTING
    676. i_mode = '1'.
    677. CALL FUNCTION 'STATUS_UPDATE_ON_COMMIT'.
    678. */QAMB initialisieren
    679. CALL FUNCTION 'QAMB_REFRESH_DATA'.
    680. PERFORM update_qamb ON COMMIT.
    681. p_subrc = 0.
    682. ENDFORM. " POST_DATA
    683. *----------------------------------------------------------------------*
    684. * Form UPDATE_QAMB *
    685. *----------------------------------------------------------------------*
    686. * Update auf QAMB *
    687. *----------------------------------------------------------------------*
    688. FORM update_qamb.
    689. CALL FUNCTION 'QEVA_QAMB_CANCEL' IN UPDATE TASK
    690. EXPORTING
    691. t_qamb_tab = g_qamb_vb_tab.
    692. ENDFORM. " UPDATE_QAMB
    693. *----------------------------------------------------------------------*
    694. * Form CHECK_MSEG *
    695. *----------------------------------------------------------------------*
    696. * MSEGs pr黤en *
    697. *----------------------------------------------------------------------*
    698. FORM check_mseg USING p_mseg_tab TYPE t_mseg_tab
    699. p_qamb_tab TYPE qambtab
    700. p_subrc LIKE sy-subrc.
    701. DATA:
    702. l_mseg_stor_tab LIKE mseg OCCURS 0 WITH HEADER LINE.
    703. CLEAR: p_subrc.
    704. */Zeilen bereits storniert?
    705. SELECT mblnr mjahr zeile smbln sjahr smblp
    706. FROM mseg INTO CORRESPONDING FIELDS OF TABLE l_mseg_stor_tab
    707. FOR ALL ENTRIES IN p_mseg_tab
    708. WHERE smbln EQ p_mseg_tab-mblnr
    709. AND sjahr EQ p_mseg_tab-mjahr
    710. AND smblp EQ p_mseg_tab-zeile.
    711. IF sy-subrc IS INITIAL.
    712. LOOP AT l_mseg_stor_tab.
    713. DELETE p_mseg_tab WHERE mblnr = l_mseg_stor_tab-smbln
    714. AND mjahr = l_mseg_stor_tab-sjahr
    715. AND zeile = l_mseg_stor_tab-smblp.
    716. DELETE p_qamb_tab WHERE mblnr = l_mseg_stor_tab-smbln
    717. AND mjahr = l_mseg_stor_tab-sjahr
    718. AND zeile = l_mseg_stor_tab-smblp.
    719. ENDLOOP.
    720. IF p_mseg_tab[] IS INITIAL.
    721. p_subrc = 4.
    722. EXIT.
    723. ENDIF.
    724. ENDIF.
    725. ENDFORM. " CHECK_MSEG
    726. *----------------------------------------------------------------------*
    727. * Form CHECK_MKPF *
    728. *----------------------------------------------------------------------*
    729. * Materialbelege pr黤en (Wurde durch VE-Buchung Pr黤llos erzeugt?*
    730. *----------------------------------------------------------------------*
    731. FORM check_mkpf USING p_mkpf_tab TYPE t_mkpf_tab
    732. p_subrc LIKE sy-subrc.
    733. DATA:
    734. l_mkpf_tab TYPE t_mkpf_tab.
    735. CLEAR: p_subrc.
    736. SELECT mblnr FROM qamb INTO CORRESPONDING FIELDS OF TABLE l_mkpf_tab
    737. FOR ALL ENTRIES IN p_mkpf_tab
    738. WHERE mblnr EQ p_mkpf_tab-mblnr
    739. AND mjahr EQ p_mkpf_tab-mjahr
    740. AND typ = '1'.
    741. IF sy-subrc IS INITIAL.
    742. p_subrc = 4.
    743. ENDIF.
    744. ENDFORM. " CHECK_MKPF

  • 相关阅读:
    数据结构与算法------数组
    linux 编译安装 opencv 和指定 opencv_contrib 库
    JVM虚拟机-虚拟机执行子系统-第6章 字节码指令
    数据分析案例-基于sklearn随机森林算法探究影响预期寿命的因素
    初识node.js
    JavaScript奇淫技巧:把JS编译成exe
    【技术积累】算法中的动态规划【一】
    gd32F470串口重定义
    【.NET8】访问私有成员新姿势UnsafeAccessor(下)
    DDoS渗透与攻防实战 (一) : 初识DDoS
  • 原文地址:https://blog.csdn.net/csui2008/article/details/125617123