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. "--------------------@斌将军--------------------
定期更文,欢迎关注
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