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

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.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ-常用命令

RabbitMQ常用命令 3.1 启动停止rabbitMQ命令 # 前台启动Erlang VM 和 RabbitMQ 当窗口关闭或者ctrlc时&#xff0c;使退出了。 rabbitmq-server# 使用系统命令启动 systemctl start rabbitmq-server# 后台启动 rabbitmq-server -detached# 停止rabbitMQ和Erlang VM rabbitmq-…

【Python基础教程】快速找到多个字典中的公共键(key)的方法

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 方法一&#xff1a;for in循环 from random import randint, samplea1 {k: randint(1, 4) for k in abcdefg} a2 {k: randint(1, 4) for k in abc123456…

【OpenCV入门】第七部分——图像的几何变换

文章结构 缩放dsize参数实现缩放fx参数和fy参数实现缩放 翻转仿射变换平移旋转倾斜 透视cmath模块 缩放 通过resize()方法可以随意更改图像的大小比例&#xff1a; dst cv2.resize(src, dsize, fx, fy, interpolation)src&#xff1a; 原始图像dsize&#xff1a; 输出图像的…

代码随想录—力扣算法题:19删除链表的倒数第N个节点.Java版(示例代码与导图详解)

19.删除链表的倒数第N个节点 力扣题目链接 更多内容可点击此处跳转到代码随想录&#xff0c;看原版文件 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 进阶&#xff1a;你能尝试使用一趟扫描实现吗&#xff1f; 示例 1&#xff1…

六、vim编辑器的使用

1、编辑器 (1)编辑器就是一款软件。 (2)作用就是用来编辑文件&#xff0c;譬如编辑文字、编写代码。 (3)Windows中常用的编辑器&#xff0c;有自带的有记事本(notepad)&#xff0c;比较好用的notepad、VSCode等。 (4)Linux中常用的编辑器&#xff0c;自带的最古老的vi&…

UG\NX CAM二次开发 插入工序 UF_OPER_create

