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.