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

Форум: MS ACCESS

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

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

 
 

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

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

тема: Присвоить null
 
 автор: Гоблин   (18.11.2012 в 17:08)   личное сообщение
 
 

Вот ведь хрень. Решил одну проблему, вляпался в другую. Не очень неприятно, но все же подскажите механизм.

Есть справочная таблица, данные из которой появляются в полесосписком на форме. Эти данные используются в запросе на добавление в другую таблицу, с которой справочная табла связана 1-много по данному полю. Ну все работает. Запрос типа

CurrentDb.Execute "insert into [табла 2] (Поле 1) values ('" & Me.ПолеСоСписком1 & "')"

Так вот если в этом полесосписком выбраны данные, то проблем нет. Но стоит эти данные не ввести, а такое блин к сожалению бывает, надо оставить пустым, то запрос не работает и все тут. Не добавляет просто напросто. Приходится писать так

CurrentDb.Execute "insert into [табла 2] (Поле 1) values (null)"

Если бы такое поле было одно, то и черт бы с ним, а когда их 10 и данные могут быть неизвестно в какие поля введены, то... в сто вариантах я не могу предвидеть что там кто будет...
Начал эксперименты. Чего только не делал

nz(me.Полесосписком1,null) и переменным присваивал значения подготовленных полей заранее. Ничего Либо пиши null либо '"& me.Полесосписком1 &"' А писать '"& null &"' или как переменная, сначала присвоить s=me.Полесосписком1 а после вставить эту s тоже не получается. Синтаксис блин.

Может есть что-то еще. Dlookap или еще что-нибудь. Что применить??

  Ответить  
 
 автор: Гоблин   (18.11.2012 в 18:24)   личное сообщение
 
 

Вообще проще, легче и удобнее не париться, а ввести в справочную таблу "нет данных" и по умолчанию в каждом полесосписком это значение иметь. Все. Нежели мудохаться с этими синтаксисами и хрен знает чем, что без объяснений просто работать не хочет.

  Ответить  
 
 автор: snipe   (18.11.2012 в 19:56)   личное сообщение
 
 

)))))
если список поля со списком конечен и добавление не предполагается то можно воспользоваться запросом на объединение

предположим таблица списка для поля со списком имеет 3 поля
Id, значение, Поле для отображения
имя этой таблицы Таблица1

задача первого запроса вытащить одну запись и подсунуть свои (левые) поля с нужными значениями и к этому запросу уже присоединить имеющуюся таблицу
обрати внимание что "все значения" начинается с пробела - это для того что бы в списке это значение отображалось первым (ну там зависит от сортировки конечно)

Select null as "значение1", " Все значения" as "поле для отображения1"
from Таблица1
Where Таблица1.Id=1
union all
Select Таблица1.[значение], Таблица1.[поле для отображения]
from Таблица1

значение по умолчанию ставишь в зависимости от того какой столбик присоединен (null или " Все значения")

ну и когда значение Null есть - то потом его отлавливаешь и нужные запросы переписываешь так как тебе нужно

  Ответить  
 
 автор: snipe   (18.11.2012 в 20:08)   личное сообщение
 
 

далее

if nz(Me.ПолеСоСписком1,"")="" then
CurrentDb.Execute "insert into [табла 2] (Поле 1) values (null)"
else
CurrentDb.Execute "insert into [табла 2] (Поле 1) values ('" & Me.ПолеСоСписком1 & "')"
end if

  Ответить  
 
 автор: Гоблин   (20.11.2012 в 19:49)   личное сообщение
 
 

Запрос на объединение... Что-то в этом есть. Проблема в том, что полей со списком может быть 2-3 и более. Если оно одно, то да, так и работает как написано. А если их 2, то уже надо учесть, что может быть не быть данных в первом, а во втором могут быть, или во втором есть, а в первом нет, или... Ну и так далее. Уже 4 уловия IF
А если таковых полей 10, то это уже не катит.

  Ответить  
 
 автор: akkorn   (19.11.2012 в 09:30)   личное сообщение
 
 

Не знаю, корректна ли моя точка зрения. Но раз известно конечное кол-во полей, тогда форировать две переменные непосредственно перед добавлением строки.
Первая переменная- куда, вторая- что.

function getstringadd() as string
dim into as string, val as string, separate as string, i as string

i = trim(me.полесосписком1)
if i <> "" then
into = into & separate & "[поле1]"
val = val & separate & chr(34) & i & chr(34)
separate = ", "
end if

i = trim(me.полесосписком2)
if i <> "" then
into = into & separate & "[поле2]"
val = val & separate & chr(34) & i & chr(34)
separate = ", "
end if

i = trim(me.полесосписком3)
if i <> "" then
into = into & separate & "[поле3]"
val = val & separate & chr(34) & i & chr(34)
separate = ", "
end if

i = trim(me.полесосписком4)
if i <> "" then
into = into & separate & "[поле4]"
val = val & separate & chr(34) & i & chr(34)
separate = ", "
end if

i = trim(me.полесосписком5)
if i <> "" then
into = into & separate & "[поле5]"
val = val & separate & chr(34) & i & chr(34)
separate = ", "
end if

