刘波的学习园地

让我们一起进步!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ALV输出,双击调用事务***

Posted on 2006-07-04 23:22  Loes  阅读(1644)  评论(0)    收藏  举报

report zsd_soposto no standard page heading message-id zsd.
type-pools: slis.
tables:vbak,vbkd,vbap,kna1,vbfa,vbpa,ekko,ekpo,ekbe,afko,afpo.
types: begin of strc,
       bstkd like vbkd-bstkd,   "合同号@项目名称
       name1 like kna1-name1,   "付款方
       netwr like vbak-netwr,   "工程价格
       vbeln like vbap-vbeln,   "销售订单号
       posnr like vbap-posnr,   "销售订单项目
       matnr like vbap-matnr,   "行项目物料号
       kwmeng like vbap-kwmeng, "屏体数量
       aufnr like afpo-aufnr,   "生产订单号
       strmp like afpo-strmp,   "生产订单开始日期
       vbeln1 like lips-vbeln,  "工程交货单号
       erdat1 like lips-erdat,  "工程交货单创建日期
       ebeln like ekko-ebeln,   "对应移库单号
       aedat like ekko-aedat,  "移库单创建日期
       vbeln2 like lips-vbeln,  "移库单交货单号
       erdat2 like lips-erdat,  "移库单交货单创建日期
       contract(20) type c,     "合同号
       project(40) type c,      "工程名称
       end of strc.
data: itab1 type strc occurs 0 with header line,
      temp_tab like table of ekbe with header line.

*"Variants
data: temp_con like vbkd-bstkd,
      temp_con1 like vbkd-bstkd,
      temp_con2 like vbkd-bstkd,
      temp_con3 like vbkd-bstkd,
      temp_pro3 like vbkd-bstkd,
      temp_bstkd like vbkd-bstkd.

****about alv
data: it_fieldcat type slis_t_fieldcat_alv,
      wa_fieldcat type slis_fieldcat_alv,
      myindex like sy-tabix,
      gs_layout type slis_layout_alv,
      g_exit_caused_by_caller,
      gs_exit_caused_by_user type slis_exit_by_user,
      fieldcat type slis_t_fieldcat_alv,
      fieldcat_ln like line of fieldcat,
      g_repid like sy-repid,
      gs_variant like disvariant,
      g_save.
data:
    gt_events      type slis_t_event,
    gt_list_top_of_page type slis_t_listheader,
    g_status_set   type slis_formname value 'PF_STATUS_SET',
    g_user_command type slis_formname value 'USER_COMMAND',
    g_top_of_page  type slis_formname value 'TOP_OF_PAGE',
    g_top_of_list  type slis_formname value 'TOP_OF_LIST',
    g_end_of_list  type slis_formname value 'END_OF_LIST'.
g_repid = sy-repid.
define add_field.
  wa_fieldcat-tabname = 'ITAB1'.
  wa_fieldcat-fieldname = &1.
  wa_fieldcat-seltext_m = &2.
  wa_fieldcat-outputlen = &3.
  append wa_fieldcat to it_fieldcat.
end-of-definition.

selection-screen: skip 1.
selection-screen: begin of block input with frame title text-001,
                  skip 1.
selection-screen: begin of block so with frame title text-002.
parameters: so_con(20) type c,     "合同号
            so_pro(40) type c.      "工程名称
select-options: so_auart for vbak-auart, "销售单据类型
                so_vkbur for vbak-vkbur, "销售办公室
                so_vkgrp for vbak-vkgrp, "销售组
                so_vbeln for vbak-vbeln, "销售订单号
                so_erdat for vbak-erdat, "销售订单创建日期
                so_kunnr for vbpa-kunnr, "付款方
                so_matnr for vbap-matnr, "物料编码
                so_werks for vbap-werks.   "工厂
selection-screen: end of block so.
selection-screen: skip 1.
selection-screen: begin of block sto with frame title text-003.
select-options: so_ebeln for ekko-ebeln, "移库单编号
                so_aedat for ekko-aedat. "移库单创建日期
selection-screen: end of block sto.
selection-screen: skip 1.
selection-screen: begin of block po with frame title text-004.
select-options: so_aufnr for afpo-aufnr,  "生产订单号
                so_strmp for afpo-strmp.  "生产订单基本开始日期
selection-screen: end of block po.
selection-screen: end of block input.
selection-screen: skip 1.
selection-screen: begin of block output with frame title text-005.
parameters: so as checkbox default 'X',
            solf as checkbox default 'X',
            sto as checkbox default 'X',
            stolf as checkbox default 'X',
            po as checkbox default 'X'.
selection-screen: end of block output.

