×

注意!页面内容来自https://wenku.csdn.net/column/60l99siqbyu,本站不储存任何内容,为了更好的阅读体验进行在线解析,若有广告出现,请及时反馈。若您觉得侵犯了您的利益,请通知我们进行删除,然后访问 原网页

活动介绍

SAP EWM开发实战:手把手教你用ABAP类/SCWM/CL_SP_PRD_INB创建内向交货单(含完整代码)

立即解锁
发布时间: 2026-04-14 03:47:33 阅读量: 29 订阅数: 3 AIGC
# SAP EWM开发实战:ABAP类创建内向交货单的完整指南 在SAP扩展仓库管理(EWM)系统中,内向交货单(Inbound Delivery)是处理入库流程的核心单据。虽然标准功能提供了前台事务码/N/SCWM/PRDI用于手工创建,但在实际业务中,我们经常需要批量或自动化创建内向交货单。本文将深入解析如何通过ABAP类/SCWM/CL_SP_PRD_INB实现这一需求。 ## 1. 为什么需要类方法创建内向交货单? 在EWM开发中,我们经常会遇到以下场景: - **批量创建需求**:需要从ERP系统同步大量采购订单生成内向交货单 - **自动化集成**:与外部WMS或TMS系统对接时自动生成交货单 - **特殊业务逻辑**:标准BAPI无法满足的定制化需求 然而,EWM模块并没有提供直接创建内向交货单的标准BAPI或函数模块。通过SAP官方文档和技术说明(如Note 1414179),我们可以发现使用/SCWM/CL_SP_PRD_INB类是最佳实践方案。 ## 2. 核心类与架构解析 EWM中创建内向交货单主要涉及以下关键类: | 类名 | 作用 | 重要方法 | |------|------|---------| | `/SCWM/CL_SP_PRD_INB` | UI服务提供类 | insertupdatesave | | `/SCDL/CL_SP_PRD_INB` | 交付服务提供类 | 基础服务功能 | | `/SCWM/CL_DLV_HANDLER_ADAPTER` | 适配器处理类 | 属性与消息处理 | 这些类共同构成了EWM内向交货单创建的底层架构。与前台操作不同,编程实现需要严格遵循以下流程: 1. 初始化服务提供者实例 2. 设置仓库编号等基础参数 3. 分步创建抬头、合作伙伴、参考凭证数据 4. 添加行项目并填充物料信息 5. 执行保存前检查 6. 提交数据到数据库 ## 3. 完整代码实现 下面是一个可复用的函数模块实现,包含了创建内向交货单的全部关键步骤: ```abap FUNCTION zewm_fm_inb_delivery_create. *"---------------------------------------------------------------------- *"*"本地接口: *" IMPORTING *" VALUE(IV_LGNUM) TYPE /SCWM/LGNUM OPTIONAL *" VALUE(IV_RECEIVING_OFFICE) TYPE /SCMB/SCU_RO OPTIONAL *" VALUE(IV_ENTITLED) TYPE /SCWM/DE_ENTITLED OPTIONAL *" VALUE(IV_DOCTYPE) TYPE /SCDL/DL_DOCTYPE OPTIONAL *" VALUE(IV_DOCCAT) TYPE /SCDL/DL_DOCCAT OPTIONAL *" VALUE(IV_ITEMTYPE) TYPE /SCDL/DL_ITEMTYPE OPTIONAL *" EXPORTING *" VALUE(EV_TYPE) TYPE CHAR1 *" VALUE(EV_MSG) TYPE STRING *" VALUE(EV_DOCNO) TYPE /SCDL/DL_DOCNO_INT *" TABLES *" IT_HEAD_PARTY STRUCTURE /SCWM/S_SP_A_HEAD_PARTY OPTIONAL *" IT_HEAD_REFDOC STRUCTURE /SCWM/S_SP_A_HEAD_REFDOC OPTIONAL *" IT_ITEM STRUCTURE /SCWM/S_SP_A_ITEM_PRDI OPTIONAL *" OT_REFDOC STRUCTURE ZEWMS0087 OPTIONAL *"---------------------------------------------------------------------- DATA: lo_sp_inb TYPE REF TO /scwm/cl_sp_prd_inb, lo_adapter_handler TYPE REF TO /scwm/cl_dlv_handler_adapter, lv_docid TYPE /scdl/dl_docid, lv_rejected TYPE boole_d. " 1. 初始化服务提供者 TRY. CREATE OBJECT lo_adapter_handler. CREATE OBJECT lo_sp_inb EXPORTING iv_mode = /scdl/cl_sp=>sc_mode_classic io_attribute_handler = lo_adapter_handler io_message_handler = lo_adapter_handler. CATCH cx_root INTO DATA(lx_error). ev_type = 'E'. ev_msg = lx_error->get_text( ). RETURN. ENDTRY. " 2. 设置仓库编号等基础参数 PERFORM frm_set_default_values USING lo_sp_inb lo_adapter_handler iv_lgnum iv_receiving_office iv_entitled. " 3. 创建交货单抬头 PERFORM frm_create_header USING lo_sp_inb iv_doctype iv_doccat CHANGING lv_docid ev_type ev_msg. IF ev_type = 'E'. PERFORM frm_cleanup USING lo_sp_inb. RETURN. ENDIF. " 4. 添加合作伙伴数据 IF it_head_party[] IS NOT INITIAL. PERFORM frm_add_partner USING lo_sp_inb lv_docid it_head_party[] CHANGING ev_type ev_msg. IF ev_type = 'E'. PERFORM frm_cleanup USING lo_sp_inb. RETURN. ENDIF. ENDIF. " 5. 添加参考凭证 IF it_head_refdoc[] IS NOT INITIAL. PERFORM frm_add_refdoc USING lo_sp_inb lv_docid it_head_refdoc[] CHANGING ev_type ev_msg. IF ev_type = 'E'. PERFORM frm_cleanup USING lo_sp_inb. RETURN. ENDIF. ENDIF. " 6. 创建行项目 IF it_item[] IS NOT INITIAL. PERFORM frm_create_items USING lo_sp_inb lv_docid iv_itemtype iv_doccat iv_doctype it_item[] CHANGING ev_type ev_msg ot_refdoc[]. IF ev_type = 'E'. PERFORM frm_cleanup USING lo_sp_inb. RETURN. ENDIF. ENDIF. " 7. 保存前检查 CALL METHOD lo_sp_inb->before_save IMPORTING rejected = lv_rejected. IF lv_rejected = abap_true. ev_type = 'E'. ev_msg = '保存前校验失败'. PERFORM frm_cleanup USING lo_sp_inb. RETURN. ENDIF. " 8. 提交保存 CALL METHOD lo_sp_inb->save IMPORTING rejected = lv_rejected. IF lv_rejected = abap_true. ev_type = 'E'. ev_msg = '提交数据库失败'. ROLLBACK WORK. ELSE. COMMIT WORK AND WAIT. ev_type = 'S'. ev_msg = '内向交货单创建成功'. IF ot_refdoc[] IS NOT INITIAL. READ TABLE ot_refdoc INDEX 1. ev_docno = ot_refdoc-docno. ENDIF. ENDIF. PERFORM frm_cleanup USING lo_sp_inb. ENDFUNCTION. ``` ## 4. 关键参数详解 创建内向交货单时需要特别注意以下参数: ### 4.1 抬头必填参数 | 参数名 | 类型 | 描述 | 示例值 | |--------|------|------|--------| | `IV_LGNUM` | `/SCWM/LGNUM` | 仓库编号 | 'W001' | | `IV_RECEIVING_OFFICE` | `/SCMB/SCU_RO` | 收货办公室 | 'RO01' | | `IV_ENTITLED` | `/SCWM/DE_ENTITLED` | 授权处理方 | 'USER01' | | `IV_DOCTYPE` | `/SCDL/DL_DOCTYPE` | 凭证类型 | 'IDN' | | `IV_DOCCAT` | `/SCDL/DL_DOCCAT` | 凭证类别 | 'IDOC' | ### 4.2 合作伙伴角色类型 在添加合作伙伴时,常见的角色类型包括: - `VENDOR`: 供应商 - `SHIPFROM`: 发货方 - `CARRIER`: 承运商 - `FORWARDER`: 货运代理 ### 4.3 参考凭证类别 参考凭证是内向交货单的重要关联单据,主要类型有: - `ERP`: ERP系统单据(如采购订单) - `ASN`: 提前发货通知 - `BOL`: 提货单 - `IDOC`: EDI传输单据 ## 5. 错误处理最佳实践 在开发过程中,我们需要特别注意以下错误场景: 1. **仓库编号未设置**:必须先调用`/scwm/cl_tm=>set_lgnum()` 2. **必填字段缺失**:如凭证类型、合作伙伴角色等 3. **参考凭证冲突**:ASN和BOL类型至少需要一种 4. **行项目数据不完整**:物料编号、数量、单位必须完整 建议的错误处理方式: ```abap " 示例:检查方法调用结果 READ TABLE lt_return_codes TRANSPORTING NO FIELDS WITH KEY failed = abap_true. IF sy-subrc = 0 OR lv_rejected = abap_true. MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_msg. ev_type = 'E'. ev_msg = '操作失败: ' && lv_msg. RETURN. ENDIF. ``` ## 6. 性能优化建议 对于批量创建场景,可以采用以下优化策略: 1. **批量处理**:尽量减少单次提交的数据量(建议每次50-100条) 2. **内存管理**:及时清理临时变量和内表 3. **错误收集**:实现错误日志记录和重试机制 4. **并行处理**:对独立单据使用并行任务 ```abap " 示例:批量提交控制 DATA: lt_batch TYPE TABLE OF ty_delivery_data, lv_batch_size TYPE i VALUE 50. LOOP AT lt_source_data ASSIGNING FIELD-SYMBOL(<fs_data>). APPEND <fs_data> TO lt_batch. IF lines( lt_batch ) >= lv_batch_size. PERFORM process_batch USING lt_batch. CLEAR lt_batch. ENDIF. ENDLOOP. IF lt_batch IS NOT INITIAL. PERFORM process_batch USING lt_batch. ENDIF. ``` ## 7. 与前台操作的对应关系 为了帮助理解,下表展示了代码实现与前台操作的对应关系: | 前台操作步骤 | 对应代码实现 | 关键方法 | |--------------|--------------|----------| | 输入仓库编号 | `SET PARAMETER ID '/SCWM/LGN'` | 参数设置 | | 创建交货单抬头 | `lo_sp_inb->insert` | 插入抬头数据 | | 添加供应商 | `lo_sp_inb->insert` | 插入合作伙伴 | | 关联采购订单 | `lo_sp_inb->insert` | 插入参考凭证 | | 添加行项目 | `lo_sp_inb->insert` | 插入行项目 | | 保存单据 | `lo_sp_inb->save` | 提交数据 | ## 8. 扩展应用场景 掌握了基础创建方法后,这一技术还可以应用于: 1. **跨系统集成**:与SRM、CRM等系统对接自动创建交货单 2. **退货处理**:创建退货类型的入库交货单 3. **质检流程**:自动生成质检需要的入库单据 4. **库存调整**:通过交货单实现特殊库存移动 实际项目中,我们曾用此方法实现了与第三方物流系统的对接,每天自动处理超过5000笔入库交易,将人工操作时间减少了80%。关键是在标准方法基础上增加了以下增强点: - 自动校验供应商主数据 - 智能分配存储位置 - 与RFID扫描设备集成 - 实时状态跟踪看板 ## 9. 常见问题排查 开发过程中遇到的典型问题及解决方案: **问题1:保存时报"参考凭证缺失"错误** *原因*:未提供ASN或BOL类型的参考凭证 *解决*:确保至少提供一种运输相关参考凭证 ```abap " 必须包含ASN或BOL参考凭证 LOOP AT it_head_refdoc ASSIGNING FIELD-SYMBOL(<fs_refdoc>) WHERE refdoccat = 'ASN' OR refdoccat = 'BOL'. lv_has_trans_refdoc = abap_true. EXIT. ENDLOOP. IF lv_has_trans_refdoc = abap_false. " 自动添加默认ASN参考 ls_head_refdoc-refdoccat = 'ASN'. ls_head_refdoc-refdocno = iv_docno. APPEND ls_head_refdoc TO lt_head_refdoc. ENDIF. ``` **问题2:行项目物料无法识别** *原因*:物料编号格式不正确或未维护EWM主数据 *解决*:添加物料主数据检查逻辑 ```abap " 检查物料主数据 SELECT COUNT(*) FROM /scwm/mat WHERE lgnum = @iv_lgnum AND matid = @<fs_item>-productid. IF sy-subrc <> 0. " 记录错误并跳过该物料 CONTINUE. ENDIF. ``` **问题3:性能随数据量增加急剧下降** *原因*:未及时清理内存或单次处理数据过多 *解决*:实现分页处理和内存清理机制 ```abap " 分页处理示例 DATA: lv_page_size TYPE i VALUE 100, lv_total TYPE i, lv_pages TYPE i. DESCRIBE TABLE lt_input_data LINES lv_total. lv_pages = ceil( lv_total / lv_page_size ). DO lv_pages TIMES. CLEAR: lt_page_data. lt_page_data = lt_input_data[ ( sy-index - 1 ) * lv_page_size + 1 TO sy-index * lv_page_size ]. " 处理当前页数据 PERFORM process_data USING lt_page_data. " 清理内存 PERFORM cleanup_memory. ENDDO. ``` ## 10. 最佳实践总结 基于多个项目实施经验,我们总结了以下EWM开发最佳实践: 1. **封装重用**:将核心逻辑封装为可重用函数模块 2. **日志完善**:记录详细的操作日志和错误信息 3. **参数校验**:在入口处验证所有输入参数 4. **事务控制**:合理设计事务边界,避免长时间锁表 5. **性能监控**:添加执行时间统计和性能分析点 一个典型的增强型函数模块结构如下: ```abap FUNCTION zewm_enhanced_inb_create. *"---------------------------------------------------------------------- *"*"增强型内向交货单创建 *" 特点: *" - 完善的输入校验 *" - 详细的操作日志 *" - 性能监控点 *"---------------------------------------------------------------------- " 1. 初始化日志和计时器 PERFORM init_log USING iv_log_level. PERFORM start_timer. " 2. 输入参数校验 PERFORM validate_parameters CHANGING ev_type ev_msg. IF ev_type = 'E'. PERFORM write_log USING 'E' '参数校验失败'. RETURN. ENDIF. " 3. 核心处理逻辑 TRY. PERFORM core_processing. CATCH cx_root INTO DATA(lx_error). ev_type = 'E'. ev_msg = lx_error->get_text( ). PERFORM write_log USING 'E' ev_msg. ROLLBACK WORK. ENDTRY. " 4. 记录性能数据 PERFORM end_timer. PERFORM log_performance. " 5. 清理资源 PERFORM cleanup. ENDFUNCTION. ``` 通过本文介绍的方法,开发者可以构建稳定高效的EWM内向交货单自动化解决方案。在实际应用中,建议根据具体业务需求进行适当调整和扩展,同时注意遵循SAP EWM的最佳实践和性能优化原则。
corwn 最低0.47元/天 解锁文章
买1年送3月
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
0
0
复制全文

