*&---------------------------------------------------------------------* *& Report ZFID005 *&---------------------------------------------------------------------* *&添加程序注释BY :XY 20170208 *&---------------------------------------------------------------------* REPORT zfid005. TYPE-POOLS: slis. *======================================================================* * Tabellen * *======================================================================* TABLES : vbco7. TABLES : rv60a. TABLES : tvfk . TABLES : tvfkd. TABLES : tvko . TABLES : t005 . TABLES : vkdfi,vbak,vkdfs. ************************************************************************ * 定义类型 ************************************************************************ * 定义用与转换的类型 TYPES: BEGIN OF ty_out, vkorg TYPE vkorg, "销售组织 spart TYPE spart, vtweg TYPE vtweg, kunnr TYPE kunnr, "客户 name1 TYPE string, "受达方名称 kunn2 TYPE string, "付款方编号 name2 TYPE string, "付款方名称 knrze TYPE knb1-knrze, "总部编号 name3 TYPE string, "总部描述 fktyp TYPE vkdfs-fktyp, "出具发票类别 ftext TYPE string, "出具发票类别描述 vbeln TYPE vbeln, "发货单号 posnr TYPE posnr, "发货打行项目 fkdat TYPE fkdat, "出具发票日期 auart TYPE auart, "凭证类型 bezei TYPE v_tvak-bezei, "凭证类型描述 fkart TYPE fkart, "开票类型 vgbel TYPE vgbel, "销售订单号 vgpos TYPE vgpos, "销售订单行号 mtart TYPE mara-mtart, "物料类型 mtbez TYPE t134t-mtbez, "物料类型描述 matnr TYPE matnr, "物料编码 maktx TYPE maktx, "物料描述 kwmeng TYPE bstmg, "数量 meins TYPE meins, "单位 vertn TYPE vbap-vertn, "活动项目 zproj TYPE zfit001-zproj, "活动项目描述 xflag TYPE c, "票折计算标识 zdiscount TYPE c, "票折行 kbetr TYPE zkbetr, "零售价 akbetr TYPE zkbetr, "零售金额 vkbetr TYPE zkbetr6, "订单价 avkbetr TYPE zkbetr2, "订单价金额 pzqdj TYPE zkbetr6, "票折前单价 pzqje TYPE kbetr, "票折前金额 pzhje TYPE kbetr, "票折后金额 pzhdj TYPE zkbetr6, "票折后单价 "modify by xy 20170227 "PZHJEFS type KBETR,"票折后金额(反算) pzhjefs TYPE zkbetr2, "票折后金额(反算) "modify ended pzzk TYPE zkbetr, "票折折扣 wc TYPE kbetr, "尾差 knumv TYPE knumv, zterm TYPE dzterm, type TYPE c, statu TYPE char10, msg TYPE string, chbox TYPE c LENGTH 1, bill TYPE vbeln, billmsg TYPE string, billdate TYPE sy-datum, * CELLCOLOR TYPE LVC_T_SCOL, END OF ty_out. TYPES: BEGIN OF ty_kunnr_akbetr, kunnr TYPE kunnr, akbetr TYPE kbetr, "零售金额 pzqje TYPE kbetr, "票折前金额 "modify by xy 20170227 "PZHJEFS type KBETR, pzhjefs TYPE zkbetr2, "票折后金额(反算) "modify ended END OF ty_kunnr_akbetr. ************************************************************************ * 声明内表、工作区和全局变量 ************************************************************************ DATA: gt_out TYPE STANDARD TABLE OF ty_out, gs_out LIKE LINE OF gt_out. "add by xy 20170302 DATA: BEGIN OF wa_vbeln, vgbel TYPE vgbel, "销售订单号 "VGPOS type VGPOS,"销售订单行号 END OF wa_vbeln. DATA:gt_vbeln LIKE TABLE OF wa_vbeln. "add ended FIELD-SYMBOLS <fs_out> TYPE ty_out. DATA: gt_k_akbetr TYPE TABLE OF ty_kunnr_akbetr, gs_k_akbetr TYPE ty_kunnr_akbetr. DATA g_rassc TYPE rassc. ** 使用 ALV DATA: it_fieldcat TYPE slis_t_fieldcat_alv, " ALV 标题内表 wa_layout TYPE slis_layout_alv. " ALV 格式 * it_events TYPE slis_t_event. " ALV事件处理 DATA :l_num TYPE n LENGTH 10, s_num TYPE n LENGTH 10, m_num TYPE n LENGTH 3. DATA: zflag(1) TYPE C. FIELD-SYMBOLS <p_hsl>. " 定义指针 ************************************************************************ * 选择屏幕 * ************************************************************************ *======================================================================* * Selektionsdynpro 1000 * *======================================================================* *Block : Belegdaten----------------------------------------------------* "SELECTION-SCREEN SKIP 1. PARAMETERS p_date TYPE sy-datum DEFAULT sy-datum. SELECTION-SCREEN BEGIN OF BLOCK beleg WITH FRAME TITLE TEXT-a01. SELECT-OPTIONS s_fkdat FOR vbco7-fkdat NO-EXTENSION. SELECT-OPTIONS s_fkart FOR vbco7-fkart. SELECT-OPTIONS s_vbeln FOR vbco7-vbeln. SELECT-OPTIONS s_vgbel FOR vbak-vbeln. SELECTION-SCREEN END OF BLOCK beleg. *Block : Organisationsdaten--------------------------------------------* SELECTION-SCREEN BEGIN OF BLOCK organ WITH FRAME TITLE TEXT-001. PARAMETERS: p_vkorg LIKE vbco7-vkorg MEMORY ID fko OBLIGATORY DEFAULT 1500. SELECT-OPTIONS s_vtweg FOR vbco7-vtweg. SELECT-OPTIONS s_spart FOR vbco7-spart. SELECT-OPTIONS s_vstel FOR vbco7-vstel. SELECTION-SCREEN END OF BLOCK organ. *Block : Kundendaten---------------------------------------------------* SELECTION-SCREEN BEGIN OF BLOCK kunde WITH FRAME TITLE TEXT-a02. SELECT-OPTIONS: s_kunnr FOR vbco7-kunnr MATCHCODE OBJECT debi, s_kunnr2 FOR vbco7-kunnr MATCHCODE OBJECT debi,"开票方 s_kunnr3 FOR vbco7-kunnr MATCHCODE OBJECT debi,"付款方 s_kunnr4 FOR vbco7-kunnr MATCHCODE OBJECT debi."总部 SELECTION-SCREEN END OF BLOCK kunde. SELECTION-SCREEN BEGIN OF BLOCK select WITH FRAME TITLE TEXT-a03. PARAMETERS: p_so AS CHECKBOX DEFAULT 'X', p_dn AS CHECKBOX DEFAULT 'X', p_in AS CHECKBOX DEFAULT 'X'. SELECTION-SCREEN END OF BLOCK select. ************************************************************************ * 初始化事件 * ************************************************************************ INITIALIZATION. ************************************************************************ * 选择屏幕事件 * ************************************************************************ AT SELECTION-SCREEN. ************************************************************************ * START-OF-SELECTION * ************************************************************************ START-OF-SELECTION. PERFORM frm_getdata. PERFORM frm_dealdata. ************************************************************************ * END-OF-SELECTION * ************************************************************************ END-OF-SELECTION. * using alv to display report PERFORM frm_alv. *&---------------------------------------------------------------------* *& Form FRM_GETDATA *&---------------------------------------------------------------------* * 功能描述:按指定条件从数据库表中取出数据,并传入相应的内表或工作区 *----------------------------------------------------------------------* * 入口参数:无 * 出口参数:无 *----------------------------------------------------------------------* FORM frm_getdata . DATA:lt_vkdfs TYPE TABLE OF vkdfs, ls_vkdfs TYPE vkdfs. DATA:lt_vkdfs1 TYPE TABLE OF vkdfs, ls_vkdfs1 TYPE vkdfs. DATA:lt_vkdfs2 TYPE TABLE OF vkdfs, "交货单开票用 ls_vkdfs2 TYPE vkdfs. DATA:lt_vkdfs3 TYPE TABLE OF vkdfs, "公司间开票用 ls_vkdfs3 TYPE vkdfs. DATA:lt_kna1 TYPE TABLE OF kna1, ls_kna1 TYPE kna1, lt_kna12 TYPE TABLE OF kna1, lt_kna13 TYPE TABLE OF kna1, lt_kna14 TYPE TABLE OF kna1. DATA:lt_knvp TYPE TABLE OF knvp, ls_knvp TYPE knvp. DATA:lt_knb1 TYPE TABLE OF knb1, ls_knb1 TYPE knb1. DATA: * LT_LIKP type table of LIKP, * LS_LIKP type LIKP, lt_lips TYPE TABLE OF lips, ls_lips TYPE lips, lt_lips3 TYPE TABLE OF lips, ls_lips3 TYPE lips, lt_vbak TYPE TABLE OF vbak, ls_vbak TYPE vbak, lt_vbap TYPE TABLE OF vbap, ls_vbap TYPE vbap. DATA: lt_prcd_elements TYPE TABLE OF prcd_elements, ls_prcd_elements TYPE prcd_elements. DATA:lt_vbak1 TYPE TABLE OF vbak, ls_vbak1 TYPE vbak, lt_vbap1 TYPE TABLE OF vbap, ls_vbap1 TYPE vbap. DATA:lt_ekko3 TYPE TABLE OF ekko, ls_ekko3 TYPE ekko, lt_ekpo3 TYPE TABLE OF ekpo, ls_ekpo3 TYPE ekpo. DATA: lt_prcd_elements1 TYPE TABLE OF prcd_elements, ls_prcd_elements1 TYPE prcd_elements. DATA: lt_prcd_elements3 TYPE TABLE OF prcd_elements, ls_prcd_elements3 TYPE prcd_elements. DATA:lt_tvakt TYPE TABLE OF tvakt, ls_tvakt TYPE tvakt. DATA:lt_t161t TYPE TABLE OF t161t, ls_t161t TYPE t161t. DATA:lt_tvakt1 TYPE TABLE OF tvakt, ls_tvakt1 TYPE tvakt. DATA:lt_vbkd TYPE TABLE OF vbkd, ls_vbkd TYPE vbkd. DATA:lt_mara TYPE TABLE OF mara, ls_mara TYPE mara, lt_t134t TYPE TABLE OF t134t, ls_t134t TYPE t134t, lt_makt TYPE TABLE OF makt, ls_makt TYPE makt, lt_zfit001 TYPE TABLE OF zfit001, ls_zfit001 TYPE zfit001. DATA:lt_zfit013 TYPE TABLE OF zfit013, ls_zfit013 TYPE zfit013. IF p_so = 'X'. "如果勾选销售订单,取VKDPS表信息,出具发票类别FKTYP = A(与订单相关的出具发票凭证) SELECT * INTO TABLE lt_vkdfs1 FROM vkdfs WHERE fkart IN s_fkart"开票类型 AND fkdat IN s_fkdat "出具发票日期 AND vbeln IN s_vgbel"销售订单 AND vkorg = p_vkorg"销售组织 AND vtweg IN s_vtweg"分销渠道 AND spart IN s_spart"产品组 AND vstel IN s_vstel "装运地点 AND kunnr IN s_kunnr AND fktyp = 'A'. IF lt_vkdfs1[] IS NOT INITIAL. "如果不为空,表示针对销售订单有开票,取销售订单凭证类型和条件号等信息 SELECT vbeln auart "销售凭证类型 knumv "条件号 vbtyp "销售和分销凭证类别(长) INTO CORRESPONDING FIELDS OF TABLE lt_vbak FROM vbak FOR ALL ENTRIES IN lt_vkdfs1 WHERE vbeln = lt_vkdfs1-vbeln. " 取没有完全开票的销售订单行项目 的物料、数量、款项项目等信息 SELECT vbeln posnr matnr zmeng AS kwmeng "目标数量(采用销售单位) vrkme"以销售单位表示的累计订购数量 vertn " 款项项目 INTO CORRESPONDING FIELDS OF TABLE lt_vbap FROM vbap FOR ALL ENTRIES IN lt_vkdfs1 WHERE vbeln = lt_vkdfs1-vbeln AND fksaa <> 'C' "销售订单行项目没有完全开票 AND fksaa <> ''. "如果销售订单不为空,取凭证类型文本 IF lt_vbak[] IS NOT INITIAL. SELECT * INTO TABLE lt_tvakt FROM tvakt FOR ALL ENTRIES IN lt_vbak WHERE auart = lt_vbak-auart AND spras = 1. "按销售订单的条件号取价格 SELECT client knumv kposn stunr zaehk kappl kschl kbetr kpein INTO CORRESPONDING FIELDS OF TABLE lt_prcd_elements FROM prcd_elements FOR ALL ENTRIES IN lt_vbak WHERE knumv = lt_vbak-knumv. ENDIF. ENDIF. ENDIF. "如果勾选交货单,取VKDFS表中数据,FKTYP = L(交货-相关的出具发票凭证) IF p_dn = 'X' . SELECT * INTO TABLE lt_vkdfs2 FROM vkdfs WHERE fkart IN s_fkart AND fkdat IN s_fkdat AND vbeln IN s_vbeln AND vkorg = p_vkorg AND vtweg IN s_vtweg AND spart IN s_spart AND vstel IN s_vstel AND kunnr IN s_kunnr AND ( fktyp = 'L' ). ENDIF. "取公司间数据 IF p_in = 'X'. SELECT * INTO TABLE lt_vkdfs3 FROM vkdfs WHERE fkart IN s_fkart AND fkdat IN s_fkdat AND vbeln IN s_vbeln AND vkorg = p_vkorg AND vtweg IN s_vtweg AND spart IN s_spart AND vstel IN s_vstel AND kunnr IN s_kunnr AND ( fktyp = 'I' ). ENDIF. "如果交货单有发票数据 IF lt_vkdfs2[] IS NOT INITIAL. * select * into table LT_LIKP from LIKP * for all entries in LT_VKDFS2 * where VBELN = LT_VKDFS2-VBELN. "取交货单明细行的数据 SELECT vbeln posnr vgbel vgpos lgmng"以仓库保管单位级的实际交货数量 INTO CORRESPONDING FIELDS OF TABLE lt_lips FROM lips FOR ALL ENTRIES IN lt_vkdfs2 WHERE vbeln = lt_vkdfs2-vbeln AND vgbel IN s_vgbel AND fksta <> 'C' AND fksta <> '' AND lgmng <> 0. "如果有交货数据,取销售订单的条件号 IF lt_lips[] IS NOT INITIAL. SELECT vbeln auart knumv vbtyp INTO CORRESPONDING FIELDS OF TABLE lt_vbak1 FROM vbak FOR ALL ENTRIES IN lt_lips WHERE vbeln = lt_lips-vgbel. SELECT vbeln posnr matnr kwmeng vrkme vertn INTO CORRESPONDING FIELDS OF TABLE lt_vbap1 FROM vbap FOR ALL ENTRIES IN lt_lips WHERE vbeln = lt_lips-vgbel. IF lt_vbak1[] IS NOT INITIAL. SELECT * INTO TABLE lt_tvakt1 FROM tvakt FOR ALL ENTRIES IN lt_vbak1 WHERE auart = lt_vbak1-auart AND spras = 1. SELECT client knumv kposn stunr zaehk kappl kschl kbetr kpein INTO CORRESPONDING FIELDS OF TABLE lt_prcd_elements1 FROM prcd_elements FOR ALL ENTRIES IN lt_vbak1 WHERE knumv = lt_vbak1-knumv. ENDIF. ENDIF. ENDIF. IF lt_vkdfs3[] IS NOT INITIAL. SELECT vbeln posnr vgbel vgpos lgmng INTO CORRESPONDING FIELDS OF TABLE lt_lips3 FROM lips FOR ALL ENTRIES IN lt_vkdfs3 WHERE vbeln = lt_vkdfs3-vbeln AND vgbel IN s_vgbel AND fkivp <> 'C' AND fkivp <> '' AND lgmng <> 0. "公司间开票数据 IF lt_lips3[] IS NOT INITIAL. SELECT ebeln bsart knumv INTO CORRESPONDING FIELDS OF TABLE lt_ekko3 FROM ekko FOR ALL ENTRIES IN lt_lips3 WHERE ebeln = lt_lips3-vgbel. SELECT ebeln ebelp matnr menge meins INTO CORRESPONDING FIELDS OF TABLE lt_ekpo3 FROM ekpo FOR ALL ENTRIES IN lt_lips WHERE ebeln = lt_lips-vgbel. IF lt_ekko3[] IS NOT INITIAL. SELECT * INTO TABLE lt_t161t FROM t161t FOR ALL ENTRIES IN lt_ekko3 WHERE bsart = lt_ekko3-bsart AND spras = 1. SELECT client knumv kposn stunr zaehk kappl kschl kbetr kpein INTO CORRESPONDING FIELDS OF TABLE lt_prcd_elements3 FROM prcd_elements FOR ALL ENTRIES IN lt_ekko3 WHERE knumv = lt_ekko3-knumv. ENDIF. ENDIF. ENDIF. APPEND LINES OF lt_vkdfs1 TO lt_vkdfs. APPEND LINES OF lt_vkdfs2 TO lt_vkdfs. APPEND LINES OF lt_vkdfs3 TO lt_vkdfs. IF lt_vkdfs[] IS NOT INITIAL. SELECT kunnr name1 name2 INTO CORRESPONDING FIELDS OF TABLE lt_kna1 FROM kna1 FOR ALL ENTRIES IN lt_vkdfs WHERE kunnr = lt_vkdfs-kunnr. SELECT * INTO TABLE lt_knvp FROM knvp FOR ALL ENTRIES IN lt_vkdfs WHERE kunnr = lt_vkdfs-kunnr AND vkorg = lt_vkdfs-vkorg AND vtweg = lt_vkdfs-vtweg AND spart = lt_vkdfs-spart AND parvw = 'RG'. IF lt_knvp[] IS NOT INITIAL. SELECT kunnr name1 name2 INTO CORRESPONDING FIELDS OF TABLE lt_kna13 FROM kna1 FOR ALL ENTRIES IN lt_knvp WHERE kunnr = lt_knvp-kunn2. ENDIF. SELECT kunnr bukrs knrze INTO CORRESPONDING FIELDS OF TABLE lt_knb1 FROM knb1 FOR ALL ENTRIES IN lt_vkdfs WHERE kunnr = lt_vkdfs-kunnr AND bukrs = lt_vkdfs-vkorg. IF lt_knb1[] IS NOT INITIAL. SELECT kunnr name1 name2 INTO CORRESPONDING FIELDS OF TABLE lt_kna14 FROM kna1 FOR ALL ENTRIES IN lt_knb1 WHERE kunnr = lt_knb1-knrze. ENDIF. ENDIF. "so "MODIFY BY XY 04.03.2017 10:09:13 SORT lt_vbak BY vbeln. SORT lt_kna1 BY kunnr. SORT lt_knvp BY kunnr vkorg vtweg spart. SORT lt_kna13 BY kunnr. SORT lt_knb1 BY bukrs kunnr. SORT lt_kna14 BY kunnr. SORT lt_tvakt BY auart. SORT lt_prcd_elements BY knumv kposn kschl. SORT lt_vbak1 BY vbeln. SORT lt_vbap1 BY vbeln posnr. SORT lt_tvakt1 BY auart. SORT lt_prcd_elements1 BY knumv kposn kschl. "MODIFY ENDED BY XY 04.03.2017 10:09:13 LOOP AT lt_vkdfs1 INTO ls_vkdfs1. LOOP AT lt_vbap INTO ls_vbap WHERE vbeln = ls_vkdfs1-vbeln. CLEAR ls_vbak. READ TABLE lt_vbak INTO ls_vbak WITH KEY vbeln = ls_vbap-vbeln BINARY SEARCH. CLEAR ls_kna1. READ TABLE lt_kna1 INTO ls_kna1 WITH KEY kunnr = ls_vkdfs1-kunnr BINARY SEARCH. CLEAR ls_kna1. READ TABLE lt_knvp INTO ls_knvp WITH KEY kunnr = ls_vkdfs1-kunnr vkorg = ls_vkdfs1-vkorg vtweg = ls_vkdfs1-vtweg spart = ls_vkdfs1-spart BINARY SEARCH. CLEAR gs_out. gs_out-vkorg = ls_vkdfs1-vkorg."销售组织 gs_out-vtweg = ls_vkdfs1-vtweg."分销渠道 gs_out-spart = ls_vkdfs1-spart."产品组 gs_out-kunnr = ls_vkdfs1-kunnr."客户 CONCATENATE ls_kna1-name1 ls_kna1-name2 INTO gs_out-name1."受达方名称 gs_out-kunn2 = ls_knvp-kunn2."付款方编号 CLEAR ls_kna1. READ TABLE lt_kna13 INTO ls_kna1 WITH KEY kunnr = ls_knvp-kunn2 BINARY SEARCH. CONCATENATE ls_kna1-name1 ls_kna1-name2 INTO gs_out-name2."受达方名称 CLEAR ls_knb1. READ TABLE lt_knb1 INTO ls_knb1 WITH KEY bukrs = ls_vkdfs1-vkorg kunnr = ls_vkdfs1-kunnr BINARY SEARCH. gs_out-knrze = ls_knb1-knrze."总部编号 CLEAR ls_kna1. READ TABLE lt_kna14 INTO ls_kna1 WITH KEY kunnr = ls_knb1-knrze BINARY SEARCH. CONCATENATE ls_kna1-name1 ls_kna1-name2 INTO gs_out-name3."总部描述 gs_out-fktyp = ls_vkdfs1-fktyp."出具发票类别 gs_out-ftext = '与订单相关的出具发票凭证'. * VBELN type VBELN,"发货单号 * POSNR type POSNR,"发货打行项目 gs_out-fkdat = ls_vkdfs1-fkdat."出具发票日期 gs_out-auart = ls_vbak-auart."凭证类型 gs_out-knumv = ls_vbak-knumv. CLEAR ls_tvakt. READ TABLE lt_tvakt INTO ls_tvakt WITH KEY auart = ls_vbak-auart BINARY SEARCH. gs_out-bezei = ls_tvakt-bezei."凭证类型描述 gs_out-fkart = ls_vkdfs1-fkart."开票类型 gs_out-vgbel = ls_vbap-vbeln."销售订单号 gs_out-vgpos = ls_vbap-posnr."销售订单行号 * GS_OUT-MTART = MARA-MTART,"物料类型 * MTBEZ type T134T-MTBEZ,"物料类型描述 gs_out-matnr = ls_vbap-matnr."物料编码 * MAKTX type MAKTX,"物料描述 gs_out-kwmeng = ls_vbap-kwmeng."数量 IF ls_vbak-vbtyp = 'K' OR ls_vbak-vbtyp = 'H'. gs_out-kwmeng = gs_out-kwmeng * -1. ENDIF. gs_out-meins = ls_vbap-vrkme."单位 gs_out-vertn = ls_vbap-vertn."活动项目 * ZPROJ type ZFIT001-ZPROJ,"活动项目描述 * XFLAG type C,"票折计算标识 * ZDISCOUNT type C,"票折行 CLEAR ls_prcd_elements. READ TABLE lt_prcd_elements INTO ls_prcd_elements WITH KEY knumv = ls_vbak-knumv kposn = ls_vbap-posnr kschl = 'ZPR1' BINARY SEARCH. gs_out-kbetr = ls_prcd_elements-kbetr / ls_prcd_elements-kpein."零售价 gs_out-akbetr = gs_out-kbetr * gs_out-kwmeng. "零售金额 READ TABLE lt_prcd_elements INTO ls_prcd_elements WITH KEY knumv = ls_vbak-knumv kposn = ls_vbap-posnr kschl = 'ZPR3'. gs_out-vkbetr = ls_prcd_elements-kbetr / ls_prcd_elements-kpein.""订单价 gs_out-avkbetr = gs_out-vkbetr * gs_out-kwmeng. "订单金额 * PZQDJ type KBETR,"票折前单价 * PZQJE type KBETR,"票折前金额 * PZHJE type KBETR,"票折后金额 * PZHDJ type KBETR,"票折后单价 * PZHJEFS type KBETR,"票折后金额(反算) * PZZK type KBETR,"票折折扣 APPEND gs_out TO gt_out. * clear GS_K_AKBETR. * move-corresponding GS_OUT to GS_K_AKBETR. * collect GS_K_AKBETR into GT_K_AKBETR. ENDLOOP. ENDLOOP. "交货单 LOOP AT lt_vkdfs2 INTO ls_vkdfs1. LOOP AT lt_lips INTO ls_lips WHERE vbeln = ls_vkdfs1-vbeln. * clear LS_LIKP. * read table LT_LIKP into LS_LIKP with key VBELN = LS_LIPS-VBELN. CLEAR ls_vbak. READ TABLE lt_vbak1 INTO ls_vbak WITH KEY vbeln = ls_lips-vgbel BINARY SEARCH. CLEAR ls_vbap. READ TABLE lt_vbap1 INTO ls_vbap WITH KEY vbeln = ls_lips-vgbel posnr = ls_lips-vgpos BINARY SEARCH. CLEAR ls_kna1. READ TABLE lt_kna1 INTO ls_kna1 WITH KEY kunnr = ls_vkdfs1-kunnr BINARY SEARCH. CLEAR ls_knvp. READ TABLE lt_knvp INTO ls_knvp WITH KEY kunnr = ls_vkdfs1-kunnr vkorg = ls_vkdfs1-vkorg vtweg = ls_vkdfs1-vtweg spart = ls_vkdfs1-spart BINARY SEARCH. CLEAR gs_out. gs_out-vkorg = ls_vkdfs1-vkorg."销售组织 gs_out-vtweg = ls_vkdfs1-vtweg."分销渠道 gs_out-spart = ls_vkdfs1-spart."产品组 gs_out-kunnr = ls_vkdfs1-kunnr."客户 CONCATENATE ls_kna1-name1 ls_kna1-name2 INTO gs_out-name1."受达方名称 gs_out-kunn2 = ls_knvp-kunn2."付款方编号 CLEAR ls_kna1. READ TABLE lt_kna13 INTO ls_kna1 WITH KEY kunnr = ls_knvp-kunn2 BINARY SEARCH. CONCATENATE ls_kna1-name1 ls_kna1-name2 INTO gs_out-name2."受达方名称 CLEAR ls_knb1. READ TABLE lt_knb1 INTO ls_knb1 WITH KEY bukrs = ls_vkdfs1-vkorg kunnr = ls_vkdfs1-kunnr BINARY SEARCH. gs_out-knrze = ls_knb1-knrze."总部编号 CLEAR ls_kna1. READ TABLE lt_kna14 INTO ls_kna1 WITH KEY kunnr = ls_knb1-knrze BINARY SEARCH. CONCATENATE ls_kna1-name1 ls_kna1-name2 INTO gs_out-name3."总部描述 gs_out-fktyp = ls_vkdfs1-fktyp."出具发票类别 gs_out-ftext = '交货-相关的出具发票凭证'. gs_out-vbeln = ls_lips-vbeln."发货单号 gs_out-posnr = ls_lips-posnr."发货打行项目 gs_out-fkdat = ls_vkdfs1-fkdat."出具发票日期 gs_out-auart = ls_vbak-auart."凭证类型 gs_out-knumv = ls_vbak-knumv. CLEAR ls_tvakt. READ TABLE lt_tvakt1 INTO ls_tvakt WITH KEY auart = ls_vbak-auart BINARY SEARCH. gs_out-bezei = ls_tvakt-bezei."凭证类型描述 gs_out-fkart = ls_vkdfs1-fkart."开票类型 gs_out-vgbel = ls_vbap-vbeln."销售订单号 gs_out-vgpos = ls_vbap-posnr."销售订单行号 * GS_OUT-MTART = MARA-MTART,"物料类型 * MTBEZ type T134T-MTBEZ,"物料类型描述 gs_out-matnr = ls_vbap-matnr."物料编码 * MAKTX type MAKTX,"物料描述 gs_out-kwmeng = ls_lips-lgmng."数量 IF ls_vbak-vbtyp = 'K' OR ls_vbak-vbtyp = 'H'. gs_out-kwmeng = gs_out-kwmeng * -1. ENDIF. gs_out-meins = ls_vbap-vrkme."单位 gs_out-vertn = ls_vbap-vertn."活动项目 * ZPROJ type ZFIT001-ZPROJ,"活动项目描述 * XFLAG type C,"票折计算标识 * ZDISCOUNT type C,"票折行 CLEAR ls_prcd_elements. READ TABLE lt_prcd_elements1 INTO ls_prcd_elements WITH KEY knumv = ls_vbak-knumv kposn = ls_vbap-posnr kschl = 'ZPR1' BINARY SEARCH. gs_out-kbetr = ls_prcd_elements-kbetr / ls_prcd_elements-kpein."零售价 gs_out-akbetr = ls_prcd_elements-kbetr / ls_prcd_elements-kpein * gs_out-kwmeng. "零售金额 CLEAR ls_prcd_elements. READ TABLE lt_prcd_elements1 INTO ls_prcd_elements WITH KEY knumv = ls_vbak-knumv kposn = ls_vbap-posnr kschl = 'ZPR3' BINARY SEARCH. gs_out-vkbetr = ls_prcd_elements-kbetr / ls_prcd_elements-kpein.""订单价 gs_out-avkbetr = ls_prcd_elements-kbetr / ls_prcd_elements-kpein * gs_out-kwmeng. "订单金额 * PZQDJ type KBETR,"票折前单价 * PZQJE type KBETR,"票折前金额 * PZHJE type KBETR,"票折后金额 * PZHDJ type KBETR,"票折后单价 * PZHJEFS type KBETR,"票折后金额(反算) * PZZK type KBETR,"票折折扣 APPEND gs_out TO gt_out. * clear GS_K_AKBETR. * move-corresponding GS_OUT to GS_K_AKBETR. * collect GS_K_AKBETR into GT_K_AKBETR. ENDLOOP. ENDLOOP. "公司间 begin LOOP AT lt_vkdfs3 INTO ls_vkdfs1. LOOP AT lt_lips3 INTO ls_lips WHERE vbeln = ls_vkdfs1-vbeln. CLEAR ls_ekko3. READ TABLE lt_ekko3 INTO ls_ekko3 WITH KEY ebeln = ls_lips-vgbel. CLEAR ls_ekpo3. READ TABLE lt_ekpo3 INTO ls_ekpo3 WITH KEY ebeln = ls_lips-vgbel ebelp = ls_lips-vgpos. CLEAR ls_kna1. READ TABLE lt_kna1 INTO ls_kna1 WITH KEY kunnr = ls_vkdfs1-kunnr. CLEAR ls_knvp. READ TABLE lt_knvp INTO ls_knvp WITH KEY kunnr = ls_vkdfs1-kunnr vkorg = ls_vkdfs1-vkorg vtweg = ls_vkdfs1-vtweg spart = ls_vkdfs1-spart. CLEAR gs_out. gs_out-vkorg = ls_vkdfs1-vkorg."销售组织 gs_out-vtweg = ls_vkdfs1-vtweg."分销渠道 gs_out-spart = ls_vkdfs1-spart."产品组 gs_out-kunnr = ls_vkdfs1-kunnr."客户 CONCATENATE ls_kna1-name1 ls_kna1-name2 INTO gs_out-name1."受达方名称 gs_out-kunn2 = ls_knvp-kunn2."付款方编号 CLEAR ls_kna1. READ TABLE lt_kna13 INTO ls_kna1 WITH KEY kunnr = ls_knvp-kunn2. CONCATENATE ls_kna1-name1 ls_kna1-name2 INTO gs_out-name2."受达方名称 CLEAR ls_knb1. READ TABLE lt_knb1 INTO ls_knb1 WITH KEY bukrs = ls_vkdfs1-vkorg kunnr = ls_vkdfs1-kunnr. gs_out-knrze = ls_knb1-knrze."总部编号 CLEAR ls_kna1. READ TABLE lt_kna14 INTO ls_kna1 WITH KEY kunnr = ls_knb1-knrze. CONCATENATE ls_kna1-name1 ls_kna1-name2 INTO gs_out-name3."总部描述 gs_out-fktyp = ls_vkdfs1-fktyp."出具发票类别 gs_out-ftext = '公司间交货-相关的出具发票凭证'. gs_out-vbeln = ls_lips-vbeln."发货单号 gs_out-posnr = ls_lips-posnr."发货打行项目 gs_out-fkdat = ls_vkdfs1-fkdat."出具发票日期 gs_out-auart = ls_ekko3-bsart."凭证类型 gs_out-knumv = ls_ekko3-knumv. CLEAR ls_t161t. READ TABLE lt_t161t INTO ls_t161t WITH KEY bsart = ls_ekko3-bsart. gs_out-bezei = ls_t161t-batxt."凭证类型描述 gs_out-fkart = ls_vkdfs1-fkart."开票类型 gs_out-vgbel = ls_lips-vgbel."销售订单号 gs_out-vgpos = ls_lips-vgpos."销售订单行号 * GS_OUT-MTART = MARA-MTART,"物料类型 * MTBEZ type T134T-MTBEZ,"物料类型描述 gs_out-matnr = ls_ekpo3-matnr."物料编码 * MAKTX type MAKTX,"物料描述 gs_out-kwmeng = ls_lips-lgmng."数量 gs_out-meins = ls_ekpo3-meins."单位 * GS_OUT-VERTN = LS_VBAP-VERTN."活动项目 * ZPROJ type ZFIT001-ZPROJ,"活动项目描述 * XFLAG type C,"票折计算标识 * ZDISCOUNT type C,"票折行 CLEAR ls_prcd_elements. READ TABLE lt_prcd_elements3 INTO ls_prcd_elements WITH KEY knumv = ls_ekko3-knumv kposn = ls_ekpo3-ebelp kschl = 'ZPR1'. gs_out-kbetr = ls_prcd_elements-kbetr / ls_prcd_elements-kpein."零售价 gs_out-akbetr = ls_prcd_elements-kbetr / ls_prcd_elements-kpein * gs_out-kwmeng. "零售金额 CLEAR ls_prcd_elements. READ TABLE lt_prcd_elements3 INTO ls_prcd_elements WITH KEY knumv = ls_ekko3-knumv kposn = ls_ekpo3-ebelp kschl = 'PB00'. gs_out-vkbetr = ls_prcd_elements-kbetr / ls_prcd_elements-kpein.""订单价 gs_out-avkbetr = ls_prcd_elements-kbetr / ls_prcd_elements-kpein * gs_out-kwmeng. "订单金额 * PZQDJ type KBETR,"票折前单价 * PZQJE type KBETR,"票折前金额 * PZHJE type KBETR,"票折后金额 * PZHDJ type KBETR,"票折后单价 * PZHJEFS type KBETR,"票折后金额(反算) * PZZK type KBETR,"票折折扣 APPEND gs_out TO gt_out. * clear GS_K_AKBETR. * move-corresponding GS_OUT to GS_K_AKBETR. * collect GS_K_AKBETR into GT_K_AKBETR. ENDLOOP. ENDLOOP. "公司间 end IF gt_out[] IS NOT INITIAL. SELECT matnr mtart INTO CORRESPONDING FIELDS OF TABLE lt_mara FROM mara FOR ALL ENTRIES IN gt_out WHERE matnr = gt_out-matnr. SELECT matnr maktx INTO CORRESPONDING FIELDS OF TABLE lt_makt FROM makt FOR ALL ENTRIES IN gt_out WHERE matnr = gt_out-matnr AND spras = 1. IF lt_mara[] IS NOT INITIAL. SELECT mtart mtbez INTO CORRESPONDING FIELDS OF TABLE lt_t134t FROM t134t FOR ALL ENTRIES IN lt_mara WHERE mtart = lt_mara-mtart AND spras = 1. ENDIF. SELECT * INTO TABLE lt_zfit001 FROM zfit001 FOR ALL ENTRIES IN gt_out WHERE zproj_code = gt_out-vertn. SELECT vbeln posnr zterm INTO CORRESPONDING FIELDS OF TABLE lt_vbkd FROM vbkd FOR ALL ENTRIES IN gt_out WHERE vbeln = gt_out-vgbel. ENDIF. SELECT * INTO TABLE lt_zfit013 FROM zfit013. LOOP AT gt_out ASSIGNING <fs_out>. CLEAR ls_mara. READ TABLE lt_mara INTO ls_mara WITH KEY matnr = <fs_out>-matnr. CLEAR ls_makt. READ TABLE lt_makt INTO ls_makt WITH KEY matnr = <fs_out>-matnr. CLEAR ls_t134t. READ TABLE lt_t134t INTO ls_t134t WITH KEY mtart = ls_mara-mtart. CLEAR ls_zfit001. READ TABLE lt_zfit001 INTO ls_zfit001 WITH KEY zproj_code = <fs_out>-vertn. CLEAR ls_vbkd. READ TABLE lt_vbkd INTO ls_vbkd WITH KEY vbeln = <fs_out>-vbeln. <fs_out>-zterm = ls_vbkd-zterm. IF <fs_out>-knrze IS INITIAL. <fs_out>-knrze = <fs_out>-kunnr. <fs_out>-name3 = <fs_out>-name1. ENDIF. <fs_out>-mtart = ls_mara-mtart. <fs_out>-maktx = ls_makt-maktx. <fs_out>-mtbez = ls_t134t-mtbez. <fs_out>-zproj = ls_zfit001-zproj."活动项目描述 READ TABLE lt_zfit013 INTO ls_zfit013 WITH KEY fktyp = <fs_out>-fktyp mtart = <fs_out>-mtart. IF sy-subrc EQ 0. <fs_out>-xflag = 'X'."票折计算标识 物料类型与出具发票类别在票折范围自建表,设置X ENDIF. <fs_out>-zdiscount = ls_zfit001-zdiscount."票折行 IF <fs_out>-xflag = 'X' AND <fs_out>-zdiscount = 'X'. ELSE. * PZQDJ type KBETR,"票折前单价 * PZQJE type KBETR,"票折前金额 <fs_out>-pzqdj = <fs_out>-vkbetr. <fs_out>-pzqje = <fs_out>-avkbetr. "ADD BY XY 20170302 <fs_out>-pzhdj = <fs_out>-pzqdj. "ADD ENDED ENDIF. IF <fs_out>-xflag = 'X'. CLEAR gs_k_akbetr. * move-corresponding <FS_OUT> to GS_K_AKBETR. CLEAR gs_k_akbetr. gs_k_akbetr-kunnr = <fs_out>-kunnr. gs_k_akbetr-pzqje = <fs_out>-pzqje. gs_k_akbetr-akbetr = <fs_out>-akbetr. COLLECT gs_k_akbetr INTO gt_k_akbetr. ENDIF. ENDLOOP. LOOP AT gt_out ASSIGNING <fs_out>. *1、票折计算标识=X,按客户,根据零售金额比例分摊票折前金额,保留两位小数: *票折后金额=(该行零售金额/按客户合计的零售金额)*按客户合计的票折前金额 *2、票折计算标识<>X,票折后金额=票折前金额 CLEAR gs_k_akbetr. READ TABLE gt_k_akbetr INTO gs_k_akbetr WITH KEY kunnr = <fs_out>-kunnr. IF <fs_out>-xflag = 'X'. * PZHJE type KBETR,"票折后金额 * PZHDJ type KBETR,"票折后单价 IF gs_k_akbetr-akbetr NE 0. <fs_out>-pzhje = <fs_out>-akbetr / gs_k_akbetr-akbetr * gs_k_akbetr-pzqje. ENDIF. ELSE. <fs_out>-pzhje = <fs_out>-pzqje. ENDIF. IF <fs_out>-kwmeng NE 0. IF <fs_out>-xflag = 'X' AND <fs_out>-zdiscount = 'X'. <fs_out>-pzhdj = <fs_out>-pzhje / <fs_out>-kwmeng. ENDIF. ENDIF. <fs_out>-pzhjefs = <fs_out>-pzhdj * <fs_out>-kwmeng. IF <fs_out>-avkbetr NE 0. <fs_out>-pzzk = <fs_out>-pzhje / <fs_out>-avkbetr * 100."票折折扣 ENDIF. IF <fs_out>-xflag = 'X'. CLEAR gs_k_akbetr. gs_k_akbetr-kunnr = <fs_out>-kunnr. gs_k_akbetr-pzhjefs = <fs_out>-pzhjefs. COLLECT gs_k_akbetr INTO gt_k_akbetr. ENDIF. ENDLOOP. LOOP AT gt_k_akbetr INTO gs_k_akbetr. IF gs_k_akbetr-pzqje NE gs_k_akbetr-pzhjefs . LOOP AT gt_out ASSIGNING <fs_out> WHERE kunnr = gs_k_akbetr-kunnr AND xflag = 'X' AND zdiscount = 'X'. <fs_out>-wc = gs_k_akbetr-pzqje - gs_k_akbetr-pzhjefs. EXIT. ENDLOOP. ENDIF. ENDLOOP. ENDFORM. " FRM_GETDATA *&---------------------------------------------------------------------* *& Form FRM_DEALDATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_dealdata . ENDFORM. " FRM_DEALDATA *&---------------------------------------------------------------------* *& Form FRM_ALV *&---------------------------------------------------------------------* * 功能描述:ALV显示子程序 *----------------------------------------------------------------------* * 入口参数:无 * 出口参数:无 *----------------------------------------------------------------------* FORM frm_alv . PERFORM frm_fieldcat. PERFORM frm_layout. PERFORM frm_output. ENDFORM. " FRM_ALV *&---------------------------------------------------------------------* *& Form FRM_FIELDCAT *&---------------------------------------------------------------------* * 功能描述:显示ALV列的标题、列宽、CHECKBOX *----------------------------------------------------------------------* * 入口参数:无 * 出口参数:无 *----------------------------------------------------------------------* FORM frm_fieldcat . PERFORM frm_disp TABLES it_fieldcat USING: 'VKORG' '销售组织' '' '' '' '', 'KUNNR' '客户' '' '' '' '', 'NAME1' '售达方名称' '' '' '' '', 'KUNN2' '付款方编号' '' '' '' '', 'NAME2' '付款方名称' '' '' '' '', 'KNRZE' '总部编号' '' '' '' '', 'NAME3' '总部描述' '' '' '' '', 'FKTYP' '出具发票类别' '' '' '' '', 'FTEXT' '出具发票类别描述' '' '' '' '', 'VBELN' '发货单号' '' '' '' '', 'POSNR' '发货单行项目' '' '' '' '', 'FKDAT' '出具发票日期' '' '' '' '', 'AUART' '凭证类型' '' '' '' '', 'BEZEI' '凭证类型描述' '' '' '' '', 'FKART' '开票类型' '' '' '' '', 'VGBEL' 'SO/PO号' '' '' '' '', 'VGPOS' 'SO/PO行号' '' '' '' '', 'MTART' '物料类型' '' '' '' '', 'MTBEZ' '物料类型描述' '' '' '' '', 'MATNR' '物料编码' '' '' '' '', 'MAKTX' '物料描述' '' '' '' '', 'KWMENG' '数量' '' '' '' '', 'MEINS' '单位' '' '' '' '', 'VERTN' '活动项目' '' '' '' '', 'ZPROJ' '活动项目描述' '' '' '' '', 'XFLAG' '票折计算标识' '' '' '' '', 'ZDISCOUNT' '票折行' '' '' '' 'X', 'KBETR' '零售价' '' '' '' '', 'AKBETR' '零售金额' '' '' '' '', 'VKBETR' '订单价' '' '' '' '', 'AVKBETR' '订单价金额' '' '' '' '', 'PZQDJ' '票折前单价' '' '' '' '', 'PZQJE' '票折前金额' '' '' '' '', 'PZHJE' '票折后金额' '' '' '' '', 'PZHDJ' '票折后单价' '' '' '' '', 'PZHJEFS' '票折后金额(反算)' '' '' '' '', 'PZZK' '票折折扣(%)' '' '' '' '', 'WC' '尾差' '' '' '' '', 'STATU' '状态' '' '' '' '', 'TYPE' '状态' '' '' '' '', 'MSG' '消息' '' '' '' '', 'BILLDATE' '开票日期' '' 'ERDAT' 'VBAK' 'X', 'BILL' '发票号' '' '' '' '', 'BILLMSG' '开票消息' '' '' '' ''. ENDFORM. " FRM_FIELDCAT *&--------------------------------------------------------------------- *& Form FRM_FIELD_DISP *&---------------------------------------------------------------------* * 功能描述:通过传入字段名、字段名的相应描述,得到ALV视图的列标题 *----------------------------------------------------------------------* * 入口参数:大写字段名、字段名的描述,列的宽度,参考的系统表字段名,参考 * 的系统表名(不需要的参数传为空)。 * 出口参数:无 *----------------------------------------------------------------------* FORM frm_disp TABLES it_fieldcat TYPE slis_t_fieldcat_alv USING fu_name TYPE slis_fieldcat_alv-fieldname" 自定义数据库表字段 fu_disp TYPE slis_fieldcat_alv-seltext_l" 字段描述 * fu_colwidth TYPE slis_fieldcat_alv-outputlen" 输出列的宽度 fu_nozero TYPE slis_fieldcat_alv-no_zero" 是否显示前导零 fu_refname TYPE slis_fieldcat_alv-ref_fieldname" 参考的系统表字段 fu_reftab TYPE slis_fieldcat_alv-ref_tabname" 参考的系统表 fu_edit TYPE slis_fieldcat_alv-edit. "形参类型与slis_fieldcat_alv中相应字段名的类型保持一致 DATA: lw_fieldcat TYPE slis_fieldcat_alv. CLEAR lw_fieldcat. lw_fieldcat-fieldname = fu_name. " 自定义数据库表字段 lw_fieldcat-ref_fieldname = fu_refname. " 参考的系统表字段 lw_fieldcat-ref_tabname = fu_reftab. " 参考的系统表 lw_fieldcat-seltext_l = fu_disp. " 字段描述 * lw_fieldcat-outputlen = fu_colwidth. " 输出列的宽度 lw_fieldcat-no_zero = fu_nozero. " 是否显示前导零 lw_fieldcat-edit = fu_edit. lw_fieldcat-icon = 'X'. "-icon = 'X'. "图标功能 APPEND lw_fieldcat TO it_fieldcat. ENDFORM. " FRM_DISP *&---------------------------------------------------------------------* *& Form FRM_LAYOUT *&---------------------------------------------------------------------* * 功能描述:显示ALV报表中的斑马线,设置ALV报表的第一列为CHECKBOX *----------------------------------------------------------------------* * 入口参数:无 * 出口参数:无 *----------------------------------------------------------------------* FORM frm_layout . wa_layout-colwidth_optimize = 'X'. " ALV显示的列宽自动调整 wa_layout-zebra = 'X'. " ALV中显示斑马线 wa_layout-box_fieldname = 'CHBOX'. " 第一列设置为CHECKBOX按钮 * WA_LAYOUT-COLTAB_FIELDNAME = 'CELLCOLOR'. ENDFORM. " FRM_LAYOUT *&---------------------------------------------------------------------* *& Form FRM_OUTPUT *&---------------------------------------------------------------------* * 功能描述:输出ALV报表的视图 *----------------------------------------------------------------------* * 入口参数:无 * 出口参数:无 *----------------------------------------------------------------------* FORM frm_output . DATA: l_repid LIKE sy-repid, gs_variant TYPE disvariant. gs_variant-report = sy-repid. l_repid = sy-repid. DATA:lc_glay TYPE lvc_s_glay. lc_glay-edt_cll_cb = 'X'. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_pf_status_set = 'FRM_SET_STATUS' "自定义按钮及事件 i_callback_user_command = 'FRM_USER_COMMAND' i_callback_program = l_repid is_variant = gs_variant i_html_height_top = 26 " I_CALLBACK_HTML_TOP_OF_PAGE = 'HTML_TOP_OF_PAGE' is_layout = wa_layout it_fieldcat = it_fieldcat[] i_grid_settings = lc_glay i_save = 'A' TABLES t_outtab = gt_out EXCEPTIONS program_error = 1 OTHERS = 2. 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_OUTPUT *&---------------------------------------------------------------------* *& Form FRM_SET_STATUS *&---------------------------------------------------------------------* * 功能描述:在SE80中定义一个STANDARD_FULLSCREEN的状态栏 *----------------------------------------------------------------------* * 入口参数:无 * 出口参数:无 *----------------------------------------------------------------------* FORM frm_set_status USING rt_extab TYPE slis_t_extab.. SET PF-STATUS 'STANDARD'. "定义GUI状态,添加应用工具栏按钮 ENDFORM. " FRM_SET_STATUS FORM frm_set_status1 USING rt_extab TYPE slis_t_extab.. SET PF-STATUS 'STANDARD1'. "定义GUI状态,添加应用工具栏按钮 ENDFORM. " FRM_SET_STATUS *&---------------------------------------------------------------------* *& Form FRM_USER_COMMAND *&---------------------------------------------------------------------* * 功能描述:响应用户的操作 *----------------------------------------------------------------------* * 入口参数:无 * 出口参数:无 *----------------------------------------------------------------------* FORM frm_user_command USING ucomm LIKE sy-ucomm selfield TYPE slis_selfield.. selfield-refresh = 'X'. CASE sy-ucomm. "sy-ucomm获得按钮的功能码 WHEN 'VF04'. PERFORM frm_vf04. WHEN 'BILL'. PERFORM frm_ready_billing. WHEN 'SAVE'. PERFORM frm_save. WHEN 'BACK' . LEAVE TO SCREEN 0. WHEN 'EXIT'. LEAVE PROGRAM. WHEN 'REFRESH'. PERFORM frm_refresh. ENDCASE. ENDFORM. " FRM_USER_COMMAND FORM frm_refresh. REFRESH gt_k_akbetr. LOOP AT gt_out ASSIGNING <fs_out>. IF <fs_out>-xflag = 'X' AND <fs_out>-zdiscount = 'X'. CLEAR:<fs_out>-pzqdj,<fs_out>-pzqje. ELSE. * PZQDJ type KBETR,"票折前单价 * PZQJE type KBETR,"票折前金额 <fs_out>-pzqdj = <fs_out>-vkbetr. <fs_out>-pzqje = <fs_out>-avkbetr. ENDIF. IF <fs_out>-xflag = 'X'. CLEAR gs_k_akbetr. gs_k_akbetr-kunnr = <fs_out>-kunnr. gs_k_akbetr-pzqje = <fs_out>-pzqje. gs_k_akbetr-akbetr = <fs_out>-akbetr. COLLECT gs_k_akbetr INTO gt_k_akbetr. ENDIF. ENDLOOP. LOOP AT gt_out ASSIGNING <fs_out>. *1、票折计算标识=X,按客户,根据零售金额比例分摊票折前金额,保留两位小数: *票折后金额=(该行零售金额/按客户合计的零售金额)*按客户合计的票折前金额 *2、票折计算标识<>X,票折后金额=票折前金额 CLEAR gs_k_akbetr. READ TABLE gt_k_akbetr INTO gs_k_akbetr WITH KEY kunnr = <fs_out>-kunnr. IF <fs_out>-xflag = 'X'. * PZHJE type KBETR,"票折后金额 * PZHDJ type KBETR,"票折后单价 IF gs_k_akbetr-akbetr NE 0. <fs_out>-pzhje = <fs_out>-akbetr / gs_k_akbetr-akbetr * gs_k_akbetr-pzqje. ENDIF. ELSE. <fs_out>-pzhje = <fs_out>-pzqje. ENDIF. IF <fs_out>-kwmeng NE 0. <fs_out>-pzhdj = <fs_out>-pzhje / <fs_out>-kwmeng. ENDIF. <fs_out>-pzhjefs = <fs_out>-pzhdj * <fs_out>-kwmeng. IF <fs_out>-avkbetr NE 0. <fs_out>-pzzk = ( <fs_out>-pzhjefs + <fs_out>-wc ) / <fs_out>-avkbetr * 100."票折折扣 ENDIF. IF <fs_out>-xflag = 'X'. CLEAR gs_k_akbetr. gs_k_akbetr-kunnr = <fs_out>-kunnr. gs_k_akbetr-pzhjefs = <fs_out>-pzhjefs. COLLECT gs_k_akbetr INTO gt_k_akbetr. ENDIF. CLEAR <fs_out>-wc. ENDLOOP. LOOP AT gt_k_akbetr INTO gs_k_akbetr. IF gs_k_akbetr-pzqje NE gs_k_akbetr-pzhjefs. LOOP AT gt_out ASSIGNING <fs_out> WHERE kunnr = gs_k_akbetr-kunnr AND xflag = 'X' AND zdiscount = 'X'. <fs_out>-wc = gs_k_akbetr-pzqje - gs_k_akbetr-pzhjefs. EXIT. ENDLOOP. ENDIF. ENDLOOP. ENDFORM. FORM frm_save. DATA: i_bapisdh1x LIKE bapisdh1x, i_return LIKE TABLE OF bapiret2 WITH HEADER LINE. "返回消息 DATA: conditions_in LIKE TABLE OF bapicond WITH HEADER LINE, conditions_inx LIKE TABLE OF bapicondx WITH HEADER LINE. DATA: ls_prcd_elements TYPE prcd_elements. DATA:lt_zfit014 TYPE TABLE OF zfit014 WITH HEADER LINE. DATA:l_lastdt TYPE char15. DATA: DKPEIN LIKE prcd_elements-KPEIN. *票折前单价传入ZK03 *票折后单价传入ZPR4 *尾差传入ZK05 *票折折扣ZK04 CONCATENATE sy-datum sy-uzeit INTO l_lastdt. LOOP AT gt_out ASSIGNING <fs_out> WHERE chbox = 'X'. "add by xy 20170302 CLEAR wa_vbeln-vgbel. wa_vbeln-vgbel = <fs_out>-vgbel. COLLECT wa_vbeln INTO gt_vbeln. "add ended * if <FS_OUT>-FKTYP eq 'I'. * <FS_OUT>-TYPE = 'S'. * <FS_OUT>-STATU = ICON_LED_GREEN. * else. * * refresh: I_RETURN,CONDITIONS_IN,CONDITIONS_INX. * * I_BAPISDH1X-UPDATEFLAG = 'U'. * ** 票折前单价传入ZK03 * clear CONDITIONS_IN. * clear LS_PRCD_ELEMENTS. * select single * into LS_PRCD_ELEMENTS from PRCD_ELEMENTS where KNUMV = <FS_OUT>-KNUMV * and KPOSN = <FS_OUT>-VGPOS * and KSCHL = 'ZK03'. * CONDITIONS_IN-ITM_NUMBER = <FS_OUT>-VGPOS." 条件项目号 * CONDITIONS_IN-COND_TYPE = 'ZK03'. * CONDITIONS_IN-COND_VALUE = <FS_OUT>-PZQDJ. * CONDITIONS_IN-COND_ST_NO = LS_PRCD_ELEMENTS-STUNR. * CONDITIONS_IN-COND_COUNT = LS_PRCD_ELEMENTS-ZAEHK. * CONDITIONS_IN-COND_P_UNT = 1. * CONDITIONS_IN-CURRENCY = 'CNY'. * append CONDITIONS_IN. * * clear CONDITIONS_INX. * CONDITIONS_INX-ITM_NUMBER = <FS_OUT>-VGPOS. * CONDITIONS_INX-COND_TYPE = 'ZK03'. * * if LS_PRCD_ELEMENTS is not initial. * CONDITIONS_INX-UPDATEFLAG = 'U'. * else. * CONDITIONS_INX-UPDATEFLAG = 'I'. * endif. * CONDITIONS_INX-COND_VALUE = 'X'. * CONDITIONS_INX-COND_ST_NO = LS_PRCD_ELEMENTS-STUNR. * CONDITIONS_INX-COND_COUNT = LS_PRCD_ELEMENTS-ZAEHK. * CONDITIONS_INX-COND_P_UNT = 'X'. * CONDITIONS_INX-CURRENCY = 'X'. * append CONDITIONS_INX. * * "票折后单价传入ZPR4 * clear CONDITIONS_IN. * clear LS_PRCD_ELEMENTS. * select single * into LS_PRCD_ELEMENTS from PRCD_ELEMENTS where KNUMV = <FS_OUT>-KNUMV * and KPOSN = <FS_OUT>-VGPOS * and KSCHL = 'ZPR4'. * CONDITIONS_IN-ITM_NUMBER = <FS_OUT>-VGPOS." 条件项目号 * CONDITIONS_IN-COND_TYPE = 'ZPR4'. * CONDITIONS_IN-COND_VALUE = <FS_OUT>-PZHDJ. * CONDITIONS_IN-COND_ST_NO = LS_PRCD_ELEMENTS-STUNR. * CONDITIONS_IN-COND_COUNT = LS_PRCD_ELEMENTS-ZAEHK. * CONDITIONS_IN-COND_P_UNT = 1. * CONDITIONS_IN-CURRENCY = 'CNY'. * append CONDITIONS_IN. * * clear CONDITIONS_INX. * CONDITIONS_INX-ITM_NUMBER = <FS_OUT>-VGPOS. * CONDITIONS_INX-COND_TYPE = 'ZPR4'. * clear LS_PRCD_ELEMENTS. * select single * into LS_PRCD_ELEMENTS from PRCD_ELEMENTS where KNUMV = <FS_OUT>-KNUMV * and KPOSN = <FS_OUT>-VGPOS * and KSCHL = 'ZPR4'. * if LS_PRCD_ELEMENTS is not initial. * CONDITIONS_INX-UPDATEFLAG = 'U'. * else. * CONDITIONS_INX-UPDATEFLAG = 'I'. * endif. * CONDITIONS_INX-COND_VALUE = 'X'. * CONDITIONS_INX-COND_ST_NO = LS_PRCD_ELEMENTS-STUNR. * CONDITIONS_INX-COND_COUNT = LS_PRCD_ELEMENTS-ZAEHK. * CONDITIONS_INX-COND_P_UNT = 'X'. * CONDITIONS_INX-CURRENCY = 'X'. * append CONDITIONS_INX. ** 票折折扣ZK04 * clear CONDITIONS_IN. * clear LS_PRCD_ELEMENTS. * select single * into LS_PRCD_ELEMENTS from PRCD_ELEMENTS where KNUMV = <FS_OUT>-KNUMV * and KPOSN = <FS_OUT>-VGPOS * and KSCHL = 'ZK04'. * CONDITIONS_IN-ITM_NUMBER = <FS_OUT>-VGPOS." 条件项目号 * CONDITIONS_IN-COND_TYPE = 'ZK04'. * CONDITIONS_IN-COND_VALUE = <FS_OUT>-PZZK. * CONDITIONS_IN-COND_ST_NO = LS_PRCD_ELEMENTS-STUNR. * CONDITIONS_IN-COND_COUNT = LS_PRCD_ELEMENTS-ZAEHK. ** CONDITIONS_IN-COND_P_UNT = 1. ** CONDITIONS_IN-CURRENCY = 'CNY'. * append CONDITIONS_IN. * * clear CONDITIONS_INX. * CONDITIONS_INX-ITM_NUMBER = <FS_OUT>-VGPOS. * CONDITIONS_INX-COND_TYPE = 'ZK04'. * if LS_PRCD_ELEMENTS is not initial. * CONDITIONS_INX-UPDATEFLAG = 'U'. * else. * CONDITIONS_INX-UPDATEFLAG = 'I'. * endif. * CONDITIONS_INX-COND_VALUE = 'X'. * CONDITIONS_INX-COND_ST_NO = LS_PRCD_ELEMENTS-STUNR. * CONDITIONS_INX-COND_COUNT = LS_PRCD_ELEMENTS-ZAEHK. ** CONDITIONS_INX-COND_P_UNT = 'X'. ** CONDITIONS_INX-CURRENCY = 'X'. * append CONDITIONS_INX. * ** 尾差传入ZK05 ** if <FS_OUT>-WC ne 0. * clear CONDITIONS_IN. * select single * into LS_PRCD_ELEMENTS from PRCD_ELEMENTS where KNUMV = <FS_OUT>-KNUMV * and KPOSN = <FS_OUT>-VGPOS * and KSCHL = 'ZK05'. * CONDITIONS_IN-ITM_NUMBER = <FS_OUT>-VGPOS." 条件项目号 * CONDITIONS_IN-COND_TYPE = 'ZK05'. * CONDITIONS_IN-COND_VALUE = <FS_OUT>-WC. * CONDITIONS_IN-COND_ST_NO = LS_PRCD_ELEMENTS-STUNR. * CONDITIONS_IN-COND_COUNT = LS_PRCD_ELEMENTS-ZAEHK. * CONDITIONS_IN-COND_P_UNT = 1. * CONDITIONS_IN-CURRENCY = 'CNY'. * append CONDITIONS_IN. * * clear CONDITIONS_INX. * CONDITIONS_INX-ITM_NUMBER = <FS_OUT>-VGPOS. * CONDITIONS_INX-COND_TYPE = 'ZK05'. * if LS_PRCD_ELEMENTS is not initial. * CONDITIONS_INX-UPDATEFLAG = 'U'. * else. * CONDITIONS_INX-UPDATEFLAG = 'I'. * endif. * CONDITIONS_INX-COND_VALUE = 'X'. * CONDITIONS_INX-COND_ST_NO = LS_PRCD_ELEMENTS-STUNR. * CONDITIONS_INX-COND_COUNT = LS_PRCD_ELEMENTS-ZAEHK. * CONDITIONS_INX-COND_P_UNT = 'X'. * CONDITIONS_INX-CURRENCY = 'X'. * append CONDITIONS_INX. * endif. * call function 'BAPI_SALESORDER_CHANGE' * exporting * SALESDOCUMENT = <FS_OUT>-VGBEL "订单号 * ORDER_HEADER_INX = I_BAPISDH1X "Sales Order Check List * tables * RETURN = I_RETURN "返回消息 * CONDITIONS_IN = CONDITIONS_IN * CONDITIONS_INX = CONDITIONS_INX. * * loop at I_RETURN where TYPE = 'E' or TYPE = 'A' . * " concatenate <FS_OUT>-MSG I_RETURN-MESSAGE ';' into <FS_OUT>-MSG. * endloop. * if SY-SUBRC ne 0. * call function 'BAPI_TRANSACTION_COMMIT' * exporting * WAIT = 'X'. * <FS_OUT>-TYPE = 'S'. * <FS_OUT>-STATU = ICON_LED_GREEN. * move-corresponding <FS_OUT> to LT_ZFIT014. * LT_ZFIT014-LASTDT = L_LASTDT. * append LT_ZFIT014. * else. * call function 'BAPI_TRANSACTION_ROLLBACK'. * <FS_OUT>-TYPE = 'E'. * <FS_OUT>-STATU = ICON_LED_RED. * endif. * loop at I_RETURN . * concatenate <FS_OUT>-MSG I_RETURN-MESSAGE ';' into <FS_OUT>-MSG. * endloop. * endif. ENDLOOP. LOOP AT gt_vbeln INTO wa_vbeln. REFRESH: i_return,conditions_in,conditions_inx. CLEAR zflag. LOOP AT gt_out ASSIGNING <fs_out> WHERE chbox = 'X' AND vgbel = wa_vbeln-vgbel. "如果FKTYP = 'I' 不做处理 IF <fs_out>-fktyp EQ 'I'. <fs_out>-type = 'S'. <fs_out>-statu = icon_led_green. zflag = 'X'. ELSE. zflag = ''. i_bapisdh1x-updateflag = 'U'. "先取ZPR3的条件价格单位,用来作为其它字段的价格单位 CLEAR conditions_in. CLEAR ls_prcd_elements. SELECT SINGLE * INTO ls_prcd_elements FROM prcd_elements WHERE knumv = <fs_out>-knumv AND kposn = <fs_out>-vgpos AND kschl = 'ZPR3'. "如果没读到就用1。 CLEAR DKPEIN. IF SY-SUBRC = 0. DKPEIN = ls_prcd_elements-KPEIN. ELSE. DKPEIN = 1. ENDIF. * 票折前单价传入ZK03 CLEAR conditions_in. CLEAR ls_prcd_elements. SELECT SINGLE * INTO ls_prcd_elements FROM prcd_elements WHERE knumv = <fs_out>-knumv AND kposn = <fs_out>-vgpos AND kschl = 'ZK03'. conditions_in-itm_number = <fs_out>-vgpos." 条件项目号 conditions_in-cond_type = 'ZK03'. conditions_in-cond_value = <fs_out>-pzqdj * DKPEIN. conditions_in-cond_st_no = ls_prcd_elements-stunr. conditions_in-cond_count = ls_prcd_elements-zaehk. conditions_in-cond_p_unt = DKPEIN."条件单位取 conditions_in-currency = 'CNY'. APPEND conditions_in. CLEAR conditions_inx. conditions_inx-itm_number = <fs_out>-vgpos. conditions_inx-cond_type = 'ZK03'. IF ls_prcd_elements IS NOT INITIAL. conditions_inx-updateflag = 'U'. ELSE. conditions_inx-updateflag = 'I'. ENDIF. conditions_inx-cond_value = 'X'. conditions_inx-cond_st_no = ls_prcd_elements-stunr. conditions_inx-cond_count = ls_prcd_elements-zaehk. conditions_inx-cond_p_unt = 'X'. conditions_inx-currency = 'X'. APPEND conditions_inx. "票折后单价传入ZPR4 CLEAR conditions_in. CLEAR ls_prcd_elements. SELECT SINGLE * INTO ls_prcd_elements FROM prcd_elements WHERE knumv = <fs_out>-knumv AND kposn = <fs_out>-vgpos AND kschl = 'ZPR4'. conditions_in-itm_number = <fs_out>-vgpos." 条件项目号 conditions_in-cond_type = 'ZPR4'. conditions_in-cond_value = <fs_out>-pzhdj * DKPEIN. conditions_in-cond_st_no = ls_prcd_elements-stunr. conditions_in-cond_count = ls_prcd_elements-zaehk. conditions_in-cond_p_unt = DKPEIN. conditions_in-currency = 'CNY'. APPEND conditions_in. CLEAR conditions_inx. conditions_inx-itm_number = <fs_out>-vgpos. conditions_inx-cond_type = 'ZPR4'. CLEAR ls_prcd_elements. SELECT SINGLE * INTO ls_prcd_elements FROM prcd_elements WHERE knumv = <fs_out>-knumv AND kposn = <fs_out>-vgpos AND kschl = 'ZPR4'. IF ls_prcd_elements IS NOT INITIAL. conditions_inx-updateflag = 'U'. ELSE. conditions_inx-updateflag = 'I'. ENDIF. conditions_inx-cond_value = 'X'. conditions_inx-cond_st_no = ls_prcd_elements-stunr. conditions_inx-cond_count = ls_prcd_elements-zaehk. conditions_inx-cond_p_unt = 'X'. conditions_inx-currency = 'X'. APPEND conditions_inx. * 票折折扣ZK04 CLEAR conditions_in. CLEAR ls_prcd_elements. SELECT SINGLE * INTO ls_prcd_elements FROM prcd_elements WHERE knumv = <fs_out>-knumv AND kposn = <fs_out>-vgpos AND kschl = 'ZK04'. conditions_in-itm_number = <fs_out>-vgpos." 条件项目号 conditions_in-cond_type = 'ZK04'. conditions_in-cond_value = <fs_out>-pzzk. conditions_in-cond_st_no = ls_prcd_elements-stunr. conditions_in-cond_count = ls_prcd_elements-zaehk. * CONDITIONS_IN-COND_P_UNT = 1. * CONDITIONS_IN-CURRENCY = 'CNY'. APPEND conditions_in. CLEAR conditions_inx. conditions_inx-itm_number = <fs_out>-vgpos. conditions_inx-cond_type = 'ZK04'. IF ls_prcd_elements IS NOT INITIAL. conditions_inx-updateflag = 'U'. ELSE. conditions_inx-updateflag = 'I'. ENDIF. conditions_inx-cond_value = 'X'. conditions_inx-cond_st_no = ls_prcd_elements-stunr. conditions_inx-cond_count = ls_prcd_elements-zaehk. * CONDITIONS_INX-COND_P_UNT = 'X'. * CONDITIONS_INX-CURRENCY = 'X'. APPEND conditions_inx. * 尾差传入ZK05 * if <FS_OUT>-WC ne 0. CLEAR conditions_in. SELECT SINGLE * INTO ls_prcd_elements FROM prcd_elements WHERE knumv = <fs_out>-knumv AND kposn = <fs_out>-vgpos AND kschl = 'ZK05'. conditions_in-itm_number = <fs_out>-vgpos." 条件项目号 conditions_in-cond_type = 'ZK05'. conditions_in-cond_value = <fs_out>-wc. conditions_in-cond_st_no = ls_prcd_elements-stunr. conditions_in-cond_count = ls_prcd_elements-zaehk. conditions_in-cond_p_unt = 1. conditions_in-currency = 'CNY'. APPEND conditions_in. CLEAR conditions_inx. conditions_inx-itm_number = <fs_out>-vgpos. conditions_inx-cond_type = 'ZK05'. IF ls_prcd_elements IS NOT INITIAL. conditions_inx-updateflag = 'U'. ELSE. conditions_inx-updateflag = 'I'. ENDIF. conditions_inx-cond_value = 'X'. conditions_inx-cond_st_no = ls_prcd_elements-stunr. conditions_inx-cond_count = ls_prcd_elements-zaehk. conditions_inx-cond_p_unt = 'X'. conditions_inx-currency = 'X'. APPEND conditions_inx. ENDIF. ENDLOOP. "针对销售订单号过账 IF zflag <> 'X'. call function 'BAPI_SALESORDER_CHANGE' exporting SALESDOCUMENT = wa_vbeln-VGBEL "订单号 ORDER_HEADER_INX = I_BAPISDH1X "Sales Order Check List tables RETURN = I_RETURN "返回消息 CONDITIONS_IN = CONDITIONS_IN CONDITIONS_INX = CONDITIONS_INX. loop at I_RETURN where TYPE = 'E' or TYPE = 'A' . " concatenate <FS_OUT>-MSG I_RETURN-MESSAGE ';' into <FS_OUT>-MSG. endloop. if SY-SUBRC ne 0. call function 'BAPI_TRANSACTION_COMMIT' exporting WAIT = 'X'. "当前销售订单号 绿灯 LOOP AT gt_out ASSIGNING <fs_out> WHERE chbox = 'X' AND vgbel = wa_vbeln-vgbel. <FS_OUT>-TYPE = 'S'. <FS_OUT>-STATU = ICON_LED_GREEN. ENDLOOP. move-corresponding <FS_OUT> to LT_ZFIT014. LT_ZFIT014-LASTDT = L_LASTDT. append LT_ZFIT014. else. call function 'BAPI_TRANSACTION_ROLLBACK'. LOOP AT gt_out ASSIGNING <fs_out> WHERE chbox = 'X' AND vgbel = wa_vbeln-vgbel. <FS_OUT>-TYPE = 'E'. <FS_OUT>-STATU = ICON_LED_RED. ENDLOOP. endif. loop at I_RETURN . concatenate <FS_OUT>-MSG I_RETURN-MESSAGE ';' into <FS_OUT>-MSG. endloop. ENDIF. ENDLOOP. MODIFY zfit014 FROM TABLE lt_zfit014. ENDFORM. FORM frm_vf04. RANGES r_vbeln FOR vbco7-vbeln. LOOP AT gt_out ASSIGNING <fs_out> WHERE chbox = 'X' AND type = 'S'. IF <fs_out>-fktyp = 'L'. r_vbeln-low = <fs_out>-vbeln. ELSE. r_vbeln-low = <fs_out>-vgbel. ENDIF. r_vbeln-sign = 'I'. r_vbeln-option = 'EQ'. APPEND r_vbeln. ENDLOOP. * append lines of S_VBELN to R_VBELN. * append lines of S_VGBEL to R_VBELN. IF r_vbeln[] IS NOT INITIAL. SUBMIT sdbilldl WITH p_fkdat = s_fkdat-low WITH p_fkdab = s_fkdat-high WITH p_fkart IN s_fkart WITH s_vbeln IN r_vbeln WITH p_vkorg = p_vkorg WITH s_vtweg IN s_vtweg WITH s_spart IN s_spart WITH s_vstel IN s_vstel WITH p_kunnr IN s_kunnr WITH p_allea = p_so WITH p_alleb = p_dn VIA SELECTION-SCREEN AND RETURN. ENDIF. ENDFORM. DATA: gt_billingdatain TYPE TABLE OF bapivbrk WITH HEADER LINE, gt_conditiondatain TYPE TABLE OF bapikomv WITH HEADER LINE, gt_errors TYPE TABLE OF bapivbrkerrors WITH HEADER LINE, gv_flagx TYPE c, gv_flagw TYPE c, gv_count TYPE int4. DATA: gt_prcd_elements TYPE TABLE OF prcd_elements, gs_prcd_elements TYPE prcd_elements. DATA: lt_success TYPE TABLE OF bapivbrksuccess WITH HEADER LINE, lt_return TYPE TABLE OF bapiret1 WITH HEADER LINE. *------------------------------------------------------------------------- * CALL BAPI *------------------------------------------------------------------------- FORM frm_order_billing CHANGING pv_message. SORT gt_billingdatain BY ref_doc. REFRESH: lt_return[],lt_success[],gt_errors[]. * Test Run * call function 'BAPI_BILLINGDOC_CREATEMULTIPLE' * exporting ** CREATORDATAIN = * TESTRUN = 'X' ** posting = 'X' * tables * BILLINGDATAIN = GT_BILLINGDATAIN * CONDITIONDATAIN = GT_CONDITIONDATAIN ** CCARDDATAIN = ** TEXTDATAIN = * ERRORS = GT_ERRORS * RETURN = LT_RETURN * SUCCESS = LT_SUCCESS. * * if not GT_ERRORS[] is initial. * GV_FLAGX = 'X'. * endif. * * if not LT_RETURN[] is initial. * * loop at LT_RETURN where TYPE = 'E'. * concatenate LT_RETURN-MESSAGE ' ' into PV_MESSAGE. * endloop. * * GV_FLAGW = 'X'. * endif. * if GV_FLAGX is initial . * Post Run REFRESH :gt_errors,lt_return,lt_success. CALL FUNCTION 'BAPI_BILLINGDOC_CREATEMULTIPLE' EXPORTING * CREATORDATAIN = testrun = '' * POSTING = 'X' TABLES billingdatain = gt_billingdatain conditiondatain = gt_conditiondatain * CCARDDATAIN = * TEXTDATAIN = errors = gt_errors return = lt_return success = lt_success. IF NOT lt_success[] IS INITIAL. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. ENDIF. LOOP AT lt_return WHERE type = 'E'. CONCATENATE lt_return-message ' ' INTO pv_message. ENDLOOP. * loop at LT_SUCCESS. * VBELN = LT_SUCCESS-BILL_DOC. * if VBELN is not initial. * exit. * endif. * endloop. * endif. ENDFORM. " FRM_ORDER_BILLING *------------------------------------------------------------------------- * BAPI 赋值 *------------------------------------------------------------------------- FORM frm_ready_billing . DATA: lv_message TYPE bapi_msg, l_vbeln TYPE vbeln, l_posnr TYPE posnr. DATA: lt_out TYPE TABLE OF ty_out, ls_out TYPE ty_out. DATA: lt_zfit015 TYPE TABLE OF zfit015, ls_zfit015 TYPE zfit015. SELECT * INTO TABLE gt_prcd_elements FROM prcd_elements FOR ALL ENTRIES IN gt_out WHERE knumv = gt_out-knumv. LOOP AT gt_out INTO gs_out WHERE chbox = 'X' AND bill IS INITIAL AND type = 'S'. ls_out-vkorg = gs_out-vkorg. ls_out-kunnr = gs_out-kunnr. ls_out-fkart = gs_out-fkart. COLLECT ls_out INTO lt_out. ENDLOOP. "同一销售组织、开票类型、客户,统一开票 LOOP AT lt_out INTO ls_out. REFRESH: gt_billingdatain , gt_conditiondatain ,gt_errors. gv_count = 0. LOOP AT gt_out INTO gs_out WHERE chbox = 'X' AND bill IS INITIAL AND type = 'S' AND vkorg = ls_out-vkorg AND kunnr = ls_out-kunnr AND fkart = ls_out-fkart. CLEAR gt_billingdatain. IF gs_out-billdate IS INITIAL . gs_out-billdate = p_date. IF gs_out-billdate IS INITIAL. gs_out-billdate = sy-datum. ENDIF. MODIFY gt_out FROM gs_out TRANSPORTING billdate. ENDIF. gv_count = gv_count + 1. IF gs_out-fktyp = 'L'. gt_billingdatain-ref_doc = gs_out-vbeln. "交货单号 gt_billingdatain-ref_item = gs_out-posnr. gt_billingdatain-doc_number = gs_out-vgbel."凭证号 gt_billingdatain-itm_number = gs_out-vgpos. gt_billingdatain-doc_type = gs_out-auart. "销售凭证类型 gt_billingdatain-ref_doc_ca = 'J'. "SD 凭证类别 ELSEIF gs_out-fktyp = 'A'. gt_billingdatain-ref_doc = gs_out-vgbel. "SO gt_billingdatain-ref_item = gs_out-vgpos. gt_billingdatain-doc_number = gs_out-vbeln."DN gt_billingdatain-itm_number = gs_out-posnr. gt_billingdatain-doc_type = gs_out-auart. "销售凭证类型 gt_billingdatain-ref_doc_ca = 'C'. "SD 凭证类别 ELSEIF gs_out-fktyp = 'I'. gt_billingdatain-ref_doc = gs_out-vbeln. "交货单号 gt_billingdatain-ref_item = gs_out-posnr. gt_billingdatain-doc_number = gs_out-vgbel."凭证号 gt_billingdatain-itm_number = gs_out-vgpos. gt_billingdatain-doc_type = gs_out-auart. "销售凭证类型 gt_billingdatain-ref_doc_ca = 'J'. "SD 凭证类别 ENDIF. * gt_billingdatain-ordbilltyp = gs_out-fkart. "开票类型 gt_billingdatain-salesorg = gs_out-vkorg. "销售组织 * * gt_billingdatain-distr_chan = gs_out-vtweg. "分销渠道 gt_billingdatain-division = gs_out-spart. "产品组 * * 票折前单价传入ZK03 * 票折后单价传入ZPR4 * 尾差传入ZK05 * 票折折扣ZK04 * clear GT_CONDITIONDATAIN. * GT_CONDITIONDATAIN-DATA_INDEX = GV_COUNT. * GT_CONDITIONDATAIN-COND_TYPE = 'ZK03'. * GT_CONDITIONDATAIN-COND_VALUE = GS_OUT-PZQDJ. * GT_CONDITIONDATAIN-COND_CURR = 'CNY'. * append GT_CONDITIONDATAIN. * clear GT_CONDITIONDATAIN. * GT_CONDITIONDATAIN-DATA_INDEX = GV_COUNT. * GT_CONDITIONDATAIN-COND_TYPE = 'ZPR4'. * GT_CONDITIONDATAIN-COND_VALUE = GS_OUT-PZHDJ. * GT_CONDITIONDATAIN-COND_CURR = 'CNY'. * append GT_CONDITIONDATAIN. * clear GT_CONDITIONDATAIN. * GT_CONDITIONDATAIN-DATA_INDEX = GV_COUNT. * GT_CONDITIONDATAIN-COND_TYPE = 'ZK05'. * GT_CONDITIONDATAIN-COND_VALUE = GS_OUT-WC. * GT_CONDITIONDATAIN-COND_CURR = 'CNY'. * append GT_CONDITIONDATAIN. * clear GT_CONDITIONDATAIN. * GT_CONDITIONDATAIN-DATA_INDEX = GV_COUNT. * GT_CONDITIONDATAIN-COND_TYPE = 'ZK04'. * GT_CONDITIONDATAIN-COND_VALUE = GS_OUT-PZZK. * GT_CONDITIONDATAIN-COND_CURR = 'CNY'. * append GT_CONDITIONDATAIN. * loop at GT_PRCD_ELEMENTS into GS_PRCD_ELEMENTS * where KNUMV = GS_OUT-KNUMV * and KPOSN = GS_OUT-VGPOS. * if GS_PRCD_ELEMENTS-KSCHL = 'ZK03' * or GS_PRCD_ELEMENTS-KSCHL = 'ZPR4' * or GS_PRCD_ELEMENTS-KSCHL = 'ZK05' * or GS_PRCD_ELEMENTS-KSCHL = 'ZK04'. * continue. * endif. * GT_CONDITIONDATAIN-DATA_INDEX = GV_COUNT. * GT_CONDITIONDATAIN-COND_TYPE = GS_PRCD_ELEMENTS-KSCHL. * GT_CONDITIONDATAIN-COND_VALUE = GS_PRCD_ELEMENTS-KBETR. * GT_CONDITIONDATAIN-COND_CURR = GS_PRCD_ELEMENTS-WAERS. * * GT_CONDITIONDATAIN-COND_P_UNT = GS_PRCD_ELEMENTS-KPEIN. * GT_CONDITIONDATAIN-COND_D_UNT = GS_PRCD_ELEMENTS-KMEIN. * * append GT_CONDITIONDATAIN. * endloop. gt_billingdatain-ship_to = gs_out-kunnr. "客户 gt_billingdatain-sold_to = gt_billingdatain-ship_to. "售达方 gt_billingdatain-bill_to = gt_billingdatain-ship_to. "开票方 gt_billingdatain-payer = gs_out-kunn2. "付款方 * READ TABLE gt_vbkd WITH KEY vbeln = gw_alv-vbeln. * IF sy-subrc = 0. gt_billingdatain-payment_terms = gs_out-zterm. "付款方式 * gt_billingdatain-incoterms1 = gt_vbkd-inco1. "国际贸易条款1 * gt_billingdatain-incoterms2 = gt_vbkd-inco2. "国际贸易条款2 * ENDIF. * GT_BILLINGDATAIN-PLANT = GS_OUT-WERKS. "工厂 gt_billingdatain-material = gs_out-matnr. "物料 * gt_billingdatain-currency = 'CNY'. "currency gt_billingdatain-req_qty = abs( gs_out-kwmeng ). "数量 gt_billingdatain-sales_unit = gs_out-meins. "单位 gt_billingdatain-bill_date = gs_out-billdate. "开票日期 gt_billingdatain-price_date = gs_out-billdate. "开票日期 * APPEND gt_billingdatain. ENDLOOP. CLEAR:gv_flagw,gv_flagx,l_vbeln,lv_message. PERFORM frm_order_billing CHANGING lv_message . "开票 * call transaction '/$PXA'. * * 开票异常 * if not GV_FLAGX is initial. * ** MESSAGE s285 DISPLAY LIKE cn_fail. * concatenate '错误:开票失败,' LV_MESSAGE into LV_MESSAGE. * ** 开票成功 * elseif GV_FLAGW = SPACE and GV_FLAGX = SPACE. * ** MESSAGE s284 DISPLAY LIKE cn_succ. * concatenate '错误:开票成功,' LV_MESSAGE into LV_MESSAGE. ** 开票出现错误,但可开票,出警告 * elseif not GV_FLAGW is initial and GV_FLAGX = SPACE. * * concatenate '警告:开票成功,' LV_MESSAGE into LV_MESSAGE. ** MESSAGE lv_message TYPE cn_warn. * * endif. LOOP AT gt_out ASSIGNING <fs_out> WHERE chbox = 'X' AND bill IS INITIAL AND type = 'S' AND vkorg = ls_out-vkorg AND kunnr = ls_out-kunnr AND fkart = ls_out-fkart. IF <fs_out>-fktyp = 'L' OR <fs_out>-fktyp = 'I'. l_vbeln = <fs_out>-vbeln. l_posnr = <fs_out>-posnr. ELSE. l_vbeln = <fs_out>-vgbel. l_posnr = <fs_out>-vgpos. ENDIF. LOOP AT lt_success WHERE ref_doc = l_vbeln AND ref_doc_item = l_posnr. <fs_out>-bill = lt_success-bill_doc. CLEAR ls_zfit015. ls_zfit015-vbeln = lt_success-bill_doc. ls_zfit015-posnr = lt_success-bill_doc_item. APPEND ls_zfit015 TO lt_zfit015. ENDLOOP. IF <fs_out>-bill IS NOT INITIAL. <fs_out>-billmsg = '开票成功'. ELSE. <fs_out>-billmsg = lv_message. ENDIF. ENDLOOP. ENDLOOP. MODIFY zfit015 FROM TABLE lt_zfit015. ENDFORM. " FRM_READY_BILLING * data: LT_BILLING_DATA_IN type standard table of BAPIVBRK, * LW_BILLING_DATA_IN like line of LT_BILLING_DATA_IN, * LT_COND_DATA_IN type standard table of BAPIKOMV, * LW_COND_DATA_IN like line of LT_COND_DATA_IN, * LT_CCARD_DATA_IN type standard table of BAPICCARD_VF, * LT_RETURN type standard table of BAPIRETURN1, * LW_RETURN like line of LT_RETURN. *form FRM_CREATEFROMDATA changing PV_MESSAGE * VBELN . * clear:PV_MESSAGE,VBELN. * refresh:LT_RETURN,LT_CCARD_DATA_IN. * * "调用bapi * call function 'BAPI_BILLINGDOC_CREATEFROMDATA' * tables * BILLING_DATA_IN = LT_BILLING_DATA_IN * CONDITION_DATA_IN = LT_COND_DATA_IN * RETURNLOG_OUT = LT_RETURN * CCARD_DATA_IN = LT_CCARD_DATA_IN. * * read table LT_RETURN into LW_RETURN with key TYPE = 'E'. * if SY-SUBRC = 0. * "失败 * else. * call function 'BAPI_TRANSACTION_COMMIT' * exporting * WAIT = 'X'. * * read table LT_RETURN into LW_RETURN index 1. * * if SY-SUBRC = 0. * VBELN = LW_RETURN-MESSAGE_V1. * endif. * endif. * loop at LT_RETURN into LW_RETURN . * concatenate PV_MESSAGE ',' LW_RETURN-MESSAGE into PV_MESSAGE. * endloop. * shift PV_MESSAGE left deleting leading ','. *endform. * *form FRM_READY_BILLING_DATA. * * data: LV_MESSAGE type BAPI_MSG, * L_VBELN type VBELN. * * data: LT_OUT type table of TY_OUT, * LS_OUT type TY_OUT. * * select * into table GT_PRCD_ELEMENTS from PRCD_ELEMENTS * for all entries in GT_OUT * where KNUMV = GT_OUT-KNUMV. * * loop at GT_OUT into GS_OUT where CHBOX = 'X'. * LS_OUT-VKORG = GS_OUT-VKORG. * LS_OUT-KUNNR = GS_OUT-KUNNR. * LS_OUT-FKART = GS_OUT-FKART. * collect LS_OUT into LT_OUT. * endloop. "同一销售组织、开票类型、客户,统一开票 * * * loop at LT_OUT into LS_OUT. * refresh: LT_BILLING_DATA_IN , LT_COND_DATA_IN ,LT_RETURN,LT_CCARD_DATA_IN. * GV_COUNT = 0. * loop at GT_OUT into GS_OUT where CHBOX = 'X' * and VKORG = LS_OUT-VKORG * and KUNNR = LS_OUT-KUNNR * and FKART = LS_OUT-FKART. * if GS_OUT-BILLDATE is initial . * GS_OUT-BILLDATE = SY-DATUM. * modify GT_OUT from GS_OUT transporting BILLDATE. * endif. * add 1 to GV_COUNT . * * * LW_BILLING_DATA_IN-REF_DOC = GS_OUT-VBELN. "交货单 * LW_BILLING_DATA_IN-REF_ITEM = GS_OUT-POSNR. "行项目 * * LW_BILLING_DATA_IN-REQ_QTY = ABS( GS_OUT-KWMENG ). "交货单数量 * LW_BILLING_DATA_IN-SALES_UNIT = GS_OUT-MEINS. "销售单位 * select single VBTYP * into LW_BILLING_DATA_IN-REF_DOC_CA "交货单对应类别,可能为退货,可能为正常交货 * from LIKP * where VBELN = GS_OUT-VBELN. * * LW_BILLING_DATA_IN-BILL_DATE = GS_OUT-BILLDATE. "发票日期 * append LW_BILLING_DATA_IN to LT_BILLING_DATA_IN. * * ** 票折前单价传入ZK03 ** 票折后单价传入ZPR4 ** 尾差传入ZK05 ** 票折折扣ZK04 * clear LW_COND_DATA_IN. * LW_COND_DATA_IN-DATA_INDEX = GV_COUNT. * LW_COND_DATA_IN-COND_TYPE = 'ZK03'. * LW_COND_DATA_IN-COND_VALUE = GS_OUT-PZQDJ. * LW_COND_DATA_IN-COND_CURR = 'CNY'. * append LW_COND_DATA_IN to LT_COND_DATA_IN. * clear GT_CONDITIONDATAIN. * LW_COND_DATA_IN-DATA_INDEX = GV_COUNT. * LW_COND_DATA_IN-COND_TYPE = 'ZPR4'. * LW_COND_DATA_IN-COND_VALUE = GS_OUT-PZHDJ. * LW_COND_DATA_IN-COND_CURR = 'CNY'. * append LW_COND_DATA_IN to LT_COND_DATA_IN. * clear GT_CONDITIONDATAIN. * LW_COND_DATA_IN-DATA_INDEX = GV_COUNT. * LW_COND_DATA_IN-COND_TYPE = 'ZK05'. * LW_COND_DATA_IN-COND_VALUE = GS_OUT-WC. * LW_COND_DATA_IN-COND_CURR = 'CNY'. * append LW_COND_DATA_IN to LT_COND_DATA_IN. * clear GT_CONDITIONDATAIN. * LW_COND_DATA_IN-DATA_INDEX = GV_COUNT. * LW_COND_DATA_IN-COND_TYPE = 'ZK04'. * LW_COND_DATA_IN-COND_VALUE = GS_OUT-PZZK. * LW_COND_DATA_IN-COND_CURR = 'CNY'. * append LW_COND_DATA_IN to LT_COND_DATA_IN. * loop at GT_PRCD_ELEMENTS into GS_PRCD_ELEMENTS * where KNUMV = GS_OUT-KNUMV * and KPOSN = GS_OUT-VGPOS. * if GS_PRCD_ELEMENTS-KSCHL = 'ZK03' * or GS_PRCD_ELEMENTS-KSCHL = 'ZPR4' * or GS_PRCD_ELEMENTS-KSCHL = 'ZK05' * or GS_PRCD_ELEMENTS-KSCHL = 'ZK04'. * continue. * endif. * LW_COND_DATA_IN-DATA_INDEX = GV_COUNT. * LW_COND_DATA_IN-COND_TYPE = GS_PRCD_ELEMENTS-KSCHL. * LW_COND_DATA_IN-COND_VALUE = GS_PRCD_ELEMENTS-KBETR. * LW_COND_DATA_IN-COND_CURR = GS_PRCD_ELEMENTS-WAERS. * * append LW_COND_DATA_IN to LT_COND_DATA_IN. * endloop. * * * * * endloop. * * perform FRM_CREATEFROMDATA changing LV_MESSAGE L_VBELN. "开票 * * * loop at GT_OUT assigning <FS_OUT> where CHBOX = 'X' * and VKORG = LS_OUT-VKORG * and KUNNR = LS_OUT-KUNNR * and FKART = LS_OUT-FKART. * select single VBELN into <FS_OUT>-BILL from VBRP where VGBEL = <FS_OUT>-VBELN * and VGPOS = <FS_OUT>-POSNR. * if <FS_OUT>-BILL is not initial. * <FS_OUT>-BILLMSG = '开票成功'. * else. * <FS_OUT>-BILLMSG = LV_MESSAGE. * endif. * endloop. * endloop. * *endform. " FRM_READY_BILLING
^_^很多人都把资料锁进了note里,以后还怎么百度呢^_^
浙公网安备 33010602011771号