凡尘clsoho™的博客

E-mail & MSN: clsoho@hotmail.com
QQ1超级群: <101817641已满> QQ2群:<110722895已满>
QQ3超级群:<23765855>QQ4超级群:<85338969>

 闲来无事,瞎搞一下。好久没有更新过了,其实也不是比较忙,只是慢慢地不知道该写些什么了。总觉得自己知道的那点东西

大家都知道了,已经没有写出来的必要了。 今天搞一个弱智的程序,放着供自己查阅查阅,呵呵

新的一年了,其实已经不算新了,过去好几个月了,祝大家工作越来越Happy吧 

SAP客户主数据销售视图(KNVV)字段动态更新程序:

*&---------------------------------------------------------------------*
*& Report  ZSD_KNVV
*&
*&---------------------------------------------------------------------*
*&Title  :客户主数据销售视图(KNVV)数据动态更新
*&---------------------------------------------------------------------*
REPORT zsd_knvv MESSAGE-ID zf.

TYPE-POOLS: slis.

TABLES: knvv,likp,vbrp,vbak,dd03l,dd04t.

SELECTION-SCREEN BEGIN OF BLOCK b WITH FRAME TITLE text-004.
 SELECT-OPTIONS: s_field FOR dd03l-fieldname VISIBLE LENGTH 15 NO INTERVALS.
SELECTION-SCREEN END OF BLOCK b .


SELECTION-SCREEN BEGIN OF BLOCK a WITH FRAME TITLE text-001.

SELECTION-SCREEN SKIP.
PARAMETERS p_file LIKE rlgrap-filename MODIF ID upd.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN COMMENT /1(50) text-002 .
SELECTION-SCREEN COMMENT /4(68) text-003 .
SELECTION-SCREEN COMMENT /4(79) text-005 .

SELECTION-SCREEN END OF BLOCK a .

DATA: BEGIN OF wa_field,
      fieldname LIKE dd03l-fieldname,
      ddtext  LIKE dd04t-ddtext,
      datatype LIKE dd03l-datatype,
      leng LIKE dd03l-leng,
      END OF wa_field.
DATA: it_field LIKE TABLE OF wa_field.


DATA: d_ref TYPE REF TO data,
      lt_alv_cat TYPE TABLE OF lvc_s_fcat,
      ls_alv_cat LIKE LINE OF lt_alv_cat.

DATA: lt_table LIKE TABLE OF dntab.
DATA: ls_table TYPE dntab.

FIELD-SYMBOLS : <dyn_table> TYPE table,
                <dyn_wa> TYPE ANY.


INITIALIZATION.
  PERFORM sub_get_field USING it_field.

* 定义参数 p_file 的值选择事件,调用打开文件对话框
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_field-low.

  PERFORM sub_field_f4.
* 定义参数 p_file 的值选择事件,调用打开文件对话框
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
* 选择文件
  PERFORM sub_get_file USING p_file.


AT SELECTION-SCREEN OUTPUT.


AT SELECTION-SCREEN.


START-OF-SELECTION.
  PERFORM sub_progress_indicator.
  PERFORM sub_tab_create.
  PERFORM sub_data_upload.
  PERFORM sub_data_display.

*&---------------------------------------------------------------------*
*&      Form  sub_get_field
*&---------------------------------------------------------------------*
*  -->  p1        text
*----------------------------------------------------------------------*
FORM sub_get_field USING p_it_field TYPE table.

  SELECT a~fieldname a~datatype a~leng a~position b~ddtext
    FROM dd03l AS a  INNER JOIN dd04t AS b
    ON a~rollname = b~rollname
    INTO CORRESPONDING FIELDS OF TABLE  p_it_field
    WHERE a~tabname = 'KNVV' AND
          a~position NOT IN (1,2,3,4,5,75,76,77,78,79) AND
          b~ddlanguage = '1'
    ORDER BY a~position.


ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  sub_get_file
*&---------------------------------------------------------------------*
*  -->  p1        text
*----------------------------------------------------------------------*
FORM sub_get_file USING pr_file.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      mask             = ',文本文件 (*.txt),*.txt,所有文件 (*.*),*.*.'
      mode             = 'O'
      title            = text-001
    IMPORTING
      filename         = pr_file
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.
  CASE sy-subrc.
    WHEN 0.
    WHEN OTHERS.
  ENDCASE.
