abap动态写入中间库数据

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

一些项目需要向第三方数据库写入数据

一、配置数据库链接

使用DB02配置数据链接,注意叫basis装驱动

二、创建函数

1.ZFMALL_UPDATE_DB

代码如下(示例):

FUNCTION zfmall_update_db.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(PROGNAME) TYPE  PROGNAME OPTIONAL
*"     VALUE(I_TABLE) TYPE  STRING
*"     VALUE(CONNR) TYPE  DBCON-CON_NAME
*"  EXPORTING
*"     VALUE(E_RETURN) TYPE  ZSRETURN
*"  TABLES
*"      T_OUTTAB
*"      T_FIEL STRUCTURE  LVC_S_FCAT
*"----------------------------------------------------------------------
  DATA:num TYPE i.
  DATA: lr_dbconn     TYPE REF TO cl_sql_connection,
*        LV_CON        TYPE DBCON_NAME,
        lr_sql_env    TYPE REF TO cl_sql_statement,
        lr_sql_result TYPE  i,
*        lr_sql_result TYPE  i,
        lr_sql_exc    TYPE REF TO cx_sql_exception,         "#EC NEEDED
        lr_par_exc    TYPE REF TO cx_parameter_invalid.     "#EC NEEDED
*        DREF          TYPE REF TO DATA,
*        TAB_REF       TYPE REF TO DATA,
*        GT_COMPONENTS TYPE CL_ABAP_STRUCTDESCR=>COMPONENT_TABLE.
*        GS_COMPONENTS LIKE LINE OF GT_COMPONENTS.
  DATA:lv_str TYPE string.
  DATA:lv_ins TYPE string.
  DATA:lv_ins2 TYPE string.
*  DATA LV_EXISTS  TYPE ABAP_BOOL.
  DATA lv_result TYPE string.
  DATA lv_value TYPE string.
  CHECK t_fiel[] IS NOT INITIAL.
  CHECK t_outtab[] IS NOT INITIAL.
  num = lines( t_fiel ).
