日期大家好,
我有一个这样的数据库(这是这里的摘要):

该数据库来自迄今为止运行良好的脚本,但是最后一列将允许计算与其他列不同的最后持续时间。
最后一列中的值表示对应于对象的 OP。
例如,对于第一行:值 60 对应于对象 2041,我们需要一个公式,允许每行持续时间 2041 = 结束日期 2041 - 开始日期 2041,依此类推。
当该值等于 0 时,我们可以将值 0 分配给持续时间 2041。
等等..
我从下面的脚本开始:
Names Default To Here(1);
dt = current data table();
If( !Is Missing(:"valeur ST1-2"n),
For Each Row(
idx = dt[row(), :"valeur ST1-2"n]
dt[idx, durée[idx]] = dt[idx, date fin[idx]] - dt[idx, date début[idx]];
),
0
);
数据存取回复:日期这是我用来完成你想要的事情的脚本。
Names Default To Here( 1 );
dt = Current Data Table();
// Set the display format to a JMP Duration format
:"valeur ST1-2"n << format("hr:m:s");
// Loop through the rows and assign the new values
For Each Row(
If( :"valeur ST1-2"n != 0,
:"valeur ST1-2"n = :Date fin 2041 -
:Date début 2041,
:"valeur ST1-2"n = 0
)
);回复:日期- 如何知道值 60 对应于 2041,值 82 对应于 2000?valeur ST1-2 值为 68 会做什么?
- 提供的示例数据表没有 2000 年日期的列。
- 如果决定使用哪些列的规则是可辨别的,或者如果提供了 ST1-2 值的列表以及用于不同值的列。
回复:日期此处数据库已缩小,但对于列 ST1-2 中的每个值,值列可以在 OP 值和每个对象之间建立链接(在缩小的数据库中,这些是列 711-2041-9916)。
值 60 对应于 2041,因为在第一行中:

每行如此…… 对于对应于 2000 的 82,这只是又一个示例,但这意味着在第二行上,列 2000 将由值 82 填充。
回复:日期感谢你的回复 !
这适用于第一行,但“ST1-2 值”列中的值会发生变化,因此随后必须重新计算的持续时间不同。
例如,对于第 3 行:ST1-2 值 = 82 并且 82 对应于对象 2000,因此我们应该为第 3 行设置持续时间 2000 = 结束日期 2000 - 开始日期 2000
这是在中间数据库中概述 OP 与每个对象的分配的目的(相应 OP 内的列 711-2041-9916)。
目标是替换持续时间列,“ST1-2 值”列不会被修改。
我的脚本无法正常工作:
Names Default To Here(1);
dt14 = current data table();
dur_cols = Filter Each( {col_name}, dt14 << Get Column Names( "String", Continuous ),
Starts With( col_name, "Durée" )
);
fin_cols = Filter Each( {col_name}, dt14 << Get Column Names( "String", Continuous ),
Starts With( col_name, "Date fin" )
);
debut_cols = Filter Each( {col_name}, dt14 << Get Column Names( "String", Continuous ),
Starts With( col_name, "Date d" )
);
// for indexing later
num_colnr = Transform Each( {col_name}, dur_cols, Word( -1, col_name ) );
// Loop through the rows and assign the new values
For Each Row(
If( :"valeurs ST1-2"n != 0,
colidx = Loc(dt14[row(), num_colnr ] == :"valeurs ST1-2"n);
If( N items (colidx) > 0,
dt14[colidx,dur_cols] = Eval(dt14[colidx,fin_cols] - dt14[colidx,debut_cols]);
,
continue()
);
,
continue()
);
//show(colidx);
);
回复:日期我认为下面的脚本可以满足您的需求,或者至少接近您想要的
Names Default To Here( 1 );
dt14 = Current Data Table();
Lookup = Filter Each( {col_name}, dt14 << Get Column Names( "String", Continuous ),
Num( col_name ) > 0
);
dtArray = dt14 << Stack(
invisible,
columns( Lookup ),
Source Label Column( "theKeys" ),
Stacked Data Column( "valeur ST1-2" ),
Drop All Other Columns( 1 ),
Output Table( "Untitled 45.jmp" )
);
dtArray << delete rows( dtArray << get rows where( Is Missing( :"valeur ST1-2"n ) ) );
theLookup = Associative Array(
dtArray:"valeur ST1-2"n << get values,
dtArray:theKeys << get values
);
Close( dtArray, nosave );
// Loop through the rows and assign the new values
For Each Row(
row = Row();
If( :"valeur ST1-2"n != 0,
lookup = theLookup[:"valeur ST1-2"n];
If( :"valeur ST1-2"n == As Column( lookup ),
As Column( "Durée " || theLookup[:"valeur ST1-2"n] ) =
Num(
As Column( "Date fin " || theLookup[:"valeur ST1-2"n] )
-As Column( "Date début " || theLookup[:"valeur ST1-2"n] )
);
Continue();
);
,
Continue()
);
);回复:日期感谢你的回复 !
这似乎适用于前两行,但是当 ST1-2 值更改时会出现错误。
我们注意到,对于第 4 行,持续时间 2231 为零,而结束日期 2231 - 开始日期 2231 应该存在差异(因为在第 4 行,ST1-2 值的值为 82,并且 82 对应于对象 2231)。

这是我收到的错误消息:

也许在表“TheLookup”中存在不一致,因为对象可以分配给不同的OP。
例如下面的例子:我们看到对于“theKeys”= 2041,值“ST1-2 value”等于“60”和“47”

回复:日期为了确定键,将所有名为 2041、711、2231 的列放在一起,并创建一个关联数组,当在列值 ST1-2 中找到数字 60 时,它将在关联数组中查找并返回 2241。如果输入 47,它也会返回 2241。如果找到 82,则返回 2231。我假设在 2041、711、2231 等列中找到的数字具有可以在 valeur ST1-2 中找到的各种数字。
如果您可以附上您正在使用的示例数据表,我将尝试找出您所看到的问题。