news 2026/10/3 13:27:02

MIGO屏幕增强:基于BADI MB_MIGO_BADI的自定义字段实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MIGO屏幕增强:基于BADI MB_MIGO_BADI的自定义字段实现

做SAP MM这一侧ABAP增强的顾问,几乎都躲不开MIGO屏幕增强:给收货凭证加一个检验批号、给发货行项目补一个自定义文本、在过账前拦一道业务校验,这些需求用正统做法走SE19实现BADI MB_MIGO_BADI,是最稳的一条路。这篇文章按照我在实际项目里的实施路径来写:从需求分析、方案选型,到SE19建实现、画子屏幕、写PBO/PAI,再到激活测试和踩坑记录,一步步交代清楚。适合正在做MM增强的ABAP开发顾问,也适合MM顾问了解MIGO扩展边界的参考。

1. 先看需求:MIGO增强到底在解决什么问题

1.1 我遇到过的典型场景

MIGO是SAP里处理收货、发货、转储、报废等一系列货物移动的核心事务,也是MM模块中使用率最高的界面之一。但标准界面没法覆盖所有企业的特殊需求,我接触过的MIGO增强需求,基本都能归到下面四类。

第一类:抬头信息扩展。比如采购收货时,仓库需要在凭证抬头上记录“承运商单号”“到货车辆号”;生产退料时希望记一笔“退料原因备注”。这些信息和库存、物料主数据无关,也不适合硬塞进标准文本字段,最好是在界面外加一个自定义录入区域。

第二类:行项目信息扩展。比如每行收货需要填写“质检批号”“供应商批号”“自定义有效期”。做过的朋友都知道,MSEG表虽然有很多预留字段,但字段语义固定,灵活做法是用附加结构或自定义表配合BADI把数据展示到MIGO界面,再在过账时保存。

第三类:字段属性控制。比如特定移动类型下,把“文本”字段设为必输,隐藏某个不该出现的页签,或者把批次字段锁定不可修改。这类需求在MIGO里没有标准配置点,需要通过BADI在界面初始化时干预。

第四类:过账前后的业务逻辑。比如收货过账前必须校验质检结论,否则不给过账;过账成功后要把仓位、批号、数量等信息实时推送到外部WMS。这类需求虽然不直接涉及屏幕增强,但因为和MIGO强绑定,项目实施时通常和屏幕增强一起做。

动手前,我建议先和业务确认清楚这几个问题:字段加在哪里(抬头、行项目还是两者都要),字段是仅显示、可录入还是必输,数据和MM凭证的关联方式(存扩展表还是MSEG附加结构),是否要出现在后续物料凭证打印或报表里。需求少确认一项,后面返工的成本都不低。

1.2 方案选型:直接改SAPLMIGU?还是隐式增强?

既然要做MIGO增强,绕不开的是用哪种技术。

最粗暴的方式是COPY标准程序SAPLMIGU然后改逻辑。这方法缺点是升级必出问题,SAP发新NOTE后没法继续打补丁,我不建议任何项目用这种方式。

隐式增强(Enhancement Point)可以插入到标准程序关键位置,但问题在于它依赖标准程序的内部结构。SAP在MIGO程序中调整逻辑时,已存在的增强点位置可能失效,维护成本偏高。而且隐式增强不好做整体性的屏幕嵌入,你很难在标准屏幕里再塞进一个完整的自定义页签。

USER EXIT方面,MIGO不像SD有MV45AFZZ这种独立用户出口,所以在MIGO上做屏幕增强,业界基本默认用BADI MB_MIGO_BADI。

MB_MIGO_BADI是SAP专门为MIGO业务加法设计的增强点,官方支持、支持多实现并行、能跨版本升级。SAP在MIGO核心流程(初始化、行项目操作、过账、过账后)里安排了完整的调用节点,而且它天然对接MIGO的“附加数据”(Additional Data)区域,这个区域就是留给开发者的自定义屏幕挂载点。ECC时代还能用各种工程技巧绕开BADI,到了S4HANA,附加数据区域配合BADI已经是稳妥且标准的方案。

1.3 MB_MIGO_BADI有哪些方法和调用节点

MB_MIGO_BADI的方法不算少,但屏幕增强真正高频使用的方法就那么几个。我整理成一张表,方便对照。

方法调用时机用途
GET_HEADER_DATAMIGO初始化/PBO时将抬头数据从MIGO内部传到自定义屏幕
SET_HEADER_DATAPAI/数据提交前将自定义屏幕数据写回MIGO内部抬头数据结构
GET_ITEM_DATA行项目变化时读取当前行项目的自定义数据到屏幕
SET_ITEM_DATA行项目变化/提交前将屏幕数据写回行项目内部表
FIELDS_ATTRIBUTE_CHANGE屏幕初始化时修改MIGO标准字段的属性(必输/隐藏/不可修改)
POST_DOCUMENT凭证过账前对整体数据进行最终校验,可拒绝过账
POST_DOCUMENT_AFTER凭证过账成功后用于外围系统同步等后置操作
LINE_ADD / LINE_MODIFY / LINE_DELETE用户增删改行时联动处理自定义数据

注意,GET_HEADER_DATA、SET_HEADER_DATA和GET_ITEM_DATA、SET_ITEM_DATA是屏幕增强的“数据搬运工”,它们本身不画屏幕,只负责把自定义屏幕字段值和MIGO内部数据(GOHEAD/GOITEM)连接起来。真正画屏幕,靠的是在实现类里创建的子屏幕。

2. 附加数据页签的数据流转机制,先想通再动手

2.1 附加数据页签到底是怎么来的

MIGO界面上有一个“附加数据”(Additional Data)功能,中文系统里可能叫“更多数据”“辅助数据”,实际位置在MIGO抬头或行项目工具栏的“更多”下拉菜单里。点击后会弹出一个标签页区域。

这个区域不是凭空出现的。SAP标准逻辑会遍历当前激活的MB_MIGO_BADI实现,把每个实现携带的自定义子屏幕以页签方式展示出来。如果你的BADI实现里包含一个子屏幕,MIGO就把这个子屏幕镶进去;如果实现里没有子屏幕,那个页签就显示空白甚至不出现。

所以,给MIGO增加一个自定义页签,本质上就三件事:做一个包含子屏幕的BADI实现,让MIGO在附加数据区域找到这个屏幕,再通过GET/SET方法完成数据交换。

这里有个容易踩的坑:在SE19里创建实现并激活成功,但MIGO附加数据区域看不到新页签,大概率是实现类里缺少一个可挂载的子屏幕,或者屏幕类型不对。这个我在第4部分会展开说。

2.2 GET和SET的数据流,配合一个生活化类比

把MIGO内部数据(GOHEAD/GOITEM)想象成一个“保险柜”,自定义屏幕想象成“登记表”,GET和SET方法就是两个搬运工。

打开MIGO界面时,PBO触发GET_HEADER_DATA或GET_ITEM_DATA,搬运工把保险柜里的数据搬到“登记表”上显示;用户填写完,点击过账或切换单据,PAI触发SET_HEADER_DATA或SET_ITEM_DATA,搬运工把“登记表”上的改动写回保险柜。POST_DOCUMENT则像出门前的最后一道安检,保安检查有没有违规项,不合格就拦下整笔单据。

这个类比能帮你快速定位调试思路:屏幕值没显示出来,优先查GET方法;用户录的值没保存上,优先查SET方法;过账时报错,优先查POST_DOCUMENT。

2.3 自定义屏幕怎么挂接到MIGO,版本差异要留意

关于“子屏幕如何嵌入MIGO”,SAP不同版本、不同SPL(Support Package Level)的行为并不完全一致,这也是很多顾问使用一段时间后遇到的玄学问题。按照我的实操经验,最稳妥的做法是:

  1. 在创建BADI实现时,确认实现类中要包含一个屏幕(Screen);
  2. 打开实现类(SE80或SE19内跳转),在类树节点下创建子屏幕,屏幕属性选择“Subscreen”;
  3. 在实现类中添加公共属性(或常量)保存程序名和屏幕号,并确保MIGO加载时能读取到这两个参数。

