前言: 在项目上遇到的需求,在QA16中增加取消UD按钮,实现UD冲销功能,在网上查阅了一些,找到一些资料,在此记录下。

用到的增强点:
CMOD:QEVA0008 用途决议:客户功能代码(例如取消 UD)
用到的NOTE:
-74638
-175842

参考链接:SAP QM取消UD方法

增强步骤:

1.CMOD创建项目ZMM002

1.1添加逻辑代码

检验批冲销取消UD增强 - 图1
检验批冲销取消UD增强 - 图2
检验批冲销取消UD增强 - 图3
检验批冲销取消UD增强 - 图4
检验批冲销取消UD增强 - 图5

  1. DATA lv_line TYPE bsvx-sttxt.
  2. CLEAR lv_line.
  3. CALL FUNCTION 'STATUS_TEXT_EDIT'
  4. EXPORTING
  5. client = sy-mandt
  6. objnr = i_qals-objnr
  7. only_active = 'X'
  8. spras = sy-langu
  9. IMPORTING
  10. line = lv_line
  11. EXCEPTIONS
  12. object_not_found = 1
  13. OTHERS = 2.
  14. IF lv_line CS 'UD'.
  15. SUBMIT zqevac40 WITH prueflos = i_qals-prueflos AND RETURN.
  16. WAIT UP TO '1' SECONDS.
  17. ENDIF.
  18. SUBMIT zrqevac50 WITH prueflos = i_qals-prueflos AND RETURN.

1.2添加取消UD按钮

检验批冲销取消UD增强 - 图6
检验批冲销取消UD增强 - 图7

1.3配置事务

事务码:OMJJ

检验批冲销取消UD增强 - 图8
检验批冲销取消UD增强 - 图9
检验批冲销取消UD增强 - 图10

激活项目,增强完成

2.附程序

2.1 ZQEVAC40

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

2.2 ZRQEVAC50

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