相关推荐

LI_李波

资深数据库专家
北理工计算机硕士,曾在一家全球领先的互联网巨头公司担任数据库工程师,负责设计、优化和维护公司核心数据库系统,在大规模数据处理和数据库系统架构设计方面颇有造诣。
最低0.47元/天 解锁文章
买1年送3月
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看

最新推荐

客户数据资产价值计量实战:DAI(Data Asset Inventory)方法论落地指南——单标签_单旅程经济价值测算模型(含ROI反推公式与财务口径对齐表)

# 客户数据资产价值计量的范式革命:从技术台账到财务资产的落地实践 在某头部零售银行2023年第三季度财报披露前夜,CFO办公室迎来一场前所未有的审计压力测试。四大会计师事务所的合伙人手持平板电脑,没有翻阅厚厚的纸质底稿,而是直接扫描一张二维码——跳转至一个实时更新的交互式仪表盘。页面中央是一组动态滚动的数据:`DAI-CUST-REBUY-001`标签在`journey_app_rebuy_incentive`旅程中,过去30天贡献了¥3,892,457.61的净经济价值;其价值构成被拆解为可验证的三重证据链:上游埋点日志哈希值、Flink作业处理凭证、ERP系统中对应的“交易手续费收入”

VSCode Remote-SSH性能断崖诊断手册:远程IO瓶颈定位、本地推理卸载策略与gRPC流压缩参数调优(吞吐量提升4.3倍,内存占用下降57%)

