*&---------------------------------------------------------------------*
*& Report ZSDR001
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zsdr001.
TYPE-POOLS:slis.
TABLES:vbak, vbap, vbep, konv, konp.
DATA: itab LIKE TABLE OF zsdsf01 WITH HEADER LINE.
DATA: gt_sf LIKE TABLE OF zsdsf01 WITH HEADER LINE.
DATA:BEGIN OF wa_vbak,
vbeln TYPE vbak-vbeln,
vkorg TYPE vbak-vkorg,
vtweg TYPE vbak-vtweg,
spart TYPE vbak-spart,
auart TYPE vbak-auart,
kunnr TYPE vbak-kunnr,
angdt TYPE vbak-angdt,
vsnmr_v TYPE vbak-vsnmr_v,
knumv TYPE vbak-knumv,
che,
END OF wa_vbak.
DATA:it_vbak LIKE TABLE OF wa_vbak WITH HEADER LINE.
DATA:it_vbak1 LIKE TABLE OF wa_vbak WITH HEADER LINE.
DATA: BEGIN OF wa_konv,
knumv TYPE konv-knumv,
kposn TYPE konv-kposn,
kschl TYPE konv-kschl,
kumne TYPE konv-kumne,
kumza TYPE konv-kumza,
kbetr TYPE konv-kbetr,
kpein TYPE konv-kpein,
END OF wa_konv.
DATA:it_konv LIKE TABLE OF wa_konv WITH HEADER LINE.
DATA: p_vbeln TYPE vbak-vbeln.
DATA: p_num TYPE i.
DATA: p_flag TYPE i.
DATA: g_lines TYPE i.
DATA: c_form_name TYPE tdsfname ,
c_form_title TYPE string.
DATA: gv_title TYPE lvc_title.
DATA: gs_layout TYPE slis_layout_alv,
gt_fields TYPE slis_t_fieldcat_alv,
gs_fields TYPE LINE OF slis_t_fieldcat_alv.
SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_vkorg FOR vbak-vkorg. "销售组织
SELECT-OPTIONS: s_vtweg FOR vbak-vtweg. "分销渠道
SELECT-OPTIONS: s_kunnr FOR vbak-kunnr. "客户编号
SELECT-OPTIONS: s_vbeln FOR vbak-vbeln. "报价单号
SELECTION-SCREEN END OF BLOCK block1.
START-OF-SELECTION.
PERFORM getdata.
PERFORM alvdata.
*&---------------------------------------------------------------------*
*& Form getdata
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM getdata.
SELECT
a~vbeln
a~vkorg
a~vtweg
a~spart
a~auart
a~kunnr
a~angdt
a~bnddt
a~vsnmr_v
a~knumv
INTO CORRESPONDING FIELDS OF TABLE it_vbak FROM vbak AS a WHERE a~vkorg IN s_vkorg AND a~vtweg IN s_vtweg AND a~kunnr IN s_kunnr AND a~vbeln IN s_vbeln.
ENDFORM. "getdata
*&---------------------------------------------------------------------*
*& Form getdetaildata
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM getdetaildata.
IF NOT it_vbak[] IS INITIAL.
LOOP AT it_vbak WHERE che EQ 'X'.
it_vbak1 = it_vbak.
APPEND it_vbak1.
ENDLOOP.
SELECT
a~vbeln
a~vkorg
a~vtweg
a~spart
a~auart
a~kunnr
a~angdt
a~bnddt
a~vsnmr_v
a~knumv
a~erdat
b~posnr
b~matnr
b~kwmeng
b~meins
b~netpr
INTO CORRESPONDING FIELDS OF TABLE itab FROM vbak AS a LEFT JOIN vbap AS b ON a~vbeln = b~vbeln FOR ALL ENTRIES IN it_vbak1 WHERE a~vbeln = it_vbak1-vbeln.
ENDIF.
IF NOT itab[] IS INITIAL.
SORT itab BY vbeln posnr.
DATA: num TYPE i VALUE 1.
LOOP AT itab.
itab-cursornum = num.
num = num + 1.
MODIFY itab.
ENDLOOP.
SELECT
knumv
kposn
kschl "条件类型
kumne "分母cconde
kumza "分子
kbetr "金额
kpein "定价单位
INTO CORRESPONDING FIELDS OF TABLE it_konv FROM konv FOR ALL ENTRIES IN itab WHERE knumv = itab-knumv AND kposn = itab-posnr.
ENDIF.
LOOP AT itab.
IF itab-matnr = 'tooling' OR itab-matnr = 'TOOLING'.
itab-linetooling = itab-kwmeng * itab-netpr.
ELSE.
LOOP AT it_konv WHERE knumv = itab-knumv AND kposn = itab-posnr.
IF it_konv-kschl = 'ZQP1'.
itab-matcost = ( it_konv-kumne / it_konv-kumza ) * ( it_konv-kbetr / it_konv-kpein ).
ELSEIF it_konv-kschl = 'ZQP2'.
itab-scrap = itab-matcost * it_konv-kbetr / 100.
ELSEIF it_konv-kschl = 'ZQP3'.
itab-smd = ( it_konv-kumne / it_konv-kumza ) * ( it_konv-kbetr / it_konv-kpein ).
ELSEIF it_konv-kschl = 'ZQP4'.
itab-winding = ( it_konv-kumne / it_konv-kumza ) * ( it_konv-kbetr / it_konv-kpein ).
ELSEIF it_konv-kschl = 'ZQP5'.
itab-assembly = ( it_konv-kumne / it_konv-kumza ) * ( it_konv-kbetr / it_konv-kpein ).
ELSEIF it_konv-kschl = 'ZQP6'.
itab-burnin = ( it_konv-kumne / it_konv-kumza ) * ( it_konv-kbetr / it_konv-kpein ).
ELSEIF it_konv-kschl = 'ZQP7'.
itab-testing = ( it_konv-kumne / it_konv-kumza ) * ( it_konv-kbetr / it_konv-kpein ).
itab-totalmatcost = itab-matcost + itab-scrap + itab-smd + itab-assembly + itab-burnin.
ELSEIF it_konv-kschl = 'ZQPB'.
itab-sg = itab-totalmatcost * it_konv-kbetr / 100.
ELSEIF it_konv-kschl = 'ZQPC'.
itab-profit = itab-totalmatcost * it_konv-kbetr / 100.
itab-unitprice = itab-totalmatcost + itab-sg + itab-profit.
ELSEIF it_konv-kschl = 'ZQP9'.
itab-vat = itab-unitprice * it_konv-kbetr / 100.
ENDIF.
itab-totalprice = itab-unitprice + itab-vat.
MODIFY itab.
ENDLOOP.
ENDIF.
SELECT SINGLE trmtyp INTO itab-trmtyp FROM vbkd WHERE vbeln = itab-vbeln.
SELECT SINGLE zlsch INTO itab-zlsch FROM vbkd WHERE vbeln = itab-vbeln.
DATA:startdate TYPE d, enddate TYPE d.
SELECT SINGLE angdt bnddt INTO (startdate, enddate) FROM vbak WHERE vbeln = itab-vbeln.
DATA: aa TYPE i.
CALL FUNCTION 'DAYS_BETWEEN_TWO_DATES'
EXPORTING
i_datum_bis = enddate
i_datum_von = startdate
IMPORTING
e_tage = aa
EXCEPTIONS
days_method_not_defined = 1
OTHERS = 2.
itab-validdays = aa.
MODIFY itab.
ENDLOOP.
ENDFORM. "getdata
*&---------------------------------------------------------------------*
*& Form alvdata
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM alvdata.
gs_layout-colwidth_optimize = 'X'.
gs_layout-box_fieldname = 'CHE'.
gs_layout-zebra = 'X'.
REFRESH gt_fields.
CLEAR gs_fields.
gs_fields-fieldname = 'VKORG'.
gs_fields-seltext_l = '销售组织'.
APPEND gs_fields TO gt_fields.
CLEAR gs_fields.
gs_fields-fieldname = 'VTWEG'.
gs_fields-seltext_l = '分销渠道'.
APPEND gs_fields TO gt_fields.
CLEAR gs_fields.
gs_fields-fieldname = 'SPART'.
gs_fields-seltext_l = '产品组'.
APPEND gs_fields TO gt_fields.
CLEAR gs_fields.
gs_fields-fieldname = 'KUNNR'.
gs_fields-seltext_l = '客户编号'.
APPEND gs_fields TO gt_fields.
CLEAR gs_fields.
gs_fields-fieldname = 'VBELN'.
gs_fields-seltext_l = '报价单号'.
APPEND gs_fields TO gt_fields.
CLEAR gs_fields.
gs_fields-fieldname = 'AUART'.
gs_fields-seltext_l = '报价单类型'.
APPEND gs_fields TO gt_fields.
CLEAR gs_fields.
gs_fields-fieldname = 'VSNMR_V'.
gs_fields-seltext_l = '报价单版本号'.
APPEND gs_fields TO gt_fields.
CLEAR gs_fields.
gs_fields-fieldname = 'ANGDT'.
gs_fields-seltext_l = '报价单有效开始日期'.
APPEND gs_fields TO gt_fields.
CLEAR gs_fields.
gs_fields-fieldname = 'BNDDT'.
gs_fields-seltext_l = '报价单有效截止日期'.
APPEND gs_fields TO gt_fields.
CLEAR gs_fields.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'SET_PF'
i_callback_user_command = 'USER_COM'
i_grid_title = gv_title
is_layout = gs_layout
it_fieldcat = gt_fields
i_save = 'X'
TABLES
t_outtab = it_vbak
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM. "alvdata
*&---------------------------------------------------------------------*
*& Form set_fp
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->EXTAB text
*----------------------------------------------------------------------*
FORM set_pf USING extab TYPE slis_t_extab.
SET PF-STATUS 'ZSDR001'.
ENDFORM. "set_pf
*&---------------------------------------------------------------------*
*& Form user_com
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->R_UCOMM text
* -->RS_SELFIELD text
*----------------------------------------------------------------------*
FORM user_com USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
DATA: lr_grid TYPE REF TO cl_gui_alv_grid,
myindex TYPE sy-tabix.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_grid.
CALL METHOD lr_grid->check_changed_data.
rs_selfield-refresh = 'X'.
CASE r_ucomm.
WHEN '&PRQUO'.
DATA: i TYPE i VALUE 0.
LOOP AT it_vbak WHERE che EQ 'X'.
i = i + 1.
ENDLOOP.
IF i = 0.
MESSAGE:'请选择需要打印的列' TYPE 'E'.
ENDIF.
CLEAR itab.
REFRESH itab[].
CLEAR it_vbak1.
REFRESH it_vbak1[].
p_vbeln = ''.
p_num = 1.
p_flag = 0.
PERFORM getdetaildata.
PERFORM separateprint.
ENDCASE.
CLEAR r_ucomm.
ENDFORM. "user_com
*&---------------------------------------------------------------------*
*& Form separateprint
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM separateprint.
CLEAR gt_sf.
REFRESH gt_sf[].
DESCRIBE TABLE itab LINES g_lines.
LOOP AT itab WHERE cursornum >= p_num AND cursornum <= g_lines.
IF p_num <= g_lines.
IF p_flag = 0.
p_vbeln = itab-vbeln.
ENDIF.
IF itab-vbeln EQ p_vbeln.
gt_sf = itab.
APPEND gt_sf.
p_num = p_num + 1.
p_flag = 1.
IF p_num > g_lines.
PERFORM printdata. "只选中一条报价单打印时
ENDIF.
ELSE. "选中多条报价单打印时
p_num = p_num + 1.
p_flag = 0.
PERFORM printdata.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM. "separateprint
*&---------------------------------------------------------------------*
*& Form printdata
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM printdata.
DATA: f_index LIKE sy-tabix.
DATA: lines_len TYPE i.
DATA: ls_control_parameters TYPE ssfctrlop.
DATA: ls_output_options TYPE ssfcompop.
DATA: l_smf_name TYPE rs38l_fnam.
SORT gt_sf BY vbeln.
c_form_name = 'ZSDSF001'. "对应的smartform的名称
ls_output_options-tdimmed = 'X'.
ls_output_options-tdcopies = '1'.
ls_output_options-tdnoprint = ''.
ls_output_options-tddelete = 'X'.
ls_control_parameters-no_dialog = ''.
ls_control_parameters-preview = 'X'.
ls_control_parameters-langu = '1'.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME' "这个函数主要用来取你要调用的function module
EXPORTING
formname = c_form_name "将smartform赋值给formname
IMPORTING
fm_name = l_smf_name.
CALL FUNCTION l_smf_name "调用smartform,这里是以function的方式和smartform交互
EXPORTING
control_parameters = ls_control_parameters
output_options = ls_output_options
user_settings = 'X'
TABLES
it_tab = gt_sf[] "将内表的内容传递到smartfrom
EXCEPTIONS
formatting_error = 1
internal_error = 2
send_error = 3
user_canceled = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
CLEAR gt_sf.
REFRESH gt_sf[].
PERFORM separateprint.
ENDFORM. "printdata