虚拟cube取数

FUNCTION zdxs_vc_zabjxsv04.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(I_INFOPROV) TYPE  RSINFOPROV
*"     REFERENCE(I_TH_SFC) TYPE  RSDRI_TH_SFC
*"     REFERENCE(I_TH_SFK) TYPE  RSDRI_TH_SFK
*"     REFERENCE(I_T_RANGE) TYPE  RSDRI_T_RANGE
*"     REFERENCE(I_TX_RANGETAB) TYPE  RSDRI_TX_RANGETAB
*"     REFERENCE(I_FIRST_CALL) TYPE  RS_BOOL
*"     REFERENCE(I_PACKAGESIZE) TYPE  I DEFAULT 100000
*"     REFERENCE(I_KEYDATE) TYPE  RRSRDATE DEFAULT SY-DATUM
*"     REFERENCE(I_MAXROWS) TYPE  I
*"     REFERENCE(I_USE_AGGREGATION) TYPE  RS_BOOL DEFAULT 'X'
*"     REFERENCE(I_SHOW_STATEMENT) TYPE  RS_BOOL
*"  EXPORTING
*"     REFERENCE(E_T_DATA) TYPE  STANDARD TABLE
*"     REFERENCE(E_END_OF_DATA) TYPE  RS_BOOL
*"     REFERENCE(E_T_MSG) TYPE  RS_T_MSG
*"  EXCEPTIONS
*"      REMOTE_READ_FAILED
*"      X_MESSAGE
*"----------------------------------------------------------------------
*公司代码           Z00GSDM     CHAR 08 Z00GSDM
*地市分公司         Z00EAMGC    CHAR 04 Z00GC
*(统一编码)物料     ZZBWL        CHAR 18 ZZBWL
*(统计口径)销售渠道  ZZBFXQD      CHAR 04 ZZBFXQD
*作废删除标识       GZSCBS      CHAR 01 GZSCBS
*序号              GZFYXH      CHAR 10 GZFYXH
*记录修改日期       GZJLXGRQ    DATS 08 0DATE
*版本              Z00BB       CHAR 03 Z00BB


  STATICS infoprov TYPE REF TO cl_rsdri_infoprov.

  DATA: lt_idata     TYPE REF TO data,
        lt_edata     TYPE REF TO data,
        lt_edata_lap TYPE REF TO data,
        ls_idata     TYPE REF TO data,
        ls_edata     TYPE REF TO data.

  FIELD-SYMBOLS: <lt_idata>     TYPE STANDARD TABLE,
                 <lt_edata>     TYPE STANDARD TABLE,
                 <lt_edata_lap> TYPE STANDARD TABLE,
                 <ls_idata>     TYPE any,
                 <ls_edata>     TYPE any.

** local data declarations
  DATA  l_th_sfc_gl     TYPE rsdri_th_sfc.   "特征值清单
  DATA  l_th_sfk_gl     TYPE rsdri_th_sfk.   "关键值清单
  DATA: l_t_sfc      TYPE rsdri_t_sfc,
        l_t_sfk      TYPE rsdri_t_sfk,
        l_t_sfc_save TYPE rsdri_t_sfc,
        l_t_sfk_save TYPE rsdri_t_sfk.

* Range tables
  DATA: l_t_range      TYPE rsdri_t_range,  "存储报表中的选择条件  (在屏幕选择的时候我们输入的条件)
        l_t_range_save TYPE rsdri_t_range,  "存储报表中的选择条件(临时)
*.... Deep structure for i_tx_rangetab
        l_tx_rangetab  TYPE rsdri_tx_rangetab,
        l_s_rangetab   TYPE rsdri_sx_rangetab. "存储报表中的选择条件(结构)

  DATA: l_s_range_day   TYPE rsdri_s_range, "day
        l_s_range_week  TYPE rsdri_s_range, "week
        l_s_range_month TYPE rsdri_s_range, "month
        l_s_range_year  TYPE rsdri_s_range, "year
        l_s_range_gsdm  TYPE rsdri_s_range, "公司代码
        l_s_range_xsqd  TYPE rsdri_s_range, "销售渠道
        l_s_range_zbwl  TYPE  rsdri_s_range, "物料编码
        l_s_range_dsfgs TYPE rsdri_s_range, "地市公司
        l_s_range_sjlx  TYPE rsdri_s_range, "数据类型
        l_s_range_sjbb  TYPE rsdri_s_range. "时间版本


  DATA: l_z00gsdm TYPE  /bic/oiz00gsdm.