文章作者:代工 来源网站:NX CAM二次开发专栏 简介: UG\NX CAM二次开发 插入工序 UF_OPER_create 效果: 代码: void MyClass::do_it() {tag_t setup_tag=NULL_TAG;UF_SETUP_ask_setup(&setup_tag);if (setup_tag==NULL_TAG){uc1601("请先初始化加工环境…

通过类定义一个网络

import torch from torch import nnx torch.ones(2,10)class MLP(nn.Module):def __init__(self):super().__init__()self.out nn.Linear(10, 1)def forward(self,x):return self.out(x) 1. 代码解析 如何定义一个类&#xff1f;self 又是什么东西&#xff1f;类是如何继承基…

Doris架构中包含哪些技术?

Doris主要整合了Google Mesa(数据模型)&#xff0c;Apache Impala(MPP Query Engine)和Apache ORCFile (存储格式&#xff0c;编码和压缩)的技术。 为什么要将这三种技术整合? Mesa可以满足我们许多存储需求的需求&#xff0c;但是Mesa本身不提供SQL查询引擎。 Impala是一个…

开发指导—利用CSS动画实现HarmonyOS动效(一)

注&#xff1a;本文内容分享转载自 HarmonyOS Developer 官网文档 一. CSS 语法参考 CSS 是描述 HML 页面结构的样式语言。所有组件均存在系统默认样式&#xff0c;也可在页面 CSS 样式文件中对组件、页面自定义不同的样式。请参考通用样式了解兼容 JS 的类 Web 开发范式支持的…

TCP协议报文

前言 TCP/IP协议簇——打开虚拟世界大门中&#xff0c;已经给大家大致介绍了TCP/IP协议簇的分层。 TCP (Transmission Control Protocol)传输控制协议&#xff0c;在TCP/IP协议簇中&#xff0c;处于传输层。是为了在不可靠的互联网络&#xff08;IP协议&#xff09;中&#x…

蒲公英路由器如何设置远程打印?

现如今&#xff0c;打印机已经是企业日常办公中必不可少的设备&#xff0c;无论何时何地&#xff0c;总有需要用到打印的地方&#xff0c;包括资料文件、统计报表等等。 但若人在外地或分公司&#xff0c;有文件急需通过总部的打印机进行打印时&#xff0c;由于不在同一物理网络…

CSS中你不得不知道的盒子模型

目录 1、CSS的盒子模型1.1 css盒子模型有哪些&#xff1a;1.2 css盒子模型的区别1.3 通过css如何转换css盒子模型 1、CSS的盒子模型 1.1 css盒子模型有哪些&#xff1a; 标准盒子模型、怪异盒子模型&#xff08;IE盒子模型&#xff09; 1.2 css盒子模型的区别 标准盒子模型&a…

【ES系列】(一)简介与安装

首发博客地址 首发博客地址[1] 系列文章地址[2] 教学视频[3] 为什么要学习 ES? 强大的全文搜索和检索功能&#xff1a;Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;使用倒排索引和分布式计算等技术&#xff0c;提供了强大的全文搜索和检索功能。学习 ES 可以掌…

微机原理 || 第2次测试:汇编指令(加减乘除运算,XOR,PUSH,POP,寻址方式,物理地址公式,状态标志位)(测试题+手写解析)

&#xff08;一&#xff09;测试题目&#xff1a; 1.数[X]补1111,1110B&#xff0c;则其真值为 2.在I/O指令中,可用于表示端口地址的寄存器 3. MOV AX,[BXSl]的指令中&#xff0c;源操作数的物理地址应该如何计算 4.执行以下两条指令后&#xff0c;标志寄存器FLAGS的六个状态…

Go 面向对象(匿名字段)

概述 严格意义上说&#xff0c;GO语言中没有类(class)的概念,但是我们可以将结构体比作为类&#xff0c;因为在结构体中可以添加属性&#xff08;成员&#xff09;&#xff0c;方法&#xff08;函数&#xff09;。 面向对象编程的好处比较多&#xff0c;我们先来说一下“继承…

python爬虫-数据解析BeautifulSoup

1、基本简介 BeautifulSoup简称bs4,BeautifulSoup和lxml一样是一个html的解析器&#xff0c;主要功能也是解析和提取数据。 BeautifulSoup和lxml类似&#xff0c;既可以解析本地文件也可以响应服务器文件。 缺点&#xff1a;效率没有lxml的效率高 。 优点&#xff1a;接口设…

stm32之IIC协议

主要通过两个层面来讲&#xff1a;物理层、协议层。 IIC是一个同步半双工串行总线协议。 一、物理层&#xff08;通信模型&#xff09; 1、最早是飞利浦公司开发的这个协议&#xff0c;最早应用到其产品上去。 2、两线制&#xff08;两根信号线&#xff09; 其中SCL为时钟…

vue的第2篇 第一个vue程序

一 环境的搭建 1.1常见前端开发ide 1.2 安装vs.code 1.下载地址&#xff1a;Visual Studio Code - Code Editing. Redefined 2.进行安装 1.2.1 vscode的中文插件安装 1.在搜索框输入“chinese” 2.安装完成重启&#xff0c;如下变成中文 1.2.2 修改工作区的颜色 选中[浅色]…

MySQL8.0.22安装过程记录(个人笔记)

1.点击下载MySQL 2.解压到本地磁盘&#xff08;注意路径中不要有中文&#xff09; 3.在解压目录创建my.ini文件 文件内容为 [mysql] # 设置mysql客户端默认字符集 default-character-setutf8[mysqld] # 设置端口 port 3306 # 设计mysql的安装路径 basedirE:\01.app\05.Tool…

win10安装Docker Desktop,并修改存储目录

安装之前先看看自己电脑c盘剩余容量&#xff0c;如果小于30G&#xff0c;建议先配置下再安装 因为docker 安装时不提供指定安装路径和数据存储路径的选项&#xff0c;且默认是安装在C盘的。C盘比较小的&#xff0c;等docker运行久了&#xff0c;一大堆的东西放在上面容易导致磁…