Table of Contents:
REPORT zfcheque NO STANDARD PAGE HEADING LINE-SIZE 122. *@---------------------------------------------------------------------- *@ Program id : ZFCHEQUE *@ Program Desc : Cheque printing program for CAN office *@ *@ Transaction Code - none *@ Input files : ID - none *@ Output files : ID - none *@ *@ Tables Updated: Table - none *@ *@ Author : Fiona Lau *@ Date : 2001/11/15 *@ Requested by: *@ *@---------------------------------------------------------------------- *@ Algorithm: *@---------------------------------------------------------------------- ** ** Parameters: 1. run_date ** 2. identification ** 3. currency (CAD/USD) ** 4. print without signature - print all cheques without ** signature ** 5. view report option - display report only ** 6. output_file - for new print, save cheque info. to ** 7. input_file - for reprint, retrieve cheque info. from ** 8. reprint option: specify one cheque, ** specify cheque range (exclusive) ** all cheques ** ** For new print, cheque info. is retrieved form table reguh ** & regup base on input parameters(run_date, identification and ** currency) and is saved to the output_file. Then all cheque info. is ** retrieved again from file and sent to the printer. ** For reprint, cheque info. is retrieved form the input_file and is ** checked against the input paramters(run_date, identification and ** currency). If the file is valid, cheques are sent to the printer ** depends on the reprint option(specify one cheque/specify cheque ** range/all cheques). **--------------------------------------------------------------------- ** ** LABK932282 2002/04/04 FLAU ** Use payee's name & address instead of vendor's name & address ** for pay to. **--------------------------------------------------------------------- ** April 24, 2003 LABK934811 CFieulle ** Allow to print cheques of pmt method 'S'. (just add) **--------------------------------------------------------------------- INCLUDE zsmaster. TABLES: reguh, regup. TABLES: zfcheque. * c_limit : limit for auto-signature CONSTANTS: c_limit LIKE reguh-rwbtr VALUE '25000'. * c_items : no. of item per page CONSTANTS: c_items TYPE p VALUE '80'. TYPES: BEGIN OF t_reguh, laufd LIKE reguh-laufd, "run date laufi LIKE reguh-laufi, "identification vblnr LIKE reguh-vblnr, "document # rwbtr LIKE reguh-rwbtr, "amount paid in payment currency lifnr LIKE reguh-lifnr, "account # of vendor *LABK932282-> * name1 LIKE reguh-name1, * name2 LIKE reguh-name2, * stras LIKE reguh-stras, "house # & street * ort01 LIKE reguh-ort01, "city znme1 like reguh-znme1, "payee name1 znme2 like reguh-znme2, "payee name2 zstra like reguh-zstra, "payee house # & street zort1 like reguh-zort1, "payee city *LABK932282<- zregi LIKE reguh-zregi, "regional code of the payee zpstl LIKE reguh-zpstl, "postal code of the payee zland LIKE reguh-zland, "country key waers LIKE reguh-waers, "currency key landx LIKE t005t-landx, "country name hbkid LIKE reguh-hbkid, "house bank key ID ubnks LIKE reguh-ubnks, "bank country key hktid LIKE reguh-hktid, "ID for account detial bankl LIKE t012-bankl, "bank # bankn LIKE t012k-bankn, "bank account # count(6) TYPE n, "# of items pages TYPE p, "# of pages printed END OF t_reguh. TYPES: BEGIN OF t_regup, laufd LIKE regup-laufd, "run date laufi LIKE regup-laufi, "identification vblnr LIKE regup-vblnr, "doc. # (cheque #) lifnr LIKE regup-lifnr, "vendor # bldat LIKE regup-bldat, "document date xblnr LIKE regup-xblnr, "reference doc. # wrbtr LIKE regup-wrbtr, "$ in doc currency shkzg LIKE regup-shkzg, "debit/credit indicator bukrs LIKE regup-bukrs, "company code gjahr LIKE regup-gjahr, "fiscal year item LIKE regup-buzei, "item # belnr LIKE regup-belnr, "doc. # END OF t_regup. TYPES: BEGIN OF t_cheque, laufd LIKE reguh-laufd, "run date laufi LIKE reguh-laufi, "identification vblnr LIKE reguh-vblnr, "document # rwbtr LIKE reguh-rwbtr, "amount paid in payment currency lifnr LIKE reguh-lifnr, "account # of vendor *LABK932282-> * name1 LIKE reguh-name1, * name2 LIKE reguh-name2, * stras LIKE reguh-stras, "house # & street * ort01 LIKE reguh-ort01, "city znme1 like reguh-znme1, "payee name1 znme2 like reguh-znme2, "payee name2 zstra like reguh-zstra, "payee house # & street zort1 like reguh-zort1, "payee city *LABK932282<- zregi LIKE reguh-zregi, "regional code of the payee zpstl LIKE reguh-zpstl, "postal code of the payee zland LIKE reguh-zland, "country key waers LIKE reguh-waers, "currency key landx LIKE t005t-landx, "country name bankl LIKE t012-bankl, "bank # bankn LIKE t012k-bankn, "bank account # count(6) TYPE n, "# of items pages TYPE p, "# of pages printed bldat LIKE regup-bldat, "document date xblnr LIKE regup-xblnr, "reference doc. # wrbtr LIKE regup-wrbtr, "$ in doc currency shkzg LIKE regup-shkzg, "debit/credit indicator bukrs LIKE regup-bukrs, "company code gjahr LIKE regup-gjahr, "fiscal year item LIKE regup-buzei, "item # END OF t_cheque. DATA: i_reguh TYPE t_reguh OCCURS 100 WITH HEADER LINE. DATA: i_regup TYPE t_regup OCCURS 100 WITH HEADER LINE. DATA: i_cheque TYPE t_cheque OCCURS 100 WITH HEADER LINE. DATA: msg(100). DATA: datafile TYPE mac_t_filename. DATA: BEGIN OF i_currency_text OCCURS 5, waers LIKE tcurt-waers, ltext LIKE tcurt-ltext, END OF i_currency_text. DATA: l_linsz LIKE sy-linsz. DATA: l_waers LIKE reguh-waers. DATA: l_subrc LIKE sy-subrc, l_rptonly TYPE c VALUE ' ', l_newcheque TYPE c VALUE 'X', l_newprt TYPE c VALUE ' ', l_rundate LIKE reguh-laufd, l_identif LIKE reguh-laufi, l_currency LIKE reguh-waers, l_cheque LIKE reguh-vblnr, l_chequelast LIKE reguh-vblnr, l_reprint TYPE c, l_printed TYPE p VALUE 0, l_items TYPE p VALUE 0, l_totpages TYPE p VALUE 0, l_form(20) TYPE c, l_count TYPE p VALUE 0, l_start TYPE p VALUE 0, l_end TYPE p VALUE 0, l_nosignature TYPE p VALUE 0, l_employee TYPE p VALUE 0, l_other TYPE p VALUE 0, l_type TYPE c, l_index TYPE p, l_totnosign LIKE reguh-rwbtr, l_totemployee LIKE reguh-rwbtr, l_totother LIKE reguh-rwbtr. RANGES: r_rzawe FOR reguh-rzawe. "payment method mac_set_range_row r_rzawe mac_c_append : 'C' ' '. *{Start insert LABK934811 mac_set_range_row r_rzawe mac_c_append : 'S' ' '. * End insert LABK934811} PARAMETERS: p_laufd LIKE reguh-laufd OBLIGATORY, "DEFAULT '20010614', p_laufi LIKE reguh-laufi OBLIGATORY. "DEFAULT 'wca1'. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 1(10) text-001. SELECTION-SCREEN COMMENT 20(14) text-002 FOR FIELD p_cad. PARAMETERS p_cad RADIOBUTTON GROUP opt1. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT 20(14) text-003 FOR FIELD p_usd. PARAMETERS p_usd RADIOBUTTON GROUP opt1. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN SKIP 1. PARAMETERS p_nosign AS CHECKBOX. "no signature PARAMETERS p_report AS CHECKBOX. "report only SELECTION-SCREEN SKIP 1. SELECTION-SCREEN BEGIN OF BLOCK 1 WITH FRAME TITLE text-004. PARAMETERS p_ofile TYPE mac_t_filename DEFAULT 'c:\temp\zcheque.txt'. SELECTION-SCREEN END OF BLOCK 1. SELECTION-SCREEN SKIP 1. SELECTION-SCREEN BEGIN OF BLOCK 2 WITH FRAME TITLE text-005. PARAMETERS p_ifile TYPE mac_t_filename. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN POSITION 1. PARAMETERS p_one RADIOBUTTON GROUP opt3 DEFAULT 'X'. SELECTION-SCREEN COMMENT 2(26) text-006 FOR FIELD p_one. SELECTION-SCREEN POSITION 33. PARAMETERS p_cheq1 LIKE reguh-vblnr. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN POSITION 1. PARAMETERS p_range RADIOBUTTON GROUP opt3. SELECTION-SCREEN COMMENT 2(26) text-009 FOR FIELD p_range. SELECTION-SCREEN COMMENT 28(5) text-010. SELECTION-SCREEN POSITION 33. PARAMETERS p_cheq3 LIKE reguh-vblnr. SELECTION-SCREEN COMMENT 62(6) text-011. SELECTION-SCREEN POSITION 68. PARAMETERS p_cheq4 LIKE reguh-vblnr. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN POSITION 1. PARAMETERS p_all RADIOBUTTON GROUP opt3. SELECTION-SCREEN COMMENT 3(26) text-008 FOR FIELD p_all. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN END OF BLOCK 2. DEFINE lmac_check_file_access. * check if file is accessible open dataset &1 for &2 in &3 mode message msg. &4 = sy-subrc. if sy-subrc <> 0. message s001(zz) with msg. endif. close dataset &1. END-OF-DEFINITION. DEFINE lmac_write_report_header. skip. uline. format color col_group intensified off. write: at /1(l_linsz) &1. format color col_heading intensified off. write: /1(10) &2, 13(10) &3, 25(10) &4, 37(30) &5, 69(15) &6 right-justified, 86(30) &7, 118(5) &8. format reset. uline. END-OF-DEFINITION. DEFINE lmac_write_report_items. write: /1(10) &1, 13(10) &2, 25(10) &3, 37(30) &4, 69(15) &5, 86(30) &6, 118(5) &7. END-OF-DEFINITION. DEFINE lmac_write_report_subtotal. concatenate &1 &2 into l_txt. format color col_total intensified off. uline. write: at /1(l_linsz) l_txt. format reset. END-OF-DEFINITION. INITIALIZATION. * Authority check AUTHORITY-CHECK OBJECT 'Z:CHEQUE' ID 'ACTVT' FIELD '35'. "output IF sy-subrc NE 0. * no authorization for printing cheques l_rptonly = 'X'. AUTHORITY-CHECK OBJECT 'Z:CHEQUE' ID 'ACTVT' FIELD '03'. "display IF sy-subrc NE 0. MESSAGE s001(zz) WITH 'You are not authorised to run program ZFCHEQUE.'. LEAVE PROGRAM. ENDIF. ENDIF. * End Authority check START-OF-SELECTION. IF p_ofile IS INITIAL AND p_ifile IS INITIAL. MESSAGE s001(zz) WITH 'Must have input file or output file.'. EXIT. ELSEIF NOT p_ofile IS INITIAL AND NOT p_ifile IS INITIAL. MESSAGE s001(zz) WITH 'Cannot have both input file and output file.'. EXIT. ENDIF. IF NOT p_ofile IS INITIAL. * check if datafile is accessible lmac_check_file_access p_ofile output text l_subrc. IF l_subrc <> 0. STOP. ENDIF. datafile = p_ofile. l_newprt = 'X'. ELSE. IF p_one = 'X'. IF p_cheq1 IS INITIAL. MESSAGE s001(zz) WITH 'Please specify cheque no. to print'. EXIT. ENDIF. l_cheque = p_cheq1. ELSEIF p_range = 'X'. IF p_cheq3 IS INITIAL. MESSAGE s001(zz) WITH 'Please specify cheque no. range'. EXIT. ENDIF. l_cheque = p_cheq3. l_chequelast = p_cheq4. ENDIF. * check if datafile is accessible lmac_check_file_access p_ifile input text l_subrc. IF l_subrc <> 0. STOP. ENDIF. datafile = p_ifile. ENDIF. * no authorization for printing cheques * set to view report only IF l_rptonly = 'X'. p_report = 'X'. ENDIF. IF p_cad = 'X'. l_waers = 'CAD'. ELSE. l_waers = 'USD'. ENDIF. l_linsz = sy-linsz. * if this is new print, select cheques form database. IF l_newprt = 'X'. PERFORM select_cheques TABLES i_reguh i_regup USING p_laufd p_laufi l_waers CHANGING l_subrc. IF l_subrc <> 0. CASE l_subrc. WHEN '-1'. MESSAGE s001(zz) WITH 'Found no cheque.'. WHEN '-2'. MESSAGE s001(zz) WITH 'Error finding cheque item.'. WHEN '-3'. MESSAGE s001(zz) WITH 'Error finding country name.'. WHEN '-4'. MESSAGE s001(zz) WITH 'Error finding bank number.'. WHEN '-5'. MESSAGE s001(zz) WITH 'Error finding bank account number.'. ENDCASE. EXIT. ENDIF. PERFORM sort_cheques TABLES i_reguh i_regup i_cheque. mac_ws_download_raw_itab datafile i_cheque. ENDIF. REFRESH i_cheque. mac_ws_upload_tabbed_itab datafile i_cheque. l_rundate = i_cheque-laufd. l_identif = i_cheque-laufi. l_currency = i_cheque-waers. IF l_rundate <> p_laufd OR l_identif <> p_laufi OR l_currency <> l_waers. MESSAGE s001(zz) WITH 'Input parameters does not match parameters in input file.'. EXIT. ENDIF. IF l_currency = 'USD'. l_form = 'ZFCHEQUE_US'. ELSEIF l_currency = 'CAD'. l_form = 'ZFCHEQUE_CA'. ENDIF. * Get the text for the currency SELECT DISTINCT waers ltext INTO TABLE i_currency_text FROM tcurt WHERE spras = sy-langu AND waers = l_currency. READ TABLE i_currency_text WITH KEY waers = l_currency BINARY SEARCH. IF l_newprt = 'X' OR p_all = 'X'. l_start = 1. DESCRIBE TABLE i_cheque LINES l_end. ELSE. CLEAR l_start. CLEAR l_end. CLEAR l_count. LOOP AT i_cheque. l_count = l_count + 1. CHECK i_cheque-vblnr = l_cheque. IF l_start IS INITIAL. IF p_one = 'X'. l_start = l_count. l_end = l_count + i_cheque-count - 1. ELSEIF p_range = 'X'. l_start = l_count + i_cheque-count. IF l_chequelast IS INITIAL. "print to the end DESCRIBE TABLE i_cheque LINES l_end. ELSE. l_cheque = l_chequelast. "find last cheque to print ENDIF. ENDIF. ELSE. l_end = l_count - 1. ENDIF. IF NOT l_end IS INITIAL. EXIT. ENDIF. ENDLOOP. IF l_start IS INITIAL OR l_end IS INITIAL. MESSAGE s001(zz) WITH 'Incorrect cheque no specified.'. EXIT. ENDIF. ENDIF. *LABK931378-> IF p_report <> 'X'. PERFORM open_form_cheque USING l_form. ENDIF. *LABK931378<- l_newcheque = 'X'. LOOP AT i_cheque FROM l_start TO l_end. IF l_newcheque = 'X'. CLEAR zfcheque. MOVE-CORRESPONDING i_cheque TO zfcheque. * zfcheque-rwbtr = - zfcheque-rwbtr. WRITE zfcheque-rwbtr TO zfcheque-total_amount CURRENCY zfcheque-waers. CONDENSE zfcheque-total_amount NO-GAPS. CONCATENATE '$' zfcheque-total_amount '**' INTO zfcheque-total_amount. * Get the currency text PERFORM convert_amount_to_string USING zfcheque-rwbtr zfcheque-waers CHANGING zfcheque-line1 zfcheque-line2 zfcheque-line3. * not report only IF p_report <> 'X'. *LABK931378-> * PERFORM open_form_cheque USING l_form. PERFORM start_form_cheque USING l_form. *LABK931378<- * signature for amount under $25,000 only IF zfcheque-rwbtr < c_limit AND p_nosign <>'X'. CALL FUNCTION 'WRITE_FORM' EXPORTING element = 'SIGNATURE' window = 'SIGN' EXCEPTIONS element = 1 function = 2 type = 3 unopened = 4 unstarted = 5 window = 6 bad_pageformat_for_print = 7 OTHERS = 8. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDIF. ENDIF. "end p_report<>'X' l_newcheque = ' '. l_items = 0. ENDIF. "l_newcheque='X' * write cheque item zfcheque-bldat = i_cheque-bldat. zfcheque-xblnr = i_cheque-xblnr. zfcheque-wrbtr = i_cheque-wrbtr. WRITE zfcheque-wrbtr TO zfcheque-item_amount CURRENCY zfcheque-waers. IF i_cheque-shkzg = 'S'. zfcheque-item_amount+1(1) = '-'. ENDIF. CONDENSE zfcheque-item_amount NO-GAPS. WRITE zfcheque-item_amount TO zfcheque-item_amount RIGHT-JUSTIFIED. IF p_report <> 'X'. mac_write_form 'ITEMS' 'MAIN'. ENDIF. "if p_report <> 'X' l_items = l_items + 1. * last cheque item IF i_cheque-count = l_items. *LABK931378-> IF p_report <> 'X'. * PERFORM close_form. PERFORM end_form. ENDIF. *LABK931378<- l_newcheque = 'X'. COMPUTE i_cheque-pages = ceil( l_items / c_items ). l_totpages = l_totpages + i_cheque-pages. PERFORM write_report USING i_cheque CHANGING l_nosignature l_employee l_other. l_printed = l_printed + 1. ENDIF. ENDLOOP. *LABK931378-> IF p_report <> 'X'. PERFORM close_form. ENDIF. *LABK931378<- PERFORM write_report_subtotal USING 'Subtotal for all the rest:' l_totother l_waers. PERFORM write_summary USING l_totnosign l_totemployee l_totother l_nosignature l_employee l_other l_printed. TOP-OF-PAGE. mac_default_report_header mac_c_null. PERFORM wirte_parameters USING l_rundate l_identif l_currency. *---------------------------------------------------------------------* * FORM open_form_cheque * *---------------------------------------------------------------------* * ........ * *---------------------------------------------------------------------* FORM open_form_cheque USING p_form. DATA: options LIKE itcpo. CLEAR options. * options-tdpreview = 'X'. "fff options-tdimmed = 'X'. options-tddest = 'ZCHQ'. options-tdcopies = '1'. options-tddelete = ' '. CALL FUNCTION 'OPEN_FORM' EXPORTING device = 'PRINTER' dialog = ' ' form = p_form options = options. ENDFORM. "OPEN_FORM_CHEQUE *---------------------------------------------------------------------* * FORM CLOSE_FORM * *---------------------------------------------------------------------* * ........ * *---------------------------------------------------------------------* FORM close_form. CALL FUNCTION 'CLOSE_FORM'. ENDFORM. " CLOSE_FORM *---------------------------------------------------------------------* * FORM start_form_cheque * *---------------------------------------------------------------------* * ........ * *---------------------------------------------------------------------* * --> p_form * *---------------------------------------------------------------------* FORM start_form_cheque USING p_form. CALL FUNCTION 'START_FORM' EXPORTING form = p_form language = sy-langu startpage = 'FIRST'. ENDFORM. "START_FORM_CHEQUE *---------------------------------------------------------------------* * FORM end_form * *---------------------------------------------------------------------* * ........ * *---------------------------------------------------------------------* FORM end_form. CALL FUNCTION 'END_FORM'. ENDFORM. " END_FORM *&---------------------------------------------------------------------* *& Form CONVERT_AMOUNT_TO_STRING *&---------------------------------------------------------------------* FORM convert_amount_to_string USING p_total p_waers CHANGING p_line1 p_line2 p_line3. DATA: lw_words LIKE spell. DATA: li_currency(20) TYPE c OCCURS 5 WITH HEADER LINE, li_words(20) TYPE c OCCURS 50 WITH HEADER LINE. DATA: l_len TYPE i, l_count TYPE i, l_line TYPE i VALUE 1, l_fraction(8) TYPE c VALUE 'DDD/FFFF', l_factor TYPE i. DEFINE lmac_print_line. if not &1 is initial. concatenate &1 li_words into &1 separated by space. else. &1 = li_words. endif. END-OF-DEFINITION. CLEAR: p_line1, p_line2, p_line3. CALL FUNCTION 'SPELL_AMOUNT' EXPORTING amount = p_total currency = p_waers filler = ' ' language = sy-langu IMPORTING in_words = lw_words EXCEPTIONS not_found = 1 too_large = 2 OTHERS = 3. IF sy-subrc = 0. * Figure out the decimal to fraction l_factor = 10 ** lw_words-currdec. l_count = 3 MOD lw_words-currdec. DO l_count TIMES. SHIFT lw_words-decimal(3) RIGHT. lw_words-decimal(1) = 0. ENDDO. WRITE: lw_words-decimal TO l_fraction(3) NO-ZERO RIGHT-JUSTIFIED, l_factor TO l_fraction+4(4) NO-ZERO LEFT-JUSTIFIED. SHIFT l_fraction LEFT DELETING LEADING space. SPLIT i_currency_text AT space INTO TABLE li_currency. LOOP AT li_currency. ENDLOOP. CONCATENATE li_currency 's' INTO li_currency. IF NOT lw_words-decimal IS INITIAL. CONCATENATE lw_words-word li_currency 'AND' lw_words-decword 'CENTS ONLY' INTO lw_words-word SEPARATED BY space. ELSE. CONCATENATE lw_words-word li_currency 'ONLY' INTO lw_words-word SEPARATED BY space. ENDIF. TRANSLATE lw_words-word TO UPPER CASE. SPLIT lw_words-word AT space INTO TABLE li_words. CLEAR l_count. LOOP AT li_words. l_len = strlen( li_words ). ADD l_len TO l_count. IF l_count > 45. " line size of ZFCHQ-VALUE l_count = l_len. ADD 1 TO l_line. ENDIF. CASE l_line. WHEN 1. lmac_print_line p_line1. WHEN 2. lmac_print_line p_line2. WHEN 3. lmac_print_line p_line3. ENDCASE. ADD 1 TO l_count. " space between words ENDLOOP. ENDIF. ENDFORM. " CONVERT_AMOUNT_TO_STRING *&---------------------------------------------------------------------* *& Form WIRTE_PARAMETERS *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM wirte_parameters USING p_rundate p_identif p_currency. WRITE:/ 'Rundate: ', p_rundate. WRITE:/ 'Identification: ', p_identif. WRITE:/ 'Currency: ', p_currency. ULINE. ENDFORM. " WIRTE_PARAMETERS *&---------------------------------------------------------------------* *& Form SELECT_CHEQUES *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM select_cheques TABLES p_reguh STRUCTURE i_reguh p_regup STRUCTURE i_regup USING p_laufd p_laufi p_waers CHANGING p_subrc. DATA: l_count TYPE p, l_index TYPE p. DATA: tp_regup TYPE t_regup OCCURS 100 WITH HEADER LINE. SELECT laufd laufi vblnr rwbtr lifnr name1 name2 stras ort01 znme1 znme2 zstra zort1 "LABK932282 zregi zpstl zland waers hbkid ubnks hktid FROM reguh INTO CORRESPONDING FIELDS OF TABLE p_reguh WHERE laufd = p_laufd AND laufi = p_laufi AND waers = p_waers AND rzawe IN r_rzawe AND xvorl NE 'X' " production data AND rwbtr NE '0' ORDER BY lifnr vblnr. IF sy-subrc <> 0. p_subrc = -1. EXIT. ENDIF. LOOP AT p_reguh. SELECT laufd laufi vblnr lifnr bldat xblnr wrbtr shkzg bukrs gjahr belnr FROM regup INTO CORRESPONDING FIELDS OF TABLE tp_regup WHERE laufd = p_reguh-laufd AND lifnr = p_reguh-lifnr AND vblnr = p_reguh-vblnr. IF sy-subrc <> 0. p_subrc = -2. EXIT. ENDIF. LOOP AT tp_regup. * put bseg-zuonr as invoice no. for empolyee IF tp_regup-lifnr(1) = 'E'. SELECT SINGLE zuonr FROM bseg INTO tp_regup-xblnr WHERE belnr = tp_regup-belnr AND bukrs = tp_regup-bukrs. ENDIF. APPEND tp_regup TO p_regup. ENDLOOP. ENDLOOP. * count items for each cheque SORT p_reguh BY vblnr. SORT p_regup BY vblnr. l_index = 1. LOOP AT p_reguh. l_count = 0. LOOP AT p_regup FROM l_index. IF i_regup-vblnr = p_reguh-vblnr. l_count = l_count + 1. l_index = l_index + 1. ELSE. EXIT. ENDIF. ENDLOOP. p_reguh-count = l_count. * get country name from country code SELECT SINGLE landx FROM t005t INTO p_reguh-landx WHERE land1 = p_reguh-zland AND spras = sy-langu. IF sy-subrc <> 0. p_subrc = -3. EXIT. ENDIF. TRANSLATE p_reguh-landx TO UPPER CASE. * get bank # SELECT SINGLE bankl FROM t012 INTO p_reguh-bankl WHERE hbkid = p_reguh-hbkid AND banks = p_reguh-ubnks. IF sy-subrc <> 0. p_subrc = -4. EXIT. ENDIF. * get bank account # SELECT SINGLE bankn FROM t012k INTO p_reguh-bankn WHERE hbkid = p_reguh-hbkid AND hktid = p_reguh-hktid. IF sy-subrc <> 0. p_subrc = -5. EXIT. ENDIF. MODIFY p_reguh. ENDLOOP. p_subrc = 0. ENDFORM. " SELECT_CHEQUES *&---------------------------------------------------------------------* *& Form WRITE_SUMMARY *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM write_summary USING p_totnosign p_totemployee p_totother p_nosignature p_employee p_other p_printed. DATA: l_grandtotal LIKE reguh-rwbtr. l_grandtotal = p_totnosign + p_totemployee + p_totother. PERFORM write_report_subtotal USING 'Grand total for all cheques: ' l_grandtotal l_waers. SKIP. ULINE. FORMAT COLOR COL_GROUP INTENSIFIED OFF. WRITE: AT /(l_linsz) 'Summary'. FORMAT RESET. ULINE. WRITE: / 'Total cheques issued for amount >= $25,000: ', l_nosignature. WRITE: / 'Total cheques issued for employee: ', l_employee. WRITE: / 'Total cheques issued for the rest: ', l_other. ULINE. WRITE: / 'Total cheques issued: ', l_printed. WRITE: / 'Total cheque paper used: ', l_totpages. * no authorization to print cheques. IF l_rptonly = 'X'. SKIP. FORMAT COLOR COL_TOTAL INTENSIFIED OFF. WRITE: / 'You are not authorised to print cheques.'. FORMAT RESET. ENDIF. ENDFORM. " WRITE_SUMMARY *&---------------------------------------------------------------------* *& Form SORT_CHEQUES *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM sort_cheques TABLES p_reguh STRUCTURE i_reguh p_regup STRUCTURE i_regup p_cheque STRUCTURE i_cheque. DATA: wa_cheque LIKE LINE OF i_cheque. DATA: wa_reguh TYPE t_reguh, it_nosign LIKE STANDARD TABLE OF wa_reguh, it_employee LIKE STANDARD TABLE OF wa_reguh, it_other LIKE STANDARD TABLE OF wa_reguh. DATA: l_count TYPE p. * separate the cheques into 3 groups: * reguh_nosignature : amount >= 25000 * reguh_employee : for employees * reguh_other : other vernders. LOOP AT p_reguh INTO wa_reguh. wa_reguh-rwbtr = - wa_reguh-rwbtr. IF wa_reguh-rwbtr >= c_limit. APPEND wa_reguh TO it_nosign. ELSEIF wa_reguh-lifnr(1) = 'E'. APPEND wa_reguh TO it_employee. ELSE. APPEND wa_reguh TO it_other. ENDIF. ENDLOOP. SORT it_nosign BY rwbtr. *LABK932282 SORT it_employee BY name2 name1 vblnr. SORT it_employee BY znme2 znme1 vblnr. SORT it_other BY lifnr vblnr. REFRESH p_reguh. REFRESH p_cheque. LOOP AT it_nosign INTO wa_reguh. MOVE-CORRESPONDING wa_reguh TO wa_cheque. PERFORM match_cheque_items TABLES p_cheque p_regup USING wa_cheque. ENDLOOP. LOOP AT it_employee INTO wa_reguh. MOVE-CORRESPONDING wa_reguh TO wa_cheque. PERFORM match_cheque_items TABLES p_cheque p_regup USING wa_cheque. ENDLOOP. LOOP AT it_other INTO wa_reguh. MOVE-CORRESPONDING wa_reguh TO wa_cheque. PERFORM match_cheque_items TABLES p_cheque p_regup USING wa_cheque. ENDLOOP. ENDFORM. " SORT_CHEQUES *&---------------------------------------------------------------------* *& Form MATCH_CHEQUE_ITEMS *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM match_cheque_items TABLES p_cheque STRUCTURE i_cheque p_regup STRUCTURE i_regup USING p_wa_cheque STRUCTURE i_cheque. DATA: l_count TYPE p. DATA: tmp_regup TYPE t_regup OCCURS 100 WITH HEADER LINE. REFRESH tmp_regup. l_count = 0. LOOP AT p_regup. IF p_regup-vblnr = p_wa_cheque-vblnr AND p_regup-laufd = p_wa_cheque-laufd AND p_regup-laufi = p_wa_cheque-laufi AND p_regup-lifnr = p_wa_cheque-lifnr. tmp_regup = p_regup. l_count = l_count + 1. tmp_regup-item = l_count. APPEND tmp_regup. ENDIF. ENDLOOP. p_wa_cheque-count = l_count. SORT tmp_regup BY vblnr bldat xblnr wrbtr. LOOP AT tmp_regup. MOVE-CORRESPONDING tmp_regup TO p_wa_cheque. APPEND p_wa_cheque TO p_cheque. ENDLOOP. ENDFORM. " MATCH_CHEQUE_ITEMS *&---------------------------------------------------------------------* *& Form WRITE_REPORT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM write_report USING p_cheque STRUCTURE i_cheque CHANGING l_nosignature l_employee l_other. *count # of cheque printed for each category *and write report IF p_cheque-rwbtr >= c_limit. IF l_nosignature = 0. lmac_write_report_header 'Cheques for amount >= $25,000:' 'Cheque No.' 'Date' 'Vender No.' 'Vender Name' 'Amount' ' ' 'Pages'. ENDIF. lmac_write_report_items p_cheque-vblnr p_cheque-laufd p_cheque-lifnr p_cheque-znme1 *LABK932282 p_cheque-name1 p_cheque-rwbtr ' ' p_cheque-pages. l_nosignature = l_nosignature + 1. l_totnosign = l_totnosign + p_cheque-rwbtr. ELSEIF p_cheque-lifnr(1) = 'E'. IF l_employee = 0. PERFORM write_report_subtotal USING 'Subtotal for amount >= $25,000:' l_totnosign l_waers. lmac_write_report_header 'Cheques for employees:' 'Cheque No.' 'Date' 'Vender No.' 'Vender Name' 'Amount' 'Base' 'Pages'. ENDIF. lmac_write_report_items p_cheque-vblnr p_cheque-laufd p_cheque-lifnr p_cheque-znme1 *LABK932282 p_cheque-name1 p_cheque-rwbtr p_cheque-znme2 *LABK932282 p_cheque-name2 p_cheque-pages. l_employee = l_employee + 1. l_totemployee = l_totemployee + p_cheque-rwbtr. ELSE. IF l_other = 0. IF l_employee = 0. PERFORM write_report_subtotal USING 'Subtotal for amount >= $25,000:' l_totnosign l_waers. ELSE. PERFORM write_report_subtotal USING 'Subtotal for employees:' l_totemployee l_waers. ENDIF. lmac_write_report_header 'Cheques for all the rest:' 'Cheque No.' 'Date' 'Vender No.' 'Vender Name' 'Amount' ' ' 'Pages'. ENDIF. lmac_write_report_items p_cheque-vblnr p_cheque-laufd p_cheque-lifnr p_cheque-znme1 *LABK932282 p_cheque-name1 p_cheque-rwbtr ' ' p_cheque-pages. l_other = l_other + 1. l_totother = l_totother + p_cheque-rwbtr. ENDIF. ENDFORM. " WRITE_REPORT *&---------------------------------------------------------------------* *& Form WRITE_REPORT_SUBTOTAL *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM write_report_subtotal USING p_title p_total p_waers. DATA: l_txt(100) TYPE c. DATA: l_total(15) TYPE c. WRITE p_total TO l_total CURRENCY p_waers. CONCATENATE p_title l_total INTO l_txt. FORMAT COLOR COL_TOTAL INTENSIFIED OFF. ULINE. WRITE: /1 p_title, 69(15) l_total, 118(5) ' '. FORMAT RESET. ENDFORM. " WRITE_REPORT_SUBTOTAL