Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: уникальный индекс не могу использовать что делать?
 
 автор: ludmil   (12.08.2009 в 22:42)   личное сообщение
 
 

все в производстве - уникальный индекс не поставить и чтобы дальше не повторялось эта чехарда как при вводе новой записи проверить по нескольким полям что данные уже есть? например, в таблице анкета это поля: фамилия, имя, отчество, дата рождения и в случае совпадения не вводить с выдачей соответствующего сообщения пользователю (vba) Хорошо бы пример.

  Ответить  
 
 автор: Lukas   (12.08.2009 в 22:45)   личное сообщение
 
 

Перед сохранением посчитать количество записей в таблице с фильтром по четырем полям.

  Ответить  
 
 автор: ludmil   (12.08.2009 в 22:57)   личное сообщение
 
 

спасибо! но увы не умею в vba - просматривать все- ужас.Наверное есть конструкция - но какая - подскажи. Может быть Dcount()/как правильно написать.

  Ответить  
 
 автор: Lukas   (12.08.2009 в 23:13)   личное сообщение
 
 

Как-то так:

Private Const SQLDATE As String = "\#mm\/dd\/yyyy\#"

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Dim strFilter As String
    strFilter = "Фамилия='" & Me!Фамилия & "' AND Имя='" & Me!Имя & "' AND Отчество='" & Me.Отчество & "' AND ДеньРождения=" & Format$(Me!ДеньРождения, SQLDATE)
    If DCount("*", "Сотрудники", strFilter) > 0 Then
        MsgBox "Такой уже имеется"
        Cancel = 1
    End If
End Sub

  Ответить  
 
 автор: ludmil   (13.08.2009 в 00:13)   личное сообщение
 
 

без использования даты все работает а при включении даты что-то не так Вот ваш код с моими изменениями
Private Const SQLDATE As String = "\#mm\/dd\/yyyy\#"

Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim strFilter As String
strFilter = "Фамилия='" & Me!фамилия & "' AND Имя='" & Me!имя & "' AND Отчество='" & Me.отчество & "' "

If DCount("*", "анкета", strFilter) > 0 Then
MsgBox "Такой уже имеется"
Cancel = 1
Else

Parent.[подчиненная форма список членов семьи].Requery
Parent.[подчиненная форма ДЕТЕЙ ЗАПРОС].Requery
End If

  Ответить  
 
 автор: ludmil   (13.08.2009 в 00:18)   личное сообщение
 
 

что-то с датой не так.Все остальное работает. В таблице она как краткий формат даты и вид dd.mm.yyyy Выдает ошибку синтаксиса.Убираю дату - все работает. Помогите исправить.

  Ответить  
 
 автор: ShadowOfSun   (13.08.2009 в 01:30)   личное сообщение
 
 

Проверь формат даты,
возможно прийдется конвертировать для совместимости
CStr([ТвояДата])-конвертирует в строку

  Ответить  
 
 автор: Гоблин   (12.08.2009 в 23:13)   личное сообщение
 
 

Во блин такую проблему я уже пытался решать. Таких примеров уже куча.
Спасибки за код.

  Ответить  
 
 автор: ShadowOfSun   (12.08.2009 в 23:23)   личное сообщение
 
 

Можно получить строку на каждого сотрудника
и ее сверять
Trim$(CStr([Фамилия])) & Trim$(CStr([Имя])) & Trim$(CStr([Отчество]))& Trim$(CStr([ДатаРождения]))

  Ответить  
 
 автор: Lukas   (12.08.2009 в 23:33)   личное сообщение
 
 

В таком случае:
1. Иванов Иван Иванович 01.01.1950
и
2. ИвановИ ванИ ванович 01.01.1950
будут давать одинаковые строки: "ИвановИванИванович01.01.1950", а
данные то в полях разные.
К тому-же, зачем лишние функции (16 штук) там, где и без них можно обойтись?

  Ответить  
 
 автор: ShadowOfSun   (12.08.2009 в 23:43)   личное сообщение
 
 

У нас товарисч работает по имени "Абу Валид"
и если с имени нечаянно поставить два пробела то его можно внести дважды
Предлагаю очень извратный способ: составной ключ

Но это жестоко
на самом деле есть уникальные данные
например
табельный номер, номер паспорта

  Ответить  
 
 автор: Гоблин   (13.08.2009 в 16:26)   личное сообщение
 
 

Спорить можно до уср.
Все сложно. Потому и выбрал метод отсева из списка. Ввод в разные поля что бы ошибок не было да по маске ввода, что бы на регистр не смотреть. Фамилия Инициалы ДатаРождения - уже фильтр хороший. Далее если список пуст, то стало быть нет товарища и его добавляем запросом. Если есть, то запрос не срабатывает. Ну и форма для работы с ним открывается.

Но это я так сделал. Видимо неподдерживается идея. А пользователям так очень понравлось.

ludmil, Лукас мне подобный код на запрос давал. Тоже поначалу с датой проблемка была. Адаптировал слегонцухи под себя. Вот получилось:
Private Sub ПолеСоСписком13_AfterUpdate()
Dim stDocName As String
Dim stLinkCriteria As String


Me![Список10].Requery
Me.Requery
If Me.Список10.ListCount = 0 Then
If MsgBox("Введенный: " & [ПолеСоСписком2] & " " & [ПолеСоСписком4] & " " & [Поле6] & " г.р." & " отсутствует в базе. Добавить?", vbOKCancel) = vbOK Then

Const SQLDATE As String = "\#mm\/dd\/yyyy\#"
strSQL = "INSERT INTO Пациенты ( Фамилия, Инициалы, ДатаРождения, Пол ) Values ('" & Me.ПолеСоСписком2 & "', '" & Me.ПолеСоСписком4 & "', " & Format$(Me.Поле6, SQLDATE) & ", '" & Me.ПолеСоСписком13 & "');"
CurrentDb.Execute strSQL
Response = acDataErrAdded
DoCmd.Close acForm, "Поиск ввод пациентов"

Ну и там дальше нагромождено. (Я не пограммер) но все работает блин как надо.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList