LEADERSOFT.ru Разработка на заказ программ и сайтов
Форумы по информационным технологиям
 
Регистрация  |  Вход
left
Форумы Минимизировать
ПоискСписок форумов
  Программирование  Microsoft Access. Файлы mdb и accdb  Контроль уникал...
 Контроль уникальности записи при вводе в форму
 
 17.07.2007 18:09:53
al hombre
7 сообщения


Контроль уникальности записи при вводе в форму
Привет всем !
Есть таблица вида : Получатель, Номер счета, Сумма
Как можно наладить контроль, чтобы в таблицу попадала только уникальная комбинация Получатель+Номер счета+ Сумма. Т.е. грубо говоря чтобы пользователь не внес в базу один счет 2 раза . Я использовал след. конструкцию :

Dim answ As Integer
Dim count As Integer
count = 0
answ = DCount("[Получатель]", "Заявки", "[Получатель]=Forms![Заявки]![Получатель]")
If answ > 0 Then count = count + 1
answ = DCount("[Номер]", "Заявки", "[Номер]=Forms![Заявки]![Номер]")
If answ > 0 Then count = count + 1
answ = DCount("[Сумма]", "Заявки", "[Сумма]=Forms![Заявки]![Сумма]")
If answ > 0 Then count = count + 1
If count >= 3 Then
MsgBox "Возможно, такая заявка уже есть в базе", vbCritical


End If

Но меня терзают смутные сомнения. Эта конструкция пока работает Но связку из трех значений она не проверяет . Подскажите плиз другие способы - создание индекса не подходит по определенным причинам. Интересует организация поиска по таблице по критерию состоящему из 3-х значений. Или плиз подскажите другие способы решения такой проблемы.
 17.07.2007 18:30:51
Admin1
731 сообщения
1-ый


[Faq\Индекс] Контроль уникальности записи при вводе в форму

Индекс в этом случае необходим. Если рассматривать задачу с точки зрения adp проекта, то таблица без индекса вообще не редактируется. Как назначить индекс(ы):

  • Первичный ключ - это индекс, т.е. счетчик. В дальнейшем это позволяет обращаться к записи из любой другой таблицы. Например, если по заказу был платеж, то достаточно в платежах указать ЗаказID = 234. Связь платежей с заказами обеспечена достаточно просто.
  • Вторичный ключ - это Дата (равна текущему вводу данных) и Номер Заявки (присваивается по порядку с начала года). Они дадут уникальную запись за любой период: год, месяц, день. Таким образом, данные повторяться не будут.
 18.07.2007 8:58:43
al hombre
7 сообщения


Re: [Faq\Индекс] Контроль уникальности записи при вводе в форму
Спасибо за ответ, но как я уже написал данное решение мне не подходит , поскольку в таком случае возникает проблема с копированием записей, хотя возможно я ошибаюсь. У меня копирование реализовано так :
Private Sub btnDubl_Click()

Dim r As DAO.Recordset 'èñïîëüçåì äëÿ äîñòóïà ê òàáëèöå çàêàçîâ
Dim id_NewZakaz As Long 'êîä ñîçäàííîé çàïèñè â òàáëèöå çàêàçîâ,
'äëÿ ïîñëåäóþùåãî ïåðåõîäà ê íåé â ôîðìå

If Nz(Me.ID_zav, 0) <> 0 Then 'Åñëè çàêàç ñóùåñòâóåò
If Me.Dirty Then Me.Refresh 'Ñîõðàíÿåì çàêàç ïåðåä êîïèðîâàíèåì, åñëè ýòî íåîáõîäèìî
Set r = CurrentDb.OpenRecordset("Çàÿâêè", DAO.dbOpenDynaset) '"Îòêðûâàåì" òàáëèöó Zakaz â ðåæèìå ðàçðåøàþùåì èçìåíåèÿ
r.AddNew 'Äîáàâëÿåì íîâóþ çàïèñü
r!Ïîëó÷àòåëü = Me.Ïîëó÷àòåëü 'Çàíîñèì Äàòó çàêàçà
r!Äîêóìåíò = Me.Äîêóìåíò
r!Íîìåð = Me.Íîìåð
r!Äàòà = Me.Äàòà
r!Ñóììà = Me.Ñóììà
r!Âàëþòà = Me.Âàëþòà
r!Íàçíà÷åíèå = Me.Íàçíà÷åíèå
r!Ñðîê_ïëàòåæà = Me.Ñðîê_ïëàòåæà
r!Íåäåëÿ_ïëàòåæà = Me.Íåäåëÿ_ïëàòåæà
r!Îïëà÷åíî = Me.Îïëà÷åíî
r!Äîëã = Me.Äîëã
r!ÖÔÎ = Me.ÖÔÎ
r!Ñòàòüÿ = Me.Ñòàòüÿ
r!Ðàçäåë = Me.Ðàçäåë
r!Ïðîåêò = Me.Ïðîåêò
r!Áàíê = Me.Áàíê
r!Ïðèìå÷àíèå = Me.Ïðèìå÷àíèå


r.Update 'Ñîõðàíÿåì ñäåëàííûå èçìåíåíèÿ

r.Bookmark = r.LastModified 'Ïåðåõîäèì ê äîáàâëåííîé âûøå çàïèñè
id_NewZakaz = r!ID_zav 'Çàïîìèíàåì åå êîä
r.Close 'Çàêðûâàåì òàáëèöó
Set r = Nothing ' Îñâîáîæäàåì ïåðåìåííóþ



Me.Requery 'Îáíîâëÿåì ôîðìó (äëÿ òîãî ÷òîáû ïîëó÷èòü äîñòóï ê âûøå äîáàâëåííûì çàïèñÿì)
Me.Filter = "ID_zav=" & id_NewZakaz 'Íàñòðàèâàåì ôèëüòð, äëÿ ïðîñìîòðà òîëüêî íîâîãî çàêàçà
Me.FilterOn = True 'Âêëþ÷àåì ôèëüòð (â ôîðìå äîëæåíà îòîáðàçèòñÿ êîïèÿ çàêàçà, íî ñ íîâûì íîìåðîì)
End If


End Sub

Блин, проблемы с кодировкой в коментах, но думаю суть понятна. Так вот при использовании индекса возникает ошибка при копировании записи :(. Может есть другой способ копировать ? Буду очень признателен, если мне его подскажут.
 18.07.2007 9:40:08
Admin1
731 сообщения
1-ый


Re: [Faq\Индекс] Контроль уникальности записи при вводе в форму

В данном случае, записи добавляются правильно через r.AddNew и r.Update. Главная проблема не в этом. В примере решается задача управления индексами, хотя она уже решена в JET и SQL Server достаточно хорошо.

  • Индекс не копируется, его значение должен рассчитать JET или SQL Server.
  • Для пакетной обработки записей используется sql запрос INSERT. В этом запросе можно указать значение счетчика. Для данного случая это не нужно.
  • После создания записи новое значение счетчика сохраняется в глобальной переменной @@identity. Для получения этого значения используется запрос SELECT @@identity. Пример дан в запросах: http://help.leadersoft.ru/Загрузка/tabid/75/Default.aspx
  • Альтернативным способом получения значения счетчика используется обычная операция сравнения, если открыт Recordset (r). Например, ID = id_NewZakaz (должно быть полем - счетчик). Команду нужно вставить до r.Update (DAO-Recordset) или после (ADO-Recordset).
  Программирование  Microsoft Access. Файлы mdb и accdb  Контроль уникал...
ПоискПоиск  Список форумовСписок форумов  
right