行操作For(x=1,x<=N Rows(dt),x++,
If(IsMissing(Column( dt, "Actual Finish Date_" )[x]),
Column( dt, "bouge pas" )[x] = Column( dt, "Operation Due Date_" )[x] - :Operation Start Date_ [x-1],
Column( dt, "bouge pas" )[x] = Column( dt, "Actual Finish Date_" )[x] - :Actual Execution Start Date_ [x]
);
);
您好,我的问题是我想在 for 的第一行中,将 x-1 行用于列:Operation Start Date_ 但此语法不起作用? 谢谢
高级统计建模实验设计质量和工艺工程回复:行操作如果第一行的实际完成日期为空,那么您的脚本将查找上一行,这将不起作用。您需要将此行替换为不引用前一行的内容:
:"bouge pas"n = :"Operation Due Date_"n - :Operation Start Date_[Row() - 1],
回复:行操作
例如,第 2, 3 4 行...结果是 6 天,而实际上应该是 1 天
回复:行操作For Each Row(dt,
If(Is Missing(:"Actual Finish Date_"n),
:"bouge pas"n = :"Operation Due Date_"n - :Operation Start Date_[Row() - 1],
"bouge pas"n = :"Actual Finish Date_"n - :Actual Execution Start Date_
);
)

它仍然不起作用,因为从第一行开始,我的列中就有空行:实际完成日期_,我不知道该怎么做
回复:行操作如果缺少第 1 行的“实际完成日期”值,则当前建议的脚本都不起作用。因此,这个问题需要处理。下面的代码,对原始 JSL 进行简单修改即可工作。
注意:我在原始版本的代码上犯了一个逻辑错误。我已经在下面更改了它。
For( x = 1, x <= N Rows( dt ), x++,
If( Is Missing( Column( dt, "Actual Finish Date_" )[x] ),
If( Row() > 1,
Column( dt, "bouge pas" )[x] = Column( dt, "Operation Due Date_" )[x] - :Operation Start Date_[x - 1],
Column( dt, "bouge pas" )[x] = 0; // Set the value if there is not an X-1 row (i.e. row 1)
),
Column( dt, "bouge pas" )[x] = Column( dt, "Actual Finish Date_" )[x] - :Actual Execution Start Date_[x]
);
);
回复:行操作如果您正在循环数据表的行(通常我会尝试避免它并使用公式或设置每个值),我建议使用 For Each Row() 而不是 For()。 如果没有示例数据,我猜测问题可能是您将得到 0 作为行号,这在 JMP 中无效(访问或评估 ':Operation Start Date_[ /*###*/x - 1]' 、 :Operation Start Date_[/*###*/x - 1] 时第 2 行的行号无效)
尝试手动设置 x 值并查看得到的结果,添加调试打印并查看日志
这是示例脚本,其中包含有关如何设置 bouge pas 列值的几个可选想法
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(3),
New Column("Actual Finish Date_", Numeric, "Continuous", Format("Best", 12), Set Values([1, 4, 6])),
New Column("Actual Execution Start Date_", Numeric, "Continuous", Format("Best", 12), Set Values([0, 2, 3])),
New Column("Operation Start Date_", Numeric, "Continuous", Format("Best", 12), Set Values([10, 21, 32])),
New Column("Operation Due Date_", Numeric, "Continuous", Format("Best", 12), Set Values([11, 22, 33])),
New Column("bouge pas", Numeric, "Continuous")
);
For(x = 1, x <= N Rows(dt), x++,
If(Is Missing(Column(dt, "Actual Finish Date_")[x]),
Column(dt, "bouge pas")[x] = Column(dt, "Operation Due Date_")[x] - :Operation Start Date_[x - 1],
Column(dt, "bouge pas")[x] = Column(dt, "Actual Finish Date_")[x] - :Actual Execution Start Date_[x]
);
);
/* better option in my opinion
For Each Row(dt,
If(Is Missing(:"Actual Finish Date_"n),
:"bouge pas"n = :"Operation Due Date_"n - :Operation Start Date_[Row() - 1],
"bouge pas"n = :"Actual Finish Date_"n - :Actual Execution Start Date_
);
);
*/
/* usually best option
Column(dt, "bouge pas") << Set Each Value(
If(Is Missing(:"Actual Finish Date_"n),
:"Operation Due Date_"n - :Operation Start Date_[Row() - 1],
:"Actual Finish Date_"n - :Actual Execution Start Date_
);
);
*/