http://wenku.baidu.com/view/2117e25077232f60ddcca17a.html 一直想做一个dialog 程序但是一直没有这个需求,一直没做而又知道有这么一个基础的东西心里总是堵得慌,反正这两天也有空,闲的没事就边学边做了一个
*&---------------------------------------------------------------------* *& Report Z_VST_APAPPLY *& 支出申请单 *&---------------------------------------------------------------------* *& 实现新增、修改、删除、打印等功能 *& *&---------------------------------------------------------------------* REPORT zfi_007. TABLES:bkpf,bseg,bsik,lfa1,skat,zapa_header,zapa_item,tcurr,bsak. * 变量定义 DATA : smartform(30) TYPE c. DATA fm_name TYPE c. DATA: gv_fmname TYPE rs38l_fnam, gs_control_param TYPE ssfctrlop, gs_output_option TYPE ssfcompop, gs_cresop TYPE ssfcresop. DATA: gv_formname TYPE tdsfname. DATA: lv_line TYPE i VALUE 0. CONSTANTS gc_x TYPE char1 VALUE 'X'. DATA: tmp_belnr LIKE bsik-belnr. DATA: number(3) TYPE c. DATA: grop(8) TYPE c VALUE 'NO1'. DATA: z_header TYPE zapa_header. DATA: zapa_item1 TYPE zapa_item OCCURS 0 WITH HEADER LINE. DATA: p_gjahr LIKE bsik-gjahr, p_bukrs LIKE t001-bukrs, p_lifnr LIKE bsik-lifnr, p_zfbdt LIKE bsik-zfbdt, p_belnr LIKE zapa_header-belnr. CALL SCREEN 0100. INITIALIZATION. WRITE :p_bukrs,/ p_lifnr,/ p_zfbdt,/ p_belnr . ***&SPWIZARD: DATA DECLARATION FOR TABLECONTROL 'Z_ITEM' *&SPWIZARD: DEFINITION OF DDIC-TABLE *功能码返回 DATA: ok_code TYPE sy-ucomm, save_ok LIKE ok_code, mode TYPE c, i_num TYPE i. START-OF-SELECTION. *&---------------------------------------------------------------------* *& Module FORM_INIT OUTPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* MODULE form_init OUTPUT. LOOP AT SCREEN. IF screen-group1 = grop. screen-input = 1. MODIFY SCREEN. ELSE. screen-input = 0. MODIFY SCREEN. ENDIF. ENDLOOP. IF save_ok = 'SCH'. LOOP AT SCREEN. IF screen-group1 = 'NO3'. screen-input = 1. MODIFY SCREEN. ENDIF. ENDLOOP. ENDIF. ENDMODULE. " FORM_INIT OUTPUT *&---------------------------------------------------------------------* *& Module STATUS_0100 OUTPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* MODULE status_0100 OUTPUT. *定义状态栏,工具条,菜单 等 SET PF-STATUS 'SAT1'. SET TITLEBAR '001'. *将变量值输出至屏幕字段 ENDMODULE. " STATUS_0100 OUTPUT *---------PAI输入后控制 退出事件,与屏幕逻辑流对应 MODULE cancel INPUT. LEAVE PROGRAM. ENDMODULE. "CANCEL INPUT *&---------------------------------------------------------------------* *& Module USER_COMMAND_0100 INPUT *&---------------------------------------------------------------------* * PAI输入后控制 处理按钮事件 *----------------------------------------------------------------------* MODULE user_command_0100 INPUT. save_ok = ok_code. DATA: op(6) TYPE c. CLEAR ok_code. CASE save_ok . WHEN 'BACK1'. LEAVE TO SCREEN 0. WHEN 'SCH'. "检查权限 PERFORM main. PERFORM get_old_data. PERFORM display_data. WHEN 'CREATE'. "新增 grop = 'NO2'. op = 'CREATE'. PERFORM get_new_data. PERFORM display_data. WHEN 'SAVE1'. "保存 PERFORM save_data USING op . WHEN 'PRT'. PERFORM frm_set_parameter. WHEN 'CHG'. "更改 grop = 'NO2'. op = 'CHG'. PERFORM get_old_data. PERFORM display_data. WHEN 'DEL'. "删除 op = 'DEL'. PERFORM save_data USING op . WHEN 'EXIT'. "退出 LEAVE PROGRAM. ENDCASE. ENDMODULE. " USER_COMMAND_0100 INPUT *&---------------------------------------------------------------------* *& Form GET_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_Z_QTY_BUKRS text * -->P_Z_QTY_GJAHR text * -->P_Z_QTY_BELNR text *----------------------------------------------------------------------* FORM get_new_data . * data: wa_item type zapa_item. REFRESH zapa_item1. CLEAR z_header. *------抬头 z_header-name = '支出申请单'. "凭证名称 SELECT MAX( zapa_header~belnr ) FROM zapa_header INTO tmp_belnr . IF tmp_belnr <> '' AND tmp_belnr+1(6) = sy-datum(6). number = tmp_belnr+7(3) + 1. UNPACK number TO number. CONCATENATE 'B' sy-datum(6) number INTO z_header-belnr."会计凭证编号:B+年月+流水号 ELSE. CONCATENATE 'B' sy-datum(6) '001' INTO z_header-belnr."会计凭证编号 ENDIF. z_header-gjahr = sy-datum+0(4)."会计年度 z_header-cpudt = sy-datum. "请款日期-会计凭证输入日期 z_header-cpudt1 = sy-datum. "制表日期-会计凭证输入日期 z_header-usnam = sy-uname. "用户名 *货币码 付款方式 SELECT SINGLE bsik~waers bsik~zlsch INTO (z_header-waers, z_header-zlsch ) FROM bsik WHERE bukrs = p_bukrs "公司代码 AND lifnr = p_lifnr"供应商 * and waers <> 'CNY' AND blart <> 'KZ' "供应商付款 AND blart <> 'AB'. "会计凭证 *汇率 SELECT SINGLE tcurr~ukurs FROM tcurr INTO z_header-kursf WHERE kurst ='M' AND fcurr = z_header-waers AND tcurr ='CNY'. IF z_header-waers ='CNY'. z_header-kursf = 1. ENDIF. *-------行项目 客户端 公司代码 凭证编号 会计年度 行项目数 SELECT bsik~mandt bsik~bukrs bsik~belnr bsik~gjahr bsik~buzei *--供应商 会计凭证编号 会计凭证行项目数 过帐日期 基准日期 折扣天数 bsik~lifnr bsik~belnr bsik~buzei bsik~budat bsik~zfbdt bsik~zbd1t *--应付 已付 已申请 本次申请 本位币 文本 bsik~wrbtr bsik~wrbtr bsik~wrbtr bsik~wrbtr bsik~dmbtr bsik~sgtxt *--总帐科目编号 科目文本 成本中心 借方/贷方标识 BSIK~HKONT BSIK~HKONT bsik~kostl bsik~shkzg * FROM bsik INTO CORRESPONDING FIELDS OF TABLE zapa_item1 FROM bsik INTO TABLE zapa_item1 WHERE bukrs = p_bukrs "公司代码 " and gjahr = p_gjahr"会计年度 * AND belnr IN p_belnr"会计凭证编号 AND lifnr = p_lifnr"供应商 * AND monat IN p_monat"会计期间 AND blart <> 'KZ' "供应商付款 AND blart <> 'AB'. "会计凭证 * and BSTAT = ''."凭证状态 "判断正负 IF sy-subrc <> 0. MESSAGE '无凭证被选择,请重新输入!' TYPE 'I'. grop = 'NO1'. ENDIF. SORT zapa_item1 BY budat . "权限检查 LOOP AT zapa_item1. AUTHORITY-CHECK OBJECT 'M_MATE_BUK' ID 'ACTVT' DUMMY " 作业 ID 'BUKRS' FIELD p_bukrs. " 公司代码 IF sy-subrc NE 0. MESSAGE e002(zauthority). ENDIF. ENDLOOP. LOOP AT zapa_item1. * remark by dutm 2012/3/23 10:40 "进行判断 IF zapa_item1-shkzg = 'S'. zapa_item1-wrbtra = 0 - zapa_item1-wrbtra. zapa_item1-wrbtrb = 0 - zapa_item1-wrbtrb. zapa_item1-wrbtrc = 0 - zapa_item1-wrbtrc. zapa_item1-wrbtrd = 0 - zapa_item1-wrbtrd. ENDIF. "凭证已付货币金额=冲账金额 SELECT SUM( wrbtr ) FROM bsak INTO zapa_item1-wrbtrb WHERE rebzg = zapa_item1-xblnr AND bukrs = zapa_item1-bukrs AND lifnr = zapa_item1-lifnr AND rebzj = zapa_item1-gjahr AND rebzz = zapa_item1-belnr AND blart <> 'AB'. "与应付凭证相关的凭证,不为重置的凭证 * zapa_item1-wrbtrb = 0. "凭证已申请货币金额=已经申请金额 SELECT SUM( zapa_item~wrbtrd ) FROM zapa_item INTO zapa_item1-wrbtrc WHERE xblnr = zapa_item1-xblnr AND bukrs = zapa_item1-bukrs AND gjahr = zapa_item1-gjahr AND xbzei = zapa_item1-xbzei. *本次支付金额 zapa_item1-wrbtrd = zapa_item1-wrbtra - zapa_item1-wrbtrc. *本位币金额 IF zapa_item1-waers = 'JPY'. zapa_item1-dmbtr = zapa_item1-wrbtrd * z_header-kursf / 100. ELSE. zapa_item1-dmbtr = zapa_item1-wrbtrd * z_header-kursf . ENDIF. IF zapa_item1-shkzg = 'S'. zapa_item1-shkzg = '借'. ELSE. zapa_item1-shkzg = '贷'. ENDIF. * txt50 LIKE skat-txt50, "科目名称 SELECT SINGLE skat~txt50 INTO zapa_item1-txt50 FROM skat WHERE saknr = zapa_item1-saknr. zapa_item1-belnr = z_header-belnr."编号 zapa_item1-buzei = sy-tabix. "行项目数 *------抬头 z_header-lifnr = zapa_item1-lifnr. "供应商或债权人的帐号 z_header-bukrs = zapa_item1-bukrs. "公司代码 *货币码 SELECT SINGLE bsik~waers INTO (zapa_item1-waers) FROM bsik WHERE bukrs = p_bukrs "公司代码 AND lifnr = p_lifnr"供应商 * and waers <> 'CNY' AND blart <> 'KZ' "供应商付款 AND blart <> 'AB'. "会计凭证 " by dutm 2011/3/22 22:14 "关于币种为日元 IF zapa_item1-waers = 'JPY'. zapa_item1-wrbtra = zapa_item1-wrbtra * 100. zapa_item1-wrbtrb = zapa_item1-wrbtrb * 100. zapa_item1-wrbtrc = zapa_item1-wrbtrc * 100. zapa_item1-wrbtrd = zapa_item1-wrbtrd * 100. MODIFY zapa_item1. ENDIF. *2012-04-10 **项目文本 存储凭证号码 * IF z_header-sgtxt = ''. * z_header-sgtxt = zapa_item1-belnr . * ELSE. * CONCATENATE z_header-sgtxt '|' zapa_item1-belnr INTO z_header-sgtxt . * ENDIF. *到期日= 基准日期 + 折扣天数 zapa_item1-zfbdt = zapa_item1-zfbdt + zapa_item1-zbd1t . MODIFY zapa_item1. *到期日在输入日期后的,删掉 IF ( p_zfbdt <> '00000000' AND zapa_item1-zfbdt > p_zfbdt ) OR zapa_item1-wrbtrd = 0. DELETE zapa_item1. CLEAR zapa_item1. ENDIF. *本次申请总金额 * IF zapa_item1-shkzg = '借'. * z_header-twrbtr = z_header-twrbtr - zapa_item1-wrbtrd. * ELSE. z_header-twrbtr = z_header-twrbtr + zapa_item1-wrbtrd. "ENDIF. CLEAR zapa_item1. ENDLOOP. *公司的名称 SELECT SINGLE t001~butxt INTO (z_header-butxt) FROM t001 WHERE bukrs = z_header-bukrs . *供应商名称 第一个电话号 传真号 SELECT SINGLE lfa1~name1 lfa1~telf1 lfa1~telfx INTO (z_header-name1,z_header-telf1,z_header-telfx) FROM lfa1 WHERE lifnr = z_header-lifnr. *联络人 SELECT SINGLE knvk~namev knvk~name1 INTO (z_header-namev, z_header-namev1) FROM knvk WHERE kunnr = z_header-lifnr. CONCATENATE z_header-namev z_header-name1 INTO z_header-namev. ENDFORM. " GET_DATA *&---------------------------------------------------------------------* *& Form FRM_SET_PARAMETER *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_set_parameter . * remark by dutm 2012/3/23 10:40 * 2011-8-4 解决打印汇总问题 * LOOP AT zapa_item1. * IF zapa_item1-shkzg = '借'. * zapa_item1-wrbtra = 0 - zapa_item1-wrbtra. * zapa_item1-wrbtrb = 0 - zapa_item1-wrbtrb. * zapa_item1-wrbtrc = 0 - zapa_item1-wrbtrc. * zapa_item1-wrbtrd = 0 - zapa_item1-wrbtrd. * zapa_item1-dmbtr = 0 - zapa_item1-dmbtr. * MODIFY zapa_item1. * ENDIF. * ENDLOOP. IF z_header-waers = 'JPY'. z_header-twrbtr = z_header-twrbtr * 100. ENDIF. smartform = 'Z_VST_APAPPLY'. CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' EXPORTING formname = smartform IMPORTING fm_name = gv_fmname EXCEPTIONS no_form = 1 no_function_module = 2 OTHERS = 3. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. CLEAR gs_output_option. CALL FUNCTION gv_fmname EXPORTING control_parameters = gs_control_param output_options = gs_output_option user_settings = space zapa_header = z_header TABLES zapa_item = zapa_item1[] EXCEPTIONS formatting_error = 1 internal_error = 2 send_error = 3 user_canceled = 4 OTHERS = 5. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDFORM. " FRM_SET_PARAMETER *&---------------------------------------------------------------------* *& Form FRM_DISPLAY *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_display . CLEAR: gs_output_option. gs_output_option-tdimmed = gc_x. "开启立即打印 gs_output_option-tdnewid = ' '. "新的打印设备付空 gs_output_option-tddelete = gc_x. "打印完后断开设置连接,清空打印内容缓存 IF gs_cresop-tddest IS INITIAL. "判断打印输出设备是否存在 gs_output_option-tddest = 'VS'. ELSE. gs_output_option-tddest = gs_cresop-tddest. "当前打印输出设备付予打印控制 ENDIF. ENDFORM. " FRM_DISPLAY *&---------------------------------------------------------------------* *& Form GET_OLD_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM get_old_data . * REFRESH g_z_item_itab. REFRESH zapa_item1. CLEAR z_header. DATA: count TYPE i, s_where(200) TYPE c . IF p_belnr IS NOT INITIAL. SELECT SINGLE * FROM zapa_header INTO z_header WHERE bukrs = p_bukrs AND lifnr = p_lifnr AND ( belnr = p_belnr ). IF sy-subrc <> 0. MESSAGE '查询单据不存在,请重新输入!' TYPE 'I'. ENDIF. *读取表项目 SELECT * FROM zapa_item INTO CORRESPONDING FIELDS OF TABLE zapa_item1[] WHERE belnr = z_header-belnr. ELSE. SELECT COUNT(*) FROM zapa_header INTO count WHERE bukrs = p_bukrs AND lifnr = p_lifnr. IF count <> 1. MESSAGE '输入条件查出的单据不唯一,请重新输入!' TYPE 'I'. ELSE. SELECT SINGLE * FROM zapa_header INTO z_header WHERE bukrs = p_bukrs AND lifnr = p_lifnr. *读取表项目 SELECT * FROM zapa_item INTO CORRESPONDING FIELDS OF TABLE zapa_item1 WHERE belnr = z_header-belnr . ENDIF. ENDIF. * BY DUTM 2012/3/22 IF z_header-waers = 'JPY'. z_header-twrbtr = z_header-twrbtr * 100. ENDIF. LOOP AT zapa_item1. IF zapa_item1-waers = 'JPY'. zapa_item1-wrbtra = zapa_item1-wrbtra * 100. zapa_item1-wrbtrb = zapa_item1-wrbtrb * 100. zapa_item1-wrbtrc = zapa_item1-wrbtrc * 100. zapa_item1-wrbtrd = zapa_item1-wrbtrd * 100. MODIFY zapa_item1. ENDIF. ENDLOOP. ENDFORM. " GET_OLD_DATA *&---------------------------------------------------------------------* *& Form DISPLAY_DATA *&---------------------------------------------------------------------* * 查询数据显示 *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM display_data . IF z_header-waers = 'JPY'. z_header-twrbtr = z_header-twrbtr / 100. ENDIF. zapa_header-mandt = z_header-mandt . zapa_header-bukrs = z_header-bukrs . zapa_header-belnr = z_header-belnr . zapa_header-gjahr = z_header-gjahr . zapa_header-butxt = z_header-butxt . zapa_header-cpudt = z_header-cpudt . zapa_header-cpudt1 = z_header-cpudt1. zapa_header-usnam = z_header-usnam . zapa_header-lifnr = z_header-lifnr . zapa_header-name1 = z_header-name1 . zapa_header-telf1 = z_header-telf1 . zapa_header-telfx = z_header-telfx . zapa_header-namev = z_header-namev . zapa_header-namev1 = z_header-namev1 . zapa_header-kursf = z_header-kursf . zapa_header-zlsch = z_header-zlsch . zapa_header-twrbtr = z_header-twrbtr. zapa_header-name = z_header-name . zapa_header-waers = z_header-waers . "zapa_header-sgtxt = z_header-sgtxt . *2012/04/10 " zapa_header-sgtxt = ''. * WRITE:zapa_header-usnam, / zapa_header-cpudt1, / zapa_header-belnr , * / zapa_header-cpudt,/ zapa_header-lifnr ,/ zapa_header-name1, * / zapa_header-telf1,/ zapa_header-telfx, * / zapa_header-namev,/ zapa_header-waers ,/ zapa_header-kursf. IF zapa_header-twrbtr < 0. MESSAGE w001(00) WITH '该供应商应付总额为负(' zapa_header-twrbtr '),请用FBL1N检查并纠正财务凭证的错误'. * CLEAR: zapa_header, z_header, zapa_item1[]. ENDIF. ENDFORM. " DISPLAY_DATA *&---------------------------------------------------------------------* *& Form SAVE_DATA *&---------------------------------------------------------------------* * 保存支出申请单 *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM save_data USING op TYPE c. DATA:tmp_wrbtr LIKE bsik-wrbtr. DATA: flag(5) TYPE c. LOOP AT zapa_item1. * read table g_z_item_itab with table key XBLNR = zapa_item1-XBLNR INTO g_z_item_wa . * * zapa_item1-XBLNR = g_z_item_wa-XBLNR. * zapa_item1-WRBTRD = g_z_item_wa-WRBTRD. * zapa_item1-SGTXT = g_z_item_wa-SGTXT. * zapa_item1-KOSTL = g_z_item_wa-KOSTL. tmp_wrbtr = zapa_item1-wrbtrc + zapa_item1-wrbtrd. IF ABS( tmp_wrbtr ) > ABS( zapa_item1-wrbtra ). MESSAGE '申请金额不能大于应付金额减去已申请金额,请检查输入金额!' TYPE 'I'. save_ok = 'CREATE'. flag = 'false'. RETURN . ELSEIF SIGN( zapa_item1-wrbtra ) <> SIGN( tmp_wrbtr ). MESSAGE '输入有误!申请金额与应付金额的正负号应该一致。' TYPE 'I'. save_ok = 'CREATE'. flag = 'false'. RETURN . ELSE. flag = 'true'. ENDIF. CLEAR zapa_item1. ENDLOOP. IF flag = 'true'. IF op = 'CREATE'. LOOP AT zapa_item1. * remark by dutm 2012/3/23 10:40 * IF zapa_item1-shkzg = '借'. * zapa_item1-wrbtra = 0 - zapa_item1-wrbtra. * zapa_item1-wrbtrb = 0 - zapa_item1-wrbtrb. * zapa_item1-wrbtrc = 0 - zapa_item1-wrbtrc. * zapa_item1-wrbtrd = 0 - zapa_item1-wrbtrd. * zapa_item1-dmbtr = 0 - zapa_item1-dmbtr. * MODIFY zapa_item1. * ENDIF. " BY DUTM 2012/3/23 IF zapa_item1-waers = 'JPY'. zapa_item1-wrbtra = zapa_item1-wrbtra / 100. zapa_item1-wrbtrb = zapa_item1-wrbtrb / 100. zapa_item1-wrbtrc = zapa_item1-wrbtrc / 100. zapa_item1-wrbtrd = zapa_item1-wrbtrd / 100. MODIFY zapa_item1. ENDIF. INSERT INTO zapa_item VALUES zapa_item1. CLEAR zapa_item1. ENDLOOP. IF zapa_header-waers = 'JPY'. zapa_header-twrbtr = zapa_header-twrbtr / 100. ENDIF. INSERT INTO zapa_header VALUES zapa_header. MESSAGE '保存支付申请单成功!' TYPE 'I'. ELSEIF op = 'CHG'. LOOP AT zapa_item1. DELETE FROM zapa_item WHERE belnr = zapa_item1-belnr. CLEAR zapa_item1. ENDLOOP. DELETE FROM zapa_header WHERE belnr = zapa_header-belnr. LOOP AT zapa_item1. * remark by dutm 2012/3/23 10:40 * IF zapa_item1-shkzg = '借'. * zapa_item1-wrbtra = 0 - zapa_item1-wrbtra. * zapa_item1-wrbtrb = 0 - zapa_item1-wrbtrb. * zapa_item1-wrbtrc = 0 - zapa_item1-wrbtrc. * zapa_item1-wrbtrd = 0 - zapa_item1-wrbtrd. * zapa_item1-dmbtr = 0 - zapa_item1-dmbtr. * MODIFY zapa_item1. * ENDIF. " BY DUTM 2012/3/23 IF zapa_item1-waers = 'JPY'. zapa_item1-wrbtra = zapa_item1-wrbtra / 100. zapa_item1-wrbtrb = zapa_item1-wrbtrb / 100. zapa_item1-wrbtrc = zapa_item1-wrbtrc / 100. zapa_item1-wrbtrd = zapa_item1-wrbtrd / 100. MODIFY zapa_item1. ENDIF. INSERT INTO zapa_item VALUES zapa_item1. CLEAR zapa_item1. ENDLOOP. IF zapa_header-waers = 'JPY'. zapa_header-twrbtr = zapa_header-twrbtr / 100. ENDIF. INSERT INTO zapa_header VALUES zapa_header. MESSAGE '修改支付申请单成功!' TYPE 'I'. ELSEIF op = 'DEL' . LOOP AT zapa_item1. DELETE FROM zapa_item WHERE belnr = zapa_item1-belnr. CLEAR zapa_item1. ENDLOOP. DELETE FROM zapa_header WHERE belnr = zapa_header-belnr. MESSAGE '删除支付申请单成功!' TYPE 'I'. ENDIF. CLEAR zapa_header. REFRESH zapa_item1. grop = 'NO1'. ENDIF. ENDFORM. " SAVE_DATA * *&SPWIZARD: DECLARATION OF TABLECONTROL 'Z_ITEM1' ITSELF CONTROLS: z_item1 TYPE TABLEVIEW USING SCREEN 0100. *&SPWIZARD: LINES OF TABLECONTROL 'Z_ITEM1' DATA: g_z_item1_lines LIKE sy-loopc, rsdxx LIKE rsdxx. *&SPWIZARD: OUTPUT MODULE FOR TC 'Z_ITEM1'. DO NOT CHANGE THIS LINE! *&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR MODULE z_item1_change_tc_attr OUTPUT. DESCRIBE TABLE zapa_item1 LINES z_item1-lines. ENDMODULE. "Z_ITEM1_CHANGE_TC_ATTR OUTPUT *&SPWIZARD: OUTPUT MODULE FOR TC 'Z_ITEM1'. DO NOT CHANGE THIS LINE! *&SPWIZARD: GET LINES OF TABLECONTROL MODULE z_item1_get_lines OUTPUT. g_z_item1_lines = sy-loopc. ENDMODULE. "Z_ITEM1_GET_LINES OUTPUT *&SPWIZARD: INPUT MODULE FOR TC 'Z_ITEM1'. DO NOT CHANGE THIS LINE! *&SPWIZARD: MODIFY TABLE MODULE z_item1_modify INPUT. * 在表格中插入行,要考虑的因素较多,最好要弹出一个对话框让用户选择合适的数据, * 代码处理起来比较麻烦,暂时不实现。以后有空时再完善。 WRITE:/ zapa_item1-bstat. IF zapa_item1-belnr = ''. "未初始化的行项目,主要针对新增行 SELECT SINGLE * bsik~mandt bsik~bukrs bsik~belnr bsik~gjahr bsik~buzei *--供应商 会计凭证编号 会计凭证行项目数 过帐日期 基准日期 折扣天数 bsik~lifnr bsik~belnr bsik~buzei bsik~budat bsik~zfbdt bsik~zbd1t *--应付 已付 已申请 本次申请 本位币 文本 bsik~wrbtr bsik~wrbtr bsik~wrbtr bsik~wrbtr bsik~dmbtr "bsik~sgtxt *--总帐科目编号 科目文本 成本中心 借方/贷方标识 货币种类 BSIK~HKONT BSIK~HKONT bsik~kostl bsik~shkzg bsik~waers FROM bsik INTO (zapa_item1-lifnr, zapa_item1-belnr, zapa_item1-buzei, zapa_item1-budat,zapa_item1-zfbdt,zapa_item1-zbd1t, zapa_item1-wrbtra, zapa_item1-wrbtrb, zapa_item1-wrbtrc, zapa_item1-wrbtrd, zapa_item1-dmbtr,"zapa_item1-SGtxt, zapa_item1-saknr, zapa_item1-saknr, zapa_item1-kostl, zapa_item1-shkzg,zapa_item1-waers ) WHERE belnr = zapa_item1-xblnr " 这个值不够准确,本还需要一个项目…… AND bukrs = p_bukrs AND lifnr = p_lifnr AND blart <> 'KZ' AND blart <> 'AB'. * remark by dutm 2012/3/23 IF zapa_item1-shkzg = 'S'. zapa_item1-wrbtra = 0 - zapa_item1-wrbtra. zapa_item1-wrbtrb = 0 - zapa_item1-wrbtrb. zapa_item1-wrbtrc = 0 - zapa_item1-wrbtrc. zapa_item1-wrbtrd = 0 - zapa_item1-wrbtrd. ENDIF. IF zapa_item1-waers = 'JPY'. zapa_item1-wrbtra = zapa_item1-wrbtra * 100. zapa_item1-wrbtrb = zapa_item1-wrbtrb * 100. zapa_item1-wrbtrc = zapa_item1-wrbtrc * 100. zapa_item1-wrbtrd = zapa_item1-wrbtrd * 100. ENDIF. * and BSTAT = ''."凭证状态 IF sy-subrc <> 0. MESSAGE '无凭证被选择,请重新输入!' TYPE 'I'. grop = 'NO2'. ELSE. *-------行项目 客户端 公司代码 凭证编号 会计年度 行项目数 zapa_item1-mandt = zapa_header-mandt. zapa_item1-bukrs = zapa_header-bukrs. zapa_item1-belnr = zapa_header-belnr. zapa_item1-gjahr = zapa_header-gjahr. zapa_item1-buzei = ''. zapa_item1-waers = zapa_header-waers. zapa_item1-lifnr = zapa_header-lifnr. zapa_item1-zfbdt = zapa_item1-zfbdt + zapa_item1-zbd1t. "凭证已付货币金额=冲账金额 * zapa_item1-wrbtrb = 0. SELECT SUM( wrbtr ) FROM bsak INTO zapa_item1-wrbtrb WHERE rebzg = zapa_item1-xblnr AND bukrs = zapa_item1-bukrs AND lifnr = zapa_item1-lifnr AND rebzj = zapa_item1-gjahr AND rebzz = zapa_item1-belnr AND blart <> 'AB'. "凭证已申请货币金额=已经申请金额 SELECT SUM( zapa_item~wrbtrd ) FROM zapa_item INTO zapa_item1-wrbtrc WHERE xblnr = zapa_item1-xblnr AND bukrs = zapa_item1-bukrs AND gjahr = zapa_item1-gjahr AND xbzei = zapa_item1-xbzei. zapa_item1-wrbtrd = zapa_item1-wrbtra - zapa_item1-wrbtrc. IF zapa_item1-shkzg = 'S'. zapa_item1-shkzg = '借'. ELSE. zapa_item1-shkzg = '贷'. ENDIF. * txt50 LIKE skat-txt50, "科目名称 SELECT SINGLE skat~txt50 INTO zapa_item1-txt50 FROM skat WHERE saknr = zapa_item1-saknr. ENDIF. ENDIF. MODIFY zapa_item1 FROM zapa_item1 INDEX z_item1-current_line. *本次支付凭证货币总金额 zapa_header-twrbtr = 0. LOOP AT zapa_item1. ** remark by dutm 2012/3/23 10:40 * IF zapa_item1-shkzg = '借'. * zapa_item1-wrbtra = 0 - zapa_item1-wrbtra. * zapa_item1-wrbtrb = 0 - zapa_item1-wrbtrb. * zapa_item1-wrbtrc = 0 - zapa_item1-wrbtrc. * zapa_item1-wrbtrd = 0 - zapa_item1-wrbtrd. * zapa_item1-dmbtr = 0 - zapa_item1-dmbtr. * MODIFY zapa_item1. * ENDIF. * ReMark by dutm 2011/3/22 22:14 * "关于币种为日元 * IF zapa_item1-waers = 'JPY'. * zapa_item1-wrbtra = zapa_item1-wrbtra * 100. * zapa_item1-wrbtrb = zapa_item1-wrbtrb * 100. * zapa_item1-wrbtrc = zapa_item1-wrbtrc * 100. * zapa_item1-wrbtrd = zapa_item1-wrbtrd * 100. * MODIFY zapa_item1. * ENDIF. *本次申请总金额 * IF zapa_item1-shkzg = '借'. * zapa_header-twrbtr = zapa_header-twrbtr - zapa_item1-wrbtrd. * ELSE. zapa_header-twrbtr = zapa_header-twrbtr + zapa_item1-wrbtrd. "ENDIF. CLEAR zapa_item1. ENDLOOP. ENDMODULE. "Z_ITEM1_MODIFY INPUT *&SPWIZARD: INPUT MODULE FOR TC 'Z_ITEM1'. DO NOT CHANGE THIS LINE! *&SPWIZARD: PROCESS USER COMMAND MODULE z_item1_user_command INPUT. ok_code = sy-ucomm. PERFORM user_ok_tc USING 'Z_ITEM1' 'ZAPA_ITEM1' 'BSTAT'"'ITEM_LINES' CHANGING ok_code. sy-ucomm = ok_code. ENDMODULE. "Z_ITEM1_USER_COMMAND INPUT *----------------------------------------------------------------------* * INCLUDE TABLECONTROL_FORMS * *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form USER_OK_TC * *&---------------------------------------------------------------------* FORM user_ok_tc USING p_tc_name TYPE dynfnam p_table_name p_mark_name CHANGING p_ok LIKE sy-ucomm. *&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------* DATA: l_ok TYPE sy-ucomm, l_offset TYPE i. *&SPWIZARD: END OF LOCAL DATA------------------------------------------* *&SPWIZARD: Table control specific operations * *&SPWIZARD: evaluate TC name and operations * * search p_ok for p_tc_name. * if sy-subrc <> 0. * exit. * endif. * l_offset = strlen( p_tc_name ) + 1. * l_ok = p_ok+l_offset. l_ok = p_ok. *&SPWIZARD: execute general and TC specific operations * CASE l_ok. WHEN 'INSR'. "insert row PERFORM fcode_insert_row USING p_tc_name p_table_name. CLEAR p_ok. WHEN 'DELE'. "delete row PERFORM fcode_delete_row USING p_tc_name p_table_name p_mark_name. CLEAR p_ok. WHEN 'P--' OR "top of list 'P-' OR "previous page 'P+' OR "next page 'P++'. "bottom of list PERFORM compute_scrolling_in_tc USING p_tc_name l_ok. CLEAR p_ok. * WHEN 'L--'. "total left * PERFORM FCODE_TOTAL_LEFT USING P_TC_NAME. * * WHEN 'L-'. "column left * PERFORM FCODE_COLUMN_LEFT USING P_TC_NAME. * * WHEN 'R+'. "column right * PERFORM FCODE_COLUMN_RIGHT USING P_TC_NAME. * * WHEN 'R++'. "total right * PERFORM FCODE_TOTAL_RIGHT USING P_TC_NAME. * WHEN 'MARK'. "mark all filled lines PERFORM fcode_tc_mark_lines USING p_tc_name p_table_name p_mark_name . CLEAR p_ok. WHEN 'DMRK'. "demark all filled lines PERFORM fcode_tc_demark_lines USING p_tc_name p_table_name p_mark_name . CLEAR p_ok. * WHEN 'SASCEND' OR * 'SDESCEND'. "sort column * PERFORM FCODE_SORT_TC USING P_TC_NAME * l_ok. ENDCASE. ENDFORM. " USER_OK_TC *&---------------------------------------------------------------------* *& Form FCODE_INSERT_ROW * *&---------------------------------------------------------------------* FORM fcode_insert_row USING p_tc_name TYPE dynfnam p_table_name . *&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------* DATA l_lines_name LIKE feld-name. DATA l_selline LIKE sy-stepl. DATA l_lastline TYPE i. DATA l_line TYPE i. DATA l_table_name LIKE feld-name. FIELD-SYMBOLS <tc> TYPE cxtab_control. FIELD-SYMBOLS <table> TYPE STANDARD TABLE. FIELD-SYMBOLS <lines> TYPE i. *&SPWIZARD: END OF LOCAL DATA------------------------------------------* ASSIGN (p_tc_name) TO <tc>. *&SPWIZARD: get the table, which belongs to the tc * CONCATENATE p_table_name '[]' INTO l_table_name. "table body ASSIGN (l_table_name) TO <table>. "not headerline *&SPWIZARD: get looplines of TableControl * CONCATENATE 'G_' p_tc_name '_LINES' INTO l_lines_name. ASSIGN (l_lines_name) TO <lines>. *&SPWIZARD: get current line * GET CURSOR LINE l_selline. IF sy-subrc <> 0. " append line to table l_selline = <tc>-lines + 1. *&SPWIZARD: set top line * IF l_selline > <lines>. <tc>-top_line = l_selline - <lines> + 1 . ELSE. <tc>-top_line = 1. ENDIF. ELSE. " insert line into table l_selline = <tc>-top_line + l_selline - 1. l_lastline = <tc>-top_line + <lines> - 1. ENDIF. *&SPWIZARD: set new cursor line * l_line = l_selline - <tc>-top_line + 1. *&SPWIZARD: insert initial line * INSERT INITIAL LINE INTO <table> INDEX l_selline. <tc>-lines = <tc>-lines + 1. *&SPWIZARD: set cursor * SET CURSOR LINE l_line. ENDFORM. " FCODE_INSERT_ROW *&---------------------------------------------------------------------* *& Form FCODE_DELETE_ROW * *&---------------------------------------------------------------------* FORM fcode_delete_row USING p_tc_name TYPE dynfnam p_table_name p_mark_name . *&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------* DATA l_table_name LIKE feld-name. FIELD-SYMBOLS <tc> TYPE cxtab_control. FIELD-SYMBOLS <table> TYPE STANDARD TABLE. FIELD-SYMBOLS <wa>. FIELD-SYMBOLS <mark_field>. *&SPWIZARD: END OF LOCAL DATA------------------------------------------* ASSIGN (p_tc_name) TO <tc>. *&SPWIZARD: get the table, which belongs to the tc * CONCATENATE p_table_name '[]' INTO l_table_name. "table body ASSIGN (l_table_name) TO <table>. "not headerline *&SPWIZARD: delete marked lines * DESCRIBE TABLE <table> LINES <tc>-lines. LOOP AT <table> ASSIGNING <wa>. *&SPWIZARD: access to the component 'FLAG' of the table header * ASSIGN COMPONENT p_mark_name OF STRUCTURE <wa> TO <mark_field>. IF <mark_field> = 'X'. DELETE <table> INDEX syst-tabix. IF sy-subrc = 0. <tc>-lines = <tc>-lines - 1. ENDIF. ENDIF. ENDLOOP. ENDFORM. " FCODE_DELETE_ROW *&---------------------------------------------------------------------* *& Form COMPUTE_SCROLLING_IN_TC *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_TC_NAME name of tablecontrol * -->P_OK ok code *----------------------------------------------------------------------* FORM compute_scrolling_in_tc USING p_tc_name p_ok. *&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------* DATA l_tc_new_top_line TYPE i. DATA l_tc_name LIKE feld-name. DATA l_tc_lines_name LIKE feld-name. DATA l_tc_field_name LIKE feld-name. FIELD-SYMBOLS <tc> TYPE cxtab_control. FIELD-SYMBOLS <lines> TYPE i. *&SPWIZARD: END OF LOCAL DATA------------------------------------------* ASSIGN (p_tc_name) TO <tc>. *&SPWIZARD: get looplines of TableControl * CONCATENATE 'G_' p_tc_name '_LINES' INTO l_tc_lines_name. ASSIGN (l_tc_lines_name) TO <lines>. *&SPWIZARD: is no line filled? * IF <tc>-lines = 0. *&SPWIZARD: yes, ... * l_tc_new_top_line = 1. ELSE. *&SPWIZARD: no, ... * CALL FUNCTION 'SCROLLING_IN_TABLE' EXPORTING entry_act = <tc>-top_line entry_from = 1 entry_to = <tc>-lines last_page_full = 'X' loops = <lines> ok_code = p_ok overlapping = 'X' IMPORTING entry_new = l_tc_new_top_line EXCEPTIONS * NO_ENTRY_OR_PAGE_ACT = 01 * NO_ENTRY_TO = 02 * NO_OK_CODE_OR_PAGE_GO = 03 OTHERS = 0. ENDIF. *&SPWIZARD: get actual tc and column * GET CURSOR FIELD l_tc_field_name AREA l_tc_name. IF syst-subrc = 0. IF l_tc_name = p_tc_name. *&SPWIZARD: et actual column * SET CURSOR FIELD l_tc_field_name LINE 1. ENDIF. ENDIF. *&SPWIZARD: set the new top line * <tc>-top_line = l_tc_new_top_line. ENDFORM. " COMPUTE_SCROLLING_IN_TC *&---------------------------------------------------------------------* *& Form FCODE_TC_MARK_LINES *&---------------------------------------------------------------------* * marks all TableControl lines *----------------------------------------------------------------------* * -->P_TC_NAME name of tablecontrol *----------------------------------------------------------------------* FORM fcode_tc_mark_lines USING p_tc_name p_table_name p_mark_name. *&SPWIZARD: EGIN OF LOCAL DATA-----------------------------------------* DATA l_table_name LIKE feld-name. FIELD-SYMBOLS <tc> TYPE cxtab_control. FIELD-SYMBOLS <table> TYPE STANDARD TABLE. FIELD-SYMBOLS <wa>. FIELD-SYMBOLS <mark_field>. *&SPWIZARD: END OF LOCAL DATA------------------------------------------* ASSIGN (p_tc_name) TO <tc>. *&SPWIZARD: get the table, which belongs to the tc * CONCATENATE p_table_name '[]' INTO l_table_name. "table body ASSIGN (l_table_name) TO <table>. "not headerline *&SPWIZARD: mark all filled lines * LOOP AT <table> ASSIGNING <wa>. *&SPWIZARD: access to the component 'FLAG' of the table header * ASSIGN COMPONENT p_mark_name OF STRUCTURE <wa> TO <mark_field>. <mark_field> = 'X'. ENDLOOP. ENDFORM. "fcode_tc_mark_lines *&---------------------------------------------------------------------* *& Form FCODE_TC_DEMARK_LINES *&---------------------------------------------------------------------* * demarks all TableControl lines *----------------------------------------------------------------------* * -->P_TC_NAME name of tablecontrol *----------------------------------------------------------------------* FORM fcode_tc_demark_lines USING p_tc_name p_table_name p_mark_name . *&SPWIZARD: BEGIN OF LOCAL DATA----------------------------------------* DATA l_table_name LIKE feld-name. FIELD-SYMBOLS <tc> TYPE cxtab_control. FIELD-SYMBOLS <table> TYPE STANDARD TABLE. FIELD-SYMBOLS <wa>. FIELD-SYMBOLS <mark_field>. *&SPWIZARD: END OF LOCAL DATA------------------------------------------* ASSIGN (p_tc_name) TO <tc>. *&SPWIZARD: get the table, which belongs to the tc * CONCATENATE p_table_name '[]' INTO l_table_name. "table body ASSIGN (l_table_name) TO <table>. "not headerline *&SPWIZARD: demark all filled lines * LOOP AT <table> ASSIGNING <wa>. *&SPWIZARD: access to the component 'FLAG' of the table header * ASSIGN COMPONENT p_mark_name OF STRUCTURE <wa> TO <mark_field>. <mark_field> = space. ENDLOOP. ENDFORM. "fcode_tc_mark_lines *&---------------------------------------------------------------------* *& Module GET_WAERS_SET_KURSF INPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* MODULE get_waers_set_kursf INPUT. *汇率 zapa_header-kursf = 0. WRITE:zapa_header-kursf. SELECT SINGLE tcurr~ukurs FROM tcurr INTO zapa_header-kursf WHERE kurst ='M' AND fcurr = zapa_header-waers AND tcurr ='CNY'. IF sy-subrc <> 0. IF zapa_header-waers = 'CNY'. zapa_header-kursf = 1. ELSE. MESSAGE '该币种汇率没有维护!' TYPE 'I'. ENDIF. ELSE. * zapa_header-kursf = zapa_header-kursf . WRITE:zapa_header-kursf. *本位币金额 LOOP AT zapa_item1. IF zapa_item1-waers = 'JPY'. zapa_item1-dmbtr = zapa_item1-wrbtrd * zapa_header-kursf / 100. ELSE. zapa_item1-dmbtr = zapa_item1-wrbtrd * zapa_header-kursf. ENDIF. MODIFY zapa_item1 FROM zapa_item1. CLEAR zapa_item1. ENDLOOP. ENDIF. *本次支付凭证货币总金额 zapa_header-twrbtr = 0. LOOP AT zapa_item1. * remark by dutm 2012/3/23 10:40 * IF zapa_item1-shkzg = '借'. * zapa_item1-wrbtra = 0 - zapa_item1-wrbtra. * zapa_item1-wrbtrb = 0 - zapa_item1-wrbtrb. * zapa_item1-wrbtrc = 0 - zapa_item1-wrbtrc. * zapa_item1-wrbtrd = 0 - zapa_item1-wrbtrd. * zapa_item1-dmbtr = 0 - zapa_item1-dmbtr. * MODIFY zapa_item1. * ENDIF. * ReMark by dutm 2011/3/22 22:14 * "关于币种为日元 * IF zapa_item1-waers = 'JPY'. * zapa_item1-wrbtra = zapa_item1-wrbtra * 100. * zapa_item1-wrbtrb = zapa_item1-wrbtrb * 100. * zapa_item1-wrbtrc = zapa_item1-wrbtrc * 100. * zapa_item1-wrbtrd = zapa_item1-wrbtrd * 100. * MODIFY zapa_item1. * ENDIF. *本次申请总金额 * IF zapa_item1-shkzg = '借'. * zapa_header-twrbtr = zapa_header-twrbtr - zapa_item1-wrbtrd. * ELSE. zapa_header-twrbtr = zapa_header-twrbtr + zapa_item1-wrbtrd. * ENDIF. CLEAR zapa_item1. ENDLOOP. grop = 'NO2'. ENDMODULE. " GET_WAERS_SET_KURSF INPUT *&---------------------------------------------------------------------* *& Module SET_KURSF INPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* MODULE set_kursf INPUT. WRITE:zapa_header-kursf. *本位币金额 LOOP AT zapa_item1. IF zapa_item1-waers = 'JPY'. zapa_item1-dmbtr = zapa_item1-wrbtrd * zapa_header-kursf / 100. ELSE. zapa_item1-dmbtr = zapa_item1-wrbtrd * zapa_header-kursf. ENDIF. MODIFY zapa_item1 FROM zapa_item1. CLEAR zapa_item1. ENDLOOP. *本次支付凭证货币总金额 * zapa_header-twrbtr = 0. * loop at zapa_item1. * zapa_header-twrbtr = zapa_header-twrbtr + zapa_item1-wrbtrd. * clear zapa_item1. * endloop. grop = 'NO2'. ENDMODULE. " SET_KURSF INPUT *&---------------------------------------------------------------------* *& Form MAIN *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM main . "权限检查 AUTHORITY-CHECK OBJECT 'M_MATE_BUK' ID 'ACTVT' DUMMY " 作业 ID 'BUKRS' FIELD p_bukrs. " 公司代码 IF sy-subrc NE 0. MESSAGE e002(zauthority). ENDIF. ENDFORM. " MAIN