回复:公式冒号一个问题:为什么ENT4 包含从2500 开始的持续时间而ENT2 不包含从1749 开始的持续时间?
回复:列公式数据库出错,我更新了数据库!
谢谢你的评论。
回复:公式冒号您可以使用公式来执行此操作,但我会使用脚本来执行此操作。 下面是一个至少适用于您的示例数据的示例
Names Default To Here(1);
dt = Open("$DOWNLOADS/Test(1).jmp");
// get duration columns
dur_cols = Filter Each({col_name}, dt << Get Column Names("String", Continuous),
Starts With(col_name, "durée")
);
// for indexing later
num_colnr = Transform Each({col_name}, dur_cols, Output("Matrix"), Num(Word(-1, col_name)));
dt << New Column("DUREE TOT", Numeric, Continuous, << Set Each Value(
colidx = Loc(num_colnr > :T); // indices of num colums larger than :T value
If(N Items(colidx) > 0,
val = Sum(dt[Row(), dur_cols[colidx]]);
If(IsMissing(val),
0
,
val
);
,
0
)
));回复:列公式感谢你的回复。
我有一句话,在我看来,在您的代码中,您正在与列 T 的元素进行比较,但是我忘记指定 T 的值可以按任何顺序排列(不一定是递增),以便值操作按推进的升序排列。
例如 :
T = 690 / 运算 = 47
T = 550 / 运算 = 55
进度遵循操作顺序!
第二点,在我的数据库中,我有持续时间 T 的持续时间格式的数值,格式为“h:m:s”。
回复:公式冒号如果我理解正确,我的解决方案应该仍然有效。 它仅依赖于 :1500, :1749,... 列与 :duree 1500, :duree 1749,... 列的顺序相同的事实。 此外,即使 JMP 在现实中确实向您显示了格式清晰的持续时间值(我认为),它们仍然是秒(您可以通过将格式更改为最佳来检查这一点,例如从列设置中)。
回复:列公式我猜代码中有问题。
这里的问题在于“colidx”变量的赋值:我们不比较变量 T 的数字,而是比较与这些数字对应的操作(此处为黄色列)。
在上面的示例中,第一行是:
如果第一行“:1500”>第一行“:op”->添加持续时间1500
如果第一行“:1749”>第一行“:op”->添加持续时间1749如果第一行“:2100”>第一行“:op”->添加持续时间2100
如果第一行“:2500”>第一行“:op”->添加持续时间2500
并为每一行执行此操作...
回复:公式冒号所以改变
colidx = Loc(num_colnr > :T);
到
colidx = Loc(num_colnr > :"opé"n);
并对 Loc (使用特定的行而不是列名)和 num_colnr (不需要是数字)进行相应的更改
回复:列公式
感谢您的回答,我已经按照您的指示更改了“colidx”的分配。
但是,我看不出应该做哪些更改:“并对 Loc(使用特定的行名而不是列名)和 num_colnr(不需要数字)进行相应的更改。”
你能告诉我更多细节吗?
回复:列公式我使用此代码修改了 num_colnr 的值以选择以下所需的列:
SNames = dt << Get Column Names(String, "Nominal");
For(i=1, i <= N Items(Snames), i++,
sclmn = Column(Snames[i]);
显示(sclmn);
);
此代码允许我获取与数据库黄色部分对应的所有列。
但是,我似乎无法对“Loc”进行相应的更改。
回复:公式冒号Names Default To Here(1);
dt = Open("$DOWNLOADS/Test (1).jmp");
// get duration columns
dur_cols = Filter Each({col_name}, dt << Get Column Names("String", Continuous),
Starts With(col_name, "durée")
);
// for indexing later
num_colnr = Transform Each({col_name}, dur_cols, Word(-1, col_name));
dt << New Column("DUREE TOT", Numeric, Continuous, << Set Each Value(
colidx = Loc(dt[Row(), num_colnr] > :"opé"n);
If(N Items(colidx) > 0,
val = Sum(dt[Row(), dur_cols[colidx]]);
If(IsMissing(val),
0
,
val
);
,
0
)
));
数据表下标
回复:列公式在我的数据库中,我有 900 个不同的列(黄色列),这意味着数字“num_colnr”是一个包含许多数字的列表:

通过执行您与我共享的 JSL 脚本,我得到了这种类型的错误:

而上图的 num_colnr 是一个数字列表
回复:列公式并通过添加“Num”转换为数字:
num_colnr = Transform Each({col_name}, dur_cols, Num(Word(-1, col_name)));
show(num_colnr);我收到这种类型的错误:

回复:公式冒号您的数据表中是否有名为“711”的列? 我不理解该错误消息,因为它是法语的,我最好的猜测是它与此相同
Expecting a number or list of numbers at row 1 in access or evaluation of 'dt[ /*###*/Row(),num_colnr]', <BR />Bad Argument("1500"), dt[/*###*/Row(), num_colnr]
at line 14 in C:\Users\jarmo\Documents\Script.jsl
这可能意味着缺少名为“711”的列。
回复:列公式
是的,这是我的第一篇专栏(在所有黄色专栏中):
回复:公式冒号好吧,也许这表明这些列中的一列(或多列)丢失了,但并没有真正说明是哪一列。 所以也许我从 duree 列中获取那些的逻辑是不正确的
回复:列公式是的,你可能是对的,我会站在我这边。
感谢您的宝贵帮助!
列公式大家好,
我正在寻找针对数据库中的多个列构建公式。 这并不容易理解,我将用一个例子来解释我的目标:

灰色部分:
这里有 4 种不同类型的对象(ENT1、..、ENT4)。 每个对象都与一个进度号(T 列)相关联,这些数字链接到明确定义的操作。
黄色部分:
这些单元格显示每个对象将经历哪些“数字”,并将该数字与操作相关联。 当单元格为空时,这意味着该对象将不会进行此操作。
目标是:
- 将持续时间相加,知道该对象已取得进展(例如:ENT2 对象位于编号 1749,因此我们对它在 1500 之前所做的事情不感兴趣)
- 以 ENT2 对象为例,我们必须添加持续时间 2100 和持续时间 2500,因为这些是该对象必须经历的数字。
感谢您的帮助,
真挚地
自动化和脚本编写