click 的个人资料Click's Blog照片日志列表更多 工具 帮助
10月24日

日期型F4帮助:f4_date

*需求:只有显示年月,但要有日期的search help
PARAMETERS:p1(6TYPE c.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p1.
  DATA:l_date TYPE sy-datum.
  CALL FUNCTION 'F4_DATE'
    EXPORTING
      date_for_first_month         = sy-datum
    IMPORTING
      select_date                  = l_date
    EXCEPTIONS
      calendar_buffer_not_loadable = 1
      date_after_range             = 2
      date_before_range            = 3
      date_invalid                 = 4
      factory_calendar_not_found   = 5
      holiday_calendar_not_found   = 6
      parameter_conflict           = 7
      OTHERS                       = 8.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
  p1 = l_date+0(6).
10月19日

很好很强大的各国语言版本

中文:很好,很强大
英文:Very good, very strong
意大利:Molto buon, molto forte
西班牙:Muy bueno, muy fuerte
葡萄牙:Muito bom, muito forte
法语:Très bon, très fort
德语:Sehr gut, sehr stark
日语:非常によい、非常に強い
10月18日

YM的算号器,很好很强大

REPORT  z_testym15                                                  .
PARAMETERS:
  sys_id(3) DEFAULT '000'    ,
  sys_numb(2) DEFAULT '00'  ,
  msg_ser(15)  DEFAULT 'SUPERJXY' ,
  ins_no(10) DEFAULT '0000000000'.
START-OF-SELECTION.
  DATA key(10).
  PERFORM get_sp_value
            USING
              sys_id
              sys_numb
              msg_ser
              ins_no
            CHANGING
              key.
END-OF-SELECTION.
  WRITE key.
*&---------------------------------------------------------------------*
*&      Form  get_sp_value
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_PF_SID  text
*      -->P_PF_SYSNO  text
*      -->P_PF_SERVER  text
*      <--P_PF_VALUE  text
*----------------------------------------------------------------------*
FORM get_sp_value USING    p_pf_sid
                           p_pf_sysno
                           p_pf_server
                           p_pf_instno
                  CHANGING p_pf_value.
  CONSTANTS: lc_part_len TYPE i VALUE 5,
             lc_pw_len   TYPE i VALUE 10,
             lc_allowed_chars(38) TYPE c VALUE
             '-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_'.

  DATA: lf_string(20)        TYPE c,
        lf_key               TYPE i,
        lf_part(lc_part_len) TYPE c,
        lf_finalf(lc_pw_len) TYPE c,
        lf_finalx            TYPE xstring,
        lf_xbuffer           TYPE xstring,
        lf_opf(10)           TYPE c,
        lf_langu             LIKE sy-langu,
        lf_subrc             LIKE sy-subrc,
        lf_len               TYPE i,
        lo_conv_to_x         TYPE REF TO cl_abap_conv_out_ce.
  CLEAR: lf_string, lf_finalx, lf_opf.
  CONCATENATE p_pf_sid p_pf_sysno p_pf_server INTO lf_string.
* Large letters only
  TRANSLATE lf_string TO UPPER CASE.
  lf_langu = sy-langu.
  SET LOCALE LANGUAGE 'E'.
  lo_conv_to_x = cl_abap_conv_out_ce=>create( encoding = '1100' ).
  lf_len = STRLEN( lf_string ).
  IF lf_string(lf_len) CN lc_allowed_chars.
  ELSE.
* Fold the input string to a lc_part_len long string
    WHILE lf_len > 0.
      lf_part = lf_string(lc_part_len).
      SHIFT lf_string BY lc_part_len PLACES.
      lf_len = STRLEN( lf_string ).
      CALL METHOD lo_conv_to_x->reset.
      CALL METHOD lo_conv_to_x->write( data = lf_part n = -1 ).
      lf_xbuffer = lo_conv_to_x->get_buffer( ).
      lf_finalx = lf_finalx BIT-XOR lf_xbuffer.
    ENDWHILE.
    lf_key = 12.
    PERFORM scramble USING      lf_finalx
                                lf_key
                                lc_part_len
                       CHANGING lf_finalf
                                lf_subrc.
    IF NOT lf_finalf IS INITIAL.
      p_pf_value = lf_finalf.
    ELSE.
      CLEAR p_pf_value.
    ENDIF.
  ENDIF.
ENDFORM.                    "get_sp_value
*&---------------------------------------------------------------------*
*&      Form  scramble
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LF_FINALX  text
*      -->P_LF_KEY  text
*      -->P_LC_PART_LEN  text
*      <--P_LF_finalf  text
*      <--P_LF_SUBRC  text
*----------------------------------------------------------------------*
FORM scramble USING    iv_xstring TYPE xstring
                       iv_key TYPE i
                       iv_src_len TYPE i
              CHANGING lf_finalf
                       lf_subrc LIKE sy-subrc.
  CONSTANTS: lc_max_len    TYPE i VALUE 20,
             lc_mask(4)    TYPE x VALUE '0000003F',
             lc_random(64) TYPE x VALUE
                      'F0ED53B83244F1F876C67959FD4F13A2' &
                      'C15195EC5483C234774943A27DE26596' &
                      '5E5398789A17A33CD383A8B829FBDCA5' &
                      '55D702778413ACDDF9B83116610E6DFA'.
  DATA: lv_key_index(4)  TYPE x,
        lv_rand_index(4) TYPE x,
        lv_xkey(4)       TYPE x,
        lv_xkey_shl_1(4) TYPE x,
        lv_xkey_shr_5(4) TYPE x,
        lv_scramble_byte TYPE x,
        lv_dest(lc_max_len) TYPE x,
        lv_index         TYPE i,
        lv_len           TYPE i.
  CLEAR lf_subrc.
  IF iv_src_len EQ 0. EXIT. ENDIF.
  lv_len = XSTRLEN( iv_xstring ).
  IF iv_src_len GT lc_max_len OR
     iv_src_len GT lv_len.
    lf_subrc = 2.
    EXIT.
  ENDIF.
  lv_xkey       = iv_key.
  lv_xkey_shl_1 = iv_key * 2.
  lv_xkey_shr_5 = iv_key DIV 32.
  lv_rand_index = lv_xkey BIT-XOR lv_xkey_shr_5 BIT-XOR lv_xkey_shl_1.
  lv_rand_index = lv_rand_index BIT-AND lc_mask.
  lv_index = 0.
  DO iv_src_len TIMES.
    CATCH SYSTEM-EXCEPTIONS compute_int_times_overflow = 1.
      lv_key_index = ( iv_key * lv_index * lv_index ) - lv_index.
    ENDCATCH.
    IF sy-subrc <> 0.
      lf_subrc = 1.
      EXIT.
    ENDIF.
    lv_scramble_byte = lc_random+lv_rand_index(1) BIT-XOR
                       lv_key_index+3(1).
    lv_dest+lv_index(1) = iv_xstring+lv_index(1) BIT-XOR
                          lv_scramble_byte.
    lv_index = lv_index + 1.
    lv_rand_index = lv_rand_index + 1.
    lv_rand_index = lv_rand_index BIT-AND lc_mask.
  ENDDO.
  IF lf_subrc <> 0.
    EXIT.
  ENDIF.
  WRITE lv_dest(iv_src_len) TO lf_finalf.
ENDFORM.                    " scramble
10月16日

在top_of_page事件中实现超过60位可打印的alv header(grid)

    因为在 I_CALLBACK_HTML_TOP_OF_PAGE 中用cl_dd_document创建的alv头不能打印,而用REUSE_ALV_COMMENTARY_WRITE在top_of_page中输出的头虽然可以打印,但SLIS_T_LISTHEADER-INFO只有60位,有一定的局限性。所以在需要输出更长文本时,可以在top_of_page中使用以下代码实现
 
  FORM f_top_of_page .
  DATA: lr_content     TYPE REF TO cl_salv_form_element,
        lr_rows        TYPE REF TO cl_salv_form_layout_grid,
        lr_row         TYPE REF TO cl_salv_form_layout_flow,
        lr_grid_status TYPE REF TO cl_salv_form_layout_grid.
  DATA: l_row TYPE i VALUE '1'.
  DATA: l_string TYPE string.
  CREATE OBJECT lr_rows.
  lr_content = lr_rows.
* 需要输出的文本
  l_string =  '1234567890abcdefgh1234567890abcdefgh'.
* 相当于H (Header)
  lr_row = lr_rows->add_row( ).
  lr_row->create_header_information( text = l_string ).

  lr_row = lr_rows->add_row( ).
  lr_row = lr_rows->add_row( ).
  lr_grid_status = lr_row->create_grid( ).

* 相当于S(Selection)
  lr_grid_status->create_label(
    row    = l_row
    column = 1
    text   = l_string ).        " Key
  lr_grid_status->create_text(
    row    = l_row
    column = 2
    text   = l_string ).        " Info

  lr_grid_status->create_text(
    row    = l_row
    column = 3
    text   = l_string ).        " Info
  ADD 1 TO l_row.
  lr_grid_status->create_label(
    row    = l_row
    column = 1
    text   = l_string ).

  lr_row = lr_rows->add_row( ).
  lr_row = lr_rows->add_row( ).
* 相当于A (Action)
  lr_row->create_action_information( text = l_string ).


  cl_salv_form_content=>set( lr_content ).
ENDFORM.                    " F_TOP_OF_PAGE
10月10日

在user command事件中改变alv grid某列的显示模式(checkbox变普通)

建一个status命名stu_100,建一个按钮ucomm为CHANGE
 
*&---------------------------------------------------------------------*
*& Report  ZCTEST15
*&
*&---------------------------------------------------------------------*
*& 在user command事件中改变alv grid某列的显示模式(checkbox变普通)
*& by click 2007.10.10
*&---------------------------------------------------------------------*
REPORT  zctest15 NO STANDARD PAGE HEADING.
TYPE-POOLS slis.
DEFINE mac_field.
  clear iw_fieldcat.
  iw_fieldcat-col_pos   = &1.
  iw_fieldcat-fieldname = &2.
  iw_fieldcat-seltext_l = &3.
  iw_fieldcat-intlen    = &4.
  iw_fieldcat-checkbox  = &5.
  iw_fieldcat-edit      = &6.
  append iw_fieldcat to it_fieldcat.
END-OF-DEFINITION.
TYPES:
  BEGIN OF ty_data,
    chk TYPE c,
    para1 TYPE char10,
    para2 TYPE char10,
  END OF ty_data.

DATA:
  it_data TYPE TABLE OF ty_data,
  iw_data TYPE ty_data,
  it_exclude TYPE ui_functions,
  iw_exclude TYPE ui_func,
  iw_layout   TYPE slis_layout_alv,
  it_fieldcat TYPE slis_t_fieldcat_alv,
  iw_fieldcat TYPE slis_fieldcat_alv.
DATA:
  w_repid TYPE sy-repid VALUE sy-repid.
INITIALIZATION.
  mac_field : '1' 'CHK'   '选择' '1'   'X'   'X',
              '2' 'PARA1' '变量1' '10' space space,
              '3' 'PARA2' '变量2' '10' space space.
  iw_layout-colwidth_optimize = 'X'.
START-OF-SELECTION.
  DO 10 TIMES.
    CLEAR iw_data.
    iw_data-para1 = sy-index.
    iw_data-para2 = sy-index * sy-index.
    APPEND iw_data TO it_data.
  ENDDO.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      is_layout                = iw_layout
      it_fieldcat              = it_fieldcat
      i_callback_program       = w_repid
      i_callback_pf_status_set = 'F_STATUS'
      i_callback_user_command  = 'F_UCOMM'
    TABLES
      t_outtab                 = it_data
    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.
*&---------------------------------------------------------------------*
*&      Form  F_STATUS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM f_status USING lit_extab TYPE slis_t_extab.
  SET PF-STATUS 'STU_100'.
ENDFORM.                    " F_STATUS
*&---------------------------------------------------------------------*
*&      Form  F_UCOMM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM f_ucomm USING l_ucomm LIKE sy-ucomm
                   liw_selfield TYPE slis_selfield .
  CASE l_ucomm.
    WHEN 'CHANGE'.
      PERFORM f_change.
  ENDCASE.
ENDFORM.                    " F_UCOMM
*&---------------------------------------------------------------------*
*&      Form  f_change
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM f_change .
  DATA: ref_grid TYPE REF TO cl_gui_alv_grid.
  DATA: liw_layout   TYPE lvc_s_layo,
        lit_fieldcat TYPE lvc_t_fcat,
        liw_fieldcat TYPE lvc_s_fcat.
* 取得当前alv的grid和fieldcat
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid          = ref_grid
      et_fieldcat_lvc = lit_fieldcat.
* 更新数据到内表
  CALL METHOD ref_grid->check_changed_data.
* 更改fieldcat
  READ TABLE lit_fieldcat INTO liw_fieldcat INDEX 1.
  liw_fieldcat-checkbox = space.
  liw_fieldcat-edit = space.
  MODIFY lit_fieldcat FROM liw_fieldcat INDEX 1.
* 重新显示alv
  CALL METHOD ref_grid->set_frontend_fieldcatalog
    EXPORTING
      it_fieldcatalog = lit_fieldcat.


* 以前走的老路,也可以实现,但是复杂了点
** 隐藏toolbar
*  liw_layout-no_toolbar = 'X'.
** 重新显示alv
*  CALL METHOD ref_grid->set_table_for_first_display
*    EXPORTING
*      is_layout       = liw_layout
*    CHANGING
*      it_outtab       = it_data
*      it_fieldcatalog = lit_fieldcat.
ENDFORM.                    " f_change