SAP_ABAP_接口技术_RFC远程函数实践总结

news2024/11/18 11:50:04

SAP ABAP顾问能力模型梳理_企业数字化建设者的博客-CSDN博客SAP Abap顾问能力模型,ALV/REPORT|SMARTFROM|SCREEN|OLE|BAPI|BDC|PI|IDOC|RFC|API|WEBSERVICE|Enhancement|UserExits|Badi|Debughttps://blog.csdn.net/java_zhong1990/article/details/132469977

 SAP接口常用的有这5种:PI、远程RFC、API、Webservice、IDOC

SAP_ABAP_接口技术_PI实践总结_企业数字化建设者的博客-CSDN博客
SAP_ABAP_接口技术_RFC远程函数实践总结_企业数字化建设者的博客-CSDN博客

SAP_ABAP_接口技术_API实践总结_企业数字化建设者的博客-CSDN博客
SAP_ABAP_接口技术_Webservice实践总结_企业数字化建设者的博客-CSDN博客

一、背景介绍

  1. 函数模块: 在 SAP 系统中,函数模块是预定义的业务逻辑单元,可以被其他程序调用。RFC 机制允许通过网络调用远程系统中的函数模块。

  2. 远程调用: RFC 允许在一个 SAP 系统中调用另一个 SAP 系统中的函数模块,即使这些系统可能位于不同的服务器上。

  3. 同步和异步调用: RFC 调用可以是同步的(等待调用返回结果)或异步的(不等待返回结果)。同步调用适用于需要等待结果的情况,而异步调用适用于不需要立即获取结果的情况。

  4. RFC 目标: 在调用 RFC 函数模块之前,需要定义 RFC 目标。RFC 目标描述了要调用的远程系统和目标函数模块。这些目标可以在事务代码 SM59 中配置。

  5. 事务和批处理: RFC 调用可以在事务内或批处理作业中执行。这使得可以在不同系统之间传递数据并处理业务流程。

  6. 安全性: RFC 调用可以通过网络进行,因此安全性是一个关键问题。SAP 提供了各种身份验证和授权机制来确保数据的安全传输和处理。

实现步骤

1.1 SE37-->创建函数-->创建输入输出参数-->编写代码

1.2 启用远程的函数模块

1.3 代码样例

FUNCTION zfm_mm_140.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(IH) TYPE  ZSMM140HEADER
*"  EXPORTING
*"     VALUE(STATUS) TYPE  CHAR2
*"     VALUE(MESSAGE) TYPE  CHAR255
*"  TABLES
*"      ITAB STRUCTURE  ZSMM140ITEM
*"----------------------------------------------------------------------
*程序名:
*程序描述:MM-140_采购订单收货退货接口
*----------------------------------------------------------------------
*创建日期        ABAP开发顾问    业务顾问
*2019.09.17.             

  zlog_save1 'ZFM_MM_330'.
  zlog_save2 'B'.
