SAP操作外部数据库

1

文档说明

9032245e1ec3854c179a0b061db96c4c.png

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

主要分为两步:

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

2、运行代码实现CRUD

2

连接外围数据库

dcc42b4d4cc59656108ca70f0c4659bf.png

2.1

连接ORACLE

事务码:DBCO

31ee3b4c0f8416aaadf8585c36f2aa30.png

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

输入数据库用户名密码

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

运行程序ADBC_TEST_CONNECTION测试,

cc68346f6ec2044d6d9f8eb3ae6a8511.png

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

2e9d8b07e026d9b2c3bedec2f2695092.png

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

2b9cfb0a9fe65805fb7109c620611830.png

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

3175629ff0819a411c6d4b0d7108ac06.png

2.2

连接SQL Server

7fa177a9a74d99e484b3979a85673a70.png

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

输入数据库用户名密码

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

同样运行程序ADBC_TEST_CONNECTION测试

3

代码实现CRUD

775eb723899e2014ff606eb899e2af09.png

以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_codeENDEXEC......."提交或回滚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_codeENDEXEC......."提交或回滚IF lv_error_text IS NOT INITIAL.  EXEC SQL.    rollback  ENDEXEC.ELSE.  EXEC SQL.    commit  ENDEXEC.ENDIF."--------------------@斌将军--------------------

—— 希望本篇文章对您有所帮助 ——

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值