# VSCode Remote-SSH 性能断崖的本质与破局:从协议耦合到本地推理卸载的全栈重构 在远程开发已成为现代软件工程标配的今天,VSCode Remote-SSH 已悄然超越“连接远程机器”的工具定位,演变为一个**分布式 IDE 运行时环境**。它承载着百万行级 TypeScript 项目的符号解析、Python 数据科学栈的交互式调试、Rust 系统编程的增量编译——这些本应由本地硬件直驱的任务,却被封装进 SSH 隧道,在远程节点上经历加密、序列化、磁盘 I/O、Node. 事件循环四重延迟叠加。当开发者按下 Ctrl+Click 却等待超过两秒才看到跳转结果,当 `gi

WSL发行版与内核解耦机制深度解析:Ubuntu-24.04.tar.gz可降级运行于5.15.100,但CUDA 12.4需依赖5.15.133+中新增的nvidia_uvm_lite模块ABI(符号导出比对表)

# WSL2内核与发行版的解耦本质:一场AI时代下的系统软件范式迁移 在AI开发者日常调试`nvidia-smi`报错、CUDA程序莫名返回`cudaErrorUnknown`、或PyTorch训练突然卡死在`cudaMallocManaged`时,一个被反复忽略的事实是:问题根源往往不在代码本身,也不在驱动安装包,而深埋于Windows Subsystem for Linux(WSL2)那套精巧却易被误解的“发行版-内核分离”架构之下。这不是一次简单的兼容性故障,而是一场横跨Linux内核演进、NVIDIA专有驱动重构、微软虚拟化层设计与AI框架运行时契约的系统性共振——它暴露了现代计算栈

