您的库存管理数据模板
您的库存管理数据模板
- 建议收集的属性
- 流程发现需跟踪的关键活动
- 针对SAP S/4HANA的提取指南
库存管理属性
| 名称 | 说明 | ||
|---|---|---|---|
| 事件时间 EventTime | 库存活动记录在系统中的准确日期和时间。 | ||
| 说明 事件时间是记录活动准确发生时刻的时间戳。它对于按时间顺序排列事件、还原每个库存批次的流程至关重要,也是所有基于时间的流程挖掘分析的基础。 事件时间的准确性对于计算周期时间、交付周期和持续时长等关键绩效指标至关重要。它有助于分析不同时段的流程表现、发现瓶颈出现的时间,并为了解流程延迟提供事实依据,例如批次在质量检验中等待放行的时长。 重要性 此时间戳用于按时间顺序排列事件,是所有时长和绩效计算的基础。 获取途径 通常由物料凭证抬头表MKPF中的过账日期(MKPF-BUDAT)和录入时间(MKPF-CPUTM)组合而成。 示例 2023-10-26T09:00:00Z2023-11-15T14:35:10Z2024-01-05T23:15:00Z | |||
| 库存批次/批号 InventoryBatchLot | 用于追踪产品生命周期的特定数量产品的唯一标识符,即案例ID。 | ||
| 说明 库存批次或批号是主要案例标识符,用于汇总与特定产品数量相关的所有活动。借助它,您可以按时间顺序完整查看一批库存的流转过程,从最初入库,到各类内部移动和状态变化,再到最终用于销售、生产或处置。 在流程分析中,这项属性至关重要。它可以帮助您追踪每个批次的端到端流程、准确衡量周期时间、识别流程差异,并了解不同批次的处理方式。对于药品、食品饮料和化工等高度重视可追溯性、质量控制和有效期管理的行业,按批次分析流程尤为重要。 重要性 这是将所有相关库存事件关联到同一案例的核心标识符,也是开展端到端流程分析的基础。 获取途径 通常为批次号,可在SAP表MCHA(批次主数据)或MCH1(批次)中的字段CHARG找到。 示例 B001-A452023L202405-XYZ789456123BATCH-05-24 | |||
| 活动 ActivityName | 库存管理流程中特定时点发生的业务事件名称。 | ||
| 说明 活动属性描述批次库存生命周期中的单个步骤或事件。这些事件代表关键业务操作,例如收货、移动库存、执行质量检验或发出物料。每项活动都记录了库存批次在特定时间发生的情况。 分析活动是流程挖掘的基础。通过分析活动,可以呈现流程、识别常见和少见的路径、发现活动延迟形成的瓶颈,并分析返工循环。了解“库存已报废”或“质量检验”等活动的顺序和频率,有助于企业找出流程改进和提升运营效率的机会。 重要性 它定义了流程中的各个步骤,使库存生命周期的呈现和分析成为可能。 获取途径 这是一个派生属性,通常根据SAP移动类型(MSEG-BWART)或事务代码(MKPF-TCODE2)映射为便于用户理解的名称。 示例 已过账收货已过账上架调拨已过账交货发货库存已报废 | |||
| 存储地点 StorageLocation | 工厂内用于实际存放库存的具体地点。 | ||
| 说明 存储地点是用于区分工厂内物料库存的组织单元。例如,一个工厂可以分别设置原材料、成品和待检库存的存储地点。 与工厂相比,该属性提供了更细致的地点信息。分析时可用它了解不同库存区域之间的移动情况,例如从收货区转移到主仓库所需的周期时间。按存储地点分析库容利用率和移动频次,有助于优化仓库布局和内部物流。 重要性 可细化查看工厂内的库存位置,帮助分析内部移动和存储效率。 获取途径 位于物料凭证项目表MSEG的LGORT(存储地点)字段。 示例 0001RM01FG01QI01 | |||
| 工厂 Plant | 代表库存所在设施的组织单位,例如工厂或配送中心。 | ||
| 说明 工厂是SAP中的核心组织单元,可代表生产设施、中央仓库或公司总部。所有库存都在物理或逻辑上归属于某个工厂。 按工厂分析是比较不同地点流程绩效的基础。这有助于回答诸如“哪个工厂的上架周期时间最长?”或“工厂A的库存差异率是否高于工厂B?”等问题。按地理位置或组织单元划分数据,有助于发现特定地点的问题,并在组织内推广最佳实践。 重要性 可比较公司不同地点的库存流程及其绩效。 获取途径 位于物料凭证项目表MSEG的WERKS(工厂)字段。 示例 10001710DE01US01 | |||
| 数量 Quantity | 库存移动涉及的物料数量。 | ||
| 说明 该属性表示某项活动中移动、收货、发货或调整的物料数量,按物料的基本计量单位记录。 分析数量有助于了解库存流程的规模和影响。您可以据此创建仪表板,展示处理货物的数量,例如“按SKU统计的发货吞吐量”。数量还可用于计算“库存报废/处置率”等KPI,为流程分析提供超越事件计数的量化视角。 重要性 量化每项活动涉及的物料数量,便于分析吞吐量、报废数量和调整影响。 获取途径 位于物料凭证项目表MSEG的MENGE(数量)字段。 示例 10012.55000-10 | |||
| 物料编号 MaterialNumber | 所管理产品或物料的唯一标识符。 | ||
| 说明 物料编号通常也称为SKU(库存单位),是分配给特定产品的唯一代码。它是库存管理中的基础主数据元素,用于跟踪货物的数量、价值和移动情况。 在流程挖掘中,按物料编号分析可以从产品角度了解库存流程。您可以据此了解哪些产品的质量检验时间最长、哪些产品最常报废,或哪些产品的内部调拨量最大。按物料细分分析,有助于发现特定产品的问题,并针对不同类型的货物优化库存策略。 重要性 它可以按产品细分分析,揭示特定物料的模式和问题。 获取途径 位于物料凭证项目表MSEG的字段MATNR中。主数据存储在表MARA中。 示例 RM-1001FG-2050-B100-400-A | |||
| 用户名 UserName | 在SAP中执行交易的人员的用户ID。 | ||
| 说明 此属性记录过账凭证或执行活动的员工SAP用户ID,可追踪库存管理流程中的具体操作及其负责人。 按用户分析有助于了解绩效、合规情况和培训需求。例如,“手动库存调整原因”仪表板会使用此属性查看哪些用户执行的调整最多。它可以帮助识别需要额外培训的用户、发现未经授权的活动,或表彰表现出色的员工。 重要性 它有助于明确责任,并发现特定用户的行为、培训需求或合规问题。 获取途径 位于物料凭证抬头表MKPF的字段USNAM(用户名)中。 示例 JSMITHMBROWNWAREHOUSE_OPS | |||
| 移动原因代码 MovementReasonCode | 用于说明库存移动原因的代码。 | ||
| 说明 移动原因代码用于补充说明执行货物移动的原因,常用于解释非计划移动,例如库存调整、退货或报废。 该属性对于根因分析很有价值。在“手动库存调整原因”仪表板中,按原因代码分析可揭示差异产生的原因,例如损坏、盗窃或数据录入错误。借助这些洞察,企业可以解决根本问题,而不只是纠正表面现象。 重要性 说明非计划库存移动背后的原因,支持有针对性的根因分析。 获取途径 位于物料凭证项目表MSEG的GRUND(移动原因)字段。 示例 00010005102 | |||
| 移动类型 MovementType | SAP中的三位代码,用于控制货物移动的过账方式。 | ||
| 说明 移动类型是SAP库存管理中的关键控制代码,用于确定物料移动的特征。它规定要更新哪些科目、交易界面的布局,以及要更新哪些数量或价值字段。例如,101表示收货,311表示转储过账,551表示报废。 此属性通常用于推导便于用户理解的“活动”名称。按移动类型分析流程,可以从技术角度详细了解库存流转情况。它对于验证流程图的准确性,以及发现可能导致瓶颈或偏差的特定交易类型至关重要。 重要性 它可以精确地从技术角度对每项库存事件进行分类,是推导活动名称和开展详细分析的重要依据。 获取途径 位于物料凭证项目表MSEG的字段BWART(移动类型)中。 示例 101311261551601 | |||
| 上次数据更新 LastDataUpdate | 表示此记录的数据上次从源系统刷新时间的时间戳。 | ||
| 说明 此属性记录最近一次从源系统提取或更新数据的日期和时间,为所分析信息的新鲜度提供重要元数据。借助它,用户可以了解当前查看的是近实时数据,还是之前某个时段的数据快照。 分析时,了解数据的时效性是得出相关且准确结论的关键。分析人员和业务用户可以通过此字段确认数据是否为最新数据。仪表板通常会显示此字段,为所呈现的洞察提供背景信息。 重要性 它可以让用户了解数据的新鲜度,确保分析基于最新信息。 获取途径 此时间戳在数据提取、转换和加载(ETL)过程中生成并添加。 示例 2024-05-21T08:00:00Z2024-05-20T08:00:00Z | |||
| 仓位 StorageBin | 仓库中最细粒度的存储单元,用于标识物料的实际位置。 | ||
| 说明 仓位表示仓库中的具体坐标,例如货架位置。通常在实施SAP仓库管理(WM)或扩展仓库管理(EWM)时使用这一层级的信息。 该属性对于“仓库库容利用率”仪表板至关重要。它可用于分析仓库空间的使用效率、识别可能出现拥堵的区域,并发现低效的上架或拣货路径。分析仓位之间的移动,有助于优化仓库布局并缩短操作人员的行走时间。 重要性 提供最细粒度的地点数据,支持分析仓库空间利用率和运营效率。 获取途径 如果使用WM,可在LTAK/LTAP等转储单表中查找。对于库存凭证,相关字段可能位于MSEG-LGPBE。请参阅SAP S/4HANA文档。 示例 A-01-01-AB-05-10-C收货区-01 | |||
| 到期日 ExpirationDate | 物料批次到期、无法继续使用的日期。 | ||
| 说明 保质期到期日(SLED)是易腐或有时效要求商品的重要主数据。该日期按批次管理,用于确定产品何时不能再销售或消耗。 该属性是“呆滞及过期库存分析”仪表板的重要依据。结合到期日分析活动,企业可以识别即将过期的批次并采取预防措施。它有助于衡量先进先出(FEFO)等库存轮转策略的效果,并量化过期库存报废造成的损失。 重要性 支持分析呆滞和过期库存,帮助减少浪费和财务损失。 获取途径 位于批次主数据表MCH1或MCHA的VFDAT(保质期到期日)字段。 示例 2024-12-312025-06-302024-09-01 | |||
| 库存类型 StockType | 表示库存状态,例如非限制使用、质量检验中或冻结。 | ||
| 说明 库存类型根据库存的可用性进行分类。主要类型包括非限制使用库存(可自由使用)、质量检验库存(等待质量检查)和冻结库存(不可使用)。货物移动通常会涉及库存类型变更。 跟踪库存类型变化是了解库存可用性流程的基础,可直接支持“库存转入质量检验”和“库存状态变更为冻结”等活动。分析库存处于各类型的时长,尤其是“质量检验”状态的时长,有助于发现影响货物销售或生产可用性的延误。 重要性 跟踪库存的可用状态,对于分析质量检验延误和库存可用性至关重要。 获取途径 位于物料凭证项目表MSEG的INSMK(库存类型)字段。 示例 非限制使用质量检验冻结库存 | |||
| 源系统 SourceSystem | 标识提取数据的源系统。 | ||
| 说明 此属性用于标明库存管理数据来自哪个记录系统。在此场景中,指具体的SAP S/4HANA实例。如果数据来自多个ERP、仓库管理系统或旧平台,这项信息就十分重要。 在单系统分析中,这项属性看似固定;但合并多个来源的数据以全面了解流程时,它就不可或缺。它有助于数据治理、排查数据提取问题,并确保数据沿袭清晰。 重要性 它说明了数据的来源,为数据治理和多系统分析提供必要背景。 获取途径 通常在数据转换过程中设置为硬编码值,用于标识具体的SAP S/4HANA实例。 示例 S4H_PROD_100SAP_S4_FINANCES4HANA_GLOBAL | |||
| 物料凭证编号 MaterialDocumentNumber | 用于标识记录货物移动的物料凭证的唯一编号。 | ||
| 说明 在SAP中登记货物移动时,系统会生成物料凭证作为移动记录。该属性是凭证的唯一标识。一张物料凭证可以包含多个项目或活动。 在流程挖掘中,物料凭证编号是重要的事务标识,可用于归并同一凭证下登记的相关事件。它也有助于审计,并支持从流程分析逐级下钻到源系统,调查具体事务。 重要性 作为事务标识,可用于审计并归并一同执行的活动。 获取途径 位于MKPF(抬头)和MSEG(项目)表的MBLNR(物料凭证编号)字段。 示例 490000123450000056784900002345 | |||
| 计量单位 UnitOfMeasure | 用于计量物料数量的单位,例如件、千克。 | ||
| 说明 计量单位用于说明“数量”属性。常见单位包括件(PC)、千克(KG)、升(L)和箱(BOX),为数量字段提供必要的背景信息。 该属性看似只是简单说明,但对于确保数据质量,以及需要将不同单位换算为统一标准的分析至关重要。例如,要准确计算报废库存的总价值,就必须了解不同单位的数量,并在必要时进行换算。 重要性 为“数量”属性提供必要的背景信息,确保准确理解物料数量。 获取途径 位于物料凭证项目表MSEG的MEINS(基本计量单位)字段。 示例 件千克个米 | |||
| 订单履约周期时间 OrderFulfillmentCycleTime | 从开始拣货到登记发货的端到端时长。 | ||
| 说明 这是一个计算指标,用于衡量从“开始拣货”活动到“已登记交货发货”活动的总时长。它表示流程开始后,仓库准备并发运客户订单所需的时间。 该属性直接衡量“订单履约周期时间”KPI。分析这一时长有助于企业了解响应客户需求的速度。您可以按产品、仓库或客户细分,找出拣货、包装和发货流程中的延误,从而了解其对客户满意度和物流效率的影响。 重要性 衡量仓库出库流程的速度和效率,这是影响客户满意度的重要因素。 获取途径 这是一个计算属性,按批次计算“开始拣货”和“已登记交货发货”事件之间的时间差得出。 示例 7200144003600 | |||
库存管理活动
| 活动 | 说明 | ||
|---|---|---|---|
| 已过账上架调拨 | 表示批次从收货区或暂存区实际移至最终存储位置或货位。SAP会将此操作记录为转储过账物料凭证。 | ||
| 重要性 此活动完成入库收货流程。完成该活动所需的时间即上架时间,是衡量仓库效率的关键KPI。 获取途径 作为转储过账记录在MATDOC表中,通常发生在不同存储地点之间(例如移动类型311)。具体移动类型可能因仓库结构而异。 采集 通过MATDOC中的转储过账凭证识别,这些凭证记录了库存从临时或收货存储地点转至最终存储地点。 事件类型 explicit | |||
| 已过账交货发货 | 记录出库流程的最后一步,即将批次所有权转交给客户或承运商。这是一项明确的交易,会减少库存并生成会计过账。 | ||
| 重要性 这是订单履约流程的关键完成事件,对于衡量准时交付和计算整体订单履约周期时间至关重要。 获取途径 记录在MATDOC表中。通过销售订单交货发货对应的移动类型(BWART)识别,通常为601。 采集 从MATDOC中的物料凭证及移动类型601提取。 事件类型 explicit | |||
| 已过账库存调整 | 记录因实物盘点或其他差异导致的库存数量变化。此事件会明确调整账面库存,使其与实物盘点结果一致。 | ||
| 重要性 这些调整对于保持库存准确性至关重要。调整频繁发生,说明库存操作、安全管理或数据录入可能存在问题。 获取途径 记录在MATDOC表中。通过实物盘点移动类型(BWART)识别,例如701(盘盈)或702(盘亏)。 采集 从MATDOC中的物料凭证及实物盘点调整移动类型提取(例如701、702)。 事件类型 explicit | |||
| 已过账收货 | 表示库存批次首次进入仓库,通常来自供应商或生产环节。收货时会创建物料凭证,因此SAP S/4HANA会明确记录此事件。 | ||
| 重要性 这是库存生命周期的主要开始事件。分析此活动与上架等后续活动之间的时间,对于衡量收货月台效率至关重要。 获取途径 记录在MATDOC表中。通过特定移动类型(BWART)识别,例如采购订单收货对应101,收货后转入冻结库存对应103。 采集 从MATDOC中的物料凭证及相应的收货移动类型提取。 事件类型 explicit | |||
| 已过账生产发货 | 表示生产订单或流程订单领用库存批次。此交易会减少库存,并将物料成本分配至生产订单。 | ||
| 重要性 这是主要的领用事件,标志着组件库存生命周期结束。分析此事件对于了解生产物料的可用性和领用模式至关重要。 获取途径 记录在MATDOC表中。通过订单发货对应的移动类型(BWART)识别,例如261。 采集 从MATDOC中的物料凭证及移动类型261提取。 事件类型 explicit | |||
| 库存已报废 | 标志着库存批次最终处置,并将其永久移出库存记录。通常适用于过期、损坏或过时的库存。 | ||
| 重要性 这是代表财务损失的结束事件。分析报废事件有助于发现库存老化、操作流程或需求预测方面的问题。 获取途径 记录在MATDOC表中。通过报废移动类型(BWART)识别,例如551(从非限制使用库存报废)、553(从质量检验库存报废)或555(从冻结库存报废)。 采集 从MATDOC中的物料凭证及报废移动类型提取(例如551)。 事件类型 explicit | |||
| 质量检验库存已放行 | 表示批次已通过质量检验,现在可以使用或上架。系统会明确记录从质量检验库存转至其他库存类型(如非限制使用库存)的转储过账。 | ||
| 重要性 此里程碑标志着质量流程完成,库存可以投入使用。此处的延迟可能对后续生产或履约造成重大影响。 获取途径 作为转储过账记录在MATDOC表中。通常通过移动类型(BWART)321识别,表示库存从“质量检验”转至“非限制使用”。 采集 从MATDOC中的物料凭证及移动类型321提取。 事件类型 explicit | |||
| 已开始拣货 | 标志着订单履约流程开始。系统会创建仓库任务,从存储货位拣取指定批次。通常在创建转储订单或仓库任务时记录此事件。 | ||
| 重要性 此活动触发拣货流程。分析从此事件到拣货完成的时间,有助于衡量仓库操作人员的效率并发现延迟。 获取途径 此事件通常不记录在MATDOC中。在使用仓库管理(WM/EWM)的系统中,可根据转储订单(LTAK表)或仓库任务的创建时间戳推断。 采集 根据与物料批次关联的转储订单(WM)或仓库任务(EWM)创建记录推断。 事件类型 inferred | |||
| 已收到销售退货 | 记录客户将此前发出的批次退回仓库。这是一项会增加库存的明确交易。 | ||
| 重要性 跟踪退货对于了解产品质量问题和客户不满至关重要。退货处理和处置流程也可能存在低效环节。 获取途径 记录在MATDOC表中。通过销售退货移动类型(BWART)识别,例如651(转入非限制使用库存)或653(转入质量检验库存)。 采集 从MATDOC中的物料凭证及销售退货移动类型提取(例如651、653)。 事件类型 explicit | |||
| 已过账内部库存调拨 | 记录同一工厂内库存批次在不同存储地点或货位之间的移动。这是会生成物料凭证的明确交易。 | ||
| 重要性 跟踪内部调拨有助于分析仓库运营效率、发现不必要的移动,并衡量不同地点之间的库存补充周期。 获取途径 记录在MATDOC表中。存储地点之间的调拨通常通过移动类型(BWART)311识别。 采集 从MATDOC中的物料凭证及内部库存移动类型提取(例如311)。 事件类型 explicit | |||
| 库存已过账至质量检验 | 表示已收货批次转入质量检验状态,在检验放行前不可使用。这是SAP中的明确交易,会更改该批次的库存类型。 | ||
| 重要性 此活动标志着质量检验流程开始。从此活动到质量检验放行之间的时长,是了解质量相关延迟的重要指标。 获取途径 记录在MATDOC表中。可以是收货移动(例如101),库存类型(INSMK)设为“Q”(质量检验),也可以是转储过账(例如322)。 采集 通过MATDOC中将库存转入“质量检验”库存类型的物料凭证识别。 事件类型 explicit | |||
| 库存状态已更改为冻结 | 表示批次状态发生变化,导致其无法发货,原因通常包括损坏、暂停使用要求等。这是SAP中的明确转储过账。 | ||
| 重要性 此事件反映库存可用性受到影响。冻结事件频繁发生,可能表明操作、存储条件或供应商质量存在问题。 获取途径 作为转储过账记录在MATDOC表中。移动类型(BWART)344通常用于将库存从“冻结”转为“非限制使用”,343则用于从“非限制使用”转为“冻结”。此活动对应343。 采集 通过MATDOC中移动类型为343的物料凭证识别。 事件类型 explicit | |||
| 库存状态已更改为非限制使用 | 表示批次状态发生变化,解除冻结或质量暂停状态,使其可以投入使用。系统会将此操作记录为明确的转储过账。 | ||
| 重要性 此活动标志着库存暂停状态解除。分析库存处于冻结状态的时长,有助于改进问题处理流程。 获取途径 作为转储过账记录在MATDOC表中。移动类型(BWART)344用于将库存从“冻结”转为“非限制使用”。 采集 通过MATDOC中移动类型为344的物料凭证识别。 事件类型 explicit | |||
| 批次状态已更改 | 表示批次主记录发生变化,例如状态从“非限制使用”改为“受限”。这不是物料移动,而是主数据变更,系统会记录此变更。 | ||
| 重要性 批次状态变化会直接影响其在销售或生产中的可用性。分析这些变化,可以发现与库存过期或质量控制有关、但不涉及实物移动的问题。 获取途径 根据批次主数据表(MCH1、MCHA)的更改日志推断。CDHDR和CDPOS表会跟踪批次状态字段(MCH1-ZUSTD)的变化。 采集 根据CDHDR/CDPOS中的更改凭证推导,涉及批次主记录中的状态字段(MCH1-ZUSTD)。 事件类型 inferred | |||
数据提取指南
步骤
- 确认系统访问权限:确保您拥有具备必要授权的用户,可查询SAP S/4HANA系统中的核心数据服务(CDS)视图。通常需要由系统管理员授予访问权限。
- 选择SQL客户端:选择可连接SAP HANA数据库的SQL客户端工具。常见工具包括SAP HANA Studio、SAP HANA Database Explorer,以及DBeaver等第三方工具。
- 配置数据库连接:使用SQL客户端创建新的数据库连接。您需要准备HANA数据库主机名、端口号(通常为3<instance_number>15)和数据库用户凭据。
- 准备SQL查询:将本文档“查询”部分提供的完整SQL查询复制到SQL客户端的编辑器中。
- 设置查询参数:找到查询中的占位值。将
I_MaterialDocumentItem.PostingDate BETWEEN 'YYYYMMDD' AND 'YYYYMMDD'替换为所需日期范围,例如BETWEEN '20230101' AND '20230630'。同时,根据组织结构更新公司或工厂筛选条件,例如MaterialDocumentItem.Plant IN ('Plant1', 'Plant2')。 - 执行查询:在S/4HANA数据库中运行修改后的SQL查询。执行时间取决于日期范围以及系统中的库存数据量。
- 检查数据:查询完成后,在SQL客户端中检查结果,确认数据正确且完整。检查是否包含不同活动,以及关键属性是否已填充。
- 导出事件日志:从SQL客户端将完整结果集导出为CSV文件。请将导出编码设为UTF-8,以避免字符显示问题。
- 准备上传:CSV文件中的列名必须与查询中的别名完全一致,例如
InventoryBatchLot、ActivityName和EventTime等。完成后即可将文件上传到流程挖掘工具。
配置
- 授权:运行查询的用户需要对以下CDS视图拥有
SELECT权限:I_MaterialDocumentItem、I_BatchChangeDocument和I_WarehouseTask。还需要访问这些视图所在的底层数据库架构。 - 日期范围筛选:必须对
PostingDate、ChangeDocumentCreationDate或WarehouseTaskCreationDate字段应用日期范围筛选。分析通常选择3到12个月的范围。查询多年数据可能导致严重的性能问题。 - 组织筛选条件:为提升性能并聚焦分析范围,请添加
WHERE子句,按Plant或CompanyCode筛选。这可以减少数据量,并将提取范围限定在相关业务部分。 - 数据量:请注意,库存管理系统会生成大量数据。较宽的日期范围可能产生数百万行,影响源系统的提取过程和客户端工具的性能。
- 扩展仓库管理(EWM):“开始拣货”活动依赖
I_WarehouseTaskCDS视图,只有使用SAP扩展仓库管理时,该视图才会填充数据。如果组织使用较早的仓库管理(WM)模块或仅使用库存管理(IM),则不会提取此活动。
查询示例 sql
SELECT
mat_doc.Batch AS "InventoryBatchLot",
CASE
WHEN mat_doc.MovementType = '101' AND mat_doc.InventoryStockType = '2' THEN 'Stock Posted to Quality Inspection'
WHEN mat_doc.MovementType = '101' THEN 'Goods Receipt Posted'
WHEN mat_doc.MovementType = '321' THEN 'Quality Inspection Stock Released'
WHEN mat_doc.MovementType = '311' THEN 'Internal Stock Transfer Posted'
WHEN mat_doc.MovementType = '344' THEN 'Stock Status Changed to Blocked'
WHEN mat_doc.MovementType IN ('343', '322') THEN 'Stock Status Changed to Unrestricted'
WHEN mat_doc.MovementType IN ('701', '702') THEN 'Inventory Adjustment Posted'
WHEN mat_doc.MovementType = '601' THEN 'Goods Issue for Delivery Posted'
WHEN mat_doc.MovementType = '261' THEN 'Goods Issue for Production Posted'
WHEN mat_doc.MovementType IN ('651', '653') THEN 'Sales Return Received'
WHEN mat_doc.MovementType = '551' THEN 'Stock Scrapped'
WHEN mat_doc.MovementType = '313' THEN 'Put-Away Transfer Posted' -- Example for two-step transfers
ELSE 'Unknown Material Movement'
END AS "ActivityName",
TO_TIMESTAMP(mat_doc.PostingDate || LPAD(mat_doc.CreationTime, 6, '0'), 'YYYYMMDDHH24MISS') AS "EventTime",
mat_doc.Material AS "MaterialNumber",
mat_doc.CreatedByUser AS "UserName",
mat_doc.MovementType AS "MovementType",
mat_doc.Plant AS "Plant",
mat_doc.StorageLocation AS "StorageLocation",
mat_doc.QuantityInEntryUnit AS "Quantity",
mat_doc.ReasonForMovement AS "MovementReasonCode"
FROM
I_MaterialDocumentItem AS mat_doc
WHERE
mat_doc.Batch IS NOT NULL AND mat_doc.Batch <> ''
AND mat_doc.PostingDate BETWEEN '20230101' AND '20231231' -- Placeholder: Set your date range
-- AND mat_doc.Plant IN ('Plant1', 'Plant2') -- Placeholder: Add filters for relevant plants
UNION ALL
SELECT
SPLIT_PART(change_doc.ChangeableObjectDescription, '/', 3) AS "InventoryBatchLot",
'Batch Status Changed' AS "ActivityName",
change_doc.ChangeDocumentCreationDateTime AS "EventTime",
SPLIT_PART(change_doc.ChangeableObjectDescription, '/', 1) AS "MaterialNumber",
change_doc.ChangedByUser AS "UserName",
NULL AS "MovementType",
SPLIT_PART(change_doc.ChangeableObjectDescription, '/', 2) AS "Plant",
NULL AS "StorageLocation",
NULL AS "Quantity",
NULL AS "MovementReasonCode"
FROM
I_BatchChangeDocument AS change_doc
WHERE
change_doc.ChangeDocumentTable = 'MCHA' AND change_doc.ChangeDocumentTableFieldName = 'ZUSTD'
AND TO_VARCHAR(change_doc.ChangeDocumentCreationDate) BETWEEN '20230101' AND '20231231' -- Placeholder: Set your date range
UNION ALL
SELECT
wh_task.Batch AS "InventoryBatchLot",
'Picking Initiated' AS "ActivityName",
wh_task.WarehouseTaskCreationDateTime AS "EventTime",
wh_task.Product AS "MaterialNumber",
wh_task.CreatedByUser AS "UserName",
NULL AS "MovementType",
wh_task.Plant AS "Plant",
wh_task.SourceStorageLocation AS "StorageLocation",
wh_task.TargetQuantity AS "Quantity",
NULL AS "MovementReasonCode"
FROM
I_WarehouseTask AS wh_task
WHERE
wh_task.Batch IS NOT NULL AND wh_task.Batch <> ''
AND wh_task.WarehouseProcessType IN ('P210', 'P220') -- Placeholder: Adjust process types based on your picking configuration
AND TO_VARCHAR(wh_task.WarehouseTaskCreationDate) BETWEEN '20230101' AND '20231231'; -- Placeholder: Set your date range 步骤
- 确认已获准直接访问SAP HANA SQL,且提取用户拥有MATDOC和系统所需批次主数据表的读取权限。确认物理架构所有者,并将[Your SAP HANA schema]替换为获准使用的架构名称。
- 确认目标SAP S/4HANA版本中可用的MATDOC和批次表字段。以下查询使用常见的MATDOC和MCHA字段,但字段是否可用及其命名可能因版本、部署方式和已激活范围而异。执行前,请替换所有标记为[Configure based on your system]的字段。
- 将[Start timestamp]和[End timestamp]替换为ISO时间戳,设定提取时间范围。首次提取建议使用三到六个月的数据,验证数据量和性能后再延长范围。
- 在获准的SQL客户端、SAP HANA Database Explorer或其他经授权的数据库工具中执行查询。将相应筛选占位符替换为所需的公司代码、工厂、凭证类型或移动类型,以限制结果范围。
- 检查活动CTE中的移动类型映射。移动类型取决于系统和业务配置。请将示例移动类型列表替换为目标系统中配置的收货、质量检验、放行、上架、内部转储、冻结库存、非限制使用库存、库存调整、拣货、交货发货、生产发料、销售退货和报废移动类型。
- 验证每行输出均包含InventoryBatchLot、ActivityName和EventTime。确认批次标识足够稳定,可作为ProcessMind案例标识。如果业务场景需要通过物料、工厂或存储地点区分不同组织单元中相同的批次值,请使用配置好的复合案例标识,而不要仅使用批次值。
- 验证事件顺序、重复行、冲销凭证、已取消凭证和时区处理。MATDOC记录凭证过账,因此除非明确排除或映射,冲销和取消记录可能会作为独立事件出现。
- 将查询结果导出为平面文件,每个事件占一行,包含InventoryBatchLot、ActivityName、EventTime、MaterialNumber、UserName、MovementType、Plant、StorageLocation、Quantity和MovementReasonCode列。时间戳应统一采用ISO 8601格式,并保留物料、批次、工厂和存储地点值的前导零。
- 将生成的事件日志上传到ProcessMind,并将InventoryBatchLot映射为案例标识、ActivityName映射为活动、EventTime映射为事件时间戳。不要依赖ProcessMind推断活动、合并记录或补充缺失事件。
配置
- 提取方式:直接通过SQL查询SAP HANA库存和批次数据。查询读取MATDOC,并关联MCHA中的批次主数据。只有确认目标系统中的相关字段和批次层级后,才添加MCH1或其他批次表。
- 日期范围:从三到六个月开始。EventTime应依据MATDOC中可用的物料凭证过账日期和时间确定。增量加载时,请设置受控的重叠时间窗口,以捕获延迟过账的数据,再使用已配置的凭证和项目标识去重。
- 必需筛选条件:根据流程范围配置公司代码、工厂、物料凭证类型、移动类型、批次是否存在以及过账日期。添加公司代码和凭证类型字段前,必须确认已安装版本支持这些字段。
- 活动映射:移动类型的含义取决于配置。请维护经批准的映射表,或将查询中的移动类型列表替换为业务实际使用的值。不要将示例列表视为适用于所有SAP系统的通用语义。
- 批次范围:由于案例标识为InventoryBatchLot,查询会排除没有批次值的行。如果需要从其他来源推导批次,请在提取前明确配置该来源。
- 事件粒度:每个符合条件的MATDOC项目都会输出为一行事件。查询不会根据后续记录推断拣货、质量判定、批次状态变更或其他活动。
- 批次主数据变更:仅凭MATDOC无法可靠地表示批次状态变更。请配置变更凭证或批次历史数据源,以支持“批次状态已变更”活动。查询中包含一个占位分支,执行前必须将其连接到已验证的数据源。
- 拣货:拣货启动通常记录在仓库执行数据中,而不是MATDOC过账中。请配置经过验证的仓库任务或转储单数据源,并在执行前替换占位分支。
- 性能:按过账时间戳或日期、工厂、公司代码和相关移动类型筛选。仅选择必需列,避免不受限地扫描历史数据,并在获准的工作负载时段执行。对于大型MATDOC数据量,建议采用分区或增量提取。
- 授权和前提条件:获取经批准的数据库连接、架构访问权限、读取授权、SAP S/4HANA库存数据访问权限,以及用于两个非MATDOC活动的仓库执行数据源或变更历史数据源的访问权限。确认直接访问数据库符合组织的SAP运维模式和支持政策。
- 时区:确认数据库和应用程序的时区,并在上传到ProcessMind前统一转换EventTime。
- 数据保护:遵循组织对用户ID、物料数据、客户相关数据和数据库凭据的控制要求。不要将凭据写入查询文本。
查询示例 sql
WITH
params AS (
SELECT
TO_TIMESTAMP('[Start timestamp]') AS start_ts,
TO_TIMESTAMP('[End timestamp]') AS end_ts
FROM DUMMY
),
movement_map AS (
SELECT '101' AS movement_type, 'Goods Receipt Posted' AS activity_name FROM DUMMY
UNION ALL SELECT '105', 'Goods Receipt Posted' FROM DUMMY
UNION ALL SELECT '107', 'Goods Receipt Posted' FROM DUMMY
UNION ALL SELECT '109', 'Goods Receipt Posted' FROM DUMMY
UNION ALL SELECT '321', 'Stock Posted to Quality Inspection' FROM DUMMY
UNION ALL SELECT '322', 'Quality Inspection Stock Released' FROM DUMMY
UNION ALL SELECT '343', 'Stock Status Changed to Unrestricted' FROM DUMMY
UNION ALL SELECT '344', 'Stock Status Changed to Blocked' FROM DUMMY
UNION ALL SELECT '311', 'Internal Stock Transfer Posted' FROM DUMMY
UNION ALL SELECT '309', 'Internal Stock Transfer Posted' FROM DUMMY
UNION ALL SELECT '301', 'Internal Stock Transfer Posted' FROM DUMMY
UNION ALL SELECT '311', 'Put-Away Transfer Posted' FROM DUMMY
UNION ALL SELECT '309', 'Put-Away Transfer Posted' FROM DUMMY
UNION ALL SELECT '701', 'Inventory Adjustment Posted' FROM DUMMY
UNION ALL SELECT '702', 'Inventory Adjustment Posted' FROM DUMMY
UNION ALL SELECT '703', 'Inventory Adjustment Posted' FROM DUMMY
UNION ALL SELECT '704', 'Inventory Adjustment Posted' FROM DUMMY
UNION ALL SELECT '705', 'Inventory Adjustment Posted' FROM DUMMY
UNION ALL SELECT '706', 'Inventory Adjustment Posted' FROM DUMMY
UNION ALL SELECT '601', 'Goods Issue for Delivery Posted' FROM DUMMY
UNION ALL SELECT '602', 'Goods Issue for Delivery Posted' FROM DUMMY
UNION ALL SELECT '261', 'Goods Issue for Production Posted' FROM DUMMY
UNION ALL SELECT '262', 'Goods Issue for Production Posted' FROM DUMMY
UNION ALL SELECT '651', 'Sales Return Received' FROM DUMMY
UNION ALL SELECT '653', 'Sales Return Received' FROM DUMMY
UNION ALL SELECT '654', 'Sales Return Received' FROM DUMMY
UNION ALL SELECT '551', 'Stock Scrapped' FROM DUMMY
UNION ALL SELECT '552', 'Stock Scrapped' FROM DUMMY
),
matdoc_events AS (
SELECT
m.MATNR AS MaterialNumber,
m.CHARG AS InventoryBatchLot,
COALESCE(m.BUDAT_MKPF, m.BUDAT) AS EventTime,
CAST(NULL AS NVARCHAR(80)) AS UserName,
CAST(m.BWART AS NVARCHAR(3)) AS MovementType,
m.WERKS AS Plant,
m.LGORT AS StorageLocation,
m.MENGE AS Quantity,
m.GRUND AS MovementReasonCode,
mm.activity_name AS ActivityName,
m.MBLNR AS MaterialDocumentNumber,
m.MJAHR AS MaterialDocumentYear,
m.ZEILE AS MaterialDocumentItem
FROM [Your SAP HANA schema].MATDOC m
INNER JOIN movement_map mm
ON CAST(m.BWART AS NVARCHAR(3)) = mm.movement_type
CROSS JOIN params p
WHERE m.CHARG IS NOT NULL
AND TRIM(m.CHARG) <> ''
AND COALESCE(m.BUDAT_MKPF, m.BUDAT) >= p.start_ts
AND COALESCE(m.BUDAT_MKPF, m.BUDAT) < p.end_ts
AND m.WERKS IN ([Configure based on your system])
),
batch_enriched_events AS (
SELECT
e.InventoryBatchLot,
e.ActivityName,
e.EventTime,
e.MaterialNumber,
e.UserName,
e.MovementType,
e.Plant,
e.StorageLocation,
e.Quantity,
e.MovementReasonCode,
e.MaterialDocumentNumber,
e.MaterialDocumentYear,
e.MaterialDocumentItem,
c.CUOBJ_BM AS BatchObjectNumber
FROM matdoc_events e
LEFT JOIN [Your SAP HANA schema].MCHA c
ON c.MATNR = e.MaterialNumber
AND c.CHARG = e.InventoryBatchLot
AND c.WERKS = e.Plant
),
verified_batch_status_events AS (
SELECT
CAST(NULL AS NVARCHAR(40)) AS InventoryBatchLot,
'Batch Status Changed' AS ActivityName,
CAST(NULL AS TIMESTAMP) AS EventTime,
CAST(NULL AS NVARCHAR(40)) AS MaterialNumber,
CAST(NULL AS NVARCHAR(80)) AS UserName,
CAST(NULL AS NVARCHAR(3)) AS MovementType,
CAST(NULL AS NVARCHAR(4)) AS Plant,
CAST(NULL AS NVARCHAR(4)) AS StorageLocation,
CAST(NULL AS DECIMAL(31,3)) AS Quantity,
CAST(NULL AS NVARCHAR(3)) AS MovementReasonCode,
CAST(NULL AS NVARCHAR(20)) AS MaterialDocumentNumber,
CAST(NULL AS NVARCHAR(4)) AS MaterialDocumentYear,
CAST(NULL AS NVARCHAR(6)) AS MaterialDocumentItem,
CAST(NULL AS NVARCHAR(40)) AS BatchObjectNumber
FROM DUMMY
WHERE 1 = 0
),
verified_picking_events AS (
SELECT
CAST(NULL AS NVARCHAR(40)) AS InventoryBatchLot,
'Picking Initiated' AS ActivityName,
CAST(NULL AS TIMESTAMP) AS EventTime,
CAST(NULL AS NVARCHAR(40)) AS MaterialNumber,
CAST(NULL AS NVARCHAR(80)) AS UserName,
CAST(NULL AS NVARCHAR(3)) AS MovementType,
CAST(NULL AS NVARCHAR(4)) AS Plant,
CAST(NULL AS NVARCHAR(4)) AS StorageLocation,
CAST(NULL AS DECIMAL(31,3)) AS Quantity,
CAST(NULL AS NVARCHAR(3)) AS MovementReasonCode,
CAST(NULL AS NVARCHAR(20)) AS MaterialDocumentNumber,
CAST(NULL AS NVARCHAR(4)) AS MaterialDocumentYear,
CAST(NULL AS NVARCHAR(6)) AS MaterialDocumentItem,
CAST(NULL AS NVARCHAR(40)) AS BatchObjectNumber
FROM DUMMY
WHERE 1 = 0
),
all_events AS (
SELECT InventoryBatchLot, ActivityName, EventTime, MaterialNumber, UserName, MovementType, Plant, StorageLocation, Quantity, MovementReasonCode, MaterialDocumentNumber, MaterialDocumentYear, MaterialDocumentItem, BatchObjectNumber FROM batch_enriched_events
UNION ALL SELECT InventoryBatchLot, ActivityName, EventTime, MaterialNumber, UserName, MovementType, Plant, StorageLocation, Quantity, MovementReasonCode, MaterialDocumentNumber, MaterialDocumentYear, MaterialDocumentItem, BatchObjectNumber FROM verified_batch_status_events
UNION ALL SELECT InventoryBatchLot, ActivityName, EventTime, MaterialNumber, UserName, MovementType, Plant, StorageLocation, Quantity, MovementReasonCode, MaterialDocumentNumber, MaterialDocumentYear, MaterialDocumentItem, BatchObjectNumber FROM verified_picking_events
)
SELECT
InventoryBatchLot,
ActivityName,
EventTime,
MaterialNumber,
UserName,
MovementType,
Plant,
StorageLocation,
Quantity,
MovementReasonCode
FROM all_events
WHERE InventoryBatchLot IS NOT NULL
AND EventTime IS NOT NULL
ORDER BY InventoryBatchLot, EventTime, MaterialDocumentYear, MaterialDocumentNumber, MaterialDocumentItem, ActivityName; 步骤
- 打开ABAP编辑器:登录SAP S/4HANA系统,使用事务代码
SE38打开ABAP编辑器。 - 创建新程序:在“程序”字段中输入新程序的名称,例如
Z_PM_INVENTORY_EXTRACT,然后单击“创建”。填写描述性标题,将“类型”设为“可执行程序”,并将程序保存到程序包中。 - 定义程序参数:在程序编辑器中定义选择屏幕,作为数据提取的用户界面。用户可在此指定日期范围、工厂等提取参数。
- 编写提取逻辑:复制“查询”部分提供的完整ABAP代码,并粘贴到ABAP编辑器中。此代码用于从多个SAP表中提取所需的全部14项库存活动数据。
- 了解核心逻辑:程序会从源表中分别提取各项库存活动的数据,例如从
MKPF和MSEG提取物料移动数据,或从CDHDR和CDPOS提取主数据变更记录。随后通过UNION ALL将各项数据合并到一个内部表中,形成事件日志。 - 配置文件输出:代码的最后部分负责将内部表中的汇总数据写入文件。程序使用
OPEN DATASET语句在SAP应用服务器上创建文件。您必须指定有效的服务器路径,并确保SAP系统用户拥有该路径的写入权限。 - 运行程序:保存并激活ABAP程序(Ctrl+F3),然后按F8运行。在选择屏幕中输入所需的日期范围及其他筛选条件,例如工厂或公司代码。
- 以后台作业运行:处理大量数据时,必须将程序作为后台作业运行,以避免会话超时。在执行屏幕(F8)中,选择菜单
Program -> Execute in Background,并将作业安排在非高峰时段运行。 - 获取输出文件:作业完成后,在SAP应用服务器上找到输出文件。使用事务代码
AL11浏览服务器目录并定位文件,再使用事务代码CG3Y将文件下载到本地计算机。 - 准备上传:使用文本编辑器或电子表格软件打开下载的文件。确认文件为CSV格式,包含标题行,以逗号分隔,并使用双引号限定文本。上传到流程挖掘工具前,请核对列名是否符合要求。
配置
- 过账日期范围:这是最关键的参数。建议分批提取数据,例如每次处理3至6个月,以确保性能良好并避免系统超时。
- 工厂筛选条件:强烈建议按一个或多个特定工厂(
WERKS)筛选。一次提取所有工厂的数据可能会大量占用系统资源。 - 公司代码筛选条件:如果组织在同一系统中使用多个公司代码,您可以选择按公司代码(
BUKRS)筛选,进一步缩小数据范围。 - 应用服务器文件路径:ABAP程序需要SAP应用服务器上预先定义且有效的目录路径。请确保SAP系统用户(
SY-UNAME)拥有相应的操作系统权限,可以向该目录写入文件。 - 授权:执行提取的用户需要拥有事务代码
SE38的权限(用于创建和运行程序)、表MKPF、MSEG、MCH1、CDHDR、CDPOS、LTAK和LTAP的显示权限,以及安排后台作业(SM36/SM37)的权限。
查询示例 abap
REPORT Z_PM_INVENTORY_EXTRACT.
" ====================================================================
" SELECTION SCREEN
" ====================================================================
SELECT-OPTIONS: s_budat FOR sy-datum OBLIGATORY.
SELECT-OPTIONS: s_werks FOR mseg-werks.
PARAMETERS: p_fpath TYPE string DEFAULT '/usr/sap/trans/tmp/inventory_log.csv' OBLIGATORY.
" ====================================================================
" DATA STRUCTURES
" ====================================================================
TYPES: BEGIN OF ty_event_log,
InventoryBatchLot TYPE charg,
ActivityName TYPE string,
EventTime TYPE string,
MaterialNumber TYPE matnr,
UserName TYPE xubname,
MovementType TYPE bwart,
Plant TYPE werks_d,
StorageLocation TYPE lgort_d,
Quantity TYPE menge_d,
MovementReasonCode TYPE grund,
END OF ty_event_log.
DATA: lt_event_log TYPE TABLE OF ty_event_log.
" ====================================================================
" DATA SELECTION
" ====================================================================
START-OF-SELECTION.
SELECT
mseg~charg AS InventoryBatchLot,
'Goods Receipt Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart IN ('101', '103', '105', '501', '521', '561')
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
CASE mseg~shkzg
WHEN 'H' THEN 'Stock Posted to Quality Inspection'
WHEN 'S' THEN 'Quality Inspection Stock Released'
END AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart = '321' " For QI to Unrestricted
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Put-Away Transfer Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart = '311' AND mseg~shkzg = 'H' " Assume put-away is the credit side
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Internal Stock Transfer Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart IN ('301', '311', '313', '315')
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
CASE mseg~bwart
WHEN '343' THEN 'Stock Status Changed to Blocked'
WHEN '344' THEN 'Stock Status Changed to Unrestricted'
END AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart IN ('343', '344')
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Inventory Adjustment Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart IN ('701', '702', '711', '712')
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Goods Issue for Delivery Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart = '601'
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Goods Issue for Production Posted' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart = '261'
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Sales Return Received' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart IN ('651', '653')
UNION ALL
SELECT
mseg~charg AS InventoryBatchLot,
'Stock Scrapped' AS ActivityName,
CONCAT( mkpf~cpudt, mkpf~cputm ) AS EventTime,
mseg~matnr AS MaterialNumber,
mkpf~usnam AS UserName,
mseg~bwart AS MovementType,
mseg~werks AS Plant,
mseg~lgort AS StorageLocation,
mseg~menge AS Quantity,
mseg~grund AS MovementReasonCode
FROM mseg
JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND mkpf~mjahr = mseg~mjahr
WHERE mkpf~budat IN s_budat
AND mseg~werks IN s_werks
AND mseg~charg IS NOT NULL AND mseg~charg <> ''
AND mseg~bwart = '551'
UNION ALL
SELECT
ltap~charg AS InventoryBatchLot,
'Picking Initiated' AS ActivityName,
CONCAT( ltak~bdatu, ltak~bzeit ) AS EventTime,
ltap~matnr AS MaterialNumber,
ltak~bname AS UserName,
ltak~bwart AS MovementType,
ltap~werks AS Plant,
ltap~lgort AS StorageLocation,
ltap~nista AS Quantity,
'' AS MovementReasonCode
FROM ltap
JOIN ltak ON ltak~tanum = ltap~tanum
WHERE ltak~bdatu IN s_budat
AND ltap~werks IN s_werks
AND ltap~charg IS NOT NULL AND ltap~charg <> ''
UNION ALL
SELECT
SUBSTRING( cdhdr~objectid, 5, 18 ) AS InventoryBatchLot, " Object ID for BATCH is MATNR+WERKS+CHARG
'Batch Status Changed' AS ActivityName,
CONCAT( cdhdr~udate, cdhdr~utime ) AS EventTime,
SUBSTRING( cdhdr~objectid, 1, 4 ) AS MaterialNumber,
cdhdr~username AS UserName,
'' AS MovementType,
'' AS Plant,
'' AS StorageLocation,
0 AS Quantity,
'' AS MovementReasonCode
FROM cdhdr
JOIN cdpos ON cdpos~objectclas = cdhdr~objectclas
AND cdpos~objectid = cdhdr~objectid
AND cdpos~changenr = cdhdr~changenr
WHERE cdhdr~udate IN s_budat
AND cdhdr~objectclas = 'BATCH'
AND cdpos~tabname = 'MCH1'
AND cdpos~fname = 'ZUSTD'
INTO TABLE @lt_event_log.
" ====================================================================
" WRITE OUTPUT FILE
" ====================================================================
DATA: lv_string TYPE string.
DATA: lo_conv TYPE REF TO cl_abap_conv_out_ce.
lo_conv = cl_abap_conv_out_ce=>create( encoding = 'UTF-8' ).
OPEN DATASET p_fpath FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc <> 0.
MESSAGE 'Error opening file.' TYPE 'E'.
RETURN.
ENDIF.
" Write Header
lv_string = 'InventoryBatchLot,ActivityName,EventTime,MaterialNumber,UserName,MovementType,Plant,StorageLocation,Quantity,MovementReasonCode'.
TRANSFER lv_string TO p_fpath.
" Write Data
LOOP AT lt_event_log ASSIGNING FIELD-SYMBOL(<fs_log>).
CONCATENATE
<fs_log>-InventoryBatchLot
<fs_log>-ActivityName
<fs_log>-EventTime
<fs_log>-MaterialNumber
<fs_log>-UserName
<fs_log>-MovementType
<fs_log>-Plant
<fs_log>-StorageLocation
<fs_log>-Quantity
<fs_log>-MovementReasonCode
INTO lv_string
SEPARATED BY ','.
TRANSFER lv_string TO p_fpath.
ENDLOOP.
CLOSE DATASET p_fpath.
WRITE: 'Extraction complete. File written to:', p_fpath. 优化SAP S/4HANA库存管理
定位低效环节,将周期时间缩短30%,降低成本。
无需信用卡 • 几分钟即可完成设置