Получить дату последнего изменения файла AS400 DDS в Java

Здравствуйте, я работаю с Java, подключаясь к IBM AS400.

Я хочу прочитать метку времени последнего изменения файла DDS, например. метка времени последней операции SQL (INSERT INTO MyLib/MyDDS VALUES (...)).

В терминале 5250 я могу перейти к «работе с объектами» и открыть метаданные, выбрав опцию 5 (=показать) или просто DSPFD FILE(MyLib/MyDDS). Есть метка времени.

Другой способ — запустить dspjrn jrn(MyLib/MyJournal) для проверки журнала и его временных меток.

Как я могу получить доступ к временным меткам из Java, например. используя JTOpen или SQL?

Спасибо :)


person KeKru    schedule 05.11.2015    source источник
comment
Для файла базы данных вам нужно смотреть на дату изменения члена, а не на дату изменения объекта или дату последнего использования объекта. Работа с объектами неточно показывает дату последнего обновления данных. Вам нужно будет посмотреть информацию об участниках с помощью DSPFD. (WRKOBJ часто показывает правильную дату, но только по совпадению, когда это так.) Пока ответы могут быть неуместными.   -  person user2338816    schedule 06.11.2015
comment
Ok. Я только что попробовал, и да, он ведет себя так, как вы сказали. DSPDF показывает правильную дату, а WRKOBJ — нет. WRKOBJ имеет право Last-Used-At, но только день, а не отметку времени   -  person KeKru    schedule 06.11.2015
comment
И имейте в виду, что LastUsed для объекта не означает, что данные любого члена когда-либо читались или записывались. Простого запуска OPNDBF достаточно, чтобы запустить LastUsed без каких-либо операций ввода-вывода.   -  person user2338816    schedule 06.11.2015
comment
Простейшим CL может быть rtvmbrd mylib/myfile chgdate( &chgDate ) с включенным любым подходящим именем элемента, если это файл с несколькими элементами. Мне придется поискать любой подходящий эквивалент JTOpen.   -  person user2338816    schedule 06.11.2015
comment
RTVMBRD недоступен в моей системе... но через несколько дней я попробую на своем новом тестовом AS400. В JTOpen он мог работать с CommandResult result = CommandConnection.getConnection("host", "user", "pass").execute("rtvmbrd mylib/myfile chgdate( &chgDate )"); (из библиотеки JTOpenlite)   -  person KeKru    schedule 06.11.2015
comment
RTVMBRD — собственная команда, и она должна существовать всегда. Я бы этого не ожидал, но власти могут ограничить доступ. Хотя это не JT400, возможно, другие знают класс, у которого есть родственный метод.   -  person user2338816    schedule 08.11.2015
comment
См. com.ibm.as400.access.MemberDescription. поле CHANGE_DATE_AND_TIME.   -  person user2338816    schedule 09.11.2015
comment
Спасибо, это работает с com.ibm.as400.access.MemberDescription и полем CHANGE_DATE_AND_TIME :)   -  person KeKru    schedule 12.11.2015


Ответы (5)


Особенно для Java

JT400 (и JTOpen) предоставляет классы и методы, которые взаимодействуют с системными API, такими как QUSRMBRD, и возвращают значения, используемые функциями Java.

Информацию об изменениях данных участников (и других атрибутов) см. в разделе . com.ibm.as400.access.MemberDescription CHANGE_DATE_AND_TIME.

Общие

Собственные физические файлы (PF) могут допускать несколько элементов данных, которые можно обновлять по отдельности. Элементы по сути являются отдельными объектами (типа объекта *MBR) от файлов (типа *FILE), которые их содержат. IFS представляет файлы базы данных как «контейнеры», то есть как если бы они были каталогами. Члены представлены так же, как потоковые файлы в каталоге, и изменения в содержимом отдельных элементов отслеживаются каждым членом, поскольку содержащие файловые объекты имеют только одну дату «изменения».

RTVMBRD — собственная команда, и она должна существовать всегда. Я бы этого не ожидал, но власти могут ограничить доступ. Именно так CL обычно получает даты изменения данных. В качестве альтернативы можно использовать API Получить описание члена (QUSRMBRD) может использоваться любым языком для получения сведений об участниках.

