#c# #ms-access
#c# #ms-access
Вопрос:
Я создаю записи клиентов и хочу использовать настраиваемый идентификатор, основанный на годе и числе 1 последней строки данных в моей таблице Access DB.
Примером идентификатора может быть год и номер следующей свободной строки, в которую будут записаны новые данные.(если это новая таблица базы данных, то это будет 2019-0001)
Я разработал, как извлечь год из даты, но я не могу найти никакой информации для получения количества записей в таблице Access DB, любые указания, где найти информацию / код, были бы полезны.
Я использовал обычные методы CRUD для ввода данных, но я бы хотел, чтобы идентификатор клиента можно было фильтровать по годам (первые 4 цифры), чтобы его можно было использовать для создания системы поощрений типа бонуса за лояльность.
Комментарии:
1. Вам действительно нужно хранить идентификатор таким образом или просто отображать идентификатор таким образом? Я подозреваю, что
INTEGER
столбец для года иAUTOINCREMENT
столбец для числа были бы проще. Затем просто отформатируйте их по мере необходимости при их отображении.2. Поле autonumber увеличивается само по себе, и это лучшее, что можно использовать для этого, есть причина, по которой вы не хотите его использовать? Среди прочего, это предотвратит проблему одновременного сбора двух запросов и использования одного и того же количества строк. Вы можете использовать вычисляемое поле для форматирования автономера с датой.
3. Спасибо за быстрые ответы, но я пытаюсь избежать автоматического увеличения, потому что мне нужно выполнять объединения и т.д. Для отображения. Если я создам индекс с самого начала, это упростит поиск / отображение. Доступ к CustID создания базы данных будет разрешен только 1 пользователю, поэтому я не вижу проблемы с дублированием.
4. Поскольку эта таблица будет использоваться для записей за несколько лет, автоматическое увеличение может начинаться с первого элемента 2020 года как большого числа, что не имеет смысла, я хочу, чтобы оно начиналось с 1.
5. @MintedDave: В этом случае, я полагаю, вы бы создали идентификатор, выбрав из таблицы, добавив его и вставив в таблицу. Пока вы можете гарантировать, что это будет только однопользовательская система, чтобы избежать условий гонки, это должно сработать. Что вы пробовали и что не работает?
Ответ №1:
Я только что внедрил аналогичный идентификатор в одной из баз данных моей организации. Ключ в том, чтобы поддерживать два отдельных столбца, один для года и один для идентификатора. Вы также можете использовать эти два столбца в качестве первичного ключа для поддержания целостности, хотя я обнаружил, что проще использовать отдельный столбец autonumber в качестве первичного ключа.
Вы можете использовать запрос, подобный следующему, для последовательного добавления записей за каждый год. Он использует Nz
функцию для проверки наличия нулей (например, Нового года) и присваивает Id по умолчанию значение 0, а затем добавляет 1.
INSERT INTO YOUR_TABLE (Year, Id)
SELECT New_Year, New_Id
FROM (SELECT 2019 as New_Year, Nz(Max(Id),0) 1 as New_Id FROM YOUR_TABLE WHERE Year = 2019);
Вам нужно будет использовать Format
функцию в ваших запросах ВЫБОРА и формах / отчетах, чтобы отобразить ее в формате ####-####
, поскольку начальные нули не будут сохранены и не являются необходимыми в необработанных данных.
Ниже приведен пример запроса SELECT, который печатает составные идентификаторы
SELECT Format([Year],"0000") amp; "-" amp; Format([Id],"0000") AS Composite_Id
FROM YOUR_TABLE;
Комментарии:
1. Спасибо, я собирался сделать это таким образом, но хочу посмотреть, можно ли это сделать без жесткого кодирования поисковых запросов, которые придется менять каждый год. Текстовые идентификаторы казались более простыми в использовании и обновлении, чем использование составных идентификаторов. Я экспериментирую с привязанными данными, а не использую SQL.
Ответ №2:
Что ж, составные идентификаторы — это своего рода головная боль в Access…решение, которое я использовал на протяжении многих лет, заключается в том, чтобы использовать мой идентификатор в качестве автоматического номера / первичного ключа и создать составной ключ только для целей отображения. Одним из решений является создание таблицы, в которой хранятся все годы вместе с последней записью
2017 1232
2018 2122
2019 2001
, поэтому каждый раз, когда вы хотите добавить новую запись, вы считываете текущий год … если совпадает, вы считываете последнее значение…вы добавляете ее в составное ключевое поле, например 2019002001, и увеличиваете значение последней записи на 1
2019 2002
Ответ №3:
Я ценю всех тех, кто нашел время ответить на мой вопрос.
То, что я искал, было простой строкой (ами) кода C #, чтобы найти последнюю запись в таблице базы данных Access. SQL-запрос — это не проблема и не тот ответ, который я искал. (Зачем использовать хранимые процедуры в программе на C #, если вам это не нужно?)
Я решил сделать это в datasets вместо того, чтобы просто запрашивать таблицу Access DB для последней записи, чего я хотел избежать.