SAP连接外部数据库

1、文档说明

本文档介绍SAP对外围系统的数据库进行CRUD操作。

主要分为两步:

1、建立SAP与外围数据库的连接

2、运行代码实现CRUD

2、连接外围数据库

2.1、连接ORACLE

事务码:DBCO

维护DBMS为ORA,代表ORACLE数据库

输入数据库用户名密码

连接信息的格式为:"数据库IP:端口(通常为1521)/ 数据库名称(SID/SERVICE NAME)"

运行程序ADBC_TEST_CONNECTION测试,

发现报错,这个需要BASIS协助处理

解决后再次测试,连接成功

 除了DBCO,还可以通过DB2C进行配置和测试

2.2、连接SQL Server

维护DBMS为MSS,代表Microsoft SQL Server数据库

输入数据库用户名密码

连接信息的格式为:MSSQL_SERVER=数据库IP,端口(通常为1433)"空格" MSSQL_DBNAME=数据库名称XXX

同样运行程序ADBC_TEST_CONNECTION测试

3、代码实现CRUD

以ORACLE数据库为例,需要创建连接,执行SQL语句,CUD操作还需要进行事务处理,之后关闭连接

3.1、查询

查询代码

其中日期查询需要转换一下格式

复制代码
"--------------------@斌将军--------------------
TYPES:BEGIN OF ty_data,
        batch_name      TYPE zppt_ora_bg-batch_name, "BATCH_NAME
        order_number    TYPE zppt_ora_bg-order_number, "ORDER_NUMBER
        line_name       TYPE zppt_ora_bg-line_name, "LINE_NAME
        recipe_number   TYPE zppt_ora_bg-recipe_number, "RECIPE_NUMBER
        recipe_version  TYPE zppt_ora_bg-recipe_version, "RECIPE_VERSION
        batch_number    TYPE zppt_ora_bg-batch_number, "BATCH_NUMBER
      END OF ty_data.

DATA:gt_data TYPE STANDARD TABLE OF ty_data,
     gs_data TYPE ty_data.

DATA: lv_dbs TYPE dbcon-con_name VALUE 'ZORA'.

TRY .

      EXEC SQL.
        connect to :lv_dbs
      ENDEXEC.

      EXEC SQL.
        SET CONNECTION :lv_dbs
      ENDEXEC.

      EXEC SQL PERFORMING loop_output.
        SELECT
          BATCH_NAME,
          ORDER_NUMBER,
          LINE_NAME,
          RECIPE_NUMBER,
          RECIPE_VERSION,
          BATCH_NUMBER
        INTO :gs_data
        FROM I_ORDERS_V
        WHERE STATION_IDENT = 'M'
          AND LINE_NAME = 'P'
          AND ( to_char(START_DATE,'yyyyMMdd') = :lv_last_day
            or to_char(START_DATE,'yyyyMMdd') = :lv_day)
      ENDEXEC.

  CATCH  cx_sy_native_sql_error INTO DATA(g_obj_sqldb).
      CALL METHOD g_obj_sqldb->get_text
        RECEIVING
          result = DATA(lv_error_text).
  ENDTRY.

  IF lv_error_text IS NOT INITIAL.
    MESSAGE lv_error_text TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.

      EXEC SQL.
        DISCONNECT :lv_dbs
      ENDEXEC.

FORM loop_output.
  APPEND gs_data TO gt_data.
ENDFORM.
"--------------------@斌将军--------------------
复制代码

查询单条

复制代码
"--------------------@斌将军--------------------       
 "查询数据
        CLEAR:lv_plnum.
        EXEC SQL.
          Select
            pori_order_number
          into :lv_plnum
          from customer.prod_orders_imp
          where pori_line_name = :gs_alv-pori_line_name
            and pori_order_number = :gs_alv-pori_order_number
            and pori_recipe_code = :gs_alv-pori_recipe_code
        ENDEXEC.
"--------------------@斌将军--------------------
复制代码

