Сравните два значения столбца таблицы в Java

У меня есть две таблицы в Maximo 7.5.

Таблица A: имеет атрибуты WORKORDERNUM, EXPECTEDTIME и FINISHTIME в таблице A. Таблица B: имеет атрибуты WORKNUM и STATUS в таблице B.

Что я хочу сделать, так это: если FINISHTIME> EXPECTEDTIME, тогда обновите STATUS в таблице B как «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. Внутри цикла каждый раз выполняйте Compare the values ​​for Table 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();

Какой из них лучше и экономичнее?

Любые другие предложения?


person AhmedRana    schedule 21.01.2016    source источник
comment
Ахмед Рана, если вас устраивает какой-либо из ответов, отметьте его как правильный.   -  person neuromouse    schedule 13.02.2016


Ответы (2)


Сценарии автоматизации интересно писать и использовать, но они не всегда являются лучшим инструментом для работы. В этом случае я бы использовал

  1. Escalation для поиска TableA для FINISHTIME > EXPECTEDTIME
  2. Relationship в Database Configuration от TableA до TableB, где wonum = :wonum and siteid = :siteid
  3. Action на основе TableA, который использует вышеуказанное Relationship в стандартной нотации для установки статуса в TableB

Основными преимуществами этого подхода по сравнению с представленными являются возможность обновления и поддержки. Возможность обновления, так как не используется код, который может быть объявлен устаревшим, и поскольку все конфигурации могут быть обновлены, а также возможность поддержки, поскольку IBM поддерживает конфигурации, но не настройки. (В случае сценариев автоматизации ваша способность писать их поддерживается, но сам код — нет. То же самое и с отношениями в конфигурации базы данных.)

person Preacher    schedule 25.01.2016

Наиболее экономически выгодным здесь будет не использовать Crontask каждые 5 минут, а выполнять проверку только при изменении каждой записи. Это было бы намного эффективнее.

Создайте два настраиваемых класса полей, по одному для каждого из полей даты, и прикрепите их к полям в конфигурации базы данных.

Один на 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");
                        }
                }
        }
}
person neuromouse    schedule 06.02.2016