****main program
if so_aufnr[] is initial and so_strmp[] is initial .
  perform so_search.
*ELSEIF so_ebeln IS INITIAL OR so_aedat IS INITIAL.
*  MESSAGE i001.
*  PERFORM sto_search.
else.
  perform po_search.
  write: 'PO'.
endif.
perform output.
****end main program

*---------------------------------------------------------------------*
*       FORM so_search                                                *
*---------------------------------------------------------------------*
*       search by so                                                  *
*---------------------------------------------------------------------*
form so_search.
**********get so data
  concatenate '%' so_con '%' into temp_con3.  "模糊合同号
  concatenate '%' so_pro '%' into temp_pro3.  "模糊工程名称
select vbkd~bstkd kna1~name1 vbak~netwr vbap~vbeln vbap~posnr vbap~matnr
                                  vbap~kwmeng  into table itab1
                                              from vbak inner join vbpa
                                             on vbak~vbeln = vbpa~vbeln
                                                        inner join kna1
                                             on vbpa~kunnr = kna1~kunnr
                                                        inner join vbkd
                                             on vbak~vbeln = vbkd~vbeln
                                                        inner join vbap
                                             on vbak~vbeln = vbap~vbeln
                                           where  vbkd~posnr = '000000'
                                              and vbpa~posnr = '000000'
                          and vbap~abgru = space         "行项目未被拒绝
                            and vbak~auart in so_auart     "销售单据类型
                              and vbak~vbeln in so_vbeln     "销售订单号
                              and vbak~vkbur in so_vkbur     "销售办公室
                                  and vbak~vkgrp in so_vkgrp     "销售组
                        and vbak~erdat in so_erdat     "销售订单创建日期
                                  and vbpa~kunnr in so_kunnr     "付款方
                                    and vbpa~parvw = 'RG'
                                and vbap~matnr in so_matnr     "物料编码
                                    and vbap~werks in so_werks     "工厂
*                    and vbke~bstkd  cn ''.
                         and vbkd~bstkd like temp_pro3  "合同号@项目名称
                         and vbkd~bstkd like temp_con3. "合同号@项目名称
  loop at itab1.
    split itab1-bstkd  at '@' into itab1-contract itab1-project.
    itab1-netwr = itab1-netwr * '1.17'.
    modify itab1.
  endloop.
**********get sto data
  if sto ne space.
    loop at itab1.
****delete contract's '('and ')'
      temp_con = itab1-contract.
*      CHECK itab1-contract NE space.
     if itab1-contract = space and so_ebeln[] is initial and so_aedat[]
          is initial.
        continue.
      endif.
      split temp_con at '(' into temp_con1 temp_con2.
      concatenate temp_con1 temp_con2 into temp_con.
      split temp_con at ')' into temp_con1 temp_con2.
      concatenate temp_con1 temp_con2 into temp_con.
      temp_con1 = temp_con.
      temp_con2 = temp_con.
      translate temp_con1 to upper case.
      translate temp_con2 to lower case.
      select distinct ebeln from ekpo into itab1-ebeln
            where ebeln in so_ebeln and ( bednr =
             temp_con1 or bednr = temp_con2 ).
        select single aedat from ekko into itab1-aedat
             where ebeln = itab1-ebeln and aedat in so_aedat.
        check sy-subrc = 0.
        modify itab1.
      endselect.
      if itab1-ebeln = space.
        if not ( so_ebeln[] is initial )
          or not ( so_aedat[] is initial ).
          delete itab1.
        endif.
      endif.
    endloop.
  endif.
**********get po data
  if po ne space.
    loop at itab1.
     select single aufnr strmp from afpo into (itab1-aufnr,itab1-strmp)
where kdauf = itab1-vbeln and kdpos = itab1-posnr and aufnr in so_aufnr
                      and strmp in so_strmp.
      check sy-subrc = 0.
      modify itab1.
    endloop.
  endif.
**********get so's lf data
  if solf ne space.
    loop at itab1.
   select single vbeln erdat from vbfa into (itab1-vbeln1,itab1-erdat1)
    where vbelv = itab1-vbeln and posnv = itab1-posnr and vbtyp_n = 'J'.
      check sy-subrc = 0.
      modify itab1.
    endloop.
  endif.
**********get sto's lf data
  if stolf ne space.
    loop at itab1.
      select distinct belnr budat from ekbe  into (itab1-vbeln2,
      itab1-erdat2) where ebeln = itab1-ebeln and bewtp = 'L'.
      endselect.
*    ORDER BY budat DESCENDING.
      check sy-subrc = 0.
      modify itab1.
    endloop.
  endif.
endform.

