SELECT D~PROJN, D~AUFNR, D~MATNR, D~PGMNG, C~OBJID, C~ARBPL, F~VGW01 * D~PGMNG AS VGW01, F~VGW02 * D~PGMNG AS VGW02, F~VGW03 * D~PGMNG AS VGW03, SUM( G~ISM01 ) AS ISM01, SUM( G~ISM02 ) AS ISM02, SUM( G~ISM03 ) AS ISM03, MAKT~MAKTX, ( F~VGW01 * D~PGMNG - SUM( G~ISM01 ) ) AS CY1, ( F~VGW02 * D~PGMNG - SUM( G~ISM02 ) ) AS CY2, ( F~VGW03 * D~PGMNG - SUM( G~ISM03 ) ) AS CY3 FROM AFKO AS A INNER JOIN AFVC AS B ON A~AUFPL = B~AUFPL INNER JOIN CRHD AS C ON B~ARBID = C~OBJID INNER JOIN AFPO AS D ON A~AUFNR = D~AUFNR LEFT JOIN MAPL AS E ON D~MATNR = E~MATNR AND E~WERKS = ‘CN11’ LEFT JOIN PLPO AS F ON E~PLNNR = F~PLNNR AND C~OBJID = F~ARBID LEFT JOIN AFRU AS G ON D~AUFNR = G~AUFNR AND C~OBJID = G~ARBID AND G~STOKZ <> ‘X’ AND G~STZHL <> ‘1’ LEFT JOIN MAKT ON MAKT~MATNR = D~MATNR AND MAKT~SPRAS = @SY-LANGU WHERE D~AUFNR IN @S_AUFNR AND D~PROJN IN @S_PROJN GROUP BY D~PROJN, D~AUFNR, D~MATNR, D~PGMNG, C~OBJID, C~ARBPL, F~VGW01, F~VGW02, F~VGW03, MAKT~MAKTX INTO CORRESPONDING FIELDS OF TABLE @GT_OUT.这段代码加些注释
时间: 2025-06-09 22:52:02 浏览: 16
<think>好的,我需要为用户提供的这段ABAP SQL代码添加注释。首先,我要理解这段代码的结构和各个部分的作用。
首先,代码是一个SELECT语句,从多个表中提取数据,并聚合到内表GT_OUT中。用户可能希望了解每个字段的来源以及连接条件,还有各个计算字段的含义。我需要逐步解析每个JOIN的条件,以及字段的计算方式。
接下来,观察FROM子句中的各个表:AFKO、AFVC、CRHD、AFPO、MAPL、PLPO、AFRU、MAKT。这些都是SAP的PP模块常用表,比如AFKO是订单头数据,AFVC是工艺路线中的工序,CRHD是工作中心,AFPO是生产订单项,MAPL和PLPO与工艺路线相关,AFRU是生产确认,MAKT是物料描述。
然后,分析每个JOIN的条件。例如,AFKO和AFVC通过AUFPL连接,AFVC和CRHD通过ARBID连接,这可能对应工序和工作中心的关系。左连接MAPL和PLPO可能用于获取工艺路线中的参数,比如标准工时。左连接AFRU可能用于获取实际确认的工时或数量。
计算字段部分,比如F~VGW01 * D~PGMNG,这可能表示计划工时乘以订单数量,得到总计划工时。SUM(G~ISM01)可能是实际工时,CY1到CY3则是计划与实际差异。
在注释时,需要解释每个字段的意义,以及JOIN的逻辑。同时,GROUP BY的分组字段需要说明,为什么选择这些字段作为分组依据。还要注意WHERE条件中的变量,比如S_AUFNR和S_PROJN,说明这是用户输入的订单和项目范围。
最后,确保注释清晰,帮助用户理解这段代码的业务逻辑,比如生产订单的工时计算、差异分析等。可能需要指出哪些是计划值,哪些是实际值,以及差异的计算方式。同时,注意LEFT JOIN的使用,说明可能存在空值的情况,比如未维护工艺路线或未确认工单的情况。</think>以下是为这段ABAP SQL代码添加的中文注释(关键部分用$\textcolor{red}{红色高亮}$标出):
```abap
"$\textcolor{red}{【数据查询】}$ 从多个表中获取生产订单相关数据
SELECT
"$\textcolor{red}{【选择字段】}$ 项目编号/订单号/物料号/订单数量
D~PROJN, D~AUFNR, D~MATNR, D~PGMNG,
"$\textcolor{red}{【工作中心】}$ 对象ID/工作中心
C~OBJID, C~ARBPL,
"$\textcolor{red}{【计划工时计算】}$ 标准工时 × 订单数量
F~VGW01 * D~PGMNG AS VGW01, " 工时类型1总计划
F~VGW02 * D~PGMNG AS VGW02, " 工时类型2总计划
F~VGW03 * D~PGMNG AS VGW03, " 工时类型3总计划
"$\textcolor{red}{【实际工时汇总】}$
SUM( G~ISM01 ) AS ISM01, " 工时类型1实际总和
SUM( G~ISM02 ) AS ISM02, " 工时类型2实际总和
SUM( G~ISM03 ) AS ISM03, " 工时类型3实际总和
"$\textcolor{red}{【物料描述】}$ 根据系统语言获取
MAKT~MAKTX,
"$\textcolor{red}{【差异计算】}$ 计划值 - 实际值
( F~VGW01 * D~PGMNG - SUM( G~ISM01 ) ) AS CY1,
( F~VGW02 * D~PGMNG - SUM( G~ISM02 ) ) AS CY2,
( F~VGW03 * D~PGMNG - SUM( G~ISM03 ) ) AS CY3
"$\textcolor{red}{【表连接】}$
FROM AFKO AS A " 订单主数据
INNER JOIN AFVC AS B ON A~AUFPL = B~AUFPL " 通过计划号连接工序
INNER JOIN CRHD AS C ON B~ARBID = C~OBJID " 连接工作中心
INNER JOIN AFPO AS D ON A~AUFNR = D~AUFNR " 连接订单明细
LEFT JOIN MAPL AS E ON D~MATNR = E~MATNR " 左连接物料工艺路线
AND E~WERKS = 'CN11' " 限定工厂
LEFT JOIN PLPO AS F ON E~PLNNR = F~PLNNR " 左连接工艺路线参数
AND C~OBJID = F~ARBID " 按工作中心关联
LEFT JOIN AFRU AS G ON D~AUFNR = G~AUFNR " 左连接生产确认
AND C~OBJID = G~ARBID " 按工作中心关联
AND G~STOKZ <> 'X' " 排除删除标记
AND G~STZHL <> '1' " 排除首确认
LEFT JOIN MAKT ON MAKT~MATNR = D~MATNR " 左连接物料描述
AND MAKT~SPRAS = @SY-LANGU " 使用当前系统语言
"$\textcolor{red}{【筛选条件】}$
WHERE D~AUFNR IN @S_AUFNR " 订单号范围
AND D~PROJN IN @S_PROJN " 项目编号范围
"$\textcolor{red}{【分组聚合】}$ 按业务维度分组
GROUP BY D~PROJN, D~AUFNR, D~MATNR, D~PGMNG,
C~OBJID, C~ARBPL, F~VGW01, F~VGW02, F~VGW03,
MAKT~MAKTX
"$\textcolor{red}{【结果输出】}$ 写入目标内表
INTO CORRESPONDING FIELDS OF TABLE @GT_OUT.
```
**代码逻辑说明**:
1. **目的**:计算生产订单的$\textcolor{red}{计划工时}$与$\textcolor{red}{实际工时}$差异
2. **关键处理**:
- 通过$\textcolor{red}{工艺路线}$获取标准工时(VGW01/VGW02/VGW03)
- 使用$\textcolor{red}{订单数量}$计算总计划工时
- 从$\textcolor{red}{生产确认}$(AFRU)汇总实际工时
- 计算$\textcolor{red}{计划与实际差异}$(CY1/CY2/CY3)
3. **特殊处理**:
- 使用$\textcolor{red}{LEFT JOIN}$处理可能缺失的工艺路线数据
- 排除已删除(STOKZ ≠ 'X')和非首次确认(STZHL ≠ '1')的记录
4. **输出结果**:包含项目/订单/物料信息、工时数据及差异分析的结构化数据
阅读全文
相关推荐



















