现在的位置: 首页 > 综合 > 正文

打印销售报价单

2013年08月14日 ⁄ 综合 ⁄ 共 11983字 ⁄ 字号 评论关闭

*&---------------------------------------------------------------------*
*& Report  ZSDR001
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zsdr001.

TYPE-POOLS:slis.
TABLES:vbakvbapvbepkonvkonp.

DATAitab LIKE TABLE OF zsdsf01 WITH HEADER LINE.
DATAgt_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.

DATABEGIN 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.

DATAp_vbeln TYPE vbak-vbeln.
DATAp_num TYPE i.
DATAp_flag TYPE i.
DATAg_lines TYPE i.

DATA:  c_form_name       TYPE tdsfname ,
       c_form_title      TYPE string.

DATAgv_title TYPE lvc_title.
DATAgs_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-OPTIONSs_vkorg FOR vbak-vkorg.    "销售组织
SELECT-OPTIONSs_vtweg FOR vbak-vtweg.   "分销渠道
SELECT-OPTIONSs_kunnr FOR vbak-kunnr.     "客户编号
SELECT-OPTIONSs_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 LEFT JOIN vbap AS 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.
    DATAnum TYPE 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 denddate TYPE d.
    SELECT SINGLE angdt bnddt INTO (startdateenddateFROM vbak WHERE vbeln itab-vbeln.
    DATAaa 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.

  DATAlr_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'.
      DATATYPE VALUE 0.
      LOOP AT it_vbak WHERE che EQ 'X'.
        1.
      ENDLOOP.
      IF 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.
  DATAf_index LIKE sy-tabix.
  DATAlines_len TYPE i.
  DATAls_control_parameters  TYPE ssfctrlop.
  DATAls_output_options      TYPE ssfcompop.
  DATAl_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

抱歉!评论已关闭.