ENDFORM. "sub_GET_FILE
*&---------------------------------------------------------------------*
*&      Form  sub_data_upload
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM sub_data_upload.

  CALL FUNCTION 'WS_UPLOAD'
    EXPORTING
      filename                = p_file
      filetype                = 'DAT'
    TABLES
      data_tab                = <dyn_table>
    EXCEPTIONS
      conversion_error        = 1
      file_open_error         = 2
      file_read_error         = 3
      invalid_type            = 4
      no_batch                = 5
      unknown_error           = 6
      invalid_table_width     = 7
      gui_refuse_filetransfer = 8
      customer_error          = 9.
  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. "sub_data_upload
*&---------------------------------------------------------------------*
*&      Form  SUB_FIELD_F4
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM sub_field_f4 .

  DATA: it_return LIKE TABLE OF ddshretval WITH HEADER LINE.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
     retfield               = 'FIELDNAME'
     dynpprog               = sy-repid
     dynpnr                 = sy-dynnr
     dynprofield            = 'S_FIELD-LOW'
     window_title           = '可选择字段'
     value_org              = 'S'
    TABLES
      value_tab              = it_field
*     FIELD_TAB              =
     return_tab             = it_return
*     DYNPFLD_MAPPING        =
    EXCEPTIONS
     parameter_error        = 1
     no_values_found        = 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.

  LOOP AT it_return.
    DELETE it_field WHERE fieldname = it_return-fieldval.
  ENDLOOP.
ENDFORM. " SUB_FIELD_F4
*&---------------------------------------------------------------------*
*&      Form  SUB_TAB_CREATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM sub_tab_create .
*  取出表结构的字段目录
  CALL FUNCTION 'NAMETAB_GET'
    EXPORTING
      langu          = sy-langu
      tabname        = 'KNVV'
    TABLES
      nametab        = lt_table
    EXCEPTIONS
      no_texts_found = 1.
*  根据取出的字段目录生成参考字段目录
  LOOP AT lt_table INTO ls_table.
    READ TABLE s_field WITH KEY low = ls_table-fieldname.
    IF sy-subrc EQ 0 OR ls_table-fieldname = 'VKORG' OR ls_table-fieldname = 'KUNNR'.
      ls_alv_cat-fieldname = ls_table-fieldname.
      ls_alv_cat-ref_table = 'KNVV'.
      ls_alv_cat-ref_field = ls_table-fieldname.
      APPEND ls_alv_cat TO lt_alv_cat.
    ENDIF.
    CLEAR ls_alv_cat.
  ENDLOOP.
*  内表创建
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = lt_alv_cat
    IMPORTING
      ep_table        = d_ref.
*  指定生成的内表到字段符号
  ASSIGN d_ref->* TO <dyn_table>.
