статус LOCKED записи

Обсуждение вопросов по разработке программ в среде продуктов копорации "Progress Software"
alemih
Новичок
Сообщения: 7
Зарегистрирован: 22 дек 2009, 15:43
Откуда: Латвия

статус LOCKED записи

Сообщение alemih » 29 окт 2019, 13:00

Добрый.
Наткнулся на ситуацию, и не понимаю, почему так происходит. Может кто-то уже встречался с подобным...
Имеем таблицу (это чисто для примера, т.к. реальная гораздо шире, да и записей в ней поболее):

Код: Выделить всё

TABLE test
  FIELD id  AS INTEGER
  FIELD cif AS CHARACTER
  FIELD sts AS INTEGER
  INDEX id IS PRIMARY UNIQUE id ASCENDING
  INDEX cif cif ASCENDING
В таблице 3 записи: {1, "11111", 0}, {2, "11111", 2}, {3, "22222", 2}
Открываем 2 сессии, и в одной пишем:

Код: Выделить всё

FIND test WHERE test.id = 1 EXCLUSIVE-LOCK.
READKEY.
а во второй следующий код:

Код: Выделить всё

DEFINE VARIABLE t_id  AS INTEGER INITIAL 1.
DEFINE VARIABLE t_cif AS CHARACTER INITIAL "11111".
DEFINE VARIABLE t_sts AS INTEGER INITIAL 2.

IF t_id > 0 THEN
    FIND test WHERE test.id = t_id EXCLUSIVE-LOCK NO-WAIT NO-ERROR.
ELSE
    FIND test WHERE (test.cif = t_cif) AND (test.sts = t_sts) EXCLUSIVE-LOCK NO-WAIT NO-ERROR.

IF LOCKED test THEN
    MESSAGE "LOCKED" VIEW-AS ALERT-BOX.
ELSE
    IF NOT AVAILABLE test THEN
        MESSAGE "NOT AVAILABLE" VIEW-AS ALERT-BOX.
    ELSE
        MESSAGE "AVAILABLE AND NOT LOCKED" VIEW-AS ALERT-BOX.
Запускаем код в первой сессии, и переходим во вторую. Поведение программы ожидаемо - "LOCKED", но стоит поменять t_id на 0, и для меня поведение программы становится непонятным - все равно выдает "LOCKED", хотя по исходным данным явно видно, что блокировать он должен запись с id=2.
В данном случае, если в ELSE FIND test поставить FIND LAST, то все отработает как и предполагается, но на 'боевой' таблице с множеством полей в условии FIND ни LAST ни FIRST не работают.
10.1B, Unix.