*-----------------------------------------------------------------------

  DATA ls_gh TYPE bapi2017_gm_head_01.
  DATA ls_gi TYPE bapi2017_gm_item_create.
  DATA lt_gi TYPE TABLE OF bapi2017_gm_item_create.

  DATA ls_poitem TYPE bapimepoitem.
  DATA lt_poitem TYPE TABLE OF bapimepoitem.
  DATA ls_poitemx TYPE bapimepoitemx.
  DATA lt_poitemx TYPE TABLE OF bapimepoitemx.
  DATA ls_return TYPE bapiret2.
  DATA lt_return TYPE TABLE OF bapiret2.

  DATA gr_ebeln TYPE RANGE OF ekpo-ebeln. "采购订单号
  DATA gw_ebeln LIKE LINE OF gr_ebeln.

  DATA lv_message_str(255) TYPE c.

  IF itab[] IS NOT INITIAL.

    "1.==========为检查逻辑所需要准备的数据源

    CLEAR itab.
    LOOP AT itab[] INTO itab.
      gw_ebeln-sign = 'I'.
      gw_ebeln-option = 'EQ'.
      gw_ebeln-low = itab-po_number.
      gw_ebeln-high = ''.
      APPEND gw_ebeln TO gr_ebeln.
    ENDLOOP.
    DELETE ADJACENT DUPLICATES FROM gr_ebeln COMPARING low.

    SELECT ekpo~ebeln,"采购订单号
           ekpo~ebelp,"项次
           ekpo~retpo,"采购退货订单标识 X:采购退货订单
           ekpo~werks "工厂
       FROM ekpo
       WHERE ekpo~ebeln IN @gr_ebeln
      INTO TABLE @DATA(lt_ekpo).

    "查找未打删除标识的来料单号
    SELECT
      ztmm_incom_list~incom,   "来料单号
      ztmm_incom_list~item,   "来料单项次
      ztmm_incom_list~ebeln,  "采购凭证
      ztmm_incom_list~ebelp,   "项目
      ztmm_incom_list~loekz
      FROM ztmm_incom_list WHERE ztmm_incom_list~loekz IS INITIAL AND ztmm_incom_list~incom = @ih-incom
      INTO TABLE @DATA(lt_incom_list).

    "取工厂和库存地点
    SELECT
      t001l~werks,
      t001l~lgort
      FROM t001l
       INTO TABLE @DATA(lt_t001l).

    "取物料过账日志表
    SELECT
      ztmm_140~incom,
      ztmm_140~item,
      ztmm_140~mblnr "物料凭证编号
      FROM ztmm_140 WHERE ztmm_140~incom = @ih-incom
      INTO TABLE @DATA(lt_ztmm_140).

    "2.==========接口传入参数进行检查

    LOOP AT itab[]  ASSIGNING FIELD-SYMBOL(<ls_itab>).
      "  传入的采购订单及项次若为空,则返回错消息“采购订单、项次不能为空”;
      IF <ls_itab>-po_number IS INITIAL OR <ls_itab>-po_item IS INITIAL.
        <ls_itab>-type = 'E'.
        <ls_itab>-message = '采购订单、项次不能为空'.
        CONTINUE.
      ENDIF.

      "根据传入采购订单及项次取退货标识(EKPO-RETPO),EKPO-RETPO =‘X’为退货采购订单;若采购订单及项次不是退货采购订单,
      "则传入的来料单(INCOM)及来料单项次ITEM不为空,否则提示“非采购退货单,来料单及项次不能为空”
      READ TABLE lt_ekpo INTO DATA(ls_ekpo) WITH KEY ebeln = <ls_itab>-po_number ebelp = <ls_itab>-po_item.
      IF sy-subrc = 0.
        IF ls_ekpo-retpo = 'X'.
          "EKPO-RETPO =‘X’退货采购订单
          <ls_itab>-retpo = 'X'.
          "根据传入的的采购订单及项次从EKPO取RETPO,若RETPO = ‘X’,则给161;其他情况给101
          <ls_itab>-move_type = '161'."移动类型
        ELSE.
          "采购订单
          <ls_itab>-move_type = '101'."移动类型
          "若采购订单及项次不是退货采购订单,"则传入的来料单(INCOM)及来料单项次ITEM不为空,否则提示“非采购退货单,来料单及项次不能为空”
          IF <ls_itab>-item IS INITIAL OR ih-incom IS INITIAL .
            <ls_itab>-type = 'E'.
            <ls_itab>-message = '及来料单以及项次ITEM不为空'.
            CONTINUE.
          ENDIF.
        ENDIF.
      ELSE.
        <ls_itab>-type = 'E'.
        <ls_itab>-message = '采购订单以及行项目不存在'.
        CONTINUE.
      ENDIF.

      "若库存地点为空,则返回错误消息“库存地点不能为空;
      IF <ls_itab>-stge_loc IS INITIAL.
        <ls_itab>-type = 'E'.
        <ls_itab>-message = '库存地点不能为空'.
        CONTINUE.
      ENDIF.

      "根据传入的采购订单号及项次从EKPO取 工厂(EKPO-WERKS);根据传入的库存地点及刚取到的PO 工厂判断在table T001l 是否存在,不存在返回错误消息“库存地XXX在工厂YYY 不存”
      READ TABLE lt_ekpo INTO DATA(ls_ekpo_werks) WITH KEY ebeln = <ls_itab>-po_number ebelp = <ls_itab>-po_item.
      IF sy-subrc = 0.
        READ TABLE lt_t001l INTO DATA(ls_t001l) WITH KEY werks = ls_ekpo_werks-werks lgort = <ls_itab>-stge_loc.
        IF sy-subrc <> 0.
          <ls_itab>-type = 'E'.
          <ls_itab>-message = '库存地'&& <ls_itab>-stge_loc &&'在工厂'&& ls_ekpo_werks-werks &&'不存'.
          CONTINUE.
        ENDIF.
      ELSE.
        <ls_itab>-type = 'E'.
        <ls_itab>-message = '传入的采购订单和项次在采购订单表 ekpo中,不存在'.
        CONTINUE.
      ENDIF.

      "若未税价格(NETPR)为空或价格基数PEINH为空或购买税代码(MWSKZ)空,则返回错误消息“未税价格,价格基数及税代码都不能为空”;
      IF <ls_itab>-netpr IS INITIAL OR <ls_itab>-peinh IS INITIAL OR <ls_itab>-mwskz IS INITIAL.
        <ls_itab>-type = 'E'.
        <ls_itab>-message = '未税价格,价格基数及税代码都不能为空'.
        CONTINUE.
      ENDIF.

      "若传入的来料单(INCOM)及来料单项次ITEM不为空,则根据来料单、项次 及ZTMM_INCOM_LIST-LOEKZ 等于空,判断来料单及项次在ztable ZTMM_INCOM_LIST 是否存在,不存在,则返回错误消息“来料单XXXXX 项次YY在SAP 不存在”
      READ TABLE lt_incom_list INTO DATA(ls_incom_list)  WITH KEY incom = ih-incom item = <ls_itab>-item.
      IF sy-subrc <> 0.
        <ls_itab>-type = 'E'.
        <ls_itab>-message = '传入的来料单号已经项次在 ZTMM_INCOM_LIST表中不存在'.
        CONTINUE.

      ELSE.
        "根据传入的来料单(INCOM)及来料单项次ITEM 及ZTMM_INCOM_LIST-LOEKZ 等于空条件,
        "从table ZTMM_INCOM_LIST取采购订单号(EBELN)及项次(EBELP),如果取到的采购订单号及项次与接口传入的订单号及项次不一致,
        "则返回错误消息“来料单XXXXX 项次YY 对应的采购订单号及项次不匹配”;
        IF ls_incom_list-ebeln = <ls_itab>-po_number AND ls_incom_list-ebelp = <ls_itab>-po_item.
          "相等通过
        ELSE.
          "不相等
          <ls_itab>-type = 'E'.
          <ls_itab>-message = '来料单'&& ih-incom &&'项次' && <ls_itab>-po_item && '对应的采购订单号及项次不匹配'.
          CONTINUE.
        ENDIF.
      ENDIF.

      "若传入的来料单(INCOM)及来料单项次ITEM不为空,根据传入的来料单(INCOM)及来料单项次和上述新建ztable Zpo_gr
      "能取到不为空的物料凭证(MBLNR),则提示“来料单XXX 项次之前已经入库”的错误消息
      READ TABLE lt_ztmm_140 INTO DATA(ls_ztmm_140) WITH KEY incom = ih-incom item = <ls_itab>-item.
      IF sy-subrc = 0.
        IF ls_ztmm_140-mblnr IS NOT INITIAL.
          <ls_itab>-type = 'E'.
          <ls_itab>-message = '来料单'&& ih-incom &&'项次'&& <ls_itab>-item &&'之前已经入库'.
          CONTINUE.
        ENDIF.
      ENDIF.
    ENDLOOP.

    "3.==========对检查通过的记录进行业务处理

    LOOP AT itab[] ASSIGNING FIELD-SYMBOL(<ls_tb>) WHERE type <> 'E' .
      IF <ls_tb>-retpo = 'X'. "退货订单,直接过账
      ELSE. "非采购订单,更改PO价格在过账
        ls_poitem-po_item = <ls_tb>-po_item." 行项目
        ls_poitemx-po_item = <ls_tb>-po_item." 行项目
        ls_poitemx-po_itemx = 'X'." 行项目
        ls_poitem-net_price = <ls_tb>-netpr ."净价
        ls_poitemx-net_price = 'X'.
        ls_poitem-price_unit = <ls_tb>-peinh."价格单位
        ls_poitemx-price_unit = 'X'.
        ls_poitem-tax_code = <ls_tb>-mwskz."税码
        ls_poitemx-tax_code = 'X'.
        APPEND ls_poitem TO lt_poitem.
        APPEND ls_poitemx TO lt_poitemx.

        CALL FUNCTION 'BAPI_PO_CHANGE'
          EXPORTING
            purchaseorder = <ls_tb>-po_number
          TABLES
            return        = lt_return
            poitem        = lt_poitem
            poitemx       = lt_poitemx.
        IF sy-subrc = 0.
          READ TABLE lt_return INTO ls_return INDEX 1.
          IF sy-subrc = 0.
            <ls_tb>-type = ls_return-type.
            <ls_tb>-id = ls_return-id.
            <ls_tb>-number = ls_return-number.
            <ls_tb>-message = ls_return-message.
            <ls_tb>-log_no = ls_return-log_no.
            <ls_tb>-log_msg_no = ls_return-log_msg_no.
            <ls_tb>-message_v1 = ls_return-message_v1.
            <ls_tb>-message_v2 = ls_return-message_v2.
            <ls_tb>-message_v3 = ls_return-message_v3.
            <ls_tb>-message_v4 = ls_return-message_v4.
            <ls_tb>-parameter = ls_return-parameter.
            <ls_tb>-row = ls_return-row.
            <ls_tb>-field = ls_return-field.
            <ls_tb>-system = ls_return-system.
          ENDIF.
          CLEAR ls_return.
          IF lines( lt_return ) > 1.
            lv_message_str = ''.
            LOOP AT lt_return INTO ls_return.
              lv_message_str = lv_message_str && ls_return-type && ls_return-message && ','.
            ENDLOOP.
            <ls_tb>-message = lv_message_str.
          ENDIF.
          IF <ls_tb>-type = 'S'.
            CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' "BAPI事务提交
              EXPORTING
                wait = 'X'.
          ELSE.
            CONTINUE.
          ENDIF.
           "20190927 zhongjz add : ---------------------------------------------------------------------------------------------strat
          "   根据当前记录的采购订单及行项目从EKPO取最新的价格(EKPO-NETPR)、价格基数(EKPO-PEINH)和税码(EKPO-MWSKZ),
          "只要有一个字段的值和对应传入的值不相等,则说明价格更新更新失败,继续下一条,否则继续当前采购订单收货
          SELECT ekpo~ebeln  FROM ekpo
            WHERE ekpo~ebeln =  @<ls_tb>-po_number
            AND ekpo~ebelp = @<ls_tb>-po_item
            AND ekpo~netpr =  @<ls_tb>-netpr
            AND ekpo~peinh = @<ls_tb>-peinh
            AND ekpo~mwskz = @<ls_tb>-mwskz
            INTO TABLE @DATA(lt_ekpo_update_success).
          IF sy-subrc = 0 AND lt_ekpo_update_success IS NOT INITIAL.
            "po价格等更新检查通过
            clear lt_ekpo_update_success.
          ELSE.
            "po价格等更新检查未通过
            <ls_tb>-type = 'E'.
            <ls_tb>-message = '价格更新失败'.
            CONTINUE.
          ENDIF.
          "20190927 add : ---------------------------------------------------------------------------------------------end.
        ELSE.
          <ls_tb>-type = 'E'.
          <ls_tb>-message = '价格更新失败'.
          CLEAR ls_poitem.
          REFRESH lt_poitem.
          CLEAR ls_poitemx.
          REFRESH lt_poitemx.
          CONTINUE.
        ENDIF.
        CLEAR ls_poitem.
        REFRESH lt_poitem.
        CLEAR ls_poitemx.
        REFRESH lt_poitemx.
      ENDIF.
      "过账。
      CLEAR ls_return.
      REFRESH lt_return.
      ls_gh-pstng_date = ih-pstng_date."过帐日期
      ls_gh-doc_date = ih-doc_date."凭证日期
      ls_gh-ref_doc_no = ih-incom."参考凭证编号 -来料单号
      ls_gh-bill_of_lading = ih-bill_of_lading."收货时提单号
      ls_gh-header_txt = ih-header_txt."凭证抬头文本

      ls_gi-material_long = <ls_tb>-material."物料编号
      ls_gi-plant = <ls_tb>-plant."工厂
      ls_gi-stge_loc = <ls_tb>-stge_loc."库存地点
      ls_gi-batch = <ls_tb>-batch. "批号
      ls_gi-move_type = <ls_tb>-move_type. "移动类型
      ls_gi-entry_qnt = <ls_tb>-entry_qnt."以录入项单位表示的数量

      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
        EXPORTING
          input    = <ls_tb>-entry_uom
          language = sy-langu
        IMPORTING
          output   = <ls_tb>-entry_uom.
      ls_gi-entry_uom = <ls_tb>-entry_uom."条目单位

      ls_gi-po_number = <ls_tb>-po_number. "采购订单号
      ls_gi-po_item = <ls_tb>-po_item. "采购凭证的项目编号
      ls_gi-item_text = <ls_tb>-item."项目文本
      ls_gi-mvt_ind = 'B'. "移动标识 fix value B 表示采购订单收货
      APPEND ls_gi TO lt_gi.
      CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
        EXPORTING
          goodsmvt_header  = ls_gh
          goodsmvt_code    = '01'
        IMPORTING
          materialdocument = <ls_tb>-materialdocument  "物料凭证编号
          matdocumentyear  = <ls_tb>-matdocumentyear   "物料凭证年度
        TABLES
          goodsmvt_item    = lt_gi
          return           = lt_return.
      IF sy-subrc = 0.
        IF <ls_tb>-materialdocument IS NOT INITIAL.
          <ls_tb>-type = 'S'.
        ENDIF.
        READ TABLE lt_return INTO ls_return INDEX 1.
        IF sy-subrc = 0.
          <ls_tb>-type = ls_return-type.
          <ls_tb>-id = ls_return-id.
          <ls_tb>-number = ls_return-number.
          <ls_tb>-message = ls_return-message.
          <ls_tb>-log_no = ls_return-log_no.
          <ls_tb>-log_msg_no = ls_return-log_msg_no.
          <ls_tb>-message_v1 = ls_return-message_v1.
          <ls_tb>-message_v2 = ls_return-message_v2.
          <ls_tb>-message_v3 = ls_return-message_v3.
          <ls_tb>-message_v4 = ls_return-message_v4.
          <ls_tb>-parameter = ls_return-parameter.
          <ls_tb>-row = ls_return-row.
          <ls_tb>-field = ls_return-field.
          <ls_tb>-system = ls_return-system.
          CLEAR ls_return.
          IF lines( lt_return ) > 1.
            lv_message_str = ''.
            LOOP AT lt_return INTO ls_return.
              lv_message_str = lv_message_str && ls_return-type && ls_return-message && ','.
            ENDLOOP.
            <ls_tb>-message = lv_message_str.
          ENDIF.

        ENDIF.
        IF <ls_tb>-type = 'S'.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' "BAPI事务提交
            EXPORTING
              wait = 'X'.
            "20190927 zhongjz update :注释ELSE.CONTINUE. 代码如下:
