Access 2007, вставка с MAX (IIf (IsNull)) завершается ошибкой только при первой записи второго поля на основе значения первого поля - PullRequest
0 голосов
/ 22 февраля 2019

Одно системное / нефункциональное требование для этого проекта заключается в том, что он должен быть в MS Access (не моя чашка чая уже много лет, а значит, и ржавый), а одно функциональное требование:

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

  2. Т.е. каждая категория проекта должна поддерживать последовательность автоматической нумерации:его собственные проекты, в этой таблице, такие как: (prjct_ctgry_id, ctgry_seq_id).Например: ((1,1), (1,2), (1,3), (2,1), (3,1), (3,2), (5,1), (5,2), (5,3) ...).

  3. Запрос 'передает' prjct_ctgry_id от пользователя через форму.

  4. Запрос затем проверяет, является ли это первой записью этогоprjct_ctgry_id, проверяя, является ли порядковый номер NULL;если true, он должен добавить int 1 в качестве первого ctgry_seq_id.Последующие порядковые нумерации используют MAX порядкового номера конкретной категории проекта и добавляют 1.

Проблема с самой первой записью новой категории проекта.Запрос вставляет project_category_id, ОК, но не заполняет поле category_seq_id (т. Е. Оно остается пустым).

Вторая вставка той же категории проекта работает, как и должна, но заполняет поле ctgry_seq_id 1;тогда все остальные вставки работают правильно.Итак, 1-я запись: (1, NULL);вторая запись (1,1);третья запись (1,2) и т. д.

Т.е.: сбой происходит только при первой записи каждой новой категории проекта.

Я пробовал несколько решений, но никто не работал для меня,использование «простого» SQL (не SQL в VBA).

Любые советы будут приветствоваться.Заранее спасибо.Вот запрос с жестко запрограммированным для моего тестирования project_category_id = 1:

INSERT INTO p_ctgry_seq ( prjct_ctgry_id, ctgry_seq_id )

SELECT pc.prjct_ctgry_id, 

(SELECT MAX(IIf( IsNull( ctgry_seq_id ),

  ( SELECT COUNT( ctgry_seq_id )+ 1  FROM p_ctgry_seq WHERE prjct_ctgry_id=1 ), 

  ( ctgry_seq_id ) + 1 ))

   FROM p_ctgry_seq

   WHERE prjct_ctgry_id = 1 ) AS sqnc

FROM project_ctgry AS pc

GROUP BY pc.prjct_ctgry_id

HAVING (((pc.prjct_ctgry_id)=1));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...