*  DATA:i_zyfp   TYPE STANDARD TABLE OF ZBJZYFPJG, "资源顺推拆分结果。
*       s_zyfp   TYPE ZBJZYFPJG.
  DATA:l_t_jgsj     TYPE STANDARD TABLE OF zgg_jgwh,            "价格数据   根据价格维护  这张表生成  价格数据
       l_t_jgsj_tmp TYPE STANDARD TABLE OF zgg_jgwh,            "价格数据   根据价格维护  生成临时表  价格数据
       l_s_jgsj     TYPE  zgg_jgwh,                             "价格数据   根据价格维护  生成结构    价格数据
       l_t_gddj     TYPE STANDARD TABLE OF zxs_qy_gdjg_data,    "规定吨价   根据企业规定价  生成表    规定吨加
       l_s_gddj     TYPE zxs_qy_gdjg_data,
       l_t_gdsj     TYPE STANDARD TABLE OF zxs_qy_gdjg_data,    "规定升价   根据企业规定价  生成表    规定升价
       l_s_gdsj     TYPE zxs_qy_gdjg_data,

       l_t_pzjg     TYPE STANDARD TABLE OF zbw_dqdbj,           "配置价格   根据配置价格    生成表   配置价格   
       l_t_pzjg_tmp TYPE STANDARD TABLE OF zbw_dqdbj,
       l_s_pzjg     TYPE zbw_dqdbj,

       l_t_yhjg     TYPE STANDARD TABLE OF zgg_jgwh,            "会员/大客户优惠影响单价  根据价格维护生成
       l_s_yhjg     TYPE zgg_jgwh,
       l_t_wcjg     TYPE STANDARD TABLE OF zgg_jgwh,            "外采价格    根据价格维护生成
       l_t_zpjc     TYPE STANDARD TABLE OF zgg_jgwh,            "直批价差    根据价格维护生成
       l_t_zpjc_tmp TYPE STANDARD TABLE OF zgg_jgwh,
       l_t_wcjc     TYPE STANDARD TABLE OF zgg_jgwh,            "外采价差    根据价格维护生成
       l_t_wcjc_tmp TYPE STANDARD TABLE OF zgg_jgwh,
       l_s_jgwh     TYPE zgg_jgwh,
       l_t_mlys     TYPE STANDARD TABLE OF zgg_jgwh,            "财务毛利预算  根据价格维护生成
       l_s_mlys     TYPE zgg_jgwh.



  DATA: l_xtrq            TYPE d,
        l_flag            TYPE c,
        l_date            TYPE scal-date,         " scal-date 表示工厂日期
        l_end_date        TYPE scal-date,
        l_last_day        TYPE i,
        l_cs_day          TYPE i,
        lv_days           TYPE i,
*        l_day_add(2)      TYPE i,
        ypfl(32)          TYPE c,
        l_day_s           TYPE p,
        timediff          TYPE p,
        earliest          TYPE c,
        l_week            TYPE scal-week,        "工厂日期里的日历周
        l_first_week_date TYPE d,
        s_year(4)         TYPE n,
        l_zj_date         TYPE d,
        l_final_date      TYPE d.

***************用ranges来定义公司代码和日历年月*******************
  RANGES: s_gsdm FOR zzyfp-gsdm,"公司代码              "这个声明生成的表和结构里面是一些屏幕选择(sign option low high)
          s_xsqd FOR zzyfp-fxqd,"销售渠道
          s_wl   FOR zzyfp-zzbwl,"物料
          l_sjlx FOR zzyfp-sjlx,"数据类型
*          s_calmonth FOR ZZYFP-calmonth,"日历年月
          s_dsfgs FOR zzyfp-dsfgs,"地市分公司
          l_sjbb FOR zzyfp-zupdate."时间版本

  DATA:
    lt_xsjh LIKE STANDARD TABLE OF zbj_jyjh,          "根据北京经营计划这张表  生成了 销售计划(表 结构 临时表)