i = trim(me.полесосписком6)
if i <> "" then
into = into & separate & "[поле6]"
val = val & separate & chr(34) & i & chr(34)
separate = ", "
end if

i = trim(me.полесосписком7)
if i <> "" then
into = into & separate & "[поле7]"
val = val & separate & chr(34) & i & chr(34)
separate = ", "
end if

i = trim(me.полесосписком8)
if i <> "" then
into = into & separate & "[поле8]"
val = val & separate & chr(34) & i & chr(34)
separate = ", "
end if

i = trim(me.полесосписком9)
if i <> "" then
into = into & separate & "[поле9]"
val = val & separate & chr(34) & i & chr(34)
separate = ", "
end if

i = trim(me.полесосписком10)
if i <> "" then
into = into & separate & "[поле10]"
val = val & separate & chr(34) & i & chr(34)
separate = ", "
end if

if separate <> "" then
getstringadd = "insert into [табла 2] (" & into & ") valuse (" & val & ");"
end if
end function



По идее можно организовать это все в цикле, но подразумеваю, что поля в БД не обязательно отличаются тока циферками (это здесь, в примере, они значатся как Поле1, Поле2... В БД могут быть совсем другие имена). Соответственно наиболее наглядно (шопп не путать себя самого) именно так, хоть и длиньше получается.

Ну и вынести это все в ф-цию. Ф-ция возвратит строку. Если не пустая, тадысь так:
dim i as string
i=getstringadd
if i <>"" then
CurrentDb.Execute i
else
.....
end if

  Ответить  
 
 автор: Гоблин   (20.11.2012 в 20:08)   личное сообщение
 
 

Блин. Охренеть. Мехназим сбора строки запроса на добавление с учетом наличия подготавливаемых данных для ввода. Весьма интересная хрень, но беда в том, что если в подготавливаемом полесосписком ничего нет, то нужно в запросе на добавление в данном месте указать null А если просто игнорить это поле и не ставить ничего, то запрос на добавление не работает просто напросто.
Т.е. Если i="" то ничего не будет в запросе. Ну так и не будет добавления. А присвоить переменной i значение null без кавычек и прочего не получается.

Хотя данную штуку опробую. А вдруг заработает.

  Ответить  
 
 автор: akkorn   (19.11.2012 в 09:39)   личное сообщение
 
 

Про NULL совершенно верно- синтаксис. Либо NULL четко, либо значение, вплоть до ПУСТО (не null). Либо-либо. По этому наиболее безболезненней мона именно ф-цией.
А вот на случай заранее неизвестного кол-ва полей необходимо уже крутить... Но тожа ф-ция получится, правда с переменным кол-вом переменных уже (можно рассмотреть как массив так и variant- набор переменных).

В общем- удачки

to snipe:
Интересный подход, но, согласитесь:
- Происхождение значений в списках нам еще не известно (т.к. это БД то вероятнее всего это результат выборок, но он м.б. настолько сложным шо писец...)
(например, тока оплаченные заказы за последние полгода, при условии отсутствии отгрузки продукции в долг, и что это предприятие в "белом"списке компании и что.. и что.... )

  Ответить  
 
 автор: snipe   (19.11.2012 в 10:12)   личное сообщение
 
 

Тут главное принцип
а сколько там будет условий на выборку уже не важно
все эти условия можно прописать в отдельном запросе
ну или в запросе на объединение
о том что запросы могут быть очень сложными - даже не сомневаюсь
о том что происхождение в списках не известно - согласен для этого и существует второй запрос в объединении (что бы как-раз и получить список значений)

  Ответить  
 
 автор: akkorn   (19.11.2012 в 12:53)   личное сообщение
 
 

Ваша правда

  Ответить  
 
 автор: Анатолий (Киев)   (19.11.2012 в 12:43)   личное сообщение
 
 

insert into ... values ... - очень нежный запрос. Кроме проблемы с null есть еще формат даты, десятичный разделитель в числах и необходимость дублирования кавычек/апострофов внутри текстовых значений.
Проще и надежнее открыть Recordset и добавить значение туда. К тому же сразу можно получить значение ключа-счетчика добавленной записи.

  Ответить  
 
 автор: akkorn   (19.11.2012 в 12:52)   личное сообщение
 
 

Полностью согласен!

  Ответить  
 
 автор: Гоблин   (20.11.2012 в 20:15)   личное сообщение
 
 

Вот уж верно. Нежный зараза.
Рекордсет.. Значение ключа счетчика не очень интересно, хотя может и пригодиться. А вот как добавлять рекордсетом что-то не допру. Потому и занимаюсь сексом с нежностью.

Это что-то recordsetAdd(...
Назначить переменную через dao, потом...
А можно примерчик синтаксиса начиная с самого начала цикла на 2-3 поля.?? Обязательно освою эту технику.

  Ответить  
 
 автор: Анатолий (Киев)   (21.11.2012 в 11:38)   личное сообщение
 
 

With CurrentDb.Open Recordset("табла 2", dbOpenDynaset, dbAppendOnly)
.AddNew
![Поле 1] = Me!ПолеСоСписком1
![Поле 2] = Me!Поле2
.Update
'Если нужно получить значение счетчика добавленной записи:
.Bookmark = .LastModified
ID = ![Счетчик]
End With

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