[abap] smartforms句柄与以簇的方式存储数据

来源:互联网 发布:观韬律所 知乎 编辑:程序博客网 时间:2024/05/18 14:42

说明:Smartforms输出打印,设置句柄,用于传递参数。

REPORT  ZIEB_WWFLD.

*-----------------      TABLES      ----------------------------*


*-----------------     VARIANTS     ----------------------------*
DATA l_sno TYPE ZIEB_ZSNNM.
DATA: ls_ctr  TYPE ssfctrlop,
      ls_cre  TYPE ssfcrescl,
      ls_opt TYPE ssfcompop.
  DATA : wa_indx TYPE indx .  " 作为全局声明
* 以下是一个定义宏的语句,在DEFINE和END-OF-DEFINITION之间有完整的ABAP语句,
* 用&N作为占位符,在调用的时候把真正的字符传入并取代。
** 例子:
*DATA: RESULT TYPE I,
*N1 TYPE I VALUE 5,
*N2 TYPE I VALUE 6.
*DEFINE OPERATION.
*RESULT = &1 &2 &3.
*OUTPUT &1 &2 &3 RESULT.
*END-OF-DEFINITION.
*OPERATION 4 + 3.
*OPERATION 2 ** 7.
*OPERATION N2 - N1.

DEFINE savebuffer.
  perform save_to_buffer using &1 &2.
END-OF-DEFINITION.

DEFINE clearbuffer.
  perform clear_buffer using &1.
END-OF-DEFINITION.
*-----------------    CONSTANTS     ----------------------------*


*-----------------  INTERNAL  TABLES ----------------------------*
DATA:  item_LFA1 LIKE LFA1 OCCURS 0 WITH HEADER LINE,
       item_T156T LIKE T156T OCCURS 0 WITH HEADER LINE,
       item_MAKT LIKE MAKT OCCURS 0  WITH HEADER LINE.

*结果内表item_out
TYPESBEGIN OF TY_item_out,
           SNO   TYPE ZIEB_zsnnm,         " 序号      说明: 数据元素不能用LIKE
           WERKS LIKE MSEG-WERKS,         " 工厂
           TName1 LIKE T001W-NAME1,       " 工厂名称
           Ebeln LIKE EKPO-EBELN,         " 采购订单号
           LIFNR LIKE MSEG-LIFNR,         " 委外加工商代码
           LNAME1 LIKE LFA1-NAME1,        " 委外加工商名称
           BLDAT LIKE MKPF-BLDAT,         " 凭证日期
           MBLNR LIKE MSEG-MBLNR,         " 物料凭证号
           BWART LIKE MSEG-BWART,         " 移动类型
           BTEXT LIKE T156T-BTEXT,        " 移动类型描述
           ZEILE LIKE MSEG-ZEILE,         " 序号
           MATNR LIKE MSEG-MATNR,         " 物料编号
           MAKTX LIKE MAKT-MAKTX,         " 物料描述
           ERFMG LIKE MSEG-ERFMG,         " 数量
           ERFME LIKE MSEG-ERFME,         " 单位
           LGORT LIKE MSEG-LGORT,         " 库存地代码
           LGOBE LIKE T001L-LGOBE,        " 库存地描述
           CHARG LIKE MSEG-CHARG,         " 批次
           SGTXT LIKE MSEG-SGTXT,         " 备注
      END OF TY_item_out.
DATA : item_out TYPE TABLE OF TY_item_out WITH HEADER LINE.
Data hd_item_out TYPE TY_item_out.      " 用来存放抬头的固定内容。
Data wa_item_out TYPE TY_item_out.      " 用来存放行项目的可循环内容。
*-----------------   SELECTION-SCREEN --------------------------*
SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE text-001.
PARAMETERS: p_werks LIKE mseg-werks OBLIGATORY DEFAULT '2100'" 工厂
            p_MJAHR LIKE mseg-MJAHR OBLIGATORY DEFAULT sy-datum," 当前年度
            p_MBLNR LIKE MSEG-MBLNR OBLIGATORY DEFAULT '4900001625'.  " 物料凭证
SELECTION-SCREEN  SKIP 1.
SELECTION-SCREEN END OF BLOCK block1.

*-----------------   START-OF-SELECTION --------------------------*
" MSEG - a, T001W - b,EKPO-c,LFA1-d,MKPF-e,T156T-f,MAKT-g,T001L-h
if p_werks <> '2100'.
  "  MESSAGE S004 with '工厂选择错误!'.  " MESSAGE-ID ZIEB01
  MESSAGE  '工厂选择错误!' TYPE 'E'.
  STOP.
endif.
if p_MJAHR <> sy-datum(04).
  MESSAGE '凭证年度选择错误!' TYPE 'E'.
  STOP.
ENDIF.