从VS Code源码看终端启动真相:GUI vs CLI启动环境注入路径差异(Electron主进程env注入点反编译报告,含code --no-sandbox绕过验证数据)

# VS Code 终端环境变量的真相:一场被忽视的底层战争 在某个寻常的下午,你双击桌面图标启动 VS Code,打开一个新终端,键入 `node --version`,却只看到 `command not found`。你检查 `.zshrc`,确认 PATH 已添加 `/home/user/.nvm/versions/node/v20.15.0/bin`;你重启 VS Code,问题依旧;你甚至尝试 `code --no-sandbox`,终端干脆一片空白。最后,你无奈地打开 GitHub Issues,输入 “terminal PATH not working”,翻到第 47 页,发现

Adobe官方替代方案硬核评测:Figma+DaVinci Resolve+Affinity套件组合在专业工作流中的5大功能覆盖缺口(PS图层混合模式_PR多机位剪辑_AE表达式引擎等)、性能补偿策略(GPU加速桥接、本地缓存预加载、LUT一致性校准协议)

# Adobe生态的不可替代性:一场关于工作流刚性、时间语义与元数据契约的技术深潜 在数字创意工业化的今天,我们早已习惯将“Adobe Creative Cloud”视作一个庞大而稳固的操作系统——它不是一堆软件的集合,而是一套精密咬合的齿轮组。当设计师拖动Photoshop中一个图层的`Overlay`混合模式滑块,调色师在DaVinci Resolve里用`Color Dodge`提亮发丝边缘,导演在Premiere Pro中按下`Ctrl+3`切换第3台摄像机,动画师在After Effects里输入`wiggle(530)`让文字微微震颤……这些看似独立的操作,实则共享同一套底层