ENDFORM. " SUB_TAB_CREATE
*&---------------------------------------------------------------------*
*&      Form  SUB_DATA_UPDATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM sub_data_update .
  DATA: setv(255) TYPE c,
        midd(255) TYPE c,
        cond(255) TYPE c.
  DATA: tab TYPE sy-tabix.

  LOOP AT s_field.
    CONCATENATE '<DYN_WA>-' s_field-low INTO midd.
    CONCATENATE setv s_field-low '=' midd INTO setv SEPARATED BY space.
  ENDLOOP.

  CONCATENATE  'KUNNR' '=' '<DYN_WA>-KUNNR' 'AND' 'VKORG' '=' '<DYN_WA>-VKORG'
               'AND' 'VTWEG' '=' `'00'` 'AND' 'SPART' '=' `'00'`
               INTO cond SEPARATED BY space.

  LOOP AT <dyn_table> ASSIGNING <dyn_wa>.
    tab = sy-tabix.
    UPDATE knvv SET (setv) WHERE (cond).
    IF sy-subrc = 0.
      DELETE <dyn_table> INDEX tab.
    ENDIF.
  ENDLOOP.

  COMMIT WORK.

  IF <dyn_table> IS INITIAL.
    MESSAGE i000 WITH '数据更新完成!'.
    LEAVE TO SCREEN 0.
  ELSE.
    MESSAGE s000 DISPLAY LIKE 'E' WITH '以下数据未正确更新,请检查数据是否在表KNVV中存在!'.
  ENDIF.

ENDFORM. " SUB_DATA_UPDATE
*&---------------------------------------------------------------------*
*&      Form  SUB_DATA_DISPLAY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM sub_data_display .

 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
  EXPORTING
    i_callback_program                = sy-cprog
    i_callback_user_command           = 'USER_COMMAND'
    i_callback_pf_status_set          = 'SET_STATUS'
    it_fieldcat_lvc                   = lt_alv_cat
    i_grid_title                      = text-tit
    i_save                            = 'U'
   TABLES
     t_outtab                          = <dyn_table>
  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. " SUB_DATA_DISPLAY
*&---------------------------------------------------------------------*
*&      Form  user_command
*&---------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
*      -->R_UCOMM      text
*      -->RS_SELFIELD  text
*----------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
                  rs_selfield TYPE slis_selfield.

  CASE r_ucomm.
    WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
      SET SCREEN 0.
    WHEN 'SAVE' OR 'EXCUTE'.
      PERFORM sub_progress_indicator.
      PERFORM sub_data_update.
  ENDCASE.
  PERFORM sub_data_refresh USING rs_selfield.
ENDFORM. "user_command
*&---------------------------------------------------------------------*
*&      Form  SUB_DATA_REFRESH
*&---------------------------------------------------------------------*
*       ALV 动态刷新子例程 处理ALV数据更新
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM sub_data_refresh USING in_selfield TYPE slis_selfield.

  in_selfield-col_stable = 'X'.
  in_selfield-row_stable = 'X'.
  in_selfield-refresh = 'X'.


ENDFORM. " SUB_DATA_REFRESH
*&---------------------------------------------------------------------*
*&      Form  set_status
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RT_EXTAB   text
*----------------------------------------------------------------------*
FORM set_status USING rt_extab TYPE slis_t_extab.

  SET PF-STATUS 'ZSD_KNVV' EXCLUDING rt_extab.

ENDFORM. "set_status
*&---------------------------------------------------------------------*
*&      Form  SUB_PROGRESS_INDICATOR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM sub_progress_indicator.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
   EXPORTING
     percentage       = 20
     text             = '数据处理中,请稍后…… ' .

ENDFORM. " SUB_PROGRESS_INDICATOR
*Text elements
*----------------------------------------------------------
* 001 选择文件
* 002 注:上传文件前两个字段为:客户编号 销售组织
* 003 其它字段数据应与选择字段时的顺序一致,否则将造成数据更新错误!
* 004  选择字段
* 005 更新数据时首先会把上载的数据显示出来,请先核对上载到系统中的数据是否正确,再进行数据更新!
* TIT 请检查数据是否正确,点击“执行”或者“保存”按钮进行数据更新


*Selection texts
*----------------------------------------------------------
* P_FILE D       文件名 
* S_FIELD D       字段名


*Messages
*----------------------------------------------------------
*
* Message class: ZF
*000   & & & & &

 

posted on 2011-03-21 11:03  凡尘clsoho  阅读(11844)  评论(2编辑  收藏  举报