*        ELSE.
*          CONTINUE.
        ENDIF.
      ELSE.
        <ls_tb>-type = 'E'.
        <ls_tb>-message = '过账失败'.
        CLEAR ls_gh.
        CLEAR ls_gi.
        REFRESH lt_gi.
        CLEAR ls_return.
        REFRESH lt_return.
        CONTINUE.
      ENDIF.
      CLEAR ls_gh.
      CLEAR ls_gi.
      REFRESH lt_gi.
      CLEAR ls_return.
      REFRESH lt_return.
    ENDLOOP.

    "==============4.对过账成功的记录 记录log到ztmm_140.
    DATA ls_tlog TYPE ztmm_140.
    DATA lt_tlog TYPE TABLE OF ztmm_140.
    DATA lv_date LIKE sy-datum.
    DATA lv_time LIKE sy-uzeit.
    DATA lv_tzone LIKE  tzonref-tzone.
    DATA lv_tstamp LIKE tzonref-tstamps.
    lv_date = sy-datum.
    lv_time = sy-uzeit.
    CONVERT DATE lv_date TIME lv_time INTO TIME STAMP lv_tstamp TIME ZONE lv_tzone.
    "20190927 zhongjz upate : "不仅仅是成功的记录存入log table, 所有成功或者失败的都需要存入log table"
