比较Java中的两个表列值

时间:2016-01-21 13:49:20

标签: java sql algorithm maximo

我在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();

哪一个更好,更具成本效益?

还有其他建议吗?

2 个答案:

答案 0 :(得分:1)

自动化脚本编写和使用很有趣,但它们并不总是最适合工作的工具。在这种情况下,我会使用

  1. Escalation搜索TableA FINISHTIME > EXPECTEDTIME
  2. RelationshipDatabase Configuration TableATableBwonum = :wonum and siteid = :siteid Action
  3. 基于TableA的{​​{1}},使用标准表示法中的上述Relationship来设置TableB中的状态
  4. 这种方法相对于提出的方法的主要好处是可升级性和可支持性。可升级性,因为不涉及可以弃用的代码,并且因为所有配置都是可升级的,并且可支持性,因为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");
                        }
                }
        }
}