1. FUNCTION Z_SD_CREATE_DN.
  2. *"----------------------------------------------------------------------
  3. *"*"本地接口:
  4. *" IMPORTING
  5. *" VALUE(IM_SHIP_TYPE) TYPE LIKP-VSART DEFAULT '01'
  6. *" VALUE(IM_DUE_DATE) TYPE DATUM DEFAULT '99991231'
  7. *" EXPORTING
  8. *" VALUE(E_DN) TYPE CHAR10
  9. *" VALUE(E_STATUS) TYPE CHAR1
  10. *" VALUE(E_MESSAGE) TYPE CHAR40
  11. *" TABLES
  12. *" T_DATA STRUCTURE ZSDS0008
  13. *" IT_RETURN STRUCTURE BAPIRET2 OPTIONAL
  14. *" IT_DN STRUCTURE VBAK OPTIONAL
  15. *"----------------------------------------------------------------------
  16. DATA : LV_SHIP_POINT TYPE BAPIDLVCREATEHEADER-SHIP_POINT,
  17. LV_DUE_DATE TYPE BAPIDLVCREATEHEADER-DUE_DATE,
  18. LV_DELIVERY TYPE BAPISHPDELIVNUMB-DELIV_NUMB,
  19. LV_DELIVERYS TYPE BAPIDLVCREATEHEADER-NUM_DELIVERIES, "TUS-2015-12-04
  20. LT_DELIVERIES TYPE BAPISHPDELIVNUMB OCCURS WITH HEADER LINE, "TUS-2015-12-04
  21. LT_SO_ITEMS LIKE TABLE OF BAPIDLVREFTOSALESORDER,
  22. LS_SO_ITEM LIKE BAPIDLVREFTOSALESORDER,
  23. LT_STO_ITEMS LIKE TABLE OF BAPIDLVREFTOSTO,
  24. LS_STO_ITEM LIKE BAPIDLVREFTOSTO,
  25. LT_RETURN LIKE TABLE OF BAPIRET2,
  26. LS_RETURN LIKE BAPIRET2.
  27.  
  28. DATA : LV_TYPE(). "PO / SO
  29. DATA : LV_SUCCESS.
  30. DATA : LV_MATNR TYPE VBAP-MATNR.
  31. DATA : LV_VBELN TYPE VBELN.
  32. DATA : LV_TABIX TYPE SY-TABIX.
  33. DATA : LV_CONTINUE.
  34.  
  35. DATA : LT_LIPS TYPE TABLE OF LIPS,
  36. LS_LIPS TYPE LIPS.
  37.  
  38. DATA : BEGIN OF LS_DATA,
  39. DEL.
  40. INCLUDE STRUCTURE ZSDS0008.
  41. DATA : END OF LS_DATA.
  42.  
  43. DATA : LT_DATA LIKE TABLE OF LS_DATA.
  44.  
  45. DATA : BEGIN OF LT_VBFA OCCURS ,
  46. VBELV TYPE VBFA-VBELV, "先前凭证
  47. POSNV TYPE VBFA-POSNV,
  48. VBELN TYPE VBFA-VBELN, "后续凭证
  49. POSNR TYPE VBFA-POSNN,
  50. END OF LT_VBFA.
  51.  
  52. DATA : LV_MAX TYPE I VALUE '',
  53. LV_COUNT TYPE I.
  54.  
  55. LOOP AT T_DATA.
  56. MOVE-CORRESPONDING T_DATA TO LS_DATA.
  57. APPEND LS_DATA TO LT_DATA.
  58. ENDLOOP.
  59.  
  60. PERFORM FRM_DATA_CHECK TABLES LT_DATA CHANGING E_MESSAGE.
  61.  
  62. IF E_MESSAGE IS NOT INITIAL.
  63. E_STATUS = 'E'.
  64. EXIT.
  65. ENDIF.
  66.  
  67. REFRESH : LT_STO_ITEMS,
  68. LT_SO_ITEMS,
  69. IT_RETURN.
  70.  
  71. SORT LT_DATA BY VBELN POSNR.
  72.  
  73. LV_DUE_DATE = IM_DUE_DATE.
  74.  
  75. CLEAR LS_DATA.
  76. READ TABLE LT_DATA INTO LS_DATA INDEX .
  77. SELECT SINGLE * FROM EKKO WHERE EBELN = LS_DATA-VBELN.
  78. IF SY-SUBRC EQ ."PO - STO.
  79. LV_TYPE = 'PO'.
  80. LV_SHIP_POINT = ''.
  81. * LV_DUE_DATE = '99991230'.
  82. ELSE.
  83. LV_TYPE = 'SO'.
  84. LV_SHIP_POINT = ''.
  85. * LV_DUE_DATE = '99991230'.
  86. ENDIF.
  87. ***********CHANGED BY JAHLEEL 20160328 BEGIN**************************
  88. *CHANGE THE WAY OF SEARCHING THE DELIVERY FROM SALES ORDERS.
  89.  
  90. ** 判断行项目是否产生过交货单
  91. * SELECT VGBEL AS VBELV VGPOS AS POSNV VBELN POSNR
  92. * FROM LIPS
  93. * INTO TABLE LT_VBFA
  94. * WHERE VGBEL = LS_DATA-VBELN.
  95.  
  96. IF LV_TYPE EQ 'SO'.
  97.  
  98. SELECT VBELV POSNV VBELN POSNN AS POSNR
  99. FROM VBFA
  100. INTO TABLE LT_VBFA
  101. WHERE VBELN EQ LS_DATA-VBELN
  102. AND VBTYP_N EQ 'J'.
  103.  
  104. ELSEIF LV_TYPE EQ 'PO'.
  105.  
  106. SELECT EBELN AS VBELV EBELP AS POSNV BELNR AS VBELN BUZEI AS POSNR
  107. FROM EKBE
  108. INTO TABLE LT_VBFA
  109. WHERE EBELN EQ LS_DATA-VBELN
  110. AND BEWTP EQ 'L'.
  111.  
  112. ENDIF.
  113.  
  114. ***********CHANGED BY JAHLEEL 20160328 END***************************
  115.  
  116. * 控制交货单最大的项目数
  117. DO.
  118.  
  119. CLEAR LV_CONTINUE.
  120.  
  121. LOOP AT LT_DATA INTO LS_DATA WHERE DEL EQ ''.
  122.  
  123. * IF LV_MAX = LV_COUNT.
  124. * CLEAR LV_COUNT.
  125. * EXIT.
  126. * ENDIF.
  127. * 排除掉已经创建过交货单的行项目
  128. READ TABLE LT_VBFA WITH KEY VBELV = LS_DATA-VBELN POSNV = LS_DATA-POSNR.
  129. IF SY-SUBRC EQ .
  130. E_DN = LT_VBFA-VBELN.
  131. IT_DN-VBELN = E_DN.
  132. COLLECT IT_DN.
  133. CONTINUE.
  134. ENDIF.
  135.  
  136. CLEAR E_DN.
  137.  
  138. ADD TO LV_COUNT.
  139.  
  140. IF LV_TYPE = 'PO'.
  141. CLEAR LS_STO_ITEM.
  142. LS_STO_ITEM-REF_DOC = LS_DATA-VBELN.
  143. LS_STO_ITEM-REF_ITEM = LS_DATA-POSNR.
  144. APPEND LS_STO_ITEM TO LT_STO_ITEMS.
  145. ELSE.
  146. CLEAR LS_SO_ITEM.
  147. LS_SO_ITEM-REF_DOC = LS_DATA-VBELN.
  148. LS_SO_ITEM-REF_ITEM = LS_DATA-POSNR.
  149. APPEND LS_SO_ITEM TO LT_SO_ITEMS.
  150. ENDIF.
  151.  
  152. LV_CONTINUE = 'X'.
  153.  
  154. LS_DATA-DEL = 'X'.
  155. MODIFY LT_DATA FROM LS_DATA TRANSPORTING DEL.
  156. ENDLOOP.
  157.  
  158. IF LV_CONTINUE EQ ''.
  159. EXIT.
  160. ENDIF.
  161.  
  162. IF LV_DUE_DATE NE ''.
  163. FREE MEMORY ID 'DUE_DATE'.
  164. EXPORT LV_DUE_DATE TO MEMORY ID 'DUE_DATE'.
  165. ENDIF.
  166.  
  167. IF LT_SO_ITEMS IS NOT INITIAL.
  168. * Call BAPI to Create DN
  169. CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_SLS'
  170. EXPORTING
  171. SHIP_POINT = LV_SHIP_POINT
  172. DUE_DATE = LV_DUE_DATE
  173. IMPORTING
  174. DELIVERY = LV_DELIVERY
  175. TABLES
  176. SALES_ORDER_ITEMS = LT_SO_ITEMS
  177. RETURN = LT_RETURN.
  178.  
  179. ELSEIF LT_STO_ITEMS IS NOT INITIAL.
  180. * Call BAPI to Create DN
  181. CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_STO'
  182. EXPORTING
  183. SHIP_POINT = LV_SHIP_POINT
  184. DUE_DATE = LV_DUE_DATE
  185. IMPORTING
  186. DELIVERY = LV_DELIVERY
  187. NUM_DELIVERIES = LV_DELIVERYS "TUS-2015-12-04
  188. TABLES
  189. STOCK_TRANS_ITEMS = LT_STO_ITEMS
  190. DELIVERIES = LT_DELIVERIES "TUS-2015-12-04
  191. RETURN = LT_RETURN.
  192.  
  193. ENDIF.
  194.  
  195. APPEND LINES OF LT_RETURN TO IT_RETURN.
  196.  
  197. LOOP AT LT_RETURN TRANSPORTING NO FIELDS WHERE TYPE = 'A' OR
  198. TYPE = 'E' OR
  199. TYPE = 'X'.
  200. EXIT.
  201. ENDLOOP.
  202.  
  203. IF SY-SUBRC EQ .
  204. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  205.  
  206. PERFORM FRM_CONVERT_MESSAGE TABLES LT_RETURN CHANGING E_MESSAGE.
  207.  
  208. E_STATUS = 'E'.
  209. EXIT.
  210. ELSE.
  211. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
  212. EXPORTING
  213. WAIT = 'X'.
  214.  
  215. E_STATUS = 'S'.
  216. E_DN = LV_DELIVERY.
  217. ENDIF.
  218.  
  219. IF LT_DELIVERIES[] IS NOT INITIAL.
  220. DO TIMES.
  221. SELECT *
  222. FROM LIPS
  223. INTO TABLE LT_LIPS
  224. FOR ALL ENTRIES IN LT_DELIVERIES
  225. WHERE VBELN = LT_DELIVERIES-DELIV_NUMB.
  226.  
  227. IF SY-SUBRC EQ .
  228. EXIT.
  229. ENDIF.
  230. ENDDO.
  231. ELSE.
  232. DO TIMES.
  233. SELECT *
  234. FROM LIPS
  235. INTO TABLE LT_LIPS
  236. WHERE VBELN = LV_DELIVERY.
  237.  
  238. IF SY-SUBRC EQ .
  239. EXIT.
  240. ENDIF.
  241. ENDDO.
  242. ENDIF.
  243.  
  244. * --->请求交货数量 与交货数量不一致 20152417
  245. IF LT_STO_ITEMS IS NOT INITIAL AND LINES( LT_STO_ITEMS ) NE LINES( LT_LIPS ).
  246. * WAIT UP TO 1 SECONDS.
  247. "更换成内表 TUS-2015-12-04
  248. LOOP AT LT_DELIVERIES.
  249. PERFORM FRM_DELETE_DELIVERY TABLES IT_RETURN USING LT_DELIVERIES-DELIV_NUMB.
  250. CLEAR IT_RETURN.
  251. IT_RETURN-ID = ''.
  252. IT_RETURN-NUMBER = ''.
  253. IT_RETURN-TYPE = 'E'.
  254. IT_RETURN-MESSAGE = '交货数量与请求交货数量不一致,停止交货'.
  255. IT_RETURN-MESSAGE_V1 = '交货数量与请求交货数量不一致'.
  256. IT_RETURN-MESSAGE_V2 = ',停止交货'.
  257. IT_RETURN-MESSAGE_V3 = LT_DELIVERIES-DELIV_NUMB.
  258. IT_RETURN-MESSAGE_V4 = ''.
  259. APPEND IT_RETURN.
  260.  
  261. CLEAR: E_STATUS,E_DN.
  262. ENDLOOP.
  263. EXIT.
  264. ELSEIF LT_SO_ITEMS IS NOT INITIAL AND LINES( LT_SO_ITEMS ) NE LINES( LT_LIPS ).
  265. * WAIT UP TO 1 SECONDS.
  266. PERFORM FRM_DELETE_DELIVERY TABLES IT_RETURN USING LV_DELIVERY.
  267. CLEAR IT_RETURN.
  268. IT_RETURN-ID = ''.
  269. IT_RETURN-NUMBER = ''.
  270. IT_RETURN-TYPE = 'E'.
  271. IT_RETURN-MESSAGE = '交货数量与请求交货数量不一致,停止交货'.
  272. IT_RETURN-MESSAGE_V1 = '交货数量与请求交货数量不一致'.
  273. IT_RETURN-MESSAGE_V2 = ',停止交货'.
  274. IT_RETURN-MESSAGE_V3 = LV_DELIVERY.
  275. IT_RETURN-MESSAGE_V4 = ''.
  276. APPEND IT_RETURN.
  277.  
  278. CLEAR: E_STATUS,E_DN.
  279. EXIT.
  280. ENDIF.
  281. * <---请求交货数量 与交货数量不一致 20150427
  282. IF LT_DELIVERIES[] IS NOT INITIAL.
  283. LOOP AT LT_DELIVERIES.
  284. IT_DN-VBELN = LT_DELIVERIES-DELIV_NUMB.
  285. APPEND IT_DN.
  286. ENDLOOP.
  287. ELSE.
  288. IT_DN-VBELN = LV_DELIVERY.
  289. APPEND IT_DN.
  290. ENDIF.
  291.  
  292. * REFRESH : GT_DN_ITEM.
  293. *
  294. * LOOP AT LT_LIPS INTO LS_LIPS.
  295. * LV_TABIX = SY-TABIX.
  296. *
  297. * CLEAR GS_DN_ITEM.
  298. * GS_DN_ITEM-DELIV_NUMB = LS_LIPS-VBELN.
  299. * GS_DN_ITEM-DELIV_ITEM = LS_LIPS-POSNR.
  300. * GS_DN_ITEM-MATERIAL = LS_LIPS-MATNR.
  301. * GS_DN_ITEM-DLV_QTY = LS_LIPS-LGMNG.
  302. * GS_DN_ITEM-FACT_UNIT_NOM = LS_LIPS-UMVKZ.
  303. * GS_DN_ITEM-FACT_UNIT_DENOM = LS_LIPS-UMVKN.
  304. *
  305. * READ TABLE LT_DATA INTO LS_DATA WITH KEY VBELN = LS_LIPS-VGBEL POSNR = LS_LIPS-VGPOS.
  306. * IF SY-SUBRC EQ 0 AND LS_DATA-CHARG IS NOT INITIAL AND LS_LIPS-CHARG NE LS_DATA-CHARG.
  307. * GS_DN_ITEM-BATCH = LS_DATA-CHARG.
  308. * APPEND GS_DN_ITEM TO GT_DN_ITEM.
  309. *
  310. * LS_LIPS-CHARG = LS_DATA-CHARG.
  311. * ELSE.
  312. * DELETE LT_LIPS INDEX LV_TABIX.
  313. * CONTINUE.
  314. * ENDIF.
  315. *
  316. * CLEAR GS_DN_ITEM_CTR.
  317. * GS_DN_ITEM_CTR-DELIV_NUMB = LS_LIPS-VBELN.
  318. * GS_DN_ITEM_CTR-DELIV_ITEM = LS_LIPS-POSNR.
  319. * GS_DN_ITEM_CTR-CHG_DELQTY = 'X'.
  320. * APPEND GS_DN_ITEM_CTR TO GT_DN_ITEM_CTR.
  321. *
  322. * MODIFY LT_LIPS FROM LS_LIPS TRANSPORTING CHARG.
  323. * ENDLOOP.
  324.  
  325. * CHECK GT_DN_ITEM IS NOT INITIAL.
  326.  
  327. * GS_DN_HEADER-DELIV_NUMB = LV_DELIVERY.
  328. * GS_DN_HEADER_CTR-DELIV_NUMB = LV_DELIVERY.
  329. * GS_DN_HEADER-SHIP_COND = IM_SHIP_COND."Ship condition
  330. * GS_DN_HEADER_CTR-SHIP_COND_FLG = 'X'."Ship condition
  331. * GV_DN_NUMBER = LV_DELIVERY.
  332.  
  333. * Update Batch to DN
  334. * CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
  335. * EXPORTING
  336. * HEADER_DATA = GS_DN_HEADER
  337. * HEADER_CONTROL = GS_DN_HEADER_CTR
  338. * DELIVERY = GV_DN_NUMBER
  339. * TABLES
  340. * ITEM_DATA = GT_DN_ITEM
  341. * ITEM_CONTROL = GT_DN_ITEM_CTR
  342. * RETURN = GT_RETURN.
  343.  
  344. * LV_VBELN = LV_DELIVERY.
  345. * CALL FUNCTION 'Z_SD_CHANGE_DN'
  346. * EXPORTING
  347. * IM_DELIVERY = LV_VBELN
  348. * IM_SHIP_TYPE = IM_SHIP_TYPE
  349. * TABLES
  350. * IT_ITEM = LT_LIPS
  351. * IT_RETURN = GT_RETURN.
  352. *
  353. *
  354. * LOOP AT GT_RETURN TRANSPORTING NO FIELDS WHERE TYPE = 'A' OR
  355. * TYPE = 'E' OR
  356. * TYPE = 'X'.
  357. * EXIT.
  358. * ENDLOOP.
  359. *
  360. * IF SY-SUBRC EQ 0.
  361. * CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  362. *
  363. * APPEND LINES OF GT_RETURN TO IT_RETURN.
  364. *
  365. * PERFORM FRM_CONVERT_MESSAGE TABLES GT_RETURN CHANGING E_MESSAGE.
  366. ** Delete Delivery Note
  367. * PERFORM FRM_DELETE_DELIVERY USING LV_VBELN.
  368. *
  369. * E_STATUS = 'E'.
  370. * ELSE.
  371. * CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
  372. * EXPORTING
  373. * WAIT = 'X'.
  374. *
  375. * E_STATUS = 'S'.
  376. * E_DN = LV_DELIVERY.
  377. * ENDIF.
  378. *
  379. * REFRESH: LT_SO_ITEMS,
  380. * LT_STO_ITEMS,
  381. * LT_LIPS.
  382. *
  383. * APPEND LINES OF GT_RETURN TO IT_RETURN.
  384. *
  385. * IT_DN-VBELN = LV_DELIVERY.
  386. * APPEND IT_DN.
  387. ENDDO.
  388.  
  389. ENDFUNCTION.

根据采购/销售订单创建STO/SO的更多相关文章

  1. 为什么S/4HANA的销售订单创建会触发生产订单的创建

    调用S/4HANA销售订单创建函数SD_SALES_DOCU_MAINTAIN创建一个销售订单时,会触发生产订单的创建. 销售订单的每个行项目对应一个独立的生产订单,SD_SALES_DOCU_MAI ...

  2. SAP S/4HANA销售订单创建时,会自动触发生产订单的创建

    这个自动触发的过程是怎么实现的? 使用下面的代码创建一个销售订单: DATA: ls_header TYPE bapisdhd1, ls_headerx TYPE bapisdhd1x, lt_bap ...

  3. 如何用代码的方式取出SAP C4C销售订单创建后所有业务伙伴的数据

    比如我创建了一个Sales Order(销售订单)后,如何用代码的方式取出这些通过SAP Partner determination自动填充的Involved Parties信息呢? 一种方法可以使用 ...

  4. 1.5 外部销售自动创建为内部PR

    1.5          外部销售自动创建为内部PR 1.5.1   业务方案描述 外部销售订单登记后,在销售订单录入界面点击一个创建内部申请按钮,自动将外部销售订单创建为内部申请,创建后将不得再次创 ...

  5. SAP Cloud for Customer销售订单External Note的建模细节

    SAP Cloud for Customer的销售订单创建页面里,我们可以给一个订单维护External Note,当这个订单同步到S/4HANA生成对应的生产订单后,这个note可以作为备注提示生产 ...

  6. 销售订单、外向交货单、交货 bapi

    转自[http://www.cnblogs.com/elegantok/archive/2009/10/18/1585398.html]***********SALES ORDER INPUT CRE ...

  7. 销售订单(SO)-API-创建销售订单

    创建销售订单API主要注意几点: 初始化环境变量:fnd_global.apps_initialize(); mo_global.init('ONT'); mo_global.set_policy_c ...

  8. sap 如何获取公司间采购订单或销售订单的交货状态

    在上SAP项目过程,上了SD模块的企业一般都要做一些跟公司间采购订单或销售订单的交货状态的报表,通过这些报表可以经客户的业务上提供很大的灵活性,至于如何的灵活,还是那句老话“谁用谁知道".1 ...

  9. SAP IDOC 通过采购订单输出消息生成销售订单

    题记: 在网络上看到一篇类似的公众号文章,叫<通过IDoc逐步指导PO&SO集成>,个人觉得整个配置过程中还是少了一些重点配置,也少了说明整个功能的核心逻辑,那么,趁着这个机会,就 ...

随机推荐

  1. 不小心删除数据--利用MySQL的binlog恢复数据

    MySQL Binary Log也就是常说的bin-log, ,是mysql执行改动产生的二进制日志文件,其主要作用有两个: * 数据回复 * 主从数据库.用于slave端执行增删改,保持与maste ...

  2. [SAP ABAP开发技术总结]OK_CODE

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. [Effective Java]第三章 对所有对象都通用的方法

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  4. Android——android必看 各个控件属性(网上看到的文字,觉得挺好的,珍藏了)

    属性 值 说明 Android:orientation horizontal/vertical 设置布局水平还是垂直,默认是垂直 android:checked true/false 标记默认选中,如 ...

  5. Shell Sort(草稿)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Shel ...

  6. .NET 4.0 任务和并行编程系列

    8天玩转并行开发 8天玩转并行开发——第一天 Parallel的使用 8天玩转并行开发——第二天 Task的使用 8天玩转并行开发——第三天 plinq的使用 8天玩转并行开发——第四天 同步机制(上 ...

  7. For Exam (Java常用设计模式) 介绍

    一 创建型模式 工厂模式(Factory): 定义一个用以创建对象的接口 抽象工厂模式(Abstract Factory): 提供一个创建一系列相关或相互依赖对象的接口 单例模式(Singleton) ...

  8. Json知识总结

    JSON对象是一个无序的"名称/值"对的集合它开始于“{”,结束于“}”.每一个属性名和值间用“:”提示,属性间用“,”分隔.一个数组开始于"[",结束于&qu ...

  9. keepalived的安装和使用

    IP配置 管理IP地址 角色 备注 网卡 192.168.1.114 主调度器(Director) 对外提供VIP服务的地址为192.168.1.88 eth1 192.168.1.205 备用调度器 ...

  10. 【Todo】【转载】深度学习&神经网络 科普及八卦 学习笔记 & GPU & SIMD

    上一篇文章提到了数据挖掘.机器学习.深度学习的区别:http://www.cnblogs.com/charlesblc/p/6159355.html 深度学习具体的内容可以看这里: 参考了这篇文章:h ...