您的位置:首页 > 其它

SAP 客户主数据销售视图(KNVV)数据动态更新

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

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

新的一年了,其实已经不算新了,过去好几个月了,祝大家工作越来越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 & & & & &
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: