matinal:SAP ABAP 实现图片上传及展示等功能

本文详细描述了在SAP系统中处理图片的存储过程,包括创建数据表、使用自定义表结构、文件上传、显示图片以及处理外部图片URL。作者介绍了如何通过编程实现图片的上传、显示和屏幕控制逻辑,指出大图片加载可能受网速影响,整体流程相对简单且无明显缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SAP里的图片管理

这里主要谈主数据或者单据相关的图片管理,SMW0或者LOGO之类的比较简单,不在讨论之列.

图片管理之SAP系统存储、显示

需要建一个表做数据存储。
程序需要建立一个空屏幕100,跟一个简单退出的屏幕状态。

屏幕逻辑流如下:

PROCESS BEFORE OUTPUT.
  MODULE status_0100.
*
PROCESS AFTER INPUT.
  MODULE user_command_0100.

主代码如下:

*&---------------------------------------------------------------------*
*& Report ZDEMO_PIC
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zdemo_pic.
**数据定义部分

TYPES: BEGIN OF ty_pic,
         pic_data(1024) TYPE x,
       END OF ty_pic.

DATA: pic_tab TYPE TABLE OF ty_pic.

DATA: wa_pic TYPE zpictable.



**zpictable为自定义table,设置一个主键字段,再设置一个或者多个RAWSTRING类型的字段存储图片数据
DATA: g_docking_container TYPE REF TO cl_gui_docking_container,
      g_splitter          TYPE REF TO cl_gui_splitter_container,
      c_pic               TYPE REF TO cl_gui_container,
      g_container_2       TYPE REF TO cl_gui_container,
      go_pic              TYPE REF TO cl_gui_picture.
CONSTANTS:
  cns_extension TYPE i VALUE 3000.  "Docking size
DATA: len         TYPE i,
      url(256),
      resu        TYPE i VALUE 123,
      path_string TYPE string.

PARAMETERS: p_file LIKE ibipparms-path OBLIGATORY.
PARAMETERS: p_dis TYPE char1 AS CHECKBOX .

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.

  PERFORM select_file USING p_file.

START-OF-SELECTION.

  IF p_dis = ''.
    PERFORM upload_pic.
  ENDIF.

  PERFORM show_pic.

  CALL SCREEN 100.

FORM select_file USING p_file.

  CALL FUNCTION 'F4_FILENAME'
    IMPORTING
      file_name = p_file.

ENDFORM.

FORM upload_pic.
  path_string = p_file.
  DATA lv_content TYPE xstring.

* 上载PIC文件
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename   = path_string
      filetype   = 'BIN'
    IMPORTING
      filelength = len
    TABLES
      data_tab   = pic_tab[].

  CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
    EXPORTING
      input_length = len
    IMPORTING
      buffer       = lv_content
    TABLES
      binary_tab   = pic_tab[]
    EXCEPTIONS
      failed       = 1
      OTHERS       = 2.

  wa_pic-key1    = '主键字段'.
  wa_pic-field1 = lv_content.
  MODIFY zpictable FROM wa_pic.

  IF sy-subrc = 0 .
    MESSAGE '图片已经保存至数据库表' TYPE 'S'.
  ELSE.
  ENDIF.
ENDFORM.

FORM show_pic.
  CLEAR pic_tab.

  SELECT SINGLE *
    INTO wa_pic
    FROM zpictable
    WHERE key1 = '主键字段'.

  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      buffer     = wa_pic-field1
    TABLES
      binary_tab = pic_tab.

* 创建图片URL
  CALL FUNCTION 'DP_CREATE_URL'
    EXPORTING
      type    = 'IMAGE'
      subtype = 'JPG'
    TABLES
      data    = pic_tab
    CHANGING
      url     = url.

  IF g_docking_container IS INITIAL."创建框体
    CREATE OBJECT g_docking_container
      EXPORTING
        style     = cl_gui_control=>ws_child
        repid     = sy-cprog
        dynnr     = '100'
        side      = g_docking_container->dock_at_left
        lifetime  = cl_gui_control=>lifetime_imode
        extension = cns_extension
      EXCEPTIONS
        OTHERS    = 1.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid
            TYPE sy-msgty
          NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
  ENDIF.

* SPLITTER CONTAINER
  IF g_splitter IS INITIAL. "动态分割一个框体
    CREATE OBJECT g_splitter
      EXPORTING
        parent  = g_docking_container
        rows    = 1
        columns = 1.

    c_pic  = g_splitter->get_container( row = 1 column = 1 ).

  ENDIF.
*
*  CREATE OBJECT c_pic
*    EXPORTING
*      container_name = 'C_PIC'.

  CREATE OBJECT go_pic
    EXPORTING
      parent = c_pic.

  CALL METHOD go_pic->load_picture_from_url
    EXPORTING
      url    = url
    IMPORTING
      result = resu.
* 3,居中显示
  CALL METHOD go_pic->set_display_mode
    EXPORTING
      display_mode = 3.

ENDFORM.

MODULE status_0100 OUTPUT.
  SET PF-STATUS '100'.
ENDMODULE.

MODULE user_command_0100 INPUT.
  CASE sy-ucomm.
    WHEN 'BACK'.
      CALL METHOD c_pic->free.
*      (必须释放对象,否则会出现同一屏幕上操作图片无法刷新的情况)
      LEAVE TO SCREEN 0.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.

实现起来挺简单的,存储也比较方便。难度基本为0.大图片回比较慢,网速限制嘛。没有明显缺点。

外部图片URL地址显示

比较简单,可以用外部文件地址或者固定的服务器文件路径直接做图片显示。