如果你项目里见过别人写的MIGO增强,大概率会在实现类的属性列表里看到类似P_PROGRAM、P_DYNNR这样命名的常量。这个命名是项目习惯,不是强制要求,作用就是把屏幕信息暴露给MIGO标准程序。由于这个机制涉及不少内部调用,常见教程往往略过,真到调试阶段容易懵。第3部分的实操演示里,我会用一个最直接的方式:把屏幕信息定义在类属性中,在GET_HEADER_DATA里做赋值,剩下的交给SAP标准框架。

3. 实操演示:从SE19建实现到MIGO界面看到自定义字段

3.1 前期准备:字段设计、表和域

下面以最常见的需求为例:在MIGO采购收货时,给行项目增加一个自定义字段“检验批号”,字段名ZINSPECTNO,用于录入质检结论。业务要求是收货过账前必输,不填不允许过账。

第一步,创建数据元素和域。在SE11里新建域ZD_INSPNO,字符类型CHAR20;再建数据元素ZD_INSPNO,基于该域,文案写“检验批号”。

第二步,选择存放位置。这里用最直接的方案:自定义存储表ZMM_MIGO_EXT,结构包含物料凭证号MBLNR、物料凭证年份MJAHR、行项目ZEILE、检验批号ZINSPECTNO,再加更新时间和用户。这张表由BADI在过账阶段写数据。

第三步,如果想在物料凭证也看到这个字段,可以考虑给MSEG做附加结构。这里为了控制篇幅,我优先演示自定义表方案;附加结构做法原理相同,只是把SET_ITEM_DATA里的赋值目标换成MSEG字段。

设计阶段还要确认一件事:字段出现在MIGO行项目的哪个位置。我建议放在附加数据页签里,因为这个页签天然留给自定义屏幕,不影响标准表格宽度,而且实现代码完全可控。如果你要把字段直接嵌入标准行明细表格,需要修改MIGO屏幕布局,维护成本会高一个量级,非必要不推荐。

3.2 SE19创建BADI实现的具体操作

事务代码SE19,回车。界面提供两个路径:创建增强实现(Enhancement Implementation)和创建BADI定义,我们选“创建增强实现”。

  1. 在“增强实现名称”里输入Z_MIGO_SCREEN_ENH,点击创建。
  2. 在弹出的参数对话框里,填写简短描述(比如“MIGO行项目自定义检验批号增强”),保存。
  3. 进入增强实现编辑器后,点击“增强点”(Enhancement Spot)按钮,输入MB_MIGO_BADI,系统自动带出BADI定义MB_MIGO_BADI。
  4. 双击MB_MIGO_BADI节点,系统提示“为该BADI创建实现类”,输入类名ZCL_IM_MB_MIGO_BADI,点击创建。
  5. 系统生成实现类后,展开节点,能看到接口IF_EX_MB_MIGO_BADI以及所有待实现方法。
  6. 保存并激活增强实现。

这一步完成时,类还只是空壳,但增强已经生效。你可以先去MIGO里看看附加数据区域,大概率什么都看不到,因为还没有子屏幕。

另外,如果公司启用了传输请求(TR),创建类和屏幕时会弹出TR选择框,务必和项目规范保持一致,不要为了省事跳过TR,否则后续没法运输到QA和PROD。

3.3 创建自定义子屏幕并绑定到实现类

用SE80打开程序ZMM_MIGO_SCREEN,程序名可以随意,推荐以Z开头。如果程序不存在,新建一个模块池程序,类型选“M(模块池)”,不需要勾选“面向对象”。

在程序下创建屏幕(Screen),屏幕号例如0100,屏幕类型必须选“子屏幕(Subscreen)”。

然后画屏幕布局。放一个标签文本和一个输入框。输入框的属性设置:名称ZINSPECTNO,格式字符20,输入字段勾选。为了避免与MIGO内部字段冲突,建议单独开一个Tab页。

接下来写PBO和PAI逻辑。

PBO逻辑,核心是调用BADI实现方法读取数据:

