Правильный способ обновления таблицы сервера SQL с использованием внешнего интерфейса доступа
У меня есть интерфейс в доступе и серверная часть SQL Server 2008
одно из полей это номер счета и вот правила
это почтовый индекс типа 92111 плюс тире плюс номер.
поэтому первый будет 92111-1, второй 92111-2
это связано с тем, сколько клиентов у нас в почтовом индексе
Я хотел бы, чтобы этот почтовый индекс был автоматически сгенерирован. вот что мне нужно:
- пользователь вводит почтовый индекс
- У меня есть хранимая процедура, которая проверяет, существует ли уже этот почтовый индекс, чтобы увеличить его: если 92111-4 уже существует, то сделать его 92111-5.
Как правильно это сделать?
2 ответа
Я согласен с HansUp, что вы должны хранить ZIP и последовательность отдельно. Вы можете создать индексированное вычисляемое поле с именем AccountNumber, которое объединяет zip и последовательность.
Единственный способ сделать это - заблокировать таблицу, выбрав max(sequence) ... where ZIP = 12345
, вставив новую запись, затем разблокировав таблицу. Однако блокировка таблицы означает, что все остальные должны ждать, что сильно влияет на масштабируемость. Я не могу рекомендовать это, но у меня нет другого решения.
Если вы храните как почтовый индекс, так и порядковый номер клиента в одном поле номера счета, вам придется разделить их на части, чтобы выяснить следующий порядковый номер в данном почтовом индексе.
Должно быть проще хранить их в 2 полях:
zipcode sequence_num
92111 4
92111 5
Затем получите поле номера вашего счета с запросом, когда вам это нужно.
SELECT zipcode & "-" & sequence_num AS acct_num
FROM YourTable;
Затем, когда вам нужно определить следующий sequence_num, lngNextSequenceNum, в пределах данного почтового индекса, pZip:
lngNextSequenceNum = DMax("sequence_num", "YourTable", "zipcode = " & pZip) +1
Такой подход может хорошо работать для однопользовательского приложения. Если ваше приложение многопользовательское, вам нужно что-то более изысканное. Однако это требование существует независимо от того, храните ли вы "номер счета" в одном поле или разбиваете его на два поля.
См. Создание и использование гибких полей автонумерации для многопользовательского подхода.