*    LOOP AT itab ASSIGNING FIELD-SYMBOL(<ls_itab_success>) WHERE materialdocument IS NOT INITIAL AND type = 'S'.
    LOOP AT itab ASSIGNING FIELD-SYMBOL(<ls_itab_success>).
      ls_tlog-z_tiwmstamp = lv_tstamp. "时间搓
      ls_tlog-incom = ih-incom."来料单号
      ls_tlog-item = <ls_itab_success>-item."项次
      ls_tlog-ebeln = <ls_itab_success>-po_number."采购凭证编号
      ls_tlog-ebelp = <ls_itab_success>-po_item."采购凭证的项目编号
      ls_tlog-budat = ih-pstng_date."凭证中的过账日期
      ls_tlog-bldat = ih-doc_date."凭证中的凭证日期
      ls_tlog-frbnr = ih-bill_of_lading."收货时提单号
      ls_tlog-bktxt = ih-header_txt."凭证抬头文本
      ls_tlog-werks = <ls_itab_success>-plant."工厂
      ls_tlog-matnr = <ls_itab_success>-material."物料编号
      ls_tlog-lgort = <ls_itab_success>-stge_loc."库存地点
      ls_tlog-charg = <ls_itab_success>-batch."批号
      ls_tlog-erfmg = <ls_itab_success>-entry_qnt."以录入项单位表示的数量
      ls_tlog-z_erfme = <ls_itab_success>-entry_uom."条目单位
      ls_tlog-netpr = <ls_itab_success>-netpr."净价
      ls_tlog-mwskz = <ls_itab_success>-mwskz."销售/购买税代码
      ls_tlog-peinh = <ls_itab_success>-peinh."价格单位
      ls_tlog-mblnr = <ls_itab_success>-materialdocument."物料凭证编号
      ls_tlog-mjahr = <ls_itab_success>-matdocumentyear."物料凭证的年份
      ls_tlog-z_type = <ls_itab_success>-type."单字符标记
      ls_tlog-z_wmssage = <ls_itab_success>-message."Char255
      APPEND ls_tlog TO lt_tlog.
    ENDLOOP.
    MODIFY ztmm_140 FROM TABLE lt_tlog.
    CLEAR ls_tlog.
    REFRESH lt_tlog.