ls_xsjh TYPE zbj_jyjh, lt_xsjh_temp LIKE STANDARD TABLE OF zbj_jyjh.
* Other local data DATA: l_t_rsnodes TYPE rshi_t_hienode. * local fields * data: l_fiscper_intersections type boole. * data lv_end_of_data type rs_bool. "#EC NEEDED DATA: g_itabname TYPE rstlogotab, g_etabname TYPE rstlogotab. "虚拟信息块的结构 FIELD-SYMBOLS: <l_source>,<l_target>. ** The query will be issued via the RFC-enabled module. ** RFC does not permit hashed tables so standard tables have to be ** used. * BREAK-POINT. l_t_sfc = i_th_sfc. "信息块中所有的CHAR列表 l_t_sfk = i_th_sfk. "信息块中所有的KYF列表 l_t_sfc_save = i_th_sfc. l_t_sfk_save = i_th_sfk. l_t_range[] = i_t_range[]. "将选择条件赋值到L_T_RANGE l_t_range_save[] = i_t_range[]. l_tx_rangetab[] = i_tx_rangetab[]. * * determine structure of virtual infoprovider * 获得目标虚拟信息块的结构 CALL FUNCTION 'RSD_TNAMES_GET_FOR_CUBE' EXPORTING i_infocube = i_infoprov IMPORTING e_viewtiobjnm2 = g_etabname EXCEPTIONS name_error = 1 OTHERS = 2. *如果尚未有激活版本,则直接退出程序 IF sy-subrc <> 0. CLEAR g_etabname. EXIT. ENDIF. *将结果数据结构赋值给table <t_edata_lap> CREATE DATA lt_edata_lap TYPE TABLE OF (g_etabname). ASSIGN lt_edata_lap->* TO <lt_edata_lap>. CREATE DATA ls_edata TYPE (g_etabname). ASSIGN ls_edata->* TO <ls_edata>. IF l_t_range IS INITIAL. "如果屏幕里输入为初始值,及没有限制条件 SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_xsjh FROM zbj_jyjh "从北京经营计划表里面取数放到销售计划里面 WHERE remoflag <> 'X' . ELSE. "如果屏幕选择,那么根据以下的条件取数 READ TABLE l_t_range INTO l_s_range_gsdm WITH KEY chanm = 'Z00GSDM'."公司有条件代码 READ TABLE l_t_range INTO l_s_range_xsqd WITH KEY chanm = 'ZZBFXQD'."销售渠道 READ TABLE l_t_range INTO l_s_range_zbwl WITH KEY chanm = 'ZZBWL'."物料 READ TABLE l_t_range INTO l_s_range_month WITH KEY chanm = '0CALMONTH'."日历年月 READ TABLE l_t_range INTO l_s_range_day WITH KEY chanm = '0CALDAY'."日历日 READ TABLE l_t_range INTO l_s_range_week WITH KEY chanm = '0CALWEEK'."日历周 READ TABLE l_t_range INTO l_s_range_week WITH KEY chanm = '0CALYEAR'."日历年 READ TABLE l_t_range INTO l_s_range_dsfgs WITH KEY chanm = 'Z00EAMGC'."地市公司 * 用来判断 内表中的数据类型有几个,因为在做那个预算执行情况表时,有两个输入,一个是预算,一个是实际,这种情况就写为空。否则则读取数据 DATA: count TYPE i. LOOP AT l_t_range TRANSPORTING NO FIELDS WHERE chanm = 'G00SJLX'. count = count + 1. ENDLOOP. IF count = 1. READ TABLE l_t_range INTO l_s_range_sjlx WITH KEY chanm = 'G00SJLX'."数据类型 ENDIF. READ TABLE l_t_range INTO l_s_range_sjbb WITH KEY chanm = 'G00SJBB'."时间版本 ******************************公司代码************************************* *IF l_t_range-chanm = 'Z00GSDM'. LOOP AT l_t_range INTO l_s_range_gsdm. IF l_s_range_gsdm-chanm = 'Z00GSDM'. "主要是为了读取选择屏幕上的数据 s_gsdm-sign = 'I'. s_gsdm-option = 'EQ'. s_gsdm-low = l_s_range_gsdm-low. APPEND s_gsdm. CLEAR s_gsdm. ENDIF. ENDLOOP. *****************地市公司的******************8 LOOP AT l_t_range INTO l_s_range_dsfgs. IF l_s_range_dsfgs-chanm = 'Z00EAMGC'. s_dsfgs-sign = 'I'. s_dsfgs-option = 'EQ'. s_dsfgs-low = l_s_range_dsfgs-low. APPEND s_dsfgs. CLEAR s_dsfgs. ENDIF. ENDLOOP. *****************物料层次的******************8 LOOP AT l_t_range INTO l_s_range_zbwl. IF l_s_range_zbwl-chanm = 'ZZBWL'. s_wl-sign = 'I'. s_wl-option = 'EQ'. s_wl-low = l_s_range_zbwl-low. APPEND s_wl. CLEAR s_wl. ENDIF. ENDLOOP. *****************物料层次的******************8 ******************销售渠道******************** LOOP AT l_t_range INTO l_s_range_xsqd. IF l_s_range_xsqd-chanm = 'ZZBFXQD'. s_xsqd-sign = 'I'. s_xsqd-option = 'EQ'. s_xsqd-low = l_s_range_xsqd-low. APPEND s_xsqd. CLEAR s_xsqd. ENDIF. ENDLOOP. ***************************时间处理************************************ *CALL FUNCTION 'Z_HD_XTRQ' * IMPORTING * e_xtrq = l_xtrq. ***************************日历日************************************ IF l_s_range_day IS NOT INITIAL."首先判断 日历日 IF l_s_range_day-low IS INITIAL. IF l_s_range_day-high IS NOT INITIAL. l_s_range_day-low = l_s_range_day-high. ENDIF. ELSE. IF l_s_range_day-high IS INITIAL OR l_s_range_day-high EQ '00000000'. l_s_range_day-high = l_s_range_day-low. ENDIF. ENDIF. l_s_range_month-sign = 'I'. l_s_range_month-compop = 'BT'. l_s_range_month-high = l_s_range_day-low+0(6) . l_s_range_month-low = l_s_range_month-high. ELSE."然后判断日历年月 IF l_s_range_month IS NOT INITIAL."时间不为空的判断 IF l_s_range_month-low IS INITIAL. IF l_s_range_month-high IS NOT INITIAL. l_s_range_month-low = l_s_range_month-high. ENDIF. ELSE. IF l_s_range_month-high IS INITIAL OR l_s_range_month-high EQ '000000'. l_s_range_month-high = l_s_range_month-low. ENDIF. ENDIF. "日历年月判断处理完毕根据日历年月的值对日历日进行赋值 "日历日低值处理 l_date+0(6) = l_s_range_month-low. l_date+6(2) = '01'. l_s_range_day-sign = 'I'. l_s_range_day-compop = 'BT'. l_s_range_day-low = l_date. CLEAR l_date. "日历日高值处理 l_date+0(6) = l_s_range_month-high. l_date+6(2) = '01'. CALL FUNCTION 'ZGET_LAST_DAY_OF_MONTHS' EXPORTING day_in = l_date IMPORTING last_day_of_month = l_last_day EXCEPTIONS day_in_no_date = 1 OTHERS = 2. l_date+6(2) = l_last_day. l_s_range_day-high = l_date. CLEAR l_date. ELSE."判断日历周 IF l_s_range_week IS NOT INITIAL."首先判断 IF l_s_range_week-low IS INITIAL. IF l_s_range_week-high IS NOT INITIAL. l_s_range_week-low = l_s_range_week-high. ENDIF. ELSE. IF l_s_range_week-high IS INITIAL OR l_s_range_week-high EQ '000000'. l_s_range_week-high = l_s_range_week-low. ENDIF. ENDIF. "日历周判断处理完毕 根据日历周对 日历天进行赋值 "日历日低值处理 CLEAR l_date. l_week = l_s_range_week-low. CALL FUNCTION 'WEEK_GET_FIRST_DAY' EXPORTING week = l_week IMPORTING date = l_date. l_s_range_day-sign = 'I'. l_s_range_day-compop = 'BT'. l_s_range_day-low = l_date. * CLEAR l_date. "日历日高值处理 l_date = l_date + 6. l_s_range_day-high = l_date . CLEAR l_date. ELSE."日历周为空 判断处理日历年 IF l_s_range_year IS NOT INITIAL."时间不为空的判断 IF l_s_range_year-low IS INITIAL. IF l_s_range_year-high IS NOT INITIAL. l_s_range_year-low = l_s_range_year-high. ENDIF. ELSE. IF l_s_range_year-high IS INITIAL OR l_s_range_year-high EQ '0000'. l_s_range_year-high = l_s_range_year-low. ENDIF. ENDIF. ENDIF. IF l_s_range_year-low IS NOT INITIAL. l_date+0(4) = l_s_range_year-low. l_date+4(4) = '0101'. l_s_range_day-sign = 'I'. l_s_range_day-compop = 'BT'. l_s_range_day-low = l_date. CLEAR l_date. "日历日高值处理 l_date+0(4) = l_s_range_year-high. l_date+4(4) = '1231'. l_s_range_day-high = l_date. CLEAR l_date. ENDIF. ENDIF. ENDIF. ENDIF. ***********************日历日****************************************** *****************数据类型******************8 IF l_s_range_sjlx-chanm = 'G00SJLX' AND l_s_range_sjlx-low IS NOT INITIAL. l_sjlx-sign = 'I'. l_sjlx-option = 'EQ'. l_sjlx-low = l_s_range_sjlx-low. APPEND l_sjlx. ENDIF. *****************时间版本******************8 IF l_s_range_sjbb-chanm = 'G00SJBB' AND l_s_range_sjbb-low IS NOT INITIAL. l_sjbb-sign = 'I'. l_sjbb-option = 'EQ'. l_sjbb-low = l_s_range_sjbb-low. APPEND l_sjbb. ENDIF. * 取数据范围。 * 获取销售数据 IF l_s_range_month-high IS NOT INITIAL AND l_s_range_sjbb-low IS NOT INITIAL. SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_xsjh FROM zbj_jyjh WHERE remoflag <> 'X' AND uploaddate >= l_s_range_month-low AND uploaddate <= l_s_range_month-high AND xgdate = l_s_range_sjbb-low AND gsdm IN s_gsdm AND xsqd IN s_xsqd AND zzbwl IN s_wl. ELSEIF l_s_range_month-high IS NOT INITIAL . SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_xsjh FROM zbj_jyjh WHERE remoflag <> 'X' AND uploaddate >= l_s_range_month-low AND uploaddate <= l_s_range_month-high AND gsdm IN s_gsdm AND xsqd IN s_xsqd AND zzbwl IN s_wl. ELSE. SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_xsjh FROM zbj_jyjh WHERE remoflag <> 'X' AND gsdm IN s_gsdm AND xsqd IN s_xsqd AND zzbwl IN s_wl. ENDIF. * 拆分销售数据到天。 *PERFORM get_days USING l_s_range_month-low CHANGING lv_days. ENDIF. ********************读取价格相关数据******************************* IF l_t_jgsj[] IS INITIAL."零售成本价格 SELECT * INTO CORRESPONDING FIELDS OF TABLE l_t_jgsj FROM zgg_jgwh WHERE zkind = 'X' AND zlevel IN s_gsdm AND zzbwl IN s_wl AND pricetype = 'TSCBJ'. ENDIF. IF l_t_mlys[] IS INITIAL. SELECT * INTO CORRESPONDING FIELDS OF TABLE l_t_mlys FROM zgg_jgwh WHERE zkind = 'X' AND zlevel IN s_gsdm AND zzbwl IN s_wl AND pricetype = 'CWMLYS'."财务毛利预算 ENDIF. IF l_t_gddj[] IS INITIAL. SELECT * INTO CORRESPONDING FIELDS OF TABLE l_t_gddj FROM zxs_qy_gdjg_data WHERE zkind = 'X' AND bukrs IN s_gsdm AND matnr IN s_wl AND zjglx = 'ZZBQYGDJ' . "规定吨价 ENDIF. IF l_t_gdsj[] IS INITIAL. SELECT * INTO CORRESPONDING FIELDS OF TABLE l_t_gdsj FROM zxs_qy_gdjg_data WHERE zkind = 'X' AND bukrs IN s_gsdm AND matnr IN s_wl AND zjglx = 'ZZBQYSJ' . "规定升价 ENDIF. IF l_t_yhjg[] IS INITIAL. SELECT * INTO CORRESPONDING FIELDS OF TABLE l_t_yhjg FROM zxs_qy_gdjg_data WHERE zkind = 'X' AND bukrs IN s_gsdm AND matnr IN s_wl AND zjglx = 'DKHYXML' . "会员及大客户优惠影响毛利单价 ENDIF. IF l_t_pzjg[] IS INITIAL. SELECT * INTO CORRESPONDING FIELDS OF TABLE l_t_pzjg FROM zbw_dqdbj WHERE zlevel = '269000' AND zkind = 'X' . * WHERE zlevel = '269000' AND zkind = 'X' AND datefrom <= l_s_range_day-high. SORT l_t_pzjg BY zzbwl ASCENDING datefrom DESCENDING. ENDIF. IF l_t_wcjc[] IS INITIAL. SELECT * INTO CORRESPONDING FIELDS OF TABLE l_t_wcjc FROM zgg_jgwh * WHERE zlevel = '2690' AND pricetype = 'PZWCJC' AND zkind = 'X' AND datem <= l_s_range_day-high+0(6). WHERE zlevel = '2690' AND pricetype = 'PZWCJC' AND zkind = 'X'. SORT l_t_wcjc BY zzbwl ASCENDING datem DESCENDING. ENDIF. IF l_t_zpjc[] IS INITIAL. SELECT * INTO CORRESPONDING FIELDS OF TABLE l_t_zpjc FROM zgg_jgwh * WHERE zlevel = '2690' AND pricetype = 'ZPDYJC' AND zkind = 'X' AND datem <= l_s_range_day-high+0(6). WHERE zlevel = '2690' AND pricetype = 'ZPDYJC' AND zkind = 'X' . SORT l_t_zpjc BY zzbwl ASCENDING datem DESCENDING. ENDIF. IF lt_xsjh IS NOT INITIAL. DELETE lt_xsjh WHERE xsjhsl = 0 AND zyjhsl = 0 ."清理数量为0的数据 LOOP AT lt_xsjh INTO ls_xsjh. "在销售数据中加入数据,把原来是S6的数据,改成S5的数据,这样就有量分数据,S5和S6 IF ls_xsjh-xsqd = 'S6' and ls_xsjh-MBLX <> 'JH'. ls_xsjh-xsqd = 'S5'. append ls_xsjh to lt_xsjh_temp. ENDIF. ENDLOOP. append LINES OF lt_xsjh_temp to lt_xsjh. CLEAR lt_xsjh_temp. LOOP AT lt_xsjh INTO ls_xsjh. IF strlen( ls_xsjh-zzbwl ) = 6. ls_xsjh-zzbwl+10(8) = ls_xsjh-zzbwl. ls_xsjh-zzbwl+0(10) = '0000000000'. ENDIF. "时间处理 l_date+0(6) = ls_xsjh-uploaddate. l_date+6(2) = '01'. CALL FUNCTION 'ZGET_LAST_DAY_OF_MONTHS' EXPORTING day_in = l_date IMPORTING last_day_of_month = l_last_day EXCEPTIONS day_in_no_date = 1 OTHERS = 2. l_end_date = l_date. l_end_date+6(2) = l_last_day. ASSIGN COMPONENT 'Z00GSDM' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-gsdm. ASSIGN COMPONENT 'ZZBWL' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-zzbwl. ASSIGN COMPONENT 'ZBJWL' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-zzbwl. ASSIGN COMPONENT 'ZZBFXQD' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-xsqd. ASSIGN COMPONENT 'ZBJFXQD' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-xsqd. ASSIGN COMPONENT 'Z00FXQD' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-xsqd. ASSIGN COMPONENT 'G00SJBB' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-xgdate."时间版本 ASSIGN COMPONENT 'Z00JYZSYQ' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-jyzsyq."加油站所有权 ASSIGN COMPONENT 'Z00TJZB2' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-zptjzb."直批统计指标 ASSIGN COMPONENT 'Z00CGJHLX' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-cgjhlx."采购计划类型 ASSIGN COMPONENT '0CALMONTH' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-uploaddate. ASSIGN COMPONENT '0CALYEAR' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-uploaddate+0(4). ASSIGN COMPONENT 'Z00GC' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-xsbgs. ASSIGN COMPONENT 'Z00EAMGC' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-xsbgs. ASSIGN COMPONENT 'Z00CPZ' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = '01'. ASSIGN COMPONENT 'G00JGSJLX' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-mblx. IF ls_xsjh-uploaddate IS NOT INITIAL. l_date+0(6) = ls_xsjh-uploaddate. l_date+6(2) = '01'. l_end_date = l_date. CALL FUNCTION 'ZGET_LAST_DAY_OF_MONTHS' EXPORTING day_in = l_date IMPORTING last_day_of_month = l_last_day EXCEPTIONS day_in_no_date = 1 OTHERS = 2. l_end_date+6(2) = l_last_day. ENDIF. ASSIGN COMPONENT '0CALDAY' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = l_date. IF l_s_range_week-low IS NOT INITIAL. ASSIGN COMPONENT '0CALWEEK' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = l_s_range_week-low. ELSE. CALL FUNCTION 'DATE_GET_WEEK' EXPORTING date = l_date IMPORTING week = l_week. ASSIGN COMPONENT '0CALWEEK' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = l_week. ENDIF. ASSIGN COMPONENT 'Z00CGJHSL' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-zyjhsl * 10000 / l_last_day. "采购计划数据 ASSIGN COMPONENT 'Z00JHSL' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-xsjhsl * 10000 / l_last_day. "销售计划数据 * K00MNCB 模拟成本 Z00KHCB 考核成本 Z00PZJCB 配置价成本 * READ TABLE l_t_jgsj WITH TABLE KEY MANDT = sy-MANDT * DATEFROM = '20170704' * ZZBWL = ls_xsjh-zzbwl * ZLEVEL = ls_xsjh-gsdm * ZKIND = 'X' * PRICETYPE = 'TSCBJ' * INTO l_s_jgsj. * UPDATE zgg_jgwh set DATEM = '201706'. * l_last_day IF ls_xsjh-xsjhsl <> 0 AND ls_xsjh-xsqd = 'S6'."销售渠道为零售时使用零售成本价格作为成本计算 **********************20170802经与用户确认调整为取最新零售成本价******************************** * ****** l_t_jgsj_tmp[] = l_t_jgsj[]. DELETE l_t_jgsj_tmp WHERE datefrom > l_end_date. SORT l_t_jgsj_tmp BY zzbwl datefrom DESCENDING. READ TABLE l_t_jgsj_tmp INTO l_s_jgsj WITH KEY mandt = sy-mandt zzbwl = ls_xsjh-zzbwl zlevel = ls_xsjh-gsdm xsqd = ls_xsjh-xsqd. * LOOP AT l_t_jgsj INTO l_s_jgsj * WHERE mandt = sy-mandt AND zzbwl = ls_xsjh-zzbwl AND zlevel = ls_xsjh-gsdm AND xsqd = ls_xsjh-xsqd AND datefrom <= l_end_date. * l_zj_date = l_s_jgsj-datefrom. * IF l_date >= l_zj_date AND l_zj_date > l_final_date. ASSIGN COMPONENT 'K00MNCB' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-xsjhsl * 10000 / l_last_day * l_s_jgsj-price. "销售计划数据 * l_final_date = l_zj_date. * ENDIF. * ENDLOOP. **********************20170802经与用户确认调整为取最新零售成本价************************************** CLEAR l_zj_date. CLEAR l_final_date. ENDIF. *************************企业规定价格************************************** IF ls_xsjh-xsjhsl <> 0. LOOP AT l_t_gddj INTO l_s_gddj WHERE mandt = sy-mandt AND matnr = ls_xsjh-zzbwl AND bukrs = ls_xsjh-gsdm AND vtweg = ls_xsjh-xsqd. l_zj_date = l_s_gddj-datefrom. IF l_date >= l_zj_date AND l_zj_date > l_final_date. ASSIGN COMPONENT 'KZLGYSJED' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-xsjhsl * 10000 / l_last_day * l_s_gddj-price. "规定吨价金额 l_final_date = l_zj_date. ENDIF. ENDLOOP. CLEAR l_zj_date. CLEAR l_final_date. ENDIF. IF ls_xsjh-xsjhsl <> 0. LOOP AT l_t_gdsj INTO l_s_gdsj WHERE mandt = sy-mandt AND matnr = ls_xsjh-zzbwl AND bukrs = ls_xsjh-gsdm AND vtweg = ls_xsjh-xsqd. l_zj_date = l_s_gdsj-datefrom. IF l_date >= l_zj_date AND l_zj_date > l_final_date. ASSIGN COMPONENT 'KZLGYSJES' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-xsjhsl * 10000 / l_last_day * l_s_gdsj-price. "规定升价金额 l_final_date = l_zj_date. ENDIF. ENDLOOP. CLEAR l_zj_date. CLEAR l_final_date. ENDIF. IF ls_xsjh-xsjhsl <> 0. l_t_pzjg_tmp[] = l_t_pzjg[]. l_t_wcjc_tmp[] = l_t_wcjc[]. DELETE l_t_pzjg_tmp WHERE zzbwl <> ls_xsjh-zzbwl OR datefrom > l_end_date. DELETE l_t_wcjc_tmp WHERE zzbwl <> ls_xsjh-zzbwl OR datem > l_date+0(6). SORT l_t_wcjc_tmp BY zzbwl ASCENDING datem DESCENDING. SORT l_t_pzjg_tmp BY zzbwl ASCENDING datefrom DESCENDING. READ TABLE l_t_pzjg_tmp INTO l_s_pzjg WITH KEY mandt = sy-mandt zzbwl = ls_xsjh-zzbwl zlevel = '269000'. IF sy-subrc EQ 0. ASSIGN COMPONENT 'Z00PZJCB' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-xsjhsl * 10000 / l_last_day * l_s_pzjg-price . "配置价成本 = 销售数据 * 配置价格 "使用月底价格 ENDIF. READ TABLE l_t_wcjc_tmp INTO l_s_jgwh WITH KEY mandt = sy-mandt zzbwl = ls_xsjh-zzbwl zlevel = '2690'. IF sy-subrc EQ 0. ASSIGN COMPONENT 'KZLGWCJE' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-xsjhsl * 10000 / l_last_day * ( l_s_pzjg-price - l_s_jgwh-price ). "外采成本 = 销售数据 * (配置价-配置与外采价差) ENDIF. * LOOP AT l_t_pzjg INTO l_s_pzjg * WHERE MANDT = sy-mandt AND ZZBWL = ls_xsjh-zzbwl . * l_zj_date = l_s_pzjg-DATEFROM. * IF l_date >= l_zj_date AND l_zj_date > l_final_date. * ASSIGN COMPONENT 'Z00PZJCB' OF STRUCTURE <ls_edata> TO <l_target>. * <l_target> = ls_xsjh-xsjhsl * 10000 / l_last_day * l_s_pzjg-price . "配置价成本 = 销售数据 * 配置价格 * l_final_date = l_zj_date. * ENDIF. * ENDLOOP. ENDIF. IF ls_xsjh-xsqd <> 'S6'."销售渠道为直批时使用外采价格作为成本计算/配置价格使用按天加权 LOOP AT l_t_pzjg INTO l_s_pzjg WHERE mandt = sy-mandt AND zzbwl = ls_xsjh-zzbwl AND datefrom < l_end_date. l_zj_date = l_s_pzjg-datefrom. IF l_date > l_zj_date AND l_zj_date >= l_final_date. ASSIGN COMPONENT 'K00MNCB' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-xsjhsl * 10000 / l_last_day * ( l_s_pzjg-price - l_s_jgwh-price ). l_final_date = l_zj_date. ENDIF. ENDLOOP. ENDIF. CLEAR l_s_pzjg. CLEAR l_s_jgwh. CLEAR l_t_pzjg_tmp. CLEAR l_t_wcjc_tmp. IF ls_xsjh-xsjhsl <> 0. l_t_zpjc_tmp[] = l_t_zpjc[]. DELETE l_t_zpjc_tmp WHERE datem > l_date+0(6). READ TABLE l_t_zpjc_tmp INTO l_s_jgwh WITH KEY mandt = sy-mandt zzbwl = ls_xsjh-zzbwl zlevel = '2690'. ASSIGN COMPONENT 'KZZPJCJE' OF STRUCTURE <ls_edata> TO <l_target>. IF sy-subrc EQ 0. <l_target> = ls_xsjh-xsjhsl * 10000 / l_last_day * l_s_jgwh-price . " ENDIF. CLEAR l_s_pzjg. CLEAR l_s_jgwh. ENDIF. IF ls_xsjh-xsjhsl <> 0. READ TABLE l_t_yhjg INTO l_s_yhjg WITH KEY mandt = sy-mandt zzbwl = ls_xsjh-zzbwl zlevel = ls_xsjh-gsdm datem = ls_xsjh-uploaddate . ASSIGN COMPONENT 'G00YHYXDJ' OF STRUCTURE <ls_edata> TO <l_target>. IF sy-subrc EQ 0. <l_target> = ls_xsjh-xsjhsl * 10000 / l_last_day * l_s_yhjg-price. "会员及大客户优惠影响毛利单价 ENDIF. CLEAR l_s_yhjg. ENDIF. IF ls_xsjh-xsjhsl <> 0 AND ( ls_xsjh-xsqd = 'S5' OR ls_xsjh-xsqd = 'S6' OR ls_xsjh-xsqd = 'S8' ) AND ls_xsjh-jyzsyq = '' AND ls_xsjh-zptjzb = ''. READ TABLE l_t_mlys INTO l_s_mlys WITH KEY mandt = sy-mandt zzbwl = ls_xsjh-zzbwl zlevel = ls_xsjh-gsdm datem = ls_xsjh-uploaddate XSQD = ls_xsjh-xsqd . ASSIGN COMPONENT 'K00MLYS' OF STRUCTURE <ls_edata> TO <l_target>. IF sy-subrc EQ 0. <l_target> = l_s_mlys-price / l_last_day . "毛利预算 ENDIF. CLEAR l_s_mlys. ENDIF. *************************企业规定价格************************************** APPEND <ls_edata> TO <lt_edata_lap>. DO ( l_end_date - l_date ) TIMES. l_date = l_date + 1. ASSIGN COMPONENT '0CALDAY' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = l_date. CALL FUNCTION 'DATE_GET_WEEK' EXPORTING date = l_date IMPORTING week = l_week. ASSIGN COMPONENT '0CALWEEK' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = l_week. IF ls_xsjh-xsjhsl <> 0 AND ls_xsjh-xsqd = 'S6'."销售计划数据不为0 "销售渠道为零售时使用零售成本价格作为成本计算 READ TABLE l_t_jgsj_tmp INTO l_s_jgsj WITH KEY mandt = sy-mandt zzbwl = ls_xsjh-zzbwl zlevel = ls_xsjh-gsdm xsqd = ls_xsjh-xsqd. ASSIGN COMPONENT 'K00MNCB' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-xsjhsl * 10000 / l_last_day * l_s_jgsj-price. "销售计划数据 * LOOP AT l_t_jgsj INTO l_s_jgsj * WHERE mandt = sy-mandt AND zzbwl = ls_xsjh-zzbwl AND zlevel = ls_xsjh-gsdm AND xsqd = ls_xsjh-xsqd. * l_zj_date = l_s_jgsj-datefrom. * IF l_date >= l_zj_date AND l_zj_date > l_final_date. * ASSIGN COMPONENT 'K00MNCB' OF STRUCTURE <ls_edata> TO <l_target>. * <l_target> = ls_xsjh-xsjhsl * 10000 / l_last_day * l_s_jgsj-price. "销售计划数据 * l_final_date = l_zj_date. * ENDIF. * ENDLOOP. CLEAR l_zj_date. CLEAR l_final_date. ENDIF. IF ls_xsjh-xsjhsl <> 0. LOOP AT l_t_gddj INTO l_s_gddj WHERE mandt = sy-mandt AND matnr = ls_xsjh-zzbwl AND bukrs = ls_xsjh-gsdm AND vtweg = ls_xsjh-xsqd. l_zj_date = l_s_gddj-datefrom. IF l_date >= l_zj_date AND l_zj_date > l_final_date. ASSIGN COMPONENT 'KZLGYSJED' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-xsjhsl * 10000 / l_last_day * l_s_gddj-price. "规定吨价金额 l_final_date = l_zj_date. ENDIF. ENDLOOP. CLEAR l_zj_date. CLEAR l_final_date. ENDIF. IF ls_xsjh-xsjhsl <> 0. LOOP AT l_t_gdsj INTO l_s_gdsj WHERE mandt = sy-mandt AND matnr = ls_xsjh-zzbwl AND bukrs = ls_xsjh-gsdm AND vtweg = ls_xsjh-xsqd. l_zj_date = l_s_gdsj-datefrom. IF l_date >= l_zj_date AND l_zj_date > l_final_date. ASSIGN COMPONENT 'KZLGYSJES' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-xsjhsl * 10000 / l_last_day * l_s_gdsj-price. "规定升价金额 l_final_date = l_zj_date. ENDIF. ENDLOOP. CLEAR l_zj_date. CLEAR l_final_date. ENDIF. IF ls_xsjh-xsjhsl <> 0. l_t_pzjg_tmp[] = l_t_pzjg[]. l_t_wcjc_tmp[] = l_t_wcjc[]. DELETE l_t_pzjg_tmp WHERE zzbwl <> ls_xsjh-zzbwl OR datefrom > l_end_date. DELETE l_t_wcjc_tmp WHERE zzbwl <> ls_xsjh-zzbwl OR datem > l_date+0(6). SORT l_t_wcjc_tmp BY zzbwl ASCENDING datem DESCENDING. SORT l_t_pzjg_tmp BY zzbwl ASCENDING datefrom DESCENDING. READ TABLE l_t_pzjg_tmp INTO l_s_pzjg WITH KEY mandt = sy-mandt zzbwl = ls_xsjh-zzbwl zlevel = '269000'. IF sy-subrc EQ 0. ASSIGN COMPONENT 'Z00PZJCB' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-xsjhsl * 10000 / l_last_day * l_s_pzjg-price . "配置价成本 = 销售数据 * 配置价格 "使用月底价格 ENDIF. READ TABLE l_t_wcjc_tmp INTO l_s_jgwh WITH KEY mandt = sy-mandt zzbwl = ls_xsjh-zzbwl zlevel = '2690'. IF sy-subrc EQ 0. ASSIGN COMPONENT 'KZLGWCJE' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-xsjhsl * 10000 / l_last_day * ( l_s_pzjg-price - l_s_jgwh-price ). "外采成本 = 销售数据 * (配置价-配置与外采价差) ENDIF. IF ls_xsjh-xsqd <> 'S6'."销售渠道为直批时使用外采价格作为成本计算 LOOP AT l_t_pzjg INTO l_s_pzjg WHERE mandt = sy-mandt AND zzbwl = ls_xsjh-zzbwl AND datefrom <= l_end_date. l_zj_date = l_s_pzjg-datefrom. IF l_date > l_zj_date AND l_zj_date >= l_final_date. ASSIGN COMPONENT 'K00MNCB' OF STRUCTURE <ls_edata> TO <l_target>. <l_target> = ls_xsjh-xsjhsl * 10000 / l_last_day * ( l_s_pzjg-price - l_s_jgwh-price ). l_final_date = l_zj_date. ENDIF. ENDLOOP. ENDIF. CLEAR l_s_pzjg. CLEAR l_s_jgwh. CLEAR l_t_pzjg_tmp. CLEAR l_t_wcjc_tmp. ENDIF. IF ls_xsjh-xsjhsl <> 0. l_t_zpjc_tmp[] = l_t_zpjc[]. DELETE l_t_zpjc_tmp WHERE datem > l_date+0(6). READ TABLE l_t_zpjc_tmp INTO l_s_jgwh WITH KEY mandt = sy-mandt zzbwl = ls_xsjh-zzbwl zlevel = '2690'. ASSIGN COMPONENT 'KZZPJCJE' OF STRUCTURE <ls_edata> TO <l_target>. IF sy-subrc EQ 0. <l_target> = ls_xsjh-xsjhsl * 10000 / l_last_day * l_s_jgwh-price . " ENDIF. CLEAR l_s_pzjg. CLEAR l_s_jgwh. ENDIF. IF ls_xsjh-xsjhsl <> 0. READ TABLE l_t_yhjg INTO l_s_yhjg WITH KEY mandt = sy-mandt zzbwl = ls_xsjh-zzbwl zlevel = ls_xsjh-gsdm datem = ls_xsjh-uploaddate . ASSIGN COMPONENT 'G00YHYXDJ' OF STRUCTURE <ls_edata> TO <l_target>. IF sy-subrc EQ 0. <l_target> = ls_xsjh-xsjhsl * 10000 / l_last_day * l_s_yhjg-price. "会员及大客户优惠影响毛利单价 ENDIF. CLEAR l_s_yhjg. ENDIF. IF ls_xsjh-xsjhsl <> 0 AND ( ls_xsjh-xsqd = 'S5' OR ls_xsjh-xsqd = 'S6' OR ls_xsjh-xsqd = 'S8' ) AND ls_xsjh-jyzsyq = '' AND ls_xsjh-zptjzb = ''. READ TABLE l_t_mlys INTO l_s_mlys WITH KEY mandt = sy-mandt zzbwl = ls_xsjh-zzbwl zlevel = ls_xsjh-gsdm datem = ls_xsjh-uploaddate XSQD = ls_xsjh-xsqd. ASSIGN COMPONENT 'K00MLYS' OF STRUCTURE <ls_edata> TO <l_target>. IF sy-subrc EQ 0. <l_target> = l_s_mlys-price / l_last_day . "毛利预算 ENDIF. CLEAR l_s_mlys. ENDIF. APPEND <ls_edata> TO <lt_edata_lap>. ENDDO. CLEAR l_date. CLEAR <ls_edata>. ENDLOOP. ENDIF. *** SAP 固定的语句 将数据交给系统进行处理***** PERFORM handover_data TABLES l_t_sfc_save l_t_sfk_save <lt_edata_lap> e_t_data. e_end_of_data = 'X'. ENDFUNCTION.

 

posted @ 2017-10-26 12:53  王族子坤  阅读(445)  评论(0)    收藏  举报