Как создать добавочный номер элемента в BOPF - PullRequest
0 голосов
/ 26 марта 2020

Я создал пользовательскую таблицу для хранения причин для изменения объекта. Я делаю PO C с BOPF, чтобы учиться, даже если это не имеет смысла использовать его здесь.

Вот как выглядит (упрощенно) постоянная структура:

define type zobject_modifications {
  object_id       : zobject_id;
  @EndUserText.label : 'Modification Number'
  mod_num         : abap.numc(4);
  reason_id       : zreason_id;
  @EndUserText.label : 'Modification Comments'
  comments        : abap.string(256);
}

Альтернативный ключ состоит из object_id + mod_num . mod_num должен быть автоматически сгенерированным счетчиком, всегда добавляя 1 к последней модификации для object_id.

Я создал определение before_save для его генерации, проверяя MAX mod_num из BO базы данных и из текущих экземпляров BO и увеличение на 1.

Но когда я пытаюсь создать 2 BO для одного и того же объекта в одной транзакции, я получаю ошибку из-за дублированного альтернативного ключа, поскольку поле MOD_NUM все еще является начальным, а before_save будет вызвано позже. Я попытался изменить определение на «После изменения», но у меня все та же проблема.

Вопрос в том, когда и как мне создать следующий MOD_NUM, чтобы иметь возможность создавать несколько узлов для одного и того же идентификатора объекта. безопасно?

Это должно быть очень распространенной проблемой, поэтому должен быть лучший способ сделать это, но я не смог ее найти.

1 Ответ

0 голосов
/ 27 марта 2020

Используйте диапазон номеров для создания последовательных идентификаторов. Они гарантируют, что вы не получите дубликаты, если есть текущие и параллельные транзакции.

Если вы хотите настаивать на определении следующего идентификатора самостоятельно, используйте входной параметр io_read определения для получения Самый большой mod_num:

База данных содержит только те узлы, которые уже были зафиксированы. Но ваши новые узлы еще не зафиксированы, поэтому вы их не получите.

io_read, напротив, обращается к временному буферу BOPF, который также содержит узлы, которые вы только что создали, следовательно, видя более актуальные данные.

...