DATA picture_control_1 TYPE REF TO cl_gui_picture.
    CALL METHOD picture_control_1->set_registered_events
      EXPORTING
        events = event_tab.
            CREATE OBJECT event_receiver.“图片屏幕的事件
    SET HANDLER event_receiver->event_handler_picture_dblclick
                FOR picture_control_1.
    SET HANDLER event_receiver->event_handler_context_menu
                FOR picture_control_1.
    SET HANDLER event_receiver->event_handler_context_menu_sel
                FOR picture_control_1.
                
    CALL METHOD picture_control_1->set_display_mode
      EXPORTING
        display_mode = cl_gui_picture=>display_mode_normal.

    CALL METHOD picture_control_1->set_3d_border
      EXPORTING
        border = 1.

* new async implementation since 4.6C ”关联外部URL
    CALL FUNCTION 'DP_PUBLISH_WWW_URL'
      EXPORTING
        objid    = 'HTMLCNTL_TESTHTM2_SAP_AG'
        lifetime = cndp_lifetime_transaction
      IMPORTING
        url      = url
      EXCEPTIONS
        OTHERS   = 1.


    READ TABLE gt_alv WITH KEY icon = icon_green_light.
    IF sy-subrc EQ 0.
      url = gt_alv-zbpicurl.

      CALL METHOD picture_control_1->load_picture_from_url_async
        EXPORTING
          url = url.
    ENDIF.

配合分屏幕和OO ALV,可以实现左面是ALV,点击哪个显示哪个的图片这样的功能。

<think>好的,我现在需要处理用户关于SAP系统中车间和仓库盘盈盘亏处理方式及差异的问题。首先,我要回忆之前用户提到的内容,用户之前问过车间库负库存的设置,引用了matinalSAP FICO的资料。现在用户进一步询问盘盈盘亏的具体处理方法和区别,需要结合之前的引用信息,同时可能需要补充其他相关知识。 首先,盘盈盘亏通常涉及库存差异的处理,这在SAP中可能通过不同的移动类型和会计科目来体现。根据引用[1],车间库是虚拟库,允许负库存,而实体仓库不允许。这可能影响盘点的处理方式。例如,车间库的差异可能通过生产订单调整,而实体仓库的差异可能直接通过库存调整科目处理。 然后,引用[2]提到KO88结算生产订单时产生的会计凭证,涉及生产成本和材料成本差异科目。这说明生产相关的差异可能通过生产订单结算流程处理,而仓库的差异可能直接调整库存科目。 接下来,我需要区分车间和实体仓库的处理步骤。车间库作为虚拟库,可能与生产订单相关,盘盈盘亏可能通过调整生产订单的投入或产出来处理,使用特定的移动类型如701/702。而实体仓库的差异可能使用移动类型701/702,并直接过账到差异科目,影响库存价值。 另外,会计处理方面,车间库的差异可能关联到生产成本科目,而实体仓库差异可能对应库存调整科目。需要注意系统配置中是否允许负库存对处理方式的影响,车间库允许负库存可能意味着差异处理更灵活,而实体仓库需要及时调整避免负库存。 用户可能还想知道具体的操作事务代码,比如MI07用于库存盘点,MI20查看差异,以及KO88结算生产订单。同时,需要说明两者的核心区别在于库存类型、会计科目和处理流程。 最后,生成相关问题需要考虑用户可能进一步的问题,比如配置步骤、会计凭证差异、生产订单影响等。确保问题覆盖用户可能的兴趣点,帮助他们深入理解处理机制。</think>### SAP车间与仓库盘盈盘亏处理方法及区别 #### 一、车间库(虚拟库)盘盈盘亏处理 1. **业务背景** 车间库作为配合生产回冲扣料的虚拟库,允许负库存[^1],其差异通常与生产订单执行相关。例如:生产投料未完全消耗或退库未及时记录。 2. **处理步骤** - **差异确认**:通过事务代码`MI07`进行库存盘点,系统生成差异清单。 - **调整方式**: - 盘盈:使用移动类型`701`(库存增加)关联生产订单,冲减生产成本。 - 盘亏:使用移动类型`702`(库存减少)关联生产订单,增加生产成本。 - **会计处理**:差异通过生产订单结算(事务代码`KO88`)转入成本中心或差异科目,例如: ``` 借:生产成本-差异调整 贷:库存-车间库 ``` [^2] #### 二、实体仓库盘盈盘亏处理 1. **业务限制** 实体仓库禁止负库存[^1],差异需立即处理,通常由物料管理模块触发。 2. **处理步骤** - **差异过账**:使用移动类型`701`/`702`直接调整库存,系统自动生成会计凭证: ``` 借/贷:库存商品 贷/借:库存盘盈盘亏科目 ``` - **权限控制**:需审批流程(通过审批码或电子工作流)。 #### 三、核心区别对比 | **维度** | **车间库** | **实体仓库** | |----------------|-----------------------------------|--------------------------------| | **库存类型** | 虚拟库(允许负库存)[^1] | 实物库(禁止负库存) | | **差异来源** | 生产订单执行偏差 | 收发存操作误差 | | **会计科目** | 关联生产成本科目[^2] | 直接使用库存调整科目 | | **处理流程** | 需结合生产订单结算(KO88)[^2] | 独立过账,无需关联订单 | #### 四、配置要点 1. **车间库**:在物料主数据中设置“特殊库存标识”(如生产库存),并配置移动类型与生产订单的关联。 2. **实体库**:在物料管理(MM)模块定义库存调整科目,并设置审批策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值