MODULE status_0100 OUTPUT. DATA: lr_badi TYPE REF TO IF_EX_MB_MIGO_BADI. DATA: ls_item TYPE MB_MIGO_ADD_ITEM. TRY. CALL METHOD CL_EX_MB_MIGO_BADI=>GET_INSTANCE RECEIVING instance = lr_badi. CATCH CX_NO_INTERFACE. MESSAGE 'BADI instance not available' TYPE 'E'. ENDTRY. IF lr_badi IS BOUND. " 从MIGO框架获取当前行项目附加数据 CALL METHOD lr_badi->GET_ITEM_DATA CHANGING cs_data = ls_item. ZINSPECTNO = ls_item-zzinspectno. ENDIF. ENDMODULE.

这里我使用了MB_MIGO_ADD_ITEM结构,这个结构名不一定在每台系统上都一样,具体需要在BADI实现方法参数里查看实际的变化参数名称。一个更稳妥的方式是,在实现类中定义实例属性来存屏幕数据,PBO/PAI直接读写实例属性完成交换。

更简洁的PBO/PAI做法,是在SE80的类节点下创建屏幕,系统会提示生成“PBO_0100”和“PAI_0100”模块,你可以直接在模块中操作实现类的属性,这样就不依赖结构名了。

PAI逻辑:

MODULE user_command_0100 INPUT. DATA: lr_badi TYPE REF TO IF_EX_MB_MIGO_BADI. DATA: ls_item TYPE MB_MIGO_ADD_ITEM. TRY. CALL METHOD CL_EX_MB_MIGO_BADI=>GET_INSTANCE RECEIVING instance = lr_badi. CATCH CX_NO_INTERFACE. MESSAGE 'BADI instance not available' TYPE 'E'. ENDTRY. IF lr_badi IS BOUND. ls_item-zzinspectno = ZINSPECTNO. CALL METHOD lr_badi->SET_ITEM_DATA CHANGING cs_data = ls_item. ENDIF. ENDMODULE.

注意,上面的代码是框架,重点是理解PBO/PAI与BADI方法之间的调用关系。真实项目中,你可能需要先获取当前选中行号(在MIGO中通过CURSOR_ROW等参数),才能把正确行的数据读到屏幕。

更高阶做法:在实现类中维护一个“当前行索引”实例属性,在GET_ITEM_DATA方法里,SAP框架会传入类似iv_line_index的参数,你把它存下来,PAI里就知道当前操作的是哪一行。

3.4 为BADI实现类创建屏幕并保护数据访问

现在回到SE19。打开刚才创建的增强实现Z_MIGO_SCREEN_ENH,双击实现类ZCL_IM_MB_MIGO_BADI。在类编辑器里做两件事:

  • 添加公共属性:P_PROGNAME TYPE PROGRAMM,P_DYNNR TYPE SY-DYNNR。
  • 在构造函数(CONSTRUCTOR)中给这两个属性赋默认值:
    • P_PROGNAME = 'ZMM_MIGO_SCREEN'
    • P_DYNNR = '0100'

然后在SE80里打开类ZCL_IM_MB_MIGO_BADI,右键点击类节点,选择“创建→屏幕”,确认屏幕号0100,类型为子屏幕。系统会把屏幕和类绑定,并在类里生成加载屏幕所需的内部结构。

从测试经验看,屏幕号即使和P_DYNNR不一致,标准框架通常也能按引用加载,但为了降低调试难度,最好保持一致。

保存并激活屏幕和类。

此时,MIGO的附加数据区域应该能自动识别这个屏幕。如果系统没有自动识别,可以继续在实现类中干预:在GET_HEADER_DATA或GET_ITEM_DATA里,把屏幕信息按该版本要求的参数传递给MIGO框架。这个行为在不同SPL版本有差异,我无法给出适用于所有版本的“标准属性名”,但可以负责任地讲:在SE19的BADI实现里创建了子屏幕后,MIGO会通过标准框架把它嵌进去,因为MB_MIGO_BADI这个附加数据区域的设计,本质上就是为自定义子屏幕准备的。

真的出现不显示的情况,常用救援手段是看该SPL级别的Sample Coding。在SAP开发者社区或OSS里输入MB_MIGO_BADI,通常能找到对应版本示例。经验之谈,多数不显示问题不是代码问题,而是激活或类型选错了。