*    status = 'S'.
*    message = ''.

  ELSE.

    status = 'E'.
    message = '行项目不能为空!'.

  ENDIF.

*-----------------------------------------------------------------------
  zlog_save2 'R'.
ENDFUNCTION.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/962615.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[C/C++]天天酷跑超详细教程-中篇

个人主页&#xff1a;北海 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C/C&#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正&#xff0c;大家一起学习交流&#xff01;&#x1f9…

stable diffusion实践操作-hypernetworks

本文专门开一节写hypernetworks的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 一、hypernetworks是什么&#xff1f; 中文名字叫超网络&#xff0c;功能和embedding&#xff0c;lora类似&#xff0c;都是对生成的图片进行针对性…

Spring Cloud--从零开始搭建微服务基础环境【二】

&#x1f600;前言 本篇博文是关于Spring Cloud–从零开始搭建微服务基础环境【二】&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;…

02-Flask-对象初始化参数

对象初始化参数 前言对象初始化参数import_namestatic_url_pathstatic_foldertemplate_floder 前言 本篇来学习Flask中对象初始化参数 对象初始化参数 import_name Flask程序所在的包(模块)&#xff0c;传__name__就可以 _name_ 是一个标识 Python 模块的名字的变量&#x…

随记-多租户数据隔离

