设为首页 收藏本站
查看: 1477|回复: 0

[经验分享] SAP 客户主数据销售视图(KNVV)数据动态更新

[复制链接]

尚未签到

发表于 2015-9-17 12:01:29 | 显示全部楼层 |阅读模式
  闲来无事,瞎搞一下。好久没有更新过了,其实也不是比较忙,只是慢慢地不知道该写些什么了。总觉得自己知道的那点东西
  大家都知道了,已经没有写出来的必要了。 今天搞一个弱智的程序,放着供自己查阅查阅,呵呵
  新的一年了,其实已经不算新了,过去好几个月了,祝大家工作越来越Happy吧 DSC0000.gif
  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             = '数据处理中,请稍后&#8230;&#8230; ' .
ENDFORM. " SUB_PROGRESS_INDICATOR

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

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

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-114925-1-1.html 上篇帖子: SAP IMG 解释 下篇帖子: 一些有用的SAP技术TCODE
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表