3.5 实现数据交换方法与POST_DOCUMENT校验

在实现类ZCL_IM_MB_MIGO_BADI中,双击接口方法GET_ITEM_DATA和SET_ITEM_DATA,补全逻辑。

GET_ITEM_DATA:从MIGO内部数据结构中取出当前行项目的自定义字段,放到实例属性中,供PBO使用。

METHOD if_ex_mb_migo_badi~get_item_data. " cs_data是MIGO传入的行项目附加数据 zzinspectno = cs_data-zzinspectno. ENDMETHOD.

SET_ITEM_DATA:把实例属性中的值回写。

METHOD if_ex_mb_migo_badi~set_item_data. cs_data-zzinspectno = zzinspectno. ENDMETHOD.

同时,为POST_DOCUMENT方法实现过账前校验:

METHOD if_ex_mb_migo_badi~post_document. DATA: lt_item TYPE TABLE OF MB_MIGO_ADD_ITEM. FIELD-SYMBOLS: <ls_item> LIKE LINE OF lt_item. LOOP AT cs_item INTO DATA(ls_item). IF ls_item-zzinspectno IS INITIAL. MESSAGE e034(zmm_migo) WITH ls_item-matnr. ENDIF. ENDLOOP. ENDMETHOD.

校验消息务必用SE91自定义消息类ZMM_MIGO,消息类型E。出现E类型消息时,MIGO不会生成物料凭证,事务被中断,这样就能满足“不填检验批号不允许过账”的需求。

过账后如需同步外部系统,再实现POST_DOCUMENT_AFTER,在里面读取物料凭证号(EV_GRPID或类似参数)并调用RFC或API推送数据。

3.6 激活测试流程

所有对象激活后,进入MIGO,选择收货(采购订单),点击“附加数据”。如果一切正常,你会看到自定义页签,里面有“检验批号”输入框。

测试路径建议:

  1. 测试可显示:打开一张采购订单,切到行项目,查看附加数据页签是否出现。
  2. 测试数据传递:在检验批号里输入值,点击过账,去表ZMM_MIGO_EXT里查是否有一条记录,字段有值。
  3. 测试校验:清空检验批号直接过账,看是否会报消息类ZMM_MIGO中的E类型错误。

测试过程中在GET_ITEM_DATA和SET_ITEM_DATA方法里打上断点,能更直观地看到数据调用顺序。我习惯先在一个方法里断点,确认被调用后,再逐步去掉断点看完整流程。

4. 常见问题与排查技巧实录

4.1 附加数据页签里不显示自定义屏幕

这种情况出现频率最高。我归纳了几个高优先级排查点:

  • BADI实现是否激活:SE19里确认增强实现和实现类都是“已激活”状态。
  • 屏幕是否误建成对话屏幕:在SE80查看屏幕属性,必须是“子屏幕”。
  • 是否因为缓存问题:有时新激活的BADI需要重新登录才生效。
  • 标准框架版本差异:部分低SPL版本需要额外代码支持。

调试方法:在实现类GET_HEADER_DATA方法内打断点,如果断点没被触发,说明MIGO根本没调用你的BADI实现;如果触发了,说明调用正常,问题出在屏幕挂载环节。

4.2 GET/PAI数据传值不生效

常见表现:用户明明在检验批号里输入了内容,过账后表里还是没有值,或者值永远为空。

原因多半是:

  • PAI中调用了SET_ITEM_DATA,但传的行项目索引不对,写到别的行了。
  • 在PBO中多次调用GET_ITEM_DATA,把用户输入的值在PAI前覆盖掉了。
  • 自定义字段用的数据元素类型和数据传递结构不一致。

经验做法:用调试器观察SET_ITEM_DATA的cs_data参数在调用前后的变化。如果进入SET时数据就空了,问题多半在屏幕字段绑定;如果进SET时有值但过账后表里没有,问题出在POST_DOCUMENT之后的数据持久化逻辑。

4.3 POST_DOCUMENT校验不生效或过账仍然成功

校验逻辑放在POST_DOCUMENT里,但有时候业务人员直接敲回车过账,校验不执行。原因是某些SPL级别下,POST_DOCUMENT并非对所有过账路径(比如自动批导、后台作业)都触发,或者cs_item参数没有被填充数据。

