SAP本身支持直接对外部多种数据库的直接访问,数据库类型通过搜索帮助可知:
这里主要介绍如何进行ORA也就是oracle数据库的连接以及给出实例。
ORA的配置分成二部分,一部分是SAP服务器需要有oracle的数据库驱动,比较直接的方式就是在服务器上安装相应版本的oracle,然后配置tnsnames.ora文件数据库的地址信息。
根据其他同事的经验,如果SAP版本是使用oracle作为底层数据库的话只需要配置tnsnames.ora文件夹即可。
第二部分在SAP客户端前段进行,使用事务代码DBCO或者DB02进入,按照要求填写信息:
配置完成后可以使用页面中的测试进行连接测试,也可以使用程序ADBC_TEST_CONNECTION进行连接测试。
实例:
①如何使用SELECT获取表信息
②如何使用INSERT/UPDATE
DATA: gw_dbs TYPE dbcon-con_name VALUE 'Z_ORACLE'. TRY. EXEC SQL. connect to :gw_dbs ENDEXEC. CATCH cx_sy_native_sql_error INTO g_obj_sqldb. CALL METHOD g_obj_sqldb->get_text RECEIVING result = g_error_text. ENDTRY. IF g_error_text is INITIAL. EXEC SQL. SET CONNECTION 'Z_ORACLE' ENDEXEC. TRY . EXEC SQL PERFORMING loop_output. SELECT * FROM hfm_sap_gl_balances INTO :wa ENDEXEC. CATCH cx_sy_native_sql_error INTO g_obj_sqldb. CALL METHOD g_obj_sqldb->get_text RECEIVING result = g_error_text. ENDTRY. ELSE. MESSAGE s000 WITH g_error_text DISPLAY LIKE 'E'. LEAVE LIST-PROCESSING. ENDIF. FORM loop_output. APPEND gs_balances TO gt_balances. ENDFORM.
EXEC SQL.
DISCONNECT :gw_dbs
ENDEXEC.
前面这一段代码详细介绍使用了FORM的方式获取表的内容,自然如果是单条信息的话就不需要添加PERFORMING loop_output这一段代码了,
至于INSERT与UPDATE的使用方法相对简单,直接贴核心代码
EXEC SQL. UPDATE hfm_sap_gl_balances SET begin_balance_end = :i_passin-begin_balance_end, period_net_dr = :i_passin-period_net_dr, period_net_cr = :i_passin-period_net_cr, period_net_end = :i_passin-period_net_end, begin_balance_end_rmb = :i_passin-begin_balance_end_rmb, period_net_dr_rmb = :i_passin-period_net_dr_rmb, period_net_cr_rmb = :i_passin-period_net_cr_rmb, period_net_end_rmb = :i_passin-period_net_end_rmb, last_update_date = to_date(:sy-datum,'YYYYMMDD HH24:MI:SS') WHERE period_year = :i_passin-period_year AND period_num = :i_passin-period_num AND company_code = :i_passin-company_code AND account_code = :i_passin-account_code AND customer_code = :i_passin-customer_code AND type_code = :i_passin-type_code ENDEXEC.
EXEC SQL. INSERT INTO hfm_sap_gl_balances (period_year, period_num, currency_code, company_code, department_code, account_code, customer_code, type_code, begin_balance_end, period_net_dr, period_net_cr, period_net_end, begin_balance_end_rmb, period_net_dr_rmb, period_net_cr_rmb, period_net_end_rmb, account_type, last_update_date ) VALUES (:i_passin-period_year, :i_passin-period_num, :i_passin-currency_code, :i_passin-company_code, '', :i_passin-account_code, :i_passin-customer_code, :i_passin-type_code, :i_passin-begin_balance_end, :i_passin-period_net_dr, :i_passin-period_net_cr, :i_passin-period_net_end, :i_passin-begin_balance_end_rmb, :i_passin-period_net_dr_rmb, :i_passin-period_net_cr_rmb, :i_passin-period_net_end_rmb, :i_passin-account_type, to_date(:sy-datum,'YYYYMMDD HH24:MI:SS')) ENDEXEC.
当然最后别忘了提交
EXEC SQL. COMMIT ENDEXEC.