Chinaunix首页 | 论坛 | 博客
  • 博客访问: 685322
  • 博文数量: 194
  • 博客积分: 7067
  • 博客等级: 少将
  • 技术积分: 2008
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-09 14:48
个人简介

我很好

文章分类

全部博文(194)

文章存档

2019年(1)

2018年(1)

2017年(3)

2015年(2)

2012年(2)

2011年(1)

2010年(27)

2009年(15)

2008年(142)

分类: WINDOWS

2008-06-21 14:22:26

  TYPE-POOLS: slis,vrm, sbdst, soi.

TABLES: likp, kna1,lips,vbap,mara,konv.

DATA: gd_fieldcat TYPE slis_t_fieldcat_alv.
DATA: sla TYPE slis_layout_alv ,
      ivariant LIKE disvariant,
      i_repid LIKE sy-repid .
CONSTANTS document_name(30VALUE 'SD01'.
CONSTANTS inplace VALUE 'X'.
DATA: flag .
DATA: g_def_active_sheetname(50VALUE 'Sheet1'.

DATA: container   TYPE REF TO cl_gui_custom_container,
      control     TYPE REF TO i_oi_container_control,
      document    TYPE REF TO i_oi_document_proxy,
      spreadsheet TYPE REF TO i_oi_spreadsheet,
      error       TYPE REF TO i_oi_error,
      errors TYPE REF TO i_oi_error OCCURS 0 WITH HEADER LINE.

CONTROLS:   exceldata TYPE TABLEVIEW USING SCREEN 0100.
DATA:       tablename(10), okcode(15),
            row(4), column(4), data(39).
* spreadsheet interface structures for Excel data input
DATA: rangeitem TYPE soi_range_item.
DATAranges TYPE soi_range_list.
DATA: excel_input TYPE soi_generic_table.
DATA: excel_input_wa TYPE soi_generic_item.
DATA: initialized(1), retcode TYPE soi_ret_string.
DATA: item_url(256), already_done, newname(40).
DATA  document_type(80).
DATA: app TYPE vrm_id, applist TYPE vrm_values.
DATA: excel(80VALUE 'Excel.Sheet'.
DATA: line_count TYPE i,
      column_count TYPE i.

DATABEGIN OF table_lines OCCURS 0.
        INCLUDE STRUCTURE tline.
DATAEND   OF table_lines.
DATA:  g_prodh LIKE mvke-prodh. "产品层次

*---------------------------------*
*data define
*---------------------------------*
DATABEGIN OF it_itab OCCURS 0,
    vkorg LIKE likp-vkorg,
    kunnr LIKE likp-kunnr,
    name1 LIKE kna1-name1,
    wadat_ist LIKE likp-wadat_ist,
    matnr LIKE lips-matnr,
    arktx LIKE lips-arktx,
*    lfimg LIKE lips-lfimg,
    lfimg TYPE i         ,
    vbeln LIKE lips-vbeln,
    posnr LIKE lips-posnr,
    vgbel LIKE lips-vgbel,
*    netpr LIKE ekpo-netpr,
    netpr TYPE p DECIMALS 5,
    peinh LIKE ekpo-peinh,
    menge LIKE ekpo-menge,
    bedat LIKE ekko-bedat,
    vgpos LIKE lips-vgpos,
    cob TYPE p DECIMALS 5,
    smtz  TYPE p DECIMALS 5,
    cobz  TYPE p DECIMALS 5,
    meno(120TYPE c,
    flag TYPE c ,
  END OF it_itab.

DATABEGIN OF it_chart OCCURS 0 ,
        name1 LIKE kna1-name1  ,
        smtz TYPE p DECIMALS 5 ,
      END OF it_chart .

SELECTION-SCREEN BEGIN OF BLOCK blk01 WITH FRAME TITLE text-001.
SELECT-OPTIONS:
  s_vkorg  FOR likp-vkorg DEFAULT '1000'.
PARAMETERS:
  p_lfart  LIKE likp-lfart DEFAULT 'LF' OBLIGATORY.
SELECT-OPTIONS:
  s_kunnr FOR kna1-kunnr,
  s_wadat FOR likp-wadat_ist,
  s_matnr FOR lips-matnr,
  s_vbeln FOR likp-vbeln.
PARAMETERS : cob(10TYPE c OBLIGATORY DEFAULT '2' .
SELECTION-SCREEN END OF BLOCK blk01.
PARAMETERS :
    p_chart TYPE c AS CHECKBOX DEFAULT 'X' .

INITIALIZATION .
*  CASE sy-tcode.
*    WHEN 'ZSD14' .
*      p_lfart = 'ZLCC'.
*    WHEN 'ZSD15'.
*      p_lfart = 'LF'.
*  ENDCASE.
*
*AT SELECTION-SCREEN OUTPUT.
*  IF sy-tcode <> 'SE38'.
*    LOOP AT SCREEN.
*      IF screen-name = 'P_LFART'.
*        screen-input = '0'.
*        MODIFY SCREEN.
*      ENDIF.
*    ENDLOOP.
*  ENDIF.

*SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
*PARAMETERS:
*    p_n RADIOBUTTON GROUP rad1  DEFAULT 'X' ,
*    p_w RADIOBUTTON GROUP rad1 .
*SELECTION-SCREEN END OF BLOCK b2.
*-------------------------------------*
*start of selection
*-------------------------------------*
START-OF-SELECTION.
  IF p_lfart <> 'ZLCC' AND p_lfart <> 'LF'.
    MESSAGE i000(oo) WITH '订单类型必须为LF或者ZLCC'.
    EXIT.
  ENDIF.
  PERFORM frm_get_data.
  PERFORM fixdata.
  PERFORM get_chart_data.
  IF p_chart = ''.
    PERFORM outdata.
  ELSE.
    CALL SCREEN 100.
  ENDIF.
*----------------------------------------*
*form frm-get-data
*----------------------------------------*
FORM frm_get_data.
  SELECT
      likp~vkorg
      likp~kunnr
      likp~wadat_ist
      likp~vbeln
      lips~posnr
      lips~matnr
      lips~arktx
      lips~lfimg
      lips~vgbel
      lips~vgpos
      kna1~name1
    INTO CORRESPONDING FIELDS OF TABLE it_itab
    FROM likp
    INNER JOIN lips ON likp~vbeln = lips~vbeln
    INNER JOIN kna1 ON likp~kunnr = kna1~kunnr
    WHERE likp~vkorg IN s_vkorg    AND
          likp~lfart = p_lfart     AND
          likp~kunnr IN s_kunnr    AND
          likp~wadat_ist IN s_wadat  AND
          likp~vbeln IN s_vbeln.
ENDFORM.                    "frm_get_data

*&---------------------------------------------------------------------*
*&      Form  fixdata
*&---------------------------------------------------------------------*
FORM fixdata.
  DATA: tmpvbeln LIKE vbap-vbeln ,
        tmpposnr LIKE vbap-posnr ,
        tmpknumv LIKE vbak-knumv .

  LOOP AT it_itab.
    CLEAR g_prodh.
    CLEAR:tmpvbeln ,tmpposnr ,tmpknumv .
    IF p_lfart = 'ZLCC'.
      SELECT SINGLE netpr peinh menge
      INTO (it_itab-netpr,it_itab-peinh,it_itab-menge)
      FROM ekpo
      WHERE ekpo~ebeln = it_itab-vgbel AND
            ekpo~ebelp = it_itab-vgpos+1(5).

      SELECT SINGLE bedat INTO it_itab-bedat
      FROM ekko
      WHERE ekko~ebeln = it_itab-vgbel.
    ELSE.
      SELECT SINGLE vbak~knumv vbap~vbeln vbap~posnr
      INTO (tmpknumv,tmpvbeln,tmpposnr)
      FROM vbak INNER JOIN vbap ON vbak~vbeln = vbap~vbeln
      WHERE vbak~auart = 'ZOR1'        AND
            vbap~vbeln = it_itab-vgbel AND
            vbap~posnr = it_itab-vgpos    .
      IF sy-subrc = 0 .
        SELECT SINGLE *  "kbetr kumza INTO (it_itab-netpr,it_itab-peinh)
        FROM konv
        WHERE knumv = tmpknumv AND
              kschl = 'ZSMT'.
        IF sy-subrc = 0 .
          it_itab-netpr = konv-kbetr.
          it_itab-peinh = konv-kumza.
        ENDIF.
      ELSE.
        it_itab-flag = 'D'.
      ENDIF.
    ENDIF.

    IF it_itab-peinh <> 0.
      it_itab-netpr = it_itab-netpr / it_itab-peinh.
    ENDIF.

*COB单价
    it_itab-cob = cob.

*产品层次
    SELECT SINGLE prodh INTO g_prodh
           FROM mvke
           WHERE matnr = it_itab-matnr  AND
                 vkorg = it_itab-vkorg.
    IF g_prodh+10(8) = '00000001'.
      it_itab-netpr = it_itab-netpr - cob.
    ELSE.
      it_itab-cob = 0 .
    ENDIF.
*COB总金额
    it_itab-cobz = it_itab-cob * it_itab-lfimg.
*SMT总金额
    it_itab-smtz = it_itab-netpr * it_itab-lfimg.


*读取文本(贴装点数)
    PERFORM read_text USING it_itab-matnr
                            it_itab-meno.
    MODIFY it_itab.
    CLEAR it_itab.
  ENDLOOP.
  DELETE it_itab WHERE flag = 'D'.
ENDFORM.                    " fixdata

*&---------------------------------------------------------------------*
*&      Form  get_chart_data
*&---------------------------------------------------------------------*
FORM get_chart_data.
  DATA: tmpcobz TYPE p DECIMALS 5 .

  SORT it_itab BY name1.
  LOOP AT it_itab.
    MOVE-CORRESPONDING it_itab TO it_chart.
    COLLECT it_chart.
    tmpcobz = tmpcobz + it_itab-cobz.
  ENDLOOP.
  it_chart-name1 = 'COB'.
  it_chart-smtz = tmpcobz .
  APPEND it_chart.
ENDFORM.                    " get_chart_data

*&------------------------------------------------------*
*&      Form  read_text
*&------------------------------------------------------*
FORM read_text USING  matnr LIKE it_itab-matnr
                      memo.
  DATA: tdname LIKE thead-tdname.
  CONCATENATE  matnr '880300' INTO tdname.

  CLEAR memo.
  CLEAR table_lines.
  REFRESH table_lines.
  CALL FUNCTION 'READ_TEXT'
    EXPORTING
      id                      = '0001'
      language                = '1'
      name                    = tdname
      object                  = 'MVKE'
    TABLES
      lines                   = table_lines
    EXCEPTIONS
      id                      = 1
      language                = 2
      name                    = 3
      not_found               = 4
      object                  = 5
      reference_check         = 6
      wrong_access_to_archive = 7
      OTHERS                  = 8.
*    LOOP AT table_lines .
*      CONCATENATE memo table_lines-tdline INTO memo SEPARATED BY '|' .
*    ENDLOOP .
*    IF memo+0(1) = '|' . SHIFT memo . ENDIF .
*    CLEAR table_lines .
*    REFRESH table_lines .
  READ TABLE table_lines INDEX 1.
  IF sy-subrc = 0 .
    memo = table_lines-tdline .
  ELSE.
    memo = ''.
  ENDIF.

ENDFORM.                    "READ_TEXT

*&---------------------------------------------------------------------*
*&      Form  outdata
*&---------------------------------------------------------------------*
FORM outdata.
  PERFORM fieldcat_init .
  sla-colwidth_optimize = 'X'.
  i_repid = sy-repid.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program      = i_repid
      it_fieldcat             = gd_fieldcat[]
      i_save                  = 'A'
      is_variant              = ivariant
      is_layout               = sla
      i_callback_user_command = 'USER_COMMAND'
    TABLES
      t_outtab                = it_itab[].
ENDFORM.                    " outdata
*---------------------------------------------------------------------*
*       FORM fieldcat_init                                            *
*---------------------------------------------------------------------*
FORM fieldcat_init .
  PERFORM frm_catlg_set USING:  'VBELN'  '交货单号',
                                'POSNR'  '交货单项目'.
  IF p_lfart = 'ZLCC'.
    PERFORM frm_catlg_set USING:   'VGBEL'  '采购单号',
                                   'VGPOS'  '采购单项目',
                                   'BEDAT'  '采购订单日期',
                                   'MENGE'  '采购订单数量'.
  ELSE.
    PERFORM frm_catlg_set USING:   'VGBEL'  '销售单号',
                                   'VGPOS'  '销售单项目'.
  ENDIF.
  PERFORM frm_catlg_set USING:  'KUNNR'  '客户代码',
                                'NAME1'  '客户名称',
                                'MATNR'  '物料编号',
                                'ARKTX'  '规格型号',
                                'WADAT_IST'  '实际发货日期',
                                'LFIMG'  '实际发货数量',
                                'MENO'  '贴装点数',
                                'NETPR'  'SMT单价',
                                'SMTZ'  'SMT总金额',
                                'COB'  'COB单价',
                                'COBZ'  'COB总金额' .
ENDFORM.                    "fieldcat_init

*---------------------------------------------------------------------*
*       FORM frm_catlg_set                                            *
*---------------------------------------------------------------------*
FORM frm_catlg_set USING p_field
                         p_text.
  DATA: ls_fieldcat TYPE slis_fieldcat_alv.

  ls_fieldcat-fieldname     =  p_field.
  ls_fieldcat-seltext_l     =  p_text.

  APPEND ls_fieldcat TO gd_fieldcat .
  CLEAR ls_fieldcat .
ENDFORM.                    "frm_catlg_set

*---------------------------------------------------------------------*
*       FORM user_command                                             *
*---------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
                    rs_selfield TYPE slis_selfield.
  READ TABLE it_itab INDEX rs_selfield-tabindex.
  CASE r_ucomm.
    WHEN '&IC1'"双击
      IF rs_selfield-fieldname = 'VBELN'.
        SET PARAMETER ID 'VL' FIELD it_itab-vbeln .
        CALL TRANSACTION 'VL03N' AND SKIP FIRST SCREEN .
      ELSEIF rs_selfield-fieldname = 'VGBEL' AND p_lfart = 'ZLCC' .
        CALL FUNCTION 'ME_DISPLAY_PURCHASE_DOCUMENT'
          EXPORTING
            i_ebeln              = it_itab-vgbel
          EXCEPTIONS
            not_found            = 1
            no_authority         = 2
            invalid_call         = 3
            preview_not_possible = 4
            OTHERS               = 5.
      ELSEIF rs_selfield-fieldname = 'VGBEL' AND p_lfart <> 'ZLCC' .
        SET PARAMETER ID 'AUN' FIELD it_itab-vgbel .
        CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN .
      ENDIF.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
  ENDCASE.
ENDFORM"user_com

*&-------------------------------------------------------------------
*&      Module  OUTPUT_TO_EXCEL  OUTPUT
*&-------------------------------------------------------------------
MODULE output_to_excel OUTPUT.
  SET PF-STATUS '100'.
  IF flag = space .
    PERFORM create_basic_objects USING ''  '' '' '' document_name.
    PERFORM output_to_excel.
  ENDIF.

ENDMODULE.                 " OUTPUT_TO_EXCEL  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  EXIT  INPUT
*&---------------------------------------------------------------------*
MODULE exit INPUT.
  flag = 'X'.
  CASE okcode.
    WHEN 'TESTMAC'.
      CALL METHOD document->execute_macro
        EXPORTING
          macro_string = '模块1.TestMac'
        IMPORTING
          error        = errors.
    WHEN 'STOP' .
      IF NOT document IS INITIAL.
        CALL METHOD document->close_document.
        FREE document.
      ENDIF.
      IF NOT control IS INITIAL.
        CALL METHOD control->destroy_control.
        FREE control.
      ENDIF.
      LEAVE PROGRAM.
    WHEN 'BACK' .
      IF NOT document IS INITIAL.
        CALL METHOD document->close_document.
        FREE document.
      ENDIF.
      IF NOT control IS INITIAL.
        CALL METHOD control->destroy_control.
        FREE control.
      ENDIF.
      " LEAVE TO SCREEN 1000.
      SET SCREEN 0.  " quit the program
      "set screen 1000.
  ENDCASE.
ENDMODULE.                 " EXIT  INPUT
*---------------------------------------------------------------------*
*       FORM create_basic_objects                                     *
*---------------------------------------------------------------------*
FORM  create_basic_objects USING p_app_name
                                 p_classname
                                 p_classtype
                                 p_obj_key
                                 p_docname.

  CHECK initialized IS INITIAL.
* first get the SAP DOI i_oi_container_control interface
  CALL METHOD
    c_oi_container_control_creator=>get_container_control
    IMPORTING
      control = control
      error   = error.
* check no errors occured
  CALL METHOD error->raise_message
    EXPORTING
      type = 'E'.
  CREATE OBJECT container
    EXPORTING
      container_name = 'CONTAINER'.
  DATA l_app_name(200).
  IF p_app_name IS INITIAL.
    l_app_name = 'R/3 Reporter'.
  ELSE.
    l_app_name = p_app_name.
  ENDIF.
  CALL METHOD control->init_control
    EXPORTING
      r3_application_name      = l_app_name
      inplace_enabled          = inplace
      inplace_scroll_documents = 'X'
      parent                   = container
      register_on_close_event  = 'X'
      register_on_custom_event = 'X'
      no_flush                 = 'X'
    IMPORTING
      error                    = errors.
* save error object in collection
  APPEND errors.
  CLEAR item_url.
  DATA: bds_instance TYPE REF TO cl_bds_document_set.
  DATA: doc_signature TYPE sbdst_signature,
        wa_doc_signature LIKE LINE OF doc_signature,
        doc_components TYPE sbdst_components,
        doc_uris TYPE sbdst_uri,
        wa_doc_uris LIKE LINE OF doc_uris.

  DATA: doc_classname TYPE sbdst_classname VALUE 'ZEXCEL',
        doc_classtype TYPE sbdst_classtype VALUE 'OT',
        doc_object_key TYPE sbdst_object_key VALUE 'ZEXCEL'.

  IF  NOT (  p_classname IS INITIAL OR p_classtype IS INITIAL
           OR p_obj_key IS INITIAL ).
    doc_classname =  p_classname.
    doc_classtype =  p_classtype.
    doc_object_key = p_obj_key.
  ENDIF.

  wa_doc_signature-prop_name = 'DESCRIPTION'.
  app = 'excel'.
  IF app = 'excel'.  " default value.
    document_type = excel.
    wa_doc_signature-prop_value = p_docname.
  ELSE.
*    document_type = lotus.
*    wa_doc_signature-prop_value = 'SPREAD123'.
  ENDIF.
  APPEND wa_doc_signature TO doc_signature.
  CREATE OBJECT bds_instance.
  CALL METHOD bds_instance->get_info
    EXPORTING
      classname  = doc_classname
      classtype  = doc_classtype
      object_key = doc_object_key
    CHANGING
      components = doc_components
      signature  = doc_signature.

  CALL METHOD bds_instance->get_with_url
    EXPORTING
      classname  = doc_classname
      classtype  = doc_classtype
      object_key = doc_object_key
    CHANGING
      uris       = doc_uris
      signature  = doc_signature.

  FREE bds_instance.

  READ TABLE doc_uris INTO wa_doc_uris INDEX 1.

  item_url = wa_doc_uris-uri.

* ask the SAP DOI container for a i_oi_document_proxy for Excel
  CALL METHOD control->get_document_proxy
    EXPORTING
      document_type  = 'Excel.Sheet'
      no_flush       = 'X'
    IMPORTING
      document_proxy = document
      error          = errors.
  APPEND errors.

* open a document saved in business document service.
  CALL METHOD document->open_document
    EXPORTING
      open_inplace = inplace
      document_url = item_url.

  DATA: has TYPE i.
  CALL METHOD document->has_spreadsheet_interface
    EXPORTING
      no_flush     = ''
    IMPORTING
      is_available = has
      error        = errors.
  APPEND errors.
  CALL METHOD document->get_spreadsheet_interface
    EXPORTING
      no_flush        = ' '
    IMPORTING
      sheet_interface = spreadsheet
      error           = errors.
  APPEND errors.
* Activate  sheet 1
  CALL METHOD spreadsheet->select_sheet
    EXPORTING
      name     = g_def_active_sheetname
      no_flush = ''
    IMPORTING
      error    = errors.
  APPEND errors.

  LOOP AT errors.
    CALL METHOD errors->raise_message
      EXPORTING
        type = 'E'.
  ENDLOOP.
  FREE errors.

  initialized = 'X'.

ENDFORM.              " CREATE_BASIC_OBJECTS

*---------------------------------------------------------------------*
*       FORM output_to_excel                                          *
*---------------------------------------------------------------------*
FORM output_to_excel.
  DATA: tmpdate(10TYPE c.
  column_count = 2.

  it_chart-name1 = 'Test1'.
  it_chart-smtz  = 20.
  APPEND it_chart.
  it_chart-name1 = 'Test2'.
  it_chart-smtz  = 30.
  APPEND it_chart.
  it_chart-name1 = 'Test3'.
  it_chart-smtz  = 40.
  APPEND it_chart.

  LOOP AT it_chart.
    line_count = 2.
    PERFORM fill_cell USING line_count
                            column_count
                            it_chart-name1.
    line_count = line_count + 1.
    PERFORM fill_cell USING line_count
                            column_count
                            it_chart-smtz.
    column_count = column_count + 1.
  ENDLOOP.

ENDFORM.                    "output_to_excel
*---------------------------------------------------------------------*
*       FORM fill_cell                                                *
*---------------------------------------------------------------------*
FORM fill_cell  USING i j val.
  DATA: columns_number TYPE i,
        rows_number    TYPE i.

  columns_number = 1.
  rows_number = 1.

  CALL METHOD spreadsheet->insert_range_dim
    EXPORTING
      name     = 'cell'
      no_flush = 'X'
      top      = i
      left     = j
      rows     = rows_number
      columns  = columns_number
    IMPORTING
      error    = errors.
  APPEND errors.

  REFRESHranges, excel_input.
  rangeitem-name = 'cell'.
  rangeitem-columns = 1.
  rangeitem-rows = 1.
  APPEND rangeitem TO ranges.

  excel_input_wa-column = 1.
  excel_input_wa-row = 1.
  excel_input_wa-value = val.
  APPEND excel_input_wa TO excel_input.

* set data
  CALL METHOD spreadsheet->set_ranges_data
    EXPORTING
      ranges   = ranges
      contents = excel_input
      no_flush = 'X'
    IMPORTING
      error    = errors.
  APPEND errors.

  CALL METHOD spreadsheet->fit_widest
    EXPORTING
      name     = space
      no_flush = 'X'.

  REFRESHranges, excel_input.

ENDFORM.                    "fill_cell
阅读(1744) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~