*  SELECT SINGLE con_name INTO lv_con FROM zdbt001 WHERE progname = progname.
*  IF sy-subrc NE 0.
*    e_return-type = 'E'.
*    e_return-msg = '请维护数据库连接数据'.
*    RETURN.
*  ENDIF.

  TRY.
      lr_dbconn = cl_sql_connection=>get_connection( con_name = connr ).
    CATCH cx_sql_exception INTO DATA(lr_sql).
      DATA(str) = lr_sql->get_text( ).

  ENDTRY.
  CREATE OBJECT lr_sql_env
    EXPORTING
      con_ref = lr_dbconn.
  DATA(tt_fiel) = t_fiel[].
  DELETE t_fiel[] WHERE fieldname = 'ICON'.
  DELETE t_fiel[] WHERE fieldname = 'MSG'.

  LOOP AT t_outtab ASSIGNING FIELD-SYMBOL(<fs>).
    CLEAR:e_return.
    IF str IS INITIAL.
      lv_str =  |DELETE { i_table } | & | WHERE |.
      lv_ins =  |INSERT INTO { i_table } | & | (|.
      lv_ins2 = | VALUES (|.
      LOOP AT t_fiel INTO DATA(s_fiel) .
        ASSIGN COMPONENT s_fiel-fieldname OF STRUCTURE <fs> TO FIELD-SYMBOL(<fs_key>).
        "更新数据库 INSERT
        lv_ins = lv_ins && |{ s_fiel-fieldname }| && ','.

        lv_value = <fs_key>.

        IF lv_value IS NOT INITIAL.
          REPLACE ALL OCCURRENCES OF `'` IN lv_value WITH `''`.
          IF s_fiel-currency NE 'X'.“注意currency = ’X' 可能导致前台ALV金额缩小或扩大10倍,可以其他字段替代判断
            lv_value = |'{ lv_value }'|.
          ELSE.
            CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
              CHANGING
                value = lv_value.
          ENDIF.

        ELSE.
          lv_value = 'NULL'.
        ENDIF.

        lv_ins2 = |{ lv_ins2 } { lv_value },|.


*        LV_INS2 = |{ LV_INS2 } | && `'` && <FS_KEY> && `'`  &&  ','.


        IF s_fiel-key = abap_true.
          "更新数据库 DELETE
          lv_str = lv_str && | { s_fiel-fieldname } = { lv_value } AND |.
        ENDIF.
      ENDLOOP.
      "更新数据库 INSERT
      CLEAR:num.
      DATA(sap_transdate) = sy-datum && sy-uzeit.
      lv_ins = lv_ins && 'SAP_TRANSDATE,'.
      lv_ins2 = lv_ins2 && `'` && sap_transdate && `',`.
      CLEAR:sap_transdate.
      num = strlen( lv_ins ).
      num = num - 1.
      lv_ins = lv_ins(num).
      lv_ins = lv_ins && ')'.
      CLEAR:num.
      num = strlen( lv_ins2 ).
      num = num - 1.
      lv_ins2 = lv_ins2(num).
      lv_ins2 = lv_ins2 && ')'.
*    "更新数据库 UPDATE
*    CLEAR:num.
*    num = strlen( lv_str ).
*    num = num - 4.
*    lv_str = lv_str(num).
*    lv_str = lv_str && ' WHERE'.

*      LOOP AT T_FIEL INTO S_FIEL WHERE KEY = 'X'.
*
*        ASSIGN COMPONENT S_FIEL-FIELDNAME OF STRUCTURE <FS> TO <FS_KEY>.
*        "更新数据库 DELETE
*        LV_STR = LV_STR && | { S_FIEL-FIELDNAME }|  && ' = ' && ` '` &&  <FS_KEY> && `'` && ' AND '.
*      ENDLOOP.
      num = strlen( lv_str ).
      num = num - 4.
      lv_str = lv_str(num).
      "  lv_str = lv_str && ';'.

*      REPLACE ALL OCCURRENCES OF `''` IN LV_STR WITH 'NULL'.
      TRY.
          lr_sql_result = lr_sql_env->execute_update( lv_str ).

        CATCH cx_sql_exception INTO DATA(lx_sql_exception).
          lv_result = lx_sql_exception->get_text( ).
          e_return-type = 'E'.
          e_return-msg = lv_result."'SQL错误请检查'.
*        RETURN.
        CATCH cx_parameter_invalid INTO DATA(lx_parameter_invalid).
          lv_result = lx_sql_exception->get_text( ).
          e_return-type = 'E'.
          e_return-msg = lv_result."'数据库错误'.
*        RETURN.
      ENDTRY.
      COMMIT WORK AND WAIT.
      lv_ins = lv_ins && lv_ins2 ."&& ';'.
*      REPLACE ALL OCCURRENCES OF `''` IN LV_INS WITH 'NULL'.
      TRY.
          lr_sql_result = lr_sql_env->execute_update( lv_ins ).

        CATCH cx_sql_exception INTO lx_sql_exception.
          lv_result = lx_sql_exception->get_text( ).
          e_return-type = 'E'.
          e_return-msg = lv_result." 'SQL错误请检查'.
        CATCH cx_parameter_invalid INTO lx_parameter_invalid.
          lv_result = lx_sql_exception->get_text( ).
          e_return-type = 'E'.
          e_return-msg =  lv_result. "'数据库错误'.
*        RETURN.
      ENDTRY.
    ELSE.
      e_return-type = 'E'.
      e_return-msg = str." 'SQL错误请检查'.
    ENDIF.
*    COMMIT WORK AND WAIT.
    IF e_return-type NE 'E'.
      COMMIT WORK .
      ASSIGN COMPONENT 'ICON' OF STRUCTURE <fs> TO FIELD-SYMBOL(<icon>).
      IF sy-subrc = 0.
        <icon> =  icon_green_light.
      ENDIF.
      ASSIGN COMPONENT 'MSG' OF STRUCTURE <fs> TO FIELD-SYMBOL(<msgtx>).
      IF sy-subrc = 0.
        <msgtx>  =  '推送成功'.
      ENDIF.
    ELSE.
      ASSIGN COMPONENT 'ICON' OF STRUCTURE <fs> TO <icon>.
      IF sy-subrc = 0.
        <icon> =  icon_red_light.
      ENDIF.
      ASSIGN COMPONENT 'MSG' OF STRUCTURE <fs> TO <msgtx>.
      IF sy-subrc = 0.
        <msgtx> = e_return-msg.
      ENDIF.
      ROLLBACK WORK .
    ENDIF.

  ENDLOOP.
*  IF e_return-type NE 'E'.
*    COMMIT WORK AND WAIT.
*  ENDIF.



  t_fiel[] = tt_fiel[].

  IF lr_dbconn IS NOT INITIAL.
    TRY.
        CALL METHOD lr_dbconn->close.
      CATCH cx_sql_exception.
    ENDTRY.
  ENDIF.
ENDFUNCTION.                                             "#EC CI_VALPAR

2.使用示例

在这里插入图片描述

在这里插入图片描述

总结

只测试过oracle数据库,其他数据库可能并不通用

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值