|
|
|
| Добрый день, многоуважаемые Гуру 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
|
Вот почему он, собака, текст сравнивать (по образцу текста отбирать) не хочет ну никак? Всё, что касается цифр (КодГруппы) - делает, а вот как Материал, Примечание - так тупит. Если так, как написано - ошибка, если добавляю кавычки одинарные
- то тогда неправильно считает (игнорирует поля "Материал" и "Примечание"). Если двойные кавычки добавляю - та же фигня.
Я так понял - я не могу правильно условие отбора по текстовым полям написать в строке SQL.
Подскажите кто-нибудь, как правильно?
Заранее благодарен. | |
|
| |
|
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
ЗЫ Дублирование записей можно исключить на уровне таблицы с помощью уникального ключа (см.вложение) | |
|
| |
|
|
|
|
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
|
| |
|
| |
|
|
|
| Спасибо - уже разобрался.
как всё-таки много значит такая, вроде, пустяковина как пробел....
(в данном случае в знаниях ).
| |
|
| |
|
|
|
|
Делаю так: на Form_AfterInsert вешаю код, для проверки:
| А почему вы выбрали событие Form_AfterInsert? Во-первых запись дублирующим значением уже добавлена, во-вторых ничто не помешает вам отредактировать и сохранить существующую запись как дубль.
Я бы использовал Form_BeforeUpdate
PS. Т.е. одноименный товар с другим кодом и/или в другой группе вас устраивает? | |
|
| |
|
|
|
| Анатолий, спасибо за отклик.
От Вас (и не только) всегда приятно получать дельные советы.
Здесь - на самом деле уже сам разобрался. Всё работает.
И то, что надо проверку вешать на BeforeUpdate - тоже уже "дотумкал" (изначально, кстати, так и начинал делать - только вот запись хотел, если уже есть - удалять полностью (запросом "Delete..." - просто не знаю, как иначе, хотя и понимаю, что это не совсем правильно), а BeforeUpdate - ругался на меня за это ...)
Одноименный товар - ну так чтож. Ведь "Лист" может быть и асбеста , и алюминия, и шифера и т.д. (в данном случае Асбест, Алюминий... - группа, "Лист" - товар, а в "примечании" - параметр (к примеру "10мм"). | |
|
| |
|
|
|
| if DCount("[ГруппаМатериала] & [НазваниеМатериала] & [Примечание]", "[Материалы]", "([ГруппаМатериала] & [НазваниеМатериала] & [Примечание])='" & GroupName & MatCode & Prim & "'")>0 then
бла бла бла
end if | |
|
| |
|
|
|
| Вот чесслово снип опередил. Именно так частенько и применяю. Только если =0, то запрос на добавление, если не 0, то msgbox ("Уже есть") Там жеж и условия ставить можно
if dcount("поле", "Таблица", "поле='"уловие"'")=0... ну и сложение полей соответственно. Типа одно сочетание с другим...
Правда у меня вместо формы всегда список в этом случае стоит, а поля ввода где-нить рядом..Но там масса вариантов. | |
|
| |