3.2、新增

新增数据

其中传入日期需要转换格式

复制代码
"--------------------@斌将军--------------------
FORM save_data.

  DATA: lv_dbs         TYPE dbcon-con_name VALUE 'ZORA',
        lv_pori_status TYPE char10,
        lv_plnum       TYPE plaf-plnum.

  TRY .

      EXEC SQL.
        connect to :lv_dbs
      ENDEXEC.
    CATCH  cx_sy_native_sql_error INTO DATA(g_obj_sqldb).
      CALL METHOD g_obj_sqldb->get_text
        RECEIVING
          result = DATA(lv_error_text).

      IF lv_error_text IS NOT INITIAL.
        MESSAGE '数据库连接失败:' && lv_error_text TYPE 'S' DISPLAY LIKE 'E'.
        RETURN.
      ENDIF.
  ENDTRY.

  TRY .

      LOOP AT gt_alv INTO gs_alv.

        "插入数据
        EXEC SQL.
          insert into customer.prod_orders_imp
          (pori_line_name, pori_order_number, pori_recipe_code, pori_recipe_version,pori_batch_quantity_set,
          pori_order_weight, pori_pror_blocked, pori_function, pori_start_date )
          values
          (:gs_alv-pori_line_name,:gs_alv-pori_order_number,:gs_alv-pori_recipe_code, :gs_alv-pori_recipe_version, :gs_alv-pori_batch_quantity_set,
          :gs_alv-pori_order_weight, :gs_alv-pori_pror_blocked, :gs_alv-pori_function, to_date( :gs_alv-pori_start_date,'yyyy.mm.dd hh24:mi.ss') )
        ENDEXEC.
        CLEAR:gs_alv.
      ENDLOOP.

    CATCH  cx_sy_native_sql_error INTO g_obj_sqldb.
      CALL METHOD g_obj_sqldb->get_text
        RECEIVING
          result = lv_error_text.

  ENDTRY.

  IF lv_error_text IS NOT INITIAL.
    EXEC SQL.
      rollback
    ENDEXEC.
  ELSE.
    EXEC SQL.
      commit
    ENDEXEC.
  ENDIF.

  EXEC SQL.
    DISCONNECT :lv_dbs
  ENDEXEC.

ENDFORM.
"--------------------@斌将军-------------------- 
复制代码

3.3、修改

更新数据

复制代码
"--------------------@斌将军--------------------
"更新数据
EXEC SQL.
  UPDATE customer.prod_orders_imp
  SET pori_recipe_version = :gs_alv-pori_recipe_version,
      pori_batch_quantity_set = :gs_alv-pori_batch_quantity_set
  WHERE pori_line_name = :gs_alv-pori_line_name
    AND pori_order_number = :gs_alv-pori_line_name
    AND pori_recipe_code = :gs_alv-pori_recipe_code
ENDEXEC.

......

"提交或回滚
IF lv_error_text IS NOT INITIAL.
  EXEC SQL.
    rollback
  ENDEXEC.
ELSE.
  EXEC SQL.
    commit
  ENDEXEC.
ENDIF.
"--------------------@斌将军--------------------
复制代码

3.4、删除

删除数据

复制代码
"--------------------@斌将军--------------------
"删除数据
EXEC SQL.
  DELETE FROM customer.prod_orders_imp WHERE pori_line_name = :gs_alv-pori_line_name
                                         AND pori_order_number = :gs_alv-pori_order_number
                                         AND pori_recipe_code = :gs_alv-pori_recipe_code
ENDEXEC.

......

"提交或回滚
IF lv_error_text IS NOT INITIAL.
  EXEC SQL.
    rollback
  ENDEXEC.
ELSE.
  EXEC SQL.
    commit
  ENDEXEC.
ENDIF.
"--------------------@斌将军--------------------
复制代码

 

定期更文,欢迎关注

 
 
 
 
 
 
posted @   斌将军  阅读(137)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
点击右上角即可分享
微信分享提示