START-OF-SELECTION.
* b~NAME1 as TName1     d~NAME1 as LNAME1      f~BTEXT     g~MAKTX     h~LGOBE
  SELECT a~werks   c~EBELN  a~LIFNR
         e~BLDAT a~MBLNR a~BWART  a~ZEILE a~MATNR
         a~ERFMG a~ERFME a~LGORT  a~CHARG a~SGTXT APPENDING CORRESPONDING
         FIELDS OF TABLE item_out from MSEG as a
         left join EKPO as c  on a~MATNR = c~MATNR
         left join MKPF as e  on a~MBLNR = e~MBLNR
         WHERE a~WERKS = p_werks and a~MJAHR = p_MJAHR and a~MBLNR = p_MBLNR and a~BWART in ('541','542')
         .
  if sy-subrc <> 0 .
    MESSAGE '没有委外发料凭证的行项目!' TYPE 'I'.
    STOP.
  endif.
  CLEAR item_out.
  LOOP AT  item_out.
    SELECT SINGLE NAME1 INTO item_out-TName1
      FROM T001W  WHERE werks EQ item_out-werks
                    AND SPRAS = SY-LANGU.

    SELECT SINGLE NAME1 INTO item_out-LNAME1
      FROM LFA1  WHERE LIFNR EQ item_out-LIFNR
                   AND SPRAS = SY-LANGU.
    SELECT SINGLE BTEXT  INTO item_out-BTEXT
      FROM T156T  WHERE BWART  EQ item_out-BWART
                    AND SPRAS = SY-LANGU.
    SELECT SINGLE MAKTX  INTO item_out-MAKTX
      FROM MAKT   WHERE MATNR  EQ item_out-MATNR
                    AND SPRAS = SY-LANGU.
    SELECT SINGLE LGOBE  INTO item_out-LGOBE
      FROM T001L  WHERE LGORT EQ item_out-LGORT.
    l_sno = l_sno + 1.
    item_out-SNO = l_sno.
    MODIFY item_out.

  ENDLOOP.
  read TABLE item_out INDEX 1 INTO hd_item_out.
  PERFORM Display_BySF.
*&---------------------------------------------------------------------*
*&      Form  Display_BySF
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
Form Display_BySF.
* 取得smartforms中的参数
  DATA : fm_name TYPE rs38l_fnam.

*NOTE:SmartForms中的内表不能有HeaderLine

*通过SmartForms的名称取得编译以后的对应的Function Module的名称
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      formname                 = 'ZFIEB_WWFLD'
*     VARIANT                  = ' '
*     DIRECT_CALL              = ' '
   IMPORTING
     fm_name                  = fm_name
   EXCEPTIONS
     no_form                  = 1
     no_function_module       = 2
     OTHERS                   = 3
            .
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

* 句柄的声明
  DATA : prt_handler1(22) .
  DATA : prt_handler2(22) .
  DATA : wa_indx TYPE indx .
*smartforms中的内存地址给句柄
*在句柄中加上服务器当前时间作为句柄名称,防止多人同时使用该程序,导致句柄名称相同
  CONCATENATE 'ZFMM_HDR' sy-uzeit INTO prt_handler1 .
  CONCATENATE 'ZFMM_ITEM' sy-uzeit INTO prt_handler2 .

* 将内表数据传输到数据簇表里
*  wa_indx-aedat = sy-datum .
*  wa_indx-usera = sy-uname .
*  wa_indx-pgmid = sy-repid .

*在SAP中可以将一个对象Export到内存或者数据库中,我们就可以根据一个类似于句柄的字符串再次取出该数据,
*传送一个字符串到SmartForms中是没有任何问题的,所以我们只需要Export内表到内存或者数据库中,
*然后将句柄传递到SmartForms中,在SmartForms中首先定义完全相同类型的内表,
*再将数据Impor到内表中即可完全恢复数据,这样就完成的数据的传递工作。
* Report中用EXPORT:

  EXPORT hd_item_out TO DATABASE indx(hk) ID prt_handler1 FROM wa_indx .
*  EXPORT item_out TO DATABASE indx(hk) ID prt_handler2 FROM wa_indx .
*Smartforms中用IMPORT:
*IMPORT HD_ITEM_OUT FROM DATABASE indx(hk) id PRT_HANDLER1.
*IMPORT ITEM_OUT FROM DATABASE indx(hk) id PRT_HANDLER2.
   savebuffer item_out[] prt_handler2.
  DATA : output_opt TYPE ssfcompop.   " ssfcompop :打印参数设置的“结构”

  output_opt-rqposname ='Local'.
  output_opt-tdimmed = 'X'.

  CALL FUNCTION fm_name
    EXPORTING
      prt_handler1       = prt_handler1    " 要跟Smartfroms中的全局变量对应好
      prt_handler2       = prt_handler2
      output_options     = output_opt
      control_parameters = ls_ctr
      user_settings      = 'X'
    IMPORTING
      job_output_info    = ls_cre
    EXCEPTIONS
      formatting_error   = 1
      internal_error     = 2
      send_error         = 3
      user_canceled      = 4.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

*  DELETE FROM DATABASE indx(hk) ID prt_handler1.
*  DELETE FROM DATABASE indx(hk) ID prt_handler2.
    clearbuffer prt_handler1.
    clearbuffer prt_handler2.
ENDFORM.                    "Display_BySF
*&可以用数据簇方式对程序的任何复杂内部数据对像过行分组保存,
*&并将其临时存储在程序内存中,或长时间存储在数据库中,
*&使用export to memory 语句在内存中存储数据对像
*&格式: Export <f1>[from<g1>]<f2>[from<g2>]…..to memory ID <key>.
*&
*&使用import from memory 语句从内存中读取数据对像
*&格式:  IMPORT <F1> [TO <g1>] <F2> [TO <g2>] ... FROM MEMORY ID <key>.
*&
*&使用 free memory 语句从内存中删除数据簇;
*&Free memory [id<key>].
*& 说明:如果不附加ID<key>,则此语句删除整个内存,包括此前用exoprt存储到内存中的所有数据簇 附加ID<key>之后,该语句只能删除此名称命名的数据簇;
*&
FORM save_to_buffer USING t TYPE table typeid TYPE c .
    wa_indx-aedat = sy-datum.
    wa_indx-usera = sy-uname.
    wa_indx-pgmid = sy-repid.
*以簇方式存储数据对像
*数据对像从程序写入到内存
  EXPORT t TO DATABASE indx(hk) ID typeid from wa_indx.
ENDFORM.
FORM  clear_buffer using buffid TYPE c.
   DELETE FROM DATABASE indx(hk) ID buffid.
ENDFORM.

 

原创粉丝点击