*---------------------------------------------------------------------*
*       FORM po_search                                                *
*---------------------------------------------------------------------*
*       search by po                                                  *
*---------------------------------------------------------------------*
form po_search.
  concatenate '%' so_con '%' into temp_con3.  "模糊合同号
  concatenate '%' so_pro '%' into temp_pro3.  "模糊工程名称
**********get so & po data
select vbkd~bstkd kna1~name1 vbak~netwr vbap~vbeln vbap~posnr vbap~matnr
                     vbap~kwmeng afpo~aufnr afpo~strmp into table itab1
                                              from vbak inner join vbpa
                                             on vbak~vbeln = vbpa~vbeln
                                                        inner join kna1
                                             on vbpa~kunnr = kna1~kunnr
                                                        inner join vbkd
                                             on vbak~vbeln = vbkd~vbeln
                                                        inner join vbap
                                             on vbak~vbeln = vbap~vbeln
                                                        inner join afpo
                                             on afpo~kdauf = vbak~vbeln
                                            and afpo~kdpos = vbap~posnr
                                           where  vbkd~posnr = '000000'
                                              and vbpa~posnr = '000000'
                          and vbap~abgru = space         "行项目未被拒绝
                            and vbak~auart in so_auart     "销售单据类型
                              and vbak~vbeln in so_vbeln     "销售订单号
                              and vbak~vkbur in so_vkbur     "销售办公室
                                  and vbak~vkgrp in so_vkgrp     "销售组
                        and vbak~erdat in so_erdat     "销售订单创建日期
                                  and vbpa~kunnr in so_kunnr     "付款方
                                                  and vbpa~parvw = 'RG'
                                and vbap~matnr in so_matnr     "物料编码
                                    and vbap~werks in so_werks     "工厂
*                    and vbke~bstkd  cn ''.
                         and vbkd~bstkd like temp_pro3  "合同号@项目名称
                         and vbkd~bstkd like temp_con3  "合同号@项目名称
                              and afpo~aufnr in so_aufnr     "生产订单号
                            and afpo~strmp in so_strmp.    "订单开始日期
  loop at itab1.
    split itab1-bstkd  at '@' into itab1-contract itab1-project.
    itab1-netwr = itab1-netwr * '1.17'.
    modify itab1.
  endloop.
**********get so's lf data
  if solf ne space.
    loop at itab1.
   select single vbeln erdat from vbfa into (itab1-vbeln1,itab1-erdat1)
    where vbelv = itab1-vbeln and posnv = itab1-posnr and vbtyp_n = 'J'.
      check sy-subrc = 0.
      modify itab1.
    endloop.
  endif.
**********get sto data
  if sto ne space.
    loop at itab1.
****delete contract's '('and ')'
      temp_con = itab1-contract.
*      CHECK itab1-contract NE space.
      if itab1-contract = space and so_ebeln[] is initial and
        so_aedat[] is initial.
        continue.
      endif.
      split temp_con at '(' into temp_con1 temp_con2.
      concatenate temp_con1 temp_con2 into temp_con.
      split temp_con at ')' into temp_con1 temp_con2.
      concatenate temp_con1 temp_con2 into temp_con.
      temp_con1 = temp_con.
      temp_con2 = temp_con.
      translate temp_con1 to upper case.
      translate temp_con2 to lower case.
      select distinct ebeln from ekpo into itab1-ebeln
            where ebeln in so_ebeln and ( bednr =
             temp_con1 or bednr = temp_con2 ).
        select single aedat from ekko into itab1-aedat
             where ebeln = itab1-ebeln and aedat in so_aedat.
      endselect.
      check sy-subrc = 0.
      modify itab1.
    endloop.
  endif.
**********get sto's lf data
  if stolf ne space.
    loop at itab1.
      select distinct belnr budat from ekbe  into (itab1-vbeln2,
      itab1-erdat2) where ebeln = itab1-ebeln and bewtp = 'L'.
      endselect.
      check sy-subrc = 0.
      modify itab1.
    endloop.
  endif.
endform.
*---------------------------------------------------------------------*
*       FORM output                                                   *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
form output.
********output
*  add_field 'CONTRACT' '合同号' '20'.
  add_field 'CONTRACT' text-060 '20'.
  add_field 'PROJECT' '工程名称' '40'.