数据隔离 DataBase 隔离 ( 独立数据库 )Schema 隔离 ( 共享数据库&#xff0c;但隔离数据架构 )Table 隔离 ( 共享数据库&#xff0c;共享数据架构 ) DB 隔离 即一个租户一个数据库&#xff0c;这种方案的用户数据隔离级别最高&#xff0c;安全性最好&#xff0c;但成本较高 …

软件外包开发人员分类

在软件开发中&#xff0c;通常会分为前端开发和后端开发&#xff0c;下面和大家分享软件开发中的前端开发和后端开发分类和各自的职责&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 前端开发&…

通俗易懂的子网划分(第八课)

博主换个思维方式来讲述自己学习的内容>学习这个技术的背景是啥?为什么要学习这个技术&#xff1f;如何去学习好这项技术&#xff1f;如何讲好自己学习这项技术。 一 思考下面问题带着问题找答案&#xff1f; 1 思考一下为什么要子网划分&#xff1f; 2 如何去子网划分&a…

c++11 标准模板(STL)(std::basic_stringstream)(三)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_stringstream;(C11 前)template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::alloc…

解决Linux Ubuntu上安装RabbitMQ服务后的公网远程访问问题,借助cpolar内网穿透技术

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

使用Windbg动态调试排查软件启动不了的问题

目录 1、问题说明 2、初步分析 3、使用Windbg启动程序进行动态调试 4、进一步分析 5、何时使用Windbg静态分析&#xff1f;何时使用Windbg进行动态调试&#xff1f; 6、最后 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&…

Java_理解方法调用

理解方法调用 首先什么是隐式参数 --->隐式参数是调用该方法的对象本身。 接下来方法的名称和参数列表被称为方法的签名&#xff08;signature&#xff09;。在Java中&#xff0c;方法的签名由方法的名称和参数列表组成&#xff0c;用于唯一标识一个方法。返回类型不是签名的…

windows 10通过IP连接hp打印机192.168.8.115

一直点下一步。完成后要等一会儿才出现在列表里。

Win7下设置“定时关机”的方法

【Win7下设置定时关机的方法】 ●【所有程序】→【附件】→【系统工具】→【任务计划程序】 ● 右键单击&#xff0c;选择【创建基本任务】&#xff0c;然后在【任务名称】中填自定义名称&#xff0c;如“定时关机” ● 之后&#xff0c;按照下面各图的提示进行“任务触发器”…

MySQL left join 和 left outer join 区别

先说结论: left join 和 left outer join 的结果是一致的。 我不知道各位大神是怎么测试的&#xff0c;网上面就说两个不一样&#xff0c;我A、B表都是有重复数据的&#xff0c;为啥结果是一样的。 表A 表B 左连接 SELECT ta.*,tb.Result ResultB FROM TableA ta LEFT JOIN…

Linux常用命令——cupsenable命令

在线Linux命令查询工具 cupsenable 启动指定的打印机 补充说明 cupsenable命令用于启动指定的打印机。 语法 cupsenable(选项)(参数)选项 -E&#xff1a;当连接到服务器时强制使用加密&#xff1b; -U&#xff1a;指定连接服务器时使用的用户名&#xff1b; -u&#xff…

pip安装第三方库与设置

pip的使用 假如下载numpy pip install numpypypi 镜像源「配置」 常用镜像源列表 官方&#xff1a;https://pypi.org/simple 百度&#xff1a;https://mirror.baidu.com/pypi/simple/ 清华&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 阿里&#xff1a;https://m…

JVM介绍

一、介绍 1. JVM是什么 JVM是Java Virtual Machine的缩写&#xff0c;即咱们经常提到的Java虚拟机。虚拟机是一种抽象化的计算机&#xff0c;有着自己完善的硬件架构&#xff0c;如处理器、堆栈等&#xff0c;具体有什么咱们不做了解。目前我们只需要知道想要运行Java文件&…

sqlibs安装及复现

sqlibs安装 安装phpstudy后&#xff0c;到github上获取sqlibs源码 sqli-labs项目地址—Github获取&#xff1a;GitHub - Audi-1/sqli-labs: SQLI labs to test error based, Blind boolean based, Time based. 在phpstudy本地文件中的Apache目录中解压上方下载的源码。 将sq…

沃尔玛,eBay买家号成号率低如何解决?

eBay是一个很庞大的系统&#xff0c;买家号必须在本土环境才会安全。要想养出高权重的买家号&#xff0c;需要花大量的时间跟精力&#xff0c;一旦养出一批高质量且时间周期较长的买家号&#xff0c;就可以做很多事情&#xff0c;比如可以帮产品上排名&#xff0c;提高产品的权…

01_es安装和入门体验

01_es安装和入门体验 概述Elasticsearch 是什么全文搜索引擎 1. 安装环境介绍单机 & 集群集群 Cluster节点 Node 1.1 linux 单机安装1.2 集群安装1.3 window下安装 2. postMan 体验3.java客户端体验3.1 资源链接和关闭3.2 索引相关操作3.3 文档基本操作3.4 查询相关操作 概…