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

Форум: MS ACCESS

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

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

 
 

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

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

тема: Проверка дублирования записей(String)
 
 автор: Olegza   (21.03.2012 в 15:05)   личное сообщение
 
 

Добрый день, многоуважаемые Гуру Accessa.
Проблема такова - не могу правильно собрать в ReordSet-е строку SQL для проверки вводимой записи на предмет поиска аналогичной, (занесенной ранее). Пытаюсь уберечься от дублей.
Есть форма "Материалы".
В ней поля: "КодМатериала"; "КодГруппы"; "Материал"; "Примечание"
Делаю так: на Form_AfterInsert вешаю код, для проверки:
MatCode = Me.КодМатериала
MatName = Me.НазваниеМатериала
GroupName = Me.НазваниеГруппы
Prim = Me.Примечание
    StrSQL = "SELECT Материалы.ГруппаМатериала, Материалы.НазваниеМатериала, Материалы.Примечание FROM Материалы WHERE (((Материалы.ГруппаМатериала)=" & GroupName & ") AND ((Материалы.НазваниеМатериала) = " & MatCode & ") AND ((Материалы.Примечание) = " & Prim & "));"
Set rst = CurrentDb.OpenRecordset(StrSQL) 
    If rst.EOF = False And rst.BOF = False Then
    Set rst = Nothing
        MsgBox "Тра-ля-ля"
    End If

Вот почему он, собака, текст сравнивать (по образцу текста отбирать) не хочет ну никак? Всё, что касается цифр (КодГруппы) - делает, а вот как Материал, Примечание - так тупит. Если так, как написано - ошибка, если добавляю кавычки одинарные
)
= '" & MatCode & "')

- то тогда неправильно считает (игнорирует поля "Материал" и "Примечание"). Если двойные кавычки добавляю - та же фигня.
Я так понял - я не могу правильно условие отбора по текстовым полям написать в строке SQL.
Подскажите кто-нибудь, как правильно?
Заранее благодарен.

  Ответить  
 
 автор: Дядя Федор   (21.03.2012 в 15:48)   личное сообщение
41 Кб.
 
 

MatCode = Me.КодМатериала 'это число
MatName = Me.НазваниеМатериала 'это строка
GroupName = Me.НазваниеГруппы 'это строка
Prim = Me.Примечание
'SQL Изменена Материалы.НазваниеМатериала) =' " & MatName & " '
StrSQL = "SELECT Материалы.ГруппаМатериала, Материалы.НазваниеМатериала, Материалы.Примечание_
FROM Материалы WHERE (((Материалы.ГруппаМатериала)=' " & GroupName & " ') AND ((Материалы.НазваниеМатериала) =' " & MatName & " ') AND _
((Материалы.Примечание) =' " & Prim & " '));"
'ГДЕ ЗДЕСЬ должен применяться MatCode?
Set rst = CurrentDb.OpenRecordset(StrSQL)
If rst.EOF = False And rst.BOF = False Then
Set rst = Nothing
MsgBox "Тра-ля-ля"
End If



ЗЫ Дублирование записей можно исключить на уровне таблицы с помощью уникального ключа (см.вложение)

  Ответить  
 
 автор: shanemac51   (21.03.2012 в 15:58)   личное сообщение
 
 


s1=""
s1=s1 & " SELECT Материалы.ГруппаМатериала,
s1=s1 & "  Материалы.НазваниеМатериала,
s1=s1 & "  Материалы.Примечание 
s1=s1 & " FROM Материалы
s1=s1 & "  WHERE ( ((Материалы.ГруппаМатериала)=' " & GroupName & " ')
s1=s1 & "  AND ((Материалы.НазваниеМатериала) =' " & MatName & " ')
s1=s1 & "  AND ((Материалы.Примечание) ='" & Prim & "'));"
StrSQL = s1


кавычка+пробел перед prim 

  Ответить  
 
 автор: OlegZa   (22.03.2012 в 19:40)   личное сообщение
 
 

Спасибо - уже разобрался.
как всё-таки много значит такая, вроде, пустяковина как пробел....
(в данном случае в знаниях ).

  Ответить  
 
 автор: Анатолий (Киев)   (22.03.2012 в 20:03)   личное сообщение
 
 


Делаю так: на Form_AfterInsert вешаю код, для проверки:

А почему вы выбрали событие Form_AfterInsert? Во-первых запись дублирующим значением уже добавлена, во-вторых ничто не помешает вам отредактировать и сохранить существующую запись как дубль.
Я бы использовал Form_BeforeUpdate

PS. Т.е. одноименный товар с другим кодом и/или в другой группе вас устраивает?

  Ответить  
 
 автор: OlegZa   (23.03.2012 в 07:45)   личное сообщение
 
 

Анатолий, спасибо за отклик.
От Вас (и не только) всегда приятно получать дельные советы.
Здесь - на самом деле уже сам разобрался. Всё работает.
И то, что надо проверку вешать на BeforeUpdate - тоже уже "дотумкал" (изначально, кстати, так и начинал делать - только вот запись хотел, если уже есть - удалять полностью (запросом "Delete..." - просто не знаю, как иначе, хотя и понимаю, что это не совсем правильно), а BeforeUpdate - ругался на меня за это ...)
Одноименный товар - ну так чтож. Ведь "Лист" может быть и асбеста , и алюминия, и шифера и т.д. (в данном случае Асбест, Алюминий... - группа, "Лист" - товар, а в "примечании" - параметр (к примеру "10мм").

  Ответить  
 
 автор: snipe   (23.03.2012 в 11:36)   личное сообщение
 
 

if DCount("[ГруппаМатериала] & [НазваниеМатериала] & [Примечание]", "[Материалы]", "([ГруппаМатериала] & [НазваниеМатериала] & [Примечание])='" & GroupName & MatCode & Prim & "'")>0 then
бла бла бла
end if

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

Вот чесслово снип опередил. Именно так частенько и применяю. Только если =0, то запрос на добавление, если не 0, то msgbox ("Уже есть") Там жеж и условия ставить можно
if dcount("поле", "Таблица", "поле='"уловие"'")=0... ну и сложение полей соответственно. Типа одно сочетание с другим...
Правда у меня вместо формы всегда список в этом случае стоит, а поля ввода где-нить рядом..Но там масса вариантов.

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