*add_field 'BSTKD' '合同号@项目名称' '35'.
  add_field 'NAME1' '付款方' '35'.
  add_field 'VBELN' '销售订单号' '10'.
  add_field 'MATNR' '行项目物料号' '12'.
  add_field 'KWMENG' '屏体数量' '15'.
  if po ne space.
    add_field 'AUFNR' '生产订单号' '12'.
    add_field 'STRMP' '生产订单开始日期' '16'.
  endif.
  if solf ne space.
    add_field 'VBELN1' '工程交货单号' '12'.
    add_field 'ERDAT1' '工程交货单创建日期' '18'.
  endif.
  if sto ne space.
    add_field 'EBELN' '最近移库单号' '12'.
    add_field 'AEDAT' '移库单创建日期' '14'.
  endif.
  if stolf ne space.
    add_field 'VBELN2' '移库单最近交货单号' '18'.
    add_field 'ERDAT2' '移库单交货单创建日期' '20'.
  endif.
  add_field 'NETWR' '工程价格' '15'.


  call function 'REUSE_ALV_LIST_DISPLAY'
       exporting
            i_buffer_active         = 'X'
            i_callback_program      = g_repid
            it_fieldcat             = it_fieldcat
            is_layout               = gs_layout
            i_callback_user_command = g_user_command
            i_save                  = g_save
            is_variant              = gs_variant
            it_events               = gt_events[]
       tables
            t_outtab                = itab1
       exceptions
            program_error           = 1
            others                  = 2.
  if sy-subrc <> 0.
    message id sy-msgid type sy-msgty number sy-msgno
    with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  endif.
endform.
*---------------------------------------------------------------------*
*       FORM user_command                                             *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  R_UCOMM                                                       *
*  -->  RS_SELFIELD                                                   *
*---------------------------------------------------------------------*
form user_command using r_ucomm like sy-ucomm
                  rs_selfield type slis_selfield.
  case r_ucomm.
    when '&IC1'.        " SAP standard code for double-clicking
      if rs_selfield-sel_tab_field = 'ITAB1-VBELN'.
        set parameter id 'AUN' field rs_selfield-value.
        call transaction 'VA03' and skip first screen.
      endif.
      if rs_selfield-sel_tab_field = 'ITAB1-AUFNR'.
        set parameter id 'ANR' field rs_selfield-value.
        call transaction 'CO03' and skip first screen.
      endif.
      if rs_selfield-sel_tab_field = 'ITAB1-MATNR'.
        set parameter id 'MAT' field rs_selfield-value.
        call transaction 'MM03' and skip first screen.
      endif.
      if rs_selfield-sel_tab_field = 'ITAB1-VBELN1' or
        rs_selfield-sel_tab_field = 'ITAB1-VBELN2'.
        set parameter id 'VL' field rs_selfield-value.
        call transaction 'VL03N' and skip first screen.
      endif.
      if rs_selfield-sel_tab_field = 'ITAB1-EBELN'.
        set parameter id 'BES' field rs_selfield-value.
        call transaction 'ME23N'.
      endif.
  endcase.
endform.
*&--------------------------------------------------------------------*
*&      Form  LAYOUT_INIT
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
*      -->RS_LAYOUT  text
*---------------------------------------------------------------------*
form layout_init using rs_layout type slis_layout_alv.
*"Build layout for list display
  rs_layout-detail_popup      = 'X'.
  rs_layout-colwidth_optimize = 'X'.
endform.                    "LAYOUT_INIT

*&--------------------------------------------------------------------*
*&      Form  EVENTTAB_BUILD
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
*      -->RT_EVENTS  text
*---------------------------------------------------------------------*
form eventtab_build using rt_events type slis_t_event.
*"Registration of events to happen during list display
  data: ls_event type slis_alv_event.
*
  call function 'REUSE_ALV_EVENTS_GET'
       exporting
            i_list_type = 0
       importing
            et_events   = rt_events.
  read table rt_events with key name = slis_ev_top_of_page
                           into ls_event.
  if sy-subrc = 0.
    move g_top_of_page to ls_event-form.
    append ls_event to rt_events.
  endif.
endform.                    "EVENTTAB_BUILD
"
*&--------------------------------------------------------------------*
*&      Form  TOP_OF_PAGE
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
form top_of_page.
  call function 'REUSE_ALV_COMMENTARY_WRITE'
       exporting
            i_logo             = 'LOGO_YH01'
            it_list_commentary = gt_list_top_of_page.
endform.                    "TOP_OF_PAGE
"
*&--------------------------------------------------------------------*
*&      Form  COMMENT_BUILD
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
*      -->LT_TOP_OF_Ptext
*---------------------------------------------------------------------*
form comment_build using lt_top_of_page type
                                        slis_t_listheader.
  data: ls_line type slis_listheader.
  clear ls_line.
  ls_line-typ  = 'H'.
  ls_line-info = text-100.
  append ls_line to lt_top_of_page.
endform.                    "COMMENT_BUILD