Advertisement
Guest User

Untitled

a guest
Oct 25th, 2014
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.00 KB | None | 0 0
  1. *&---------------------------------------------------------------------*
  2. *& Report Z_CRMD_PARTNER_ADDR_CORR
  3. *&
  4. *&---------------------------------------------------------------------*
  5. *& Corrects CRMD_PARTNER records with ADDR_ORIGIN = C that have invalid
  6. *& ADDR_NR (records that do not exist in ADRC).
  7. *& Report finds PARTNER_NO address using COM_PARTNER_ADDRESS_DETERMINE
  8. *& to replace missing address.
  9. *&
  10. *& The input 'Execute program in simulation' turns simulation mode on or off.
  11. *& If this is unchecked, the program will alter the CRMD_PARTNER db table replacing
  12. *& the invalid address with a valid one.
  13. *&
  14. *& There are three ways to execute this program:
  15. *&
  16. *& 1. With no inputs (e.g. Transaction number, Transaction type and Address
  17. *& number all blank).
  18. *& This will validate all records in CRMD_PARTNER with ADDR_ORIGIN = 'C'
  19. *& to ensure that they all have valid ADRC records.
  20. *& NOTE: depending on the size of the CRMD_PARTNER table in your installation,
  21. *& this can be very time consuming.
  22. *&
  23. *& 2. By Transaction number and Transaction type.
  24. *& In this case both the number and type are required.
  25. *& The program will validate all the partners on this transaction with
  26. *& ADDR_ORIGIN = 'C' to ensure they have valid ADRC records.
  27. *&
  28. *& 3. By Address number.
  29. *& The program will validate all CRMD_PARTNER records with the given address
  30. *& and ADDR_ORIGIN = 'C'.
  31. *&---------------------------------------------------------------------*
  32.  
  33. REPORT Z_CRMD_PARTNER_ADDR_CORR.
  34.  
  35. INCLUDE com_partner.
  36. TABLES: crmd_partner.
  37.  
  38. DATA: lt_partnertab LIKE TABLE OF crmd_partner,
  39. lt_orderadm_i LIKE TABLE OF crmd_orderadm_i,
  40. ls_partner TYPE crmd_partner,
  41. ls_link TYPE crmd_link,
  42. ls_orderadm_h TYPE crmd_orderadm_h,
  43. ls_orderadm_i TYPE crmd_orderadm_i,
  44. ls_proc_type TYPE CRMC_PROC_TYPE,
  45. ls_item_proc_type TYPE CRMC_ITEM_TYPE,
  46. lv_partner_guid TYPE bu_partner_guid,
  47. lv_determ_proc TYPE comt_partner_determ_proc,
  48. lv_addr_nr TYPE ad_addrnum,
  49. lv_addr_np TYPE adrnp,
  50. lv_addr_type TYPE addr_type,
  51. lv_addr_origin TYPE comt_addr_origin,
  52. lv_addr_operation TYPE bu_operation,
  53. lv_relation_partner TYPE bu_partner_guid,
  54. lv_address_count TYPE i,
  55. lv_addr_is_standard TYPE comt_partner_std_bp_address,
  56. cursor1 TYPE cursor,
  57. p_size TYPE i,
  58. lv_partner_number(10),
  59. lv_total_rec TYPE i,
  60. lv_addr_missing TYPE i,
  61. lv_no_addr TYPE i,
  62. lv_replace_addr TYPE i,
  63. lv_no_replace_addr TYPE i,
  64. lv_partner_update TYPE i,
  65. lv_partner_update_fail TYPE i,
  66. lv_header_no_pdp TYPE i,
  67. lv_item_no_pdp TYPE i,
  68. lv_rec_update TYPE i,
  69. lv_rec_update_fail TYPE i.
  70.  
  71. **********************************************************************
  72. * S C R E E N D E F I N I T I O N *
  73. **********************************************************************
  74. SELECTION-SCREEN: BEGIN OF BLOCK blk1 WITH FRAME TITLE transact.
  75. PARAMETERS: trans_id TYPE crmd_orderadm_h-object_id,
  76. tran_typ TYPE crmd_orderadm_h-process_type.
  77. SELECTION-SCREEN: END OF BLOCK blk1.
  78.  
  79. SELECTION-SCREEN: BEGIN OF BLOCK blk2 WITH FRAME TITLE addr_num.
  80. PARAMETERS: addr_nr TYPE crmd_partner-addr_nr.
  81. SELECTION-SCREEN: END OF BLOCK blk2.
  82.  
  83. SELECTION-SCREEN: BEGIN OF BLOCK blk3 WITH FRAME TITLE simulat.
  84. PARAMETERS: p_simu TYPE c AS CHECKBOX DEFAULT 'X'.
  85. SELECTION-SCREEN: END OF BLOCK blk3.
  86.  
  87. INITIALIZATION.
  88. %_trans_id_%_app_%-text = ' Transaction number'.
  89. %_tran_typ_%_app_%-text = ' Transaction type'.
  90. %_p_simu_%_app_%-text = ' Execute program in simulation'.
  91. %_addr_nr_%_app_%-text = ' Address number'.
  92. transact = 'By Transaction'.
  93. addr_num = 'By Address Number'.
  94. simulat = 'Simulate On/Off'.
  95.  
  96. **********************************************************************
  97. * S T A R T - O F - S E L E C T I O N *
  98. **********************************************************************
  99. START-OF-SELECTION.
  100.  
  101. p_size = 10000.
  102. OPEN CURSOR cursor1 FOR SELECT * FROM crmd_partner WHERE addr_origin = 'C'.
  103.  
  104. lv_total_rec = 0.
  105. lv_addr_missing = 0.
  106. lv_no_addr = 0.
  107. lv_replace_addr = 0.
  108. lv_no_replace_addr = 0.
  109. lv_partner_update = 0.
  110. lv_partner_update_fail = 0.
  111. lv_header_no_pdp = 0.
  112. lv_item_no_pdp = 0.
  113. lv_rec_update = 0.
  114. lv_rec_update_fail = 0.
  115.  
  116. DO.
  117. CLEAR lt_partnertab.
  118. IF trans_id = SPACE AND tran_typ = SPACE and addr_nr = SPACE.
  119. FETCH NEXT CURSOR cursor1 INTO TABLE lt_partnertab
  120. PACKAGE SIZE p_size.
  121. IF sy-subrc <> 0.
  122. CLOSE CURSOR cursor1.
  123. EXIT.
  124. ENDIF.
  125. ELSE.
  126. IF trans_id IS NOT INITIAL or tran_typ IS NOT INITIAL.
  127. IF trans_id = SPACE.
  128. WRITE: / 'Required input Transaction number not entered.'.
  129. EXIT.
  130. ENDIF.
  131.  
  132. IF tran_typ = SPACE.
  133. WRITE: / 'Required input Transaction type not entered.'.
  134. EXIT.
  135. ENDIF.
  136.  
  137. SELECT SINGLE * FROM crmd_orderadm_h INTO ls_orderadm_h WHERE object_id = trans_id AND process_type = tran_typ.
  138. IF sy-subrc = 0.
  139. SELECT SINGLE * FROM crmd_link INTO ls_link WHERE guid_hi = ls_orderadm_h-GUID AND OBJTYPE_SET = '07'.
  140. IF sy-subrc = 0.
  141. SELECT * FROM crmd_partner INTO ls_partner WHERE addr_origin = 'C' AND guid = ls_link-guid_set.
  142. INSERT ls_partner INTO TABLE lt_partnertab.
  143. ENDSELECT.
  144. ENDIF.
  145.  
  146. SELECT * FROM crmd_orderadm_i INTO ls_orderadm_i WHERE HEADER = ls_orderadm_h-GUID.
  147. INSERT ls_orderadm_i INTO TABLE lt_orderadm_i.
  148. ENDSELECT.
  149.  
  150. IF sy-subrc = 0.
  151. LOOP AT lt_orderadm_i INTO ls_orderadm_i.
  152. SELECT SINGLE * FROM crmd_link INTO ls_link WHERE guid_hi = ls_orderadm_i-GUID AND OBJTYPE_SET = '07'.
  153. IF sy-subrc = 0.
  154. SELECT * FROM crmd_partner INTO ls_partner WHERE addr_origin = 'C' AND guid = ls_link-guid_set.
  155. INSERT ls_partner INTO TABLE lt_partnertab.
  156. ENDSELECT.
  157. ENDIF.
  158. ENDLOOP.
  159. ENDIF.
  160. ENDIF.
  161. ELSE.
  162. SELECT * FROM crmd_partner INTO ls_partner WHERE addr_origin = 'C' AND addr_nr = addr_nr.
  163. INSERT ls_partner INTO TABLE lt_partnertab.
  164. ENDSELECT.
  165. ENDIF.
  166. ENDIF.
  167.  
  168. LOOP AT lt_partnertab INTO ls_partner.
  169. lv_total_rec = lv_total_rec + 1.
  170. IF ls_partner-addr_nr IS NOT INITIAL.
  171. SELECT SINGLE COUNT( * ) FROM adrc WHERE addrnumber = ls_partner-addr_nr.
  172.  
  173. IF sy-subrc <> 0.
  174. lv_addr_missing = lv_addr_missing + 1.
  175. lv_partner_guid = ls_partner-partner_no.
  176. CALL FUNCTION 'COM_PARTNER_CONVERT_GUID_TO_NO'
  177. EXPORTING
  178. iv_partner_guid = lv_partner_guid
  179. IMPORTING
  180. ev_partner = lv_partner_number
  181. EXCEPTIONS
  182. partner_does_not_exist = 1
  183. OTHERS = 2.
  184.  
  185.  
  186. " determine whether header or item
  187. SELECT SINGLE * FROM crmd_link INTO ls_link WHERE guid_set = ls_partner-guid.
  188.  
  189. IF ls_link-objtype_hi = 05.
  190. "header
  191. SELECT SINGLE * FROM crmd_orderadm_h INTO ls_orderadm_h WHERE guid = ls_link-guid_hi.
  192. WRITE: 'Transaction ', ls_orderadm_h-object_id, ' has partner function ', ls_partner-partner_fct, ' and partner number ', lv_partner_number, ' that uses a missing address record ', ls_partner-addr_nr.
  193.  
  194. CALL FUNCTION 'CRM_ORDER_PROC_TYPE_SELECT_CB'
  195. EXPORTING
  196. iv_process_type = ls_orderadm_h-PROCESS_TYPE
  197. IMPORTING
  198. es_proc_type = ls_proc_type
  199. EXCEPTIONS
  200. OTHERS = 0.
  201. IF sy-subrc <> 0.
  202. lv_header_no_pdp = lv_header_no_pdp + 1.
  203. lv_no_replace_addr = lv_no_replace_addr + 1.
  204. CONTINUE.
  205. ENDIF.
  206.  
  207. lv_determ_proc = ls_proc_type-part_determ_proc.
  208. ELSE.
  209. "item
  210. SELECT SINGLE * FROM crmd_orderadm_i INTO ls_orderadm_i WHERE guid = ls_link-guid_hi.
  211. SELECT SINGLE * FROM crmd_orderadm_h INTO ls_orderadm_h WHERE guid = ls_orderadm_i-header.
  212. WRITE: 'Transaction ', ls_orderadm_h-object_id, ' has item ', ls_orderadm_i-number_int, ' with partner function ', ls_partner-partner_fct, ' and partner number ', lv_partner_number, ' that uses a missing address record ', ls_partner-addr_nr.
  213.  
  214. CALL FUNCTION 'CRM_ORDER_ITEM_TYPE_SELECT_CB'
  215. EXPORTING
  216. iv_item_type = ls_orderadm_i-ITM_TYPE
  217. IMPORTING
  218. es_item_type = ls_item_proc_type
  219. EXCEPTIONS
  220. entry_not_found = 1
  221. text_entry_not_found = 2
  222. OTHERS = 3.
  223. IF sy-subrc <> 0.
  224. lv_item_no_pdp = lv_item_no_pdp + 1.
  225. lv_no_replace_addr = lv_no_replace_addr + 1.
  226. CONTINUE.
  227. ENDIF.
  228.  
  229. lv_determ_proc = ls_item_proc_type-part_determ_proc.
  230. ENDIF.
  231.  
  232. " find current master address
  233. CLEAR lv_addr_nr.
  234. CLEAR lv_addr_np.
  235. CLEAR lv_addr_type.
  236. CLEAR lv_addr_origin.
  237. CLEAR lv_addr_operation.
  238. CLEAR lv_relation_partner.
  239. CLEAR lv_address_count.
  240. CLEAR lv_addr_is_standard.
  241.  
  242. CALL FUNCTION 'COM_PARTNER_ADDRESS_DETERMINE'
  243. EXPORTING
  244. iv_partner_guid = lv_partner_guid
  245. iv_relation_partner_guid = ls_partner-relation_partner
  246. iv_partner_fct = ls_partner-partner_fct
  247. iv_determ_proc = lv_determ_proc
  248. IMPORTING
  249. ev_addr_nr = lv_addr_nr
  250. ev_addr_np = lv_addr_np
  251. ev_addr_type = lv_addr_type
  252. ev_addr_origin = lv_addr_origin
  253. ev_addr_operation = lv_addr_operation
  254. ev_relation_partner = lv_relation_partner
  255. ev_addr_count = lv_address_count
  256. ev_addr_is_standard = lv_addr_is_standard
  257. EXCEPTIONS
  258. partner_not_defined = 1
  259. partner_does_not_exist = 2
  260. rel_partner_does_not_exist = 3
  261. no_address_found = 4
  262. OTHERS = 5.
  263.  
  264. IF sy-subrc = 0.
  265. WRITE: / 'Will be replaced with address number: ', lv_addr_nr, /.
  266. lv_replace_addr = lv_replace_addr + 1.
  267. " logic to update CRMD_PARTNER
  268. IF p_simu = space.
  269. ls_partner-ADDR_NR = lv_addr_nr.
  270. ls_partner-ADDR_NP = lv_addr_np.
  271. ls_partner-ADDR_TYPE = lv_addr_type.
  272. ls_partner-ADDR_ORIGIN = lv_addr_origin.
  273. ls_partner-ADDR_OPERATION = lv_addr_operation.
  274. ls_partner-STD_BP_ADDRESS = lv_addr_is_standard.
  275.  
  276. UPDATE CRMD_PARTNER FROM ls_partner.
  277. IF sy-subrc = 0.
  278. lv_rec_update = lv_rec_update + 1.
  279. ELSE.
  280. lv_rec_update_fail = lv_rec_update_fail + 1.
  281. ENDIF.
  282. ENDIF.
  283. ELSE.
  284. WRITE: / 'No replacement address found!', /.
  285. lv_no_replace_addr = lv_no_replace_addr + 1.
  286. ENDIF.
  287.  
  288. ENDIF.
  289. ELSE.
  290. lv_no_addr = lv_no_addr + 1.
  291. ENDIF.
  292. ENDLOOP.
  293. IF trans_id <> SPACE or addr_nr <> SPACE.
  294. EXIT.
  295. ENDIF.
  296. ENDDO.
  297.  
  298. WRITE: /.
  299. WRITE: / 'Total CRMD_PARTNER records queried: ', lv_total_rec.
  300. WRITE: / 'Total records without address number: ', lv_no_addr.
  301. WRITE: / 'Total records with bad addresses: ', lv_addr_missing.
  302. WRITE: / 'Total replacement addresses found: ', lv_replace_addr.
  303. WRITE: / 'Total replacement addresses not found: ', lv_no_replace_addr.
  304. WRITE: / ' Not found because header pdp missing: ', lv_header_no_pdp.
  305. WRITE: / ' Not found because item pdp missing: ', lv_item_no_pdp.
  306. WRITE: /.
  307. WRITE: / 'Total CRMD_PARTNER records updated: ', lv_rec_update.
  308. WRITE: / 'Total CRMD_PARTNER records update failed: ', lv_rec_update_fail.
  309.  
  310. IF p_simu = space.
  311. COMMIT WORK AND WAIT.
  312. ENDIF.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement