SAP ABAP基础知识 访问外部数据库-开发篇

2023-11-14

前言

本文主要介绍通过ABAP语言访问外部数据库的几种方式

一、外部数据库配置

本文示例中的代码访问了两个外部数据库

MTD : 外部oracle数据库,其中示例表 ZTTEMP 字段( ZZTNO,WERKS)

S4Q : 外部HANA数据库(开发系统访问测试系统的数据库), 使用表USR02,ZTTEMP

二、ABAP访问外部数据库

通过ABAP访问外部数据库有四种方式.根据不同的情况,可以选择不同的方法.

OPEN SQL访问
NATIVE SQL 访问
ADBC(ABAP Database Connectivity)
AMDP ABAP Managed Database Procedures ? (未验证通过)


 

三、OPEN SQL直接访问

OPEN SQL 访问的限制条件:必须在ABAP数据字典中存在该表名,并且最好同目标系统表结构一致, 一般情况下,用来访问另外一个同版本的ECC数据库.当然,也可以把ECC的表定义语句在目标系统中创建一个同名同结构的表,然后用该方式访问.

直接访问时,在FROM TABLE 后面添加 CONNECTION s4q .

s4q是DBCO中建立的和另外一个S/4系统的连接

01

报错及处理一

可能的报错及处理方式

下图报错的原因是访问ORACLE数据库必须指定一个SCHEMA. 这个可以配置在连接参数中.

01

报错及处理二

出现下面的报错,表示系统尝试使用MANDT限制数据, 此时需要给OPEN SQL 语句添加CLIENT SPECIFIED 强制OPEN SQL 不要补充MANDT限制

四、NATIVE SQL访问

通过NATIVE SQL 访问外部数据库步骤

打开连接
执行SQL命令
关闭连接
示例代码见文末

01

读取多条记录的方式

游标方式     


非游标方式


非游标方式其实隐式使用了游标.性能比游标方式要差.数据量小的时候看不出来. 大量数据读取就能看出二者的性能差异了. 

标准帮助中提示的优劣比较.

五、ADBC访问

ADBC(ABAP Database Connectivity) 是SAP提供的原生SQL(Native SQL)接口API.可以通过ADBC执行任何数据库的原生SQL语句.

ABAP中有个标准的DEMO程序: ADBC_DEMO 演示了各种SQL语句的调用方式.图四的代码示例给出了SELECT语句的常用写法.

大概需要如下的过程

创建默认数据库的链接对象
创建一个查询对象
基于sql语句创建一个结果对象
定义传递结果集一个数据对象-内表
获取数据内容
关闭连接
赋值数据到内表
示例代码详见文末

六、通过AMDP 访问?

AMDP ABAP Managed Database Procedures

标准ABAP帮助体系中提到访问外部数据库的方法中还有一种AMDP方式.为了完善本文,补充了一个AMDP访问外部数据库表的示例.(验证未通过)

尝试中发现AMDP只适用与HANA数据库. 并且尝试通过DEMO程序 DEMO_AMDP_CONNECTION 连接外部数据库S4Q. 尝试失败. (报错见图四)

感觉AMDP 并不支持连接外部数据库. 

图五中示例代码的连接 是 R/3*开头. 帮助中说S/3*是SERVICE CONNECT. 但是不理解有什么用

处.

 

七、总结

ABAP访问外部数据库的几种方式中. OPEN SQL 最简单,但是有很大局限性. NATIVE方式最简单易懂. 性能也最好. 但是不利于代码动态化. ADBC 可以动态的实现数据的读取及内表的赋值.

前文DB02 SQL编辑器SQL语句自动生成报表 就采用了ADBC访问数据库的方法: 根据语句动态定义选择屏幕,动态定义内表, 读取的数据写入内表呈现.

详见链接无峰,公众号:ABAP开发技巧SAP工具箱之一键生成报表

该工具在付费文章中可以获取.

文中通过AMDP方式连接外部数据库的验证失败. 不推荐使用. 其它三种方式根据实际情况选择使用就好.

示例代码详见文末.

示例代码,

*&---------------------------------------------------------------------*
*& Report ZTS_SQL_DBCO
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zts_dbco_opensql.


PARAMETERS: p_s4  RADIOBUTTON GROUP ra1,
            p_ora RADIOBUTTON GROUP ra1.


START-OF-SELECTION.
  CASE 'X'.
    WHEN p_s4.
*访问另一个S4系统的同名表
*需要注意的是,目标系统CLIENT和当前CLIENT 很可能不一样, 所以需要加上CLIENT SPECIFIED 避免CLIENT不同干扰数据获取
      SELECT * FROM usr02  CLIENT SPECIFIED  INTO  TABLE @DATA(lt_usr02)  BYPASSING BUFFER CONNECTION R/3*S4Q
        WHERE bname = '00177'.
      ."可以获取数据
      DATA(lv_subrc) = sy-subrc .
      cl_demo_output=>write( lv_subrc ).
      cl_demo_output=>write( lt_usr02 ).
      cl_demo_output=>display(  ).
    WHEN p_ora.
*访问另一个其它系统的同名表
*如果ABAP表有MANDT , 目标表没有, 则需要添加CLIENT SPECIFIED 避免系统自动添加MANDT 的限制条件,导致报错:字段MANDT不存在
      DATA: BEGIN OF ls_temp,
              zztno(30),
              werks(4),
            END OF ls_temp.
      DATA: lt_temp LIKE TABLE OF ls_temp.


      SELECT zztno,werks FROM zttemp CLIENT SPECIFIED CONNECTION mtd
         INTO TABLE @lt_temp.


      cl_demo_output=>display( lt_temp ).
  ENDCASE.
*  COMMIT CONNECTION s4q. "在连接中提交.

示例代码 NATIVESQL

*&---------------------------------------------------------------------*
*& Report ZTS_SQL_DBCO
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zts_dbco_nativesql.


PARAMETERS:
  p_1 RADIOBUTTON GROUP ra1,
  p_2 RADIOBUTTON GROUP ra1,
  p_3 RADIOBUTTON GROUP ra1,
  p_4 RADIOBUTTON GROUP ra1.


DATA: BEGIN OF gs_temp,
        zztno(30),
        werks(4),
      END OF gs_temp.
DATA: gt_temp LIKE TABLE OF gs_temp.
DATA conn TYPE dbcon-con_name.


INITIALIZATION.
  %_p_1_%_app_%-text = 'SELECT方式一:DO循环读取游标,添加内表'.
  %_p_2_%_app_%-text = 'SELECT方式二:通过例程添加内表'.
  %_p_3_%_app_%-text = 'UPDATE:更新表内容'.
  %_p_4_%_app_%-text = 'INSERT:写入表内容'.


START-OF-SELECTION.
  conn = 'MTD'.
  "检查连接是否已经打开
  EXEC SQL.
    SET CONNECTION :conn
  ENDEXEC.
  IF sy-subrc <> 0. "如果连接没有打开, 打开连接
    EXEC SQL.
      CONNECT TO :conn
    ENDEXEC.
  ENDIF.


*两种方式: 方式一性能好于方式二
  CASE 'X'.
    WHEN p_1.
      PERFORM frm_method_1. "SELECT方式一:DO循环读取游标,添加内表'.
    WHEN p_2.
      PERFORM frm_method_2. "SELECT方式二:通过例程添加内表'.
    when p_3.
      perform frm_update.
    when p_4.
      perform frm_insert.
  ENDCASE.


  "关闭数据库连接
  EXEC SQL.
    DISCONNECT :CONN
  ENDEXEC.


*输出结果
  CASE 'X'.
    WHEN p_1 or p_2.
      cl_demo_output=>display( gt_temp ).
  ENDCASE.
*&---------------------------------------------------------------------*
*& Form FRM_METHOD_1
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_method_1 .
  DATA: ls_temp LIKE gs_temp,
        lt_temp LIKE TABLE OF ls_temp.
  "执行SQL语句:通过open dbcur打开游标
  EXEC SQL.
    OPEN dbcur FOR
    SELECT zztno,werks FROM zttemp
  ENDEXEC.
  "循环通过游标读取记录
  " 两种赋值方式:
  " 1.按字段顺序赋值,select 字段与 INTO 字段顺序必须一致
  "   FETCH NEXT dbcur INTO :ls_TEMP-ZZTNO,:LS_TEMP-WERKS
  " 2.按结构整体赋值:select 字段必须与结构字段顺序一致,且字段长度一致.
  "   FETCH NEXT dbcur INTO :ls_TEMP
  DO.
    EXEC SQL.
      FETCH NEXT dbcur INTO :ls_TEMP-ZZTNO,:LS_TEMP-WERKS
    ENDEXEC.
    IF sy-subrc <> 0.
      EXIT.
    ELSE.
      APPEND ls_temp TO lt_temp.
    ENDIF.
  ENDDO.
  "关闭游标
  EXEC SQL.
    CLOSE dbcur
  ENDEXEC.
  gt_temp[] = lt_temp[].
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_METHOD_2
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_method_2 .
  conn = 'MTD'.
  "检查连接是否已经打开
  EXEC SQL.
    SET CONNECTION :conn
  ENDEXEC.
  IF sy-subrc <> 0. "如果连接没有打开, 打开连接
    EXEC SQL.
      CONNECT TO :conn
    ENDEXEC.
  ENDIF.
*注意:工作区 gs_temp 内表 gt_temp 必须是全局变量
  EXEC SQL PERFORMING FRM_FILL_DATA.
    SELECT zztno,werks FROM zttemp INTO :GS_TEMP
  ENDEXEC.


ENDFORM.
FORM frm_fill_data.
  APPEND gs_temp TO gt_temp.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_UPDATE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_update .
  DATA: lv_werks(4).
  lv_werks = '1002'.
  EXEC SQL.
    UPDATE ZTTEMP SET WERKS = :LV_WERKS
     WHERE WERKS = '1003'
  ENDEXEC.
  IF sy-subrc = 0.
*提交数据更新
    EXEC SQL.
      COMMIT WORK
    ENDEXEC.
    DATA: lv_msg(50).
    lv_msg = '更新成功记录数:' && sy-dbcnt .
    cl_demo_output=>display(  lv_msg ).
  ELSE.
    cl_demo_output=>display( '更新失败' ).
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_INSERT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_insert .
  DATA: lv_werks(4).
  lv_werks = '1002'.
  EXEC SQL.
    INSERT INTO ZTTEMP VALUES ('4502',:LV_WERKS)
  ENDEXEC.
  IF sy-subrc = 0.
*提交数据更新
    EXEC SQL.
      COMMIT WORK
    ENDEXEC.
    DATA: lv_msg(50).
    lv_msg = '写入成功记录数:' && sy-dbcnt .
    cl_demo_output=>display(  lv_msg ).
  ELSE.
    cl_demo_output=>display( '写入失败' ).
  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*& Report ZTS_DBCO_ADBC
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zts_dbco_adbc.


DATA: BEGIN OF gs_temp,
        zztno(30),
        werks(4),
      END OF gs_temp.
DATA: gt_temp LIKE TABLE OF gs_temp.
DATA conn TYPE dbcon-con_name.
DATA: gv_sql TYPE string.


START-OF-SELECTION.
  gv_sql = 'SELECT zztno,werks FROM zttemp'.
  PERFORM frm_get_data_adbc_simple.
*  PERFORM frm_get_data_adbc.
  cl_demo_output=>display( gt_temp ).
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA_ADBC
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data_adbc .
  DATA: r_adbc_conn   TYPE REF TO  cl_sql_connection,
        r_adbc_query  TYPE REF TO  cl_sql_statement,
        r_metadata    TYPE REF TO  data,
        it_metadata   TYPE         adbc_rs_metadata_descr_tab,
        lv_len        TYPE         i,
        lv_off        TYPE         i,
        wa_metadata   LIKE LINE OF it_metadata,
        r_adbc_result TYPE REF TO  cl_sql_result_set,
        r_tabletype   TYPE REF TO  cl_abap_tabledescr,
        r_cxadbc      TYPE REF TO  cx_dba_adbc,
        r_cxsql       TYPE REF TO  cx_sql_exception,
        tabix_n(4)    TYPE n,
        column_names  TYPE HASHED TABLE OF adbc_name WITH UNIQUE KEY table_line.
  DATA:         lv_stmt_type      TYPE string.
  DATA:
    ex_structdescr TYPE REF TO  cl_abap_structdescr,
    ex_result_ref  TYPE REF TO data.
*获取sql语句的类型
  lv_stmt_type = cl_hdb_sql_executor=>get_statement_type( gv_sql ).
*创建默认数据库的链接对象
  r_adbc_conn    = cl_db6_con=>get_connection( 'MTD' ).
*创建一个查询对象
  r_adbc_query   = r_adbc_conn->create_statement( ).
*基于sql语句创建一个结果对象
  r_adbc_result  = r_adbc_query->execute_query( gv_sql  ).
*获取结果集合的字段名
  it_metadata = r_adbc_result->get_metadata( ).
*使用结果集合的字段信息,创建一个数据对象-结构
  r_metadata = r_adbc_result->get_struct_ref( md_tab = it_metadata   p_strict = abap_false ).
*创建一个数据对象-内表
  ex_structdescr ?= cl_abap_typedescr=>describe_by_data_ref( r_metadata ).
  r_tabletype     = cl_abap_tabledescr=>create( p_line_type  = ex_structdescr
                                                p_table_kind = cl_abap_tabledescr=>tablekind_std ).


  CREATE DATA ex_result_ref TYPE HANDLE r_tabletype.
*传递结果集一个数据对象-内表
  r_adbc_result->set_param_table( itab_ref = ex_result_ref ).
*获取数据内容
  r_adbc_result->next_package( EXPORTING upto = 100 ).
*关闭连接
  r_adbc_result->close( ).
*赋值数据到内表
  FIELD-SYMBOLS: <fs_itab> TYPE STANDARD TABLE.
  ASSIGN ex_result_ref->* TO <fs_itab>.
  MOVE-CORRESPONDING <fs_itab> TO gt_temp.
ENDFORM.


FORM frm_get_data_adbc_simple .
  DATA: r_adbc_conn   TYPE REF TO  cl_sql_connection,
        r_adbc_query  TYPE REF TO  cl_sql_statement,
        r_metadata    TYPE REF TO  data,
        it_metadata   TYPE         adbc_rs_metadata_descr_tab,
        lv_len        TYPE         i,
        lv_off        TYPE         i,
        wa_metadata   LIKE LINE OF it_metadata,
        r_adbc_result TYPE REF TO  cl_sql_result_set,
        r_tabletype   TYPE REF TO  cl_abap_tabledescr,
        r_cxadbc      TYPE REF TO  cx_dba_adbc,
        r_cxsql       TYPE REF TO  cx_sql_exception,
        tabix_n(4)    TYPE n,
        column_names  TYPE HASHED TABLE OF adbc_name WITH UNIQUE KEY table_line.
  DATA:         lv_stmt_type      TYPE string.
  DATA:
    ex_structdescr TYPE REF TO  cl_abap_structdescr,
    ex_result_ref  TYPE REF TO data.


*创建默认数据库的链接对象
  r_adbc_conn    = cl_db6_con=>get_connection( 'MTD' ).
*创建一个查询对象
  r_adbc_query   = r_adbc_conn->create_statement( ).
*基于sql语句创建一个结果对象
  r_adbc_result  = r_adbc_query->execute_query( gv_sql  ).


*定义
  DATA: lr_ref LIKE REF TO gt_temp.
  CREATE DATA lr_ref .
*传递结果集一个数据对象-内表
  r_adbc_result->set_param_table( itab_ref = lr_ref ).
*获取数据内容
  r_adbc_result->next_package( EXPORTING upto = 100 ).
*关闭连接
  r_adbc_result->close( ).
*赋值数据到内表


  gt_temp = lr_ref->*.
ENDFORM.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SAP ABAP基础知识 访问外部数据库-开发篇 的相关文章

  • SAP 一句话入门之SD

    SD是Sales and Distribution的简称 在SAP系统中 xff0c 销售与分销模块处在供应链下游 xff0c 关注从客户订单到向客户收款的全过程 SD模块中的Sales好理解 xff0c 而Distribution却容易被
  • 创建利润中心在利润中心组选择时提示不存在利润中心组

    已经KCH1创建好利润中心组的情况下KE51选刚才创建好的利润中心组依然会有如题这样的提示 原因是没有0KE5进行成本控制范围设置 如图下图 设置好后再KE51创建利润中心就可以了
  • ABAP DOI 技术

    用户提出的报表 是用EXCLE显示的 有许多特殊格式 比如 加粗 大小字体等 普通的ALV报表输出并不能满足用户的要求 那么只能用ALV与EXCLE的集成技术 目前已知的技术有两种 一种是OLE技术 用SMW0上传模板 然后填写数据 多数用
  • 一段程序:SAP使用ODI方法为WORD填充数据

    未做测试 仅记备查 原文地址 http blog sina com cn s blog 3eefd36c01008cmz html 原理 通过 CALL METHOD DOCUMENT gt GET MAIL MERGE INTERFACE
  • SAP 变更记录表 : CDHDR / CDPOS - 说明及使用

    From 1 http blog sina com cn s blog 7dce1fac01014yp2 html 2 http www cnblogs com cnlmjer archive 2012 04 18 4099808 html
  • SAP第二代增强--出口查找(实例)以及使用

    第二代增强 增强查找 增强使用 增强查找 1 以CO02修改生产订单为例 修改好数据后 输入 H打开全局调试模式 2 回车后提示 调试被激活 3 点击保存 触发调试 并在STOP处打好断点 call customer function 4
  • SAP创建采购申请 报错MEPO082

    原因是系统标准功能要求手工创建PR需要有评估价格 将此字段屏幕格式设置为显示可避免此问题
  • SAP MM ME2M ME2L ME28 增强自定义字段

    本人诚心接ABAP远程开发任务 价格公道 有需要的联系我 欢迎个人 甲方爸爸 乙方私信联系 目前项目需要增强ME2L 去增加客制化的字段 一开始顾问要求是copy标准程序 然后增加字段 查阅资料之后发现 SAP 预留了标准的增强出口去做增强
  • SAP如何控制采购价格不显示(适用ME23N、ME2L、ME2M、ME2K、ME2J、ME2C、ME2B、ME2N等)

    适用场景 需要给非采购 财务岗位显示采购凭证 但不得查看到价格 针对上述事务 可不作任何修改 通过角色 权限进行细致控制 即可达到采购价格不显示的效果 一 赋给目标用户的权限最小化 仅赋以下 必要权限 权限对象 字段 值 说明 备注 S T
  • SAP 程序中权限检查和用户权限缺失检查 SU53

    1 在程序中调用权限对象 在很多SAP标准程序中 已经存在了对权限数据的调用及管控功能 在程序中可以通过ABAP程序编辑器快速插入调用权限的代码 权限代码需要放在AT SELECTION SCREEN 事件块里 AUTHORITY CHEC
  • 记录一下QM检验批接口,回头补细节

    method ZQM II SI SPCD REC SI SPCD PROCSS INSERT IMPLEMENTATION HERE gt 数据定义部分 TYPES BEGIN OF ty qamv prueflos TYPE qamv
  • ABAP DOI技术中I_OI_SPREADSHEET接口的使用

    前言部分 大家可以关注我的公众号 公众号里的排版更好 阅读更舒适 正文部分 在DOI技术中 I OI SPREADSHEET接口有很多对excel的操作方法 举个例子 CELL FORMAT方法 这个方法里面就有参数ALIGN 可以去覆盖e
  • FICO F.27 Customer statement 打印

    需求 定制化打印 替换标准的F 27打印 类似于采购订单的打印 但是略有不同 查阅资料之后步骤如下 T code F 27 is SAP standard program to produce customer vendor corresp
  • SAP ABAP基础知识 访问外部数据库-开发篇

    前言 本文主要介绍通过ABAP语言访问外部数据库的几种方式 一 外部数据库配置 本文示例中的代码访问了两个外部数据库 MTD 外部oracle数据库 其中示例表 ZTTEMP 字段 ZZTNO WERKS S4Q 外部HANA数据库 开发系
  • ChatGPT懂SAP吗?跟ChatGPT聊完后,我暂时还不担心会被它取代岗位

    我弄了个ChatGPT账号 随便问了一下他SAP的问题 它的回答还是比较有意思的 贴出来跟大家分享一下 问题1 我是 SAP 开发工程师 你有什么可以帮到我 作为一个语言模型 我可以为您提供关于SAP开发的一般性建议 以及关于如何使用SAP
  • SAP FICO 会计凭证打印开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

    开发说明书 输入屏幕 输出布局及样式 程序逻辑 输入表屏幕逻辑 查询表BKPF 根据条件 BKPF BUKRS 输入条件的公司代码 BKPF BUDAT 输入的过账日期 取值 SAP会计凭证号码 BKPF BELNR 公司代码 BKPF B
  • ABAP GN_DELIVERY_CREATE 报错 VL 561

    GN DELIVERY CREATE 去创建内向交货单的时候 报错 VL 561 Essential transfer parameters are missing in record 表示一些必输字段没输入 诸如一些 物料号 单位 等一些
  • SAP BAPI_ACC_DOCUMENT_POST记账码问题

    今天遇见一个问题 使用BAPI ACC DOCUMENT POST过账 或BAPI ACC DOCUMENT CHECK检查数据 时 报错 借 贷标记不一致 刚开始以为是数据的问题 调试后发现数据的借贷平衡 金额也没有问题 联想到记账码是通
  • SAP PO上传异步接口(PO发布Webservice)

    导语 接口是SAP与其他系统进行数据交互的一种方式 在这篇文章中主要讲述通过PO实现的上传接口 即SAP被动接收其他系统发送的数据 注意 对于配置中涉及的基本组件的介绍和创建在前面的博客有说明和介绍 再次不做过多赘述了 一 ESB Ente
  • ABAP DOI详解

    导语 DOI是SAP与Office集成的一种技术 是早期OLE的升级版本 把Excel嵌套在程序当中进行展示 需要提前上传模板 在Excel模板中 可以事先设计好公式 在SAP将数据写入Excel中之后会自动用公式进行计算 对于习惯于用Ex

随机推荐

  • freeswitch编译过程以及添加odbc连接mysql

    freeswitch 编译 参考官网wiki bootstrap sh j configure prefix home make make j install make j cd sounds install make j cd moh i
  • Git的Patch功能

    本文整理编辑自 http www cnblogs com y041039 articles 2411600 html http yuxu9710108 blog 163 com blog static 2375153420101114488
  • 可以免费使用的ChatGPT-4,微软开放Bing Chat功能,供用户体验

    微软Bing取消了 Bing Chat的等待名单 现在用户可以通过使用 Edge 浏览器并使用微软帐户登录就可以使用Bing Chat了 入口 打开Bing首页 用户点击 聊天 Chat 即可进入Bing Chat界面 目前Bing Cha
  • Open3D(C++) 模型锐化

    目录 一 模型锐化 1 概述 2 主要函数 二 代码实现 三 结果展示 1 原始模型 2 锐化处理 一 模型锐化 1 概述 Open3D中的实现一种模型锐化处理的算法 该算法的输出值 v o v o v
  • uni.switchTab()跳转不刷新页面问题

    uni switchTab 跳转不刷新页面问题 大家应该都遇到过 调转到 tabBar 里面的页面时 只能使用 uni switchTab 或者是 uni navigator 跳转 使用 uni reLauch 或者是 uni redire
  • 【BLE】-CC2541 OSAL操作系统抽象层应用程序接口API介绍

    参考源source 简介 目的 本文档的目的是定义OS抽象层 OSAL 的API 这个API适用于TI协议栈软件组的产品 例如Z 堆栈 RemoTI 和BLE 适用范围 该文件列举了由OSAL提供的所有函数调用 详细地说明了所有函数调用 方
  • C++11之继承构造函数(using 声明)

    系列文章 C 11之正则表达式 regex match regex search regex replace C 11之线程库 Thread Mutex atomic lock guard 同步 C 11之智能指针 unique ptr s
  • SQL,NowSQL及NewSQL浅析

    关系型数据库 NOSQL NEWSQL浅析 1 关系型数据库 关系数据库 是建立在关系模型基础上的数据库 借助于集合代数等数学概念和方法来处理数据库中的数据 简单来说 关系模型指的就是二维表格模型 而一个关系型数据库就是由二维表及其之间的联
  • 华为OD机试 - 在字符串中找出连续最长的数字串(含“+-”号)(Java)

    题目描述 请在一个字符串中找出连续最长的数字串 并返回这个数字串 如果存在长度相同的连续数字串 返回最后一个 如果没有符合条件的字符串 返回空字符串 注意 数字串可以由数字 0 9 小数点 正负号 组成 长度包括组成数字串的所有符号 仅能出
  • 臭名昭著的MOS管米勒效应

    概述 MOS管的米勒效应会在高频开关电路中 延长开关频率 增加功耗 降低系统稳定性 可谓是臭名昭著 各大厂商都在不遗余力的减少米勒电容 分析 如下是一个NMOS的开关电路 阶跃信号VG1设置DC电平2V 方波 振幅2V 频率50Hz T2的
  • 求大神们指教

    都已经定义了 为什么出现如下错误 求大神们指教 1 gt main obj error LNK2019 无法解析的外部符号 public char thiscall LinkStack
  • x86直接写屏显示字符串

    直接向显存地址 0xb800 xxxx 写入数据 屏幕显示 80列 25行 一个字符显存2byte file showstr s code16 globl start begtext begdata begbss endtext endda
  • 一般试卷的纸张大小是多少_平时打印卷子的纸是多大的?

    展开全部 一般使用的是A3大小的纸 一 打印的卷子纸 一般是8K大小 就像两张A4纸拼在一起的大小 但是 32313133353236313431303231363533e59b9ee7ad9431333365643661家用打印机一般只能
  • Java学习笔记32——字符缓冲流

    字符缓冲流 字符流 字符缓冲流 字符缓冲流的特有功能 IO流小结 字节流 字符流 字符流 字符缓冲流 BufferedWriter 将文本写入字符输出流 缓冲字符 以提供单个字符 数组和字符串的高效写入 可以指定缓冲区大小 或者可以接受默认
  • IDEA 解决Maven打包时控制台中文乱码

    File Settings VM Options中加入 DarchetypeCatalog internal Dfile encoding GBK
  • 遍历提取文件夹中特定的jpg图片并存入指定文件夹

    coding utf 8 usr bin python test copyfile py import os shutil rootdir home unbuntu Desktop yixian 要提取文件夹的根目录 dstdir0 hom
  • STM32 基础系列教程 48 – CJSON

    前言 JSON JavaScript Object Notation JS 对象简谱 是一种轻量级的数据交换格式 它基于 ECMAScript 欧洲计算机协会制定的js规范 的一个子集 采用完全独立于编程语言的文本格式来存储和表示数据 简洁
  • 统计字符串中重复的字符个数并输出

    输出字符串各个字符的个数 对重复的字符将其下标存放在vector中 使用unique函数只保存一份重复字符的数字 通过下标查找到相应的字符 从map中取出对应的统计数字 include iostream include windows h
  • 吴恩达机器学习笔记:手搓线性回归(梯度下降寻优)

    概念就不介绍了 记录下公式推导和代码实现 以及与最小二乘的比较 吴恩达老师课程中使用一个参数theta保存两个变量 不过我好像没把中间变量的形状对齐 所以最后实现了两个参数的版本 代码 import time import numpy as
  • SAP ABAP基础知识 访问外部数据库-开发篇

    前言 本文主要介绍通过ABAP语言访问外部数据库的几种方式 一 外部数据库配置 本文示例中的代码访问了两个外部数据库 MTD 外部oracle数据库 其中示例表 ZTTEMP 字段 ZZTNO WERKS S4Q 外部HANA数据库 开发系