建议把必须的前置校验放在GET_ITEM_DATA或SET_ITEM_DATA阶段,界面操作阶段做友好提示,POST_DOCUMENT阶段做强制拦截。把两类校验都写上,既能给用户友好反馈,又能防止绕过界面直接过账。

错误消息类型用E,MIGO会终止事务,这个没问题。

4.4 多实现同时生效导致数据互相覆盖

MB_MIGO_BADI是multiple-use的,项目里多个开发同时新增自定义屏幕时,MIGO附加数据区域会出现多个页签或下拉列表,数据各自维护。表面没问题,但有些实现可能操作同一个内部字段,导致读取时获取的是另一个实现写入的值。

解决思路:

  • 每个实现尽量使用独立的自定义字段名,避免冲突。
  • 在实现里通过FILTER限定移动类型、工厂等条件,减少触发范围。
  • 多个实现不要对MSEG同一附加结构字段重复赋值,否则后执行者生效。

4.5 传输请求遗漏屏幕和类

做过SAP项目的都知道,BADI实现和子屏幕经常不在同一个TR里,偶尔会把屏幕忘带。检查方式:用SE03查看对象清单,确认TR中包含增强实现Z_MIGO_SCREEN_ENH、实现类ZCL_IM_MB_MIGO_BADI、程序及屏幕ZMM_MIGO_SCREEN、数据元素、域、自定义表。到QA/PROD后先激活,再验证。

最后整理一个速查表,方便当团队SOP用:

问题原因处理
附加数据页签空白实现类无子屏幕或类型不对在实现类下创建子屏幕
字段显示为空GET_ITEM_DATA未执行检查断点与实例绑定
字段值未保存SET_ITEM_DATA未执行或索引错设置断点对比cs_data
过账校验失效校验放在POST_DOCUMENT但路径未覆盖增加GET/SET阶段校验
多个实现冲突字段名或存储重复独立字段名+FILTER
S4版本未生效标准代码变更或SPL差异查SPAU/OSS Note

5. 写在最后的经验教训

MIGO屏幕增强这块,代码本身不复杂,真正考验人的是理解SAP的数据流和版本细节。我实际项目里踩了几次坑之后,最大的体会是:动手前先把“数据从哪里来、到哪里去、什么时候读、什么时候写”这四句话写在纸上。GET、SET、POST这几个方法的调用时序没理清,后面调试时间一定超过编码时间。

另一个建议是,把自定义字段尽量放在附加数据页签里,而不是直接改MIGO的行项目明细表格。虽然直接加到GRID里看着更一体化,但会影响标准屏幕结构,升级风险和维护成本都高。附加数据页签是SAP预留好的扩展位,用起来体面又安全。

最后补充一句:如果在S4HANA上做这个需求,除了传统BADI,也可以评估Fiori的扩展能力和自定义字段工具。但在OP版本ECC或S4的GUI场景里,用MB_MIGO_BADI做一套简洁实现完全够用,而且是所有顾问都看得懂的方案。希望这篇步骤拆解能帮你少走点弯路。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 13:26:55

工厂冷却水如何变身分布式能源站的余热宝库:换热与热泵实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/3 13:26:10

机器学习与深度学习入门:从梯度、泛化到第一个实战项目

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/3 13:25:24

MATLAB复现紧急需求响应下规模化灵活资源负荷管理快速决策方法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/3 13:25:24

Android生产环境内存检测利器:GWP-ASan原理与实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/3 13:25:16

基于Python的中美疫情数据可视化分析与展示源码实战

简介&#xff1a;这份资源是一套面向Python数据分析初学者与可视化实践者的完整项目源码&#xff0c;围绕中美两国疫情数据展开处理与展示&#xff0c;适合用作课程设计、毕业设计参考或数据分析练手案例。压缩包共19个文件&#xff0c;约145KB&#xff0c;其中7个HTML页面承担…

作者头像 李华
网站建设 2026/10/3 13:25:15

DRV8818PWPR+STM32F746ZG工业级步进电机精准电流控制实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华