GPU加速视觉伺服落地验证(YOLOv8n+ORB-SLAM3双模型融合):推理耗时拆解至GPU kernel级(含TensorRT engine warmup、memory pool预分配、CUDA graph固化三重优化)

# GPU加速视觉伺服系统的工程破局:从理论建模到工业落地的全链路实践 在智能制造产线、物流分拣机器人、手术辅助平台这些对可靠性与实时性要求近乎苛刻的场景中,视觉伺服系统正经历一场静默却深刻的范式迁移——它不再满足于“能用”,而是必须回答:“在光照突变时能否稳定跟踪?”“当目标被动态遮挡70%后,是否仍能在200ms内完成重定位?”“面对USB3相机1280×720@60Hz的持续帧流,端到端延迟抖动是否始终压在±0.8ms以内?”这些问题背后,是控制理论、计算机体系结构与嵌入式软件工程三重知识域的深度咬合。而GPU,这个曾被寄予厚望的加速器,却在实际部署中暴露出令人沮丧的“确定性黑洞”:Y

SWD物理层黑盒解密(STM32权威实验室实测):时序裕量仅±1.8ns!电平容限临界值、上拉电阻黄金公式、复位协同窗口<23μs的硬约束(附示波器眼图+JESD62B标准对照)

# SWD物理层:一场被低估的模拟-数字混合系统工程 在嵌入式开发者的日常中,SWD(Serial Wire Debug)接口常被当作一个“理所当然”的存在——两根线、几行OpenOCD配置、一次`target extended-remote :3333`就能连上目标芯片。它不像JTAG那样需要五根信号线,也不像SWO那样对带宽斤斤计较。于是,当某天产线突然爆出37%的调试连接失败率,当客户反馈“设备在高温车间无法烧录”,当同一块PCB在A厂良率99.8%,在B厂却批量失锁——工程师的第一反应往往是:“换J-Link”、“升级OpenOCD”、“检查固件是否禁用了调试口”。 没人想到,问题

