我在Maximo 7.5中有两个表。
表A:表A中的属性为WORKORDERNUM,EXPECTEDTIME和FINISHTIME。 表B:在表B中具有属性WORKNUM和STATUS。
我想做的是: 如果FINISHTIME>然后EXPECTEDTIME将表B中的STATUS更新为“NOTGOOD”,否则什么也不做。 我已经创建了一个CronTask,每隔五分钟就会运行一次。
现在我可以想到两种方法。
1。循环遍历所有表A.循环内部每次都为表B执行数据库查询。
以下是示例代码:
MboSetRemote TableA = mxs.getMboSet("TABLEA", ui);
MboSetRemote TableB = mxs.getMboSet("TABLEB", ui);
TableA.setWhere("FINISHTIME > EXPECTEDTIME");
TableA.reset();
TableB.setWhere("");
TableB.reset();
MboSet TableARow = null;
MboSet TableBRow = null;
//now it will give a list of entries. Which needs to be matched with Table B and values be updated in Table B STATUS.
while ((TableARow = TableA.getMbo(i)) != null)
{
int A = TableA.getString("WONUM");
while((TableBRow = TableB.getMbo(i)) != null)
int B = TableB.getString("WONUM");
if (A == B){
//set SATUS etc}
}
TableB.save();
TableA.save();
2. 循环遍历所有表A.循环内部执行每次比较表B的值。
MboSetRemote TableA = mxs.getMboSet("TABLEA", ui);
MboSetRemote TableB = mxs.getMboSet("TABLEB", ui);
TableA.setWhere("FINISHTIME > EXPECTEDTIME");
TableA.reset();
MboSet TableARow = null;
//now it will give a list of entries. Which needs to be matched with Table B and values be updated in Table B STATUS.
while ((TableARow = TableA.getMbo(i)) != null)
{
TableB.setWhere("WONUM= TABLEA.WONUM");
TableB.reset();
//set SATUS etc
TableB.save();
}
TableA.save();
哪一个更好,更具成本效益?
还有其他建议吗?
答案 0 :(得分:1)
自动化脚本编写和使用很有趣,但它们并不总是最适合工作的工具。在这种情况下,我会使用
Escalation
搜索TableA
FINISHTIME > EXPECTEDTIME
Relationship
中Database Configuration
TableA
从TableB
到wonum = :wonum and siteid = :siteid
Action
TableA
的{{1}},使用标准表示法中的上述Relationship
来设置TableB
中的状态这种方法相对于提出的方法的主要好处是可升级性和可支持性。可升级性,因为不涉及可以弃用的代码,并且因为所有配置都是可升级的,并且可支持性,因为IBM支持配置但不支持自定义。 (在自动化脚本的情况下,您支持编写它们的能力,但您的代码本身不支持。它与数据库配置中的关系相同。)
答案 1 :(得分:1)
这里最划算的事情不是每5分钟使用一次Crontask,而是在每次记录更改时执行检查。这会更有效率。
创建两个自定义字段类,每个字段对应一个日期字段,并附加到数据库配置中的字段。
EXPECTEDTIME上应该是这样的:
public class CustFldExpectedTime extends MboValueAdapter {
public CustFldExpectedTime(MboValue mbv) throws MXException {
super(mbv);
}
@Override
public void action() throws MXException, RemoteException {
super.action();
MboValue mv = getMboValue();
MboRemote mbo = mv.getMbo();
Date expectedTime = mv.getDate();
Date finishTime = mbo.getDate("FINISHTIME");
if(finishTime.after(expectedTime)) {
// first argument is the name of on-the-fly relationship
// second argument is the name of the table your relationship is pointing to
// third argument is the relationship where clause
MboSetRemote tableBSet = mbo.getMboSet("$TABLEB", "TABLEB", ":WORKORDERNUM = WORKNUM");
if(!tableBSet.isEmpty()) {
MboRemote tableB = tableBSet.getMbo(0);
tableB.setValue("STATUS", "NOTGOOD");
}
}
}
}