person user2338816    schedule 12.11.2015
comment
У меня работает :) AS400 as = new AS400(...); MemberDescription od = new MemberDescription (as, YOURLIB, FILENAME, FILENAME); Дата lastChangeDate = (Date)od.getValue(MemberDescription.CHANGE_DATE_AND_TIME); - person KeKru; 12.11.2015

SYSTABLESTAT, похоже, имеет информацию, которую вы ищете.

SELECT LAST_USED_TIMESTAMP
FROM QSYS2/SYSTABLESTAT
WHERE TABLE_SCHEMA = 'MyLib' AND TABLE_NAME = 'MyDDS'
person James Allman    schedule 05.11.2015
comment
Спасибо, но по какой-то причине в моей тестовой системе нет SYSTABLESTAT в QSYS или QSYS2. Через несколько дней попробую на новой тестовой системе. - person KeKru; 06.11.2015
comment
systablestat — это имя таблицы, которое прекрасно работает. также lastchg - это то, что вы хотите использовать в последний раз, это только дата. - person danny117; 09.11.2015
comment
@KeKru Какая у тебя версия ОС? Я вижу, что SYSTABLESTAT вернулся как минимум к 5.4, но я не вижу никаких ссылок в Центре знаний 5.3 (хотя это не значит, что его не существует). Другое дело, что у вас нет прав доступа к этому каталогу. По умолчанию *PUBLIC имеет права на это, но ваш администратор мог удалить эти права. - person Kevin Adler; 19.11.2015
comment
@Kevin Adler Я работаю над бесплатным общедоступным AS400 на pub1.de в целях тестирования, пока не получу доступ к сервер заказчика. Да, я думаю, что на этот общедоступный AS400 наложено много ограничений. - person KeKru; 20.11.2015

Вы можете использовать объект ObjectDescription, чтобы получить последнее изменение. Дата.

AS400 as400 = new AS400();
ObjectDescription od = new ObjectDescription(as400, "YOURLIB", "FILENAME", "FILE");

Date lastChangeDate = (Date)od.getValue(ObjectDescription.CHANGE_DATE);

Изменить: использовать MemberDescription и MemberDescription.CHANGE_DATE_AND_TIME

person David G    schedule 05.11.2015
comment
спасибо, но он возвращает только старую дату (думаю, это последнее изменение определения данных), но не отметку времени последнего обновления данных (вставить в...) - person KeKru; 06.11.2015
comment
Странно, прежде чем я опубликовал ответ, я провел тест, взяв старую таблицу, изменив запись, а затем запустив этот код ... дата, которую он вернул, была всего за несколько минут до этого. - person David G; 06.11.2015
comment
Из определения связанного класса: Примечание. Этот класс не предназначен для использования с элементами файла базы данных (тип *MBR). Чтобы получить атрибуты членов файла, используйте MemberDescription. В целом, обновление данных члена не должно обновлять объект CHANGE_DATE. (Это не в моих системах.) - person user2338816; 09.11.2015
comment
Работает с MemberDescription :) AS400 as = new AS400(...); MemberDescription od = new MemberDescription (as, YOURLIB, FILENAME, FILENAME); Дата lastChangeDate = (Date)od.getValue(MemberDescription.CHANGE_DATE_AND_TIME); - person KeKru; 12.11.2015

Используйте это в своем запросе...

SELECT LAST_USED_TIMESTAMP
FROM QSYS2/SYSTSTAT
WHERE (TABLE_SCHEMA, TABLE_NAME) = ('MyLib', 'MyDDS')
person Jairo R. Flores    schedule 07.11.2015
comment
У меня не работает, SYSTSTAT или SYSSTAT недоступны в моей (очень странной ^^) системе - person KeKru; 12.11.2015

Использование QSYS2/SYSTSTAT или QSYS2/SYSTABLESTAT будет медленнее, так как используются файлы соединения. Чтобы добиться этого с хорошей производительностью, используйте

SELECT DBXATS
   FROM QSYS/QADBXREF
WHERE (DBXLIB = 'MyLib' and DBXFIL = 'MyDDS')
person Ahsan Habib    schedule 08.11.2018