鸿蒙方舟运行时(Ark Runtime)与VMOS Pro ART虚拟机的类加载战争:ClassLoader双亲委派链断裂的4种触发场景、7个关键Hook点、及兼容性兜底方案(含dexopt预编译绕过与runtime class redefine PoC)

# 鸿蒙方舟运行时与Android ART虚拟机的类加载本质冲突:一场跨VM本体论的静默崩塌 在智能手机操作系统演进的漫长征途中,我们曾习惯于将“类加载”视作一个安静、确定、可预测的后台过程——它像空气一样存在,却极少被感知。直到某一天,当一个鸿蒙ArkTS模块试图在Android ART沙箱中启动Activity,日志里突然炸开一连串`ClassNotFoundException`;当`static {}`块在两个VM中各自执行三次,单例对象悄然分裂成三个独立副本;当`instanceof android.app.ContextImpl`在Ark侧返回`false`,而开发者确信那明明就是

离线环境Chrome扩展强制预装工业级方案:ExtensionInstallForcelist策略加固+CRX3签名打包规范+本地update_url托管服务(支持断点续传+版本灰度发布)

# 离线环境Chrome扩展预装的工业级挑战与架构全景 在能源调度中心的操作台、银行柜台机的密闭终端、航空地勤工作站的加固设备上,Chrome浏览器早已不是“上网工具”,而是承载关键业务逻辑、合规审计能力与安全管控入口的**可信执行平台**。然而,当这些终端被部署于物理隔离网络、策略强控区域或高敏专网时,一个看似基础的问题陡然尖锐起来:如何让扩展在**零外网访问、无云策略同步、无自动更新通道**的前提下,实现可信预装、长期受控运行与静默升级?这不是Web开发的延伸,而是终端安全治理的深水区——它直击现代企业IT基础设施中“可控性”与“连通性”的根本矛盾。 我们曾见过某省级电力调度中心因一次

硬件加速EPG卡顿根治方案:Amlogic S905X3平台VAAPI硬解与EPG UI争用GPU的v4l2-request调度器优先级劫持——实测UI卡顿下降98.7%(perf record证据链完整)

# EPG卡顿的根因解构与硬解-UI协同治理实践 在智能电视、IPTV盒子和车载信息娱乐系统中,EPG(Electronic Program Guide)界面的流畅度是用户对设备“高端感”的第一触点。当用户手指滑动频道列表,却遭遇画面停顿、输入延迟、缩略图加载卡顿——这种看似微小的体验裂痕,往往成为整机口碑崩塌的起点。但问题的真相远非“GPU性能不足”或“内存不够”这般简单。它是一场发生在硅基物理层、内核调度器、驱动栈语义与应用逻辑之间的多维共振失效:当VAAPI硬解帧就绪的瞬间,恰好撞上HWC合成器提交新一帧UI的毫秒窗口;当DDR总线被VPU满载读取时,GPU却在等待同一块buffer