Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
Якорь
Member

Откуда:
Сообщений: 10
Всем добра!
Прошу помощи общественности. Ситуация типичная для форума - есть я, который полный ноль в access, и есть база на нем, доставшаяся "в наследство" вместе с парком техники. Учитывая мое незнание, не смог грамотно сформулировать даже контекст для поиска, потому и создаю тему. Может, кто-то аккуратно пошлет в нужном направлении :)
База - самописная на MS Access 2003 кем-то в ходе изучения. Не убивается на предприятии, ибо в ней уже много всего. После активных доработок разработчиком допиливалась по необходимости моими предшественниками. Несколько раз, судя по словам предыдущего товарища, рекавилась.
Собственно, сама история началась с жалобы старшего менеджера на то, невозможно внести ассортимент. "Вот только вчера было можно, а сегодня - уже нет". Анализ бекапов показал, что "вчера" было более трех месяцев назад, еще до моего прихода. Работало "это" следующим образом: старший менеджер тыкал одну из двух кнопок "Муж." или "Жен.", вызывался соответствующий запрос ("Ассортимент муж" или "ассортимент жен") и потом - соответствующая форма (так же "муж." или "жен.", хотя, фактически, форма одинаковая и обращается к одной таблице). После заполнения полей в форме (в табличном виде) обновление базы происходило, но в поле "тип" соответствующей записи "муж." или "жен." уже не попадало (это поле в форме не показывается).
Запросы типовые: из таблицы "ассортимент" читает все поля, при этом поле "тип" не показывает (птица "показывать" снята), но по нему стоит фильтр, а по полю "код материала" читает свойства материала (название и характеристики) из таблицы "материалы". Два одинаковых запроса с разным фильтром.
Я попытался использовать структуру "Ме", но, видимо, она оказалась хитрее - прикрутить не смог. Итогом моих усилий стало добавление в обработку нажатия кнопки следующей строки:
CurrentDb.TableDefs(EditDBName).Fields(EditFieldName).DefaultValue = "Муж." для одной кнопки и "Жен." для другой. И, конечно, предварительно задание переменных.
Костыль ужасный, но в условиях "надо быстро" вполне себя оправдал.
Осталось опасение, что если кто-то полезет помогать старшему менеджеру, то будет неприятный конфликт.
Новым толчком стало желание менеджера "список большой, хочу еще две кнопки" - теперь должно быть четыре критерия: "Обувь муж.", "Обувь жен.", "Одежда муж.", "Одежда жен." В принципе, нарисовать пару кнопок и скопировать костыль еще и на них - я могу. Но, во-первых, не дает покоя мысль о том, что форма получает, по сути, выборку из одной таблицы с параметром, а потому делать четыре одинаковых запроса и четыре формы - неумно. Во-вторых, если уж что-то допиливать, то так, чтобы не было мучительно стыдно за результат. Ну, и в-третьих, не исключаю, что будут (возможно, не мне) задачи на кнопки "обувь дети" и "одежда дети" или обувь/одежда мальч/дев. Хочется унифицировать процесс.
Вызов запроса по нажатию кнопки, как я понимаю, стандартный - DoCmd.OpenForm stDocName, , , stLinkCriteria
Как я понимаю, для выборки из таблицы мне будет достаточно в stDocName указать имя формы и задать stLinkCriteria - тогда не нужно будет запроса в целом и понадобится только одна форма. Но как при добавлении данных в форме сделать, чтобы в поле "тип" записывалась строка, переданная через stLinkCriteria? Вернее, не вся строка, а именно параметр?

Заранее благодарен!
30 май 19, 16:24    [21897831]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
Панург
Member

Откуда: настоящему индейцу завсегда везде ништяк
Сообщений: 4366
всегда напрягало "многабуквов" не по делу...
чо там?
30 май 19, 16:55    [21897867]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 6260
Панург
...чо там?
Больше чем уверен что в базе "черт ногу сломит" т.к.ей занимался не один "рационализатор"-поэтому выложить её не прошу.А на вопрос типа:как добавить в таблицу запись? Вам ответят.Сформулируйте кратко и конкретно вопрос.
30 май 19, 17:58    [21897922]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
Якорь
Member

Откуда:
Сообщений: 10
sdku
Больше чем уверен что в базе "черт ногу сломит" т.к.ей занимался не один "рационализатор"-поэтому выложить её не прошу.

Именно так. Ну, и кроме того - размер. Ибо там склад и куча всякого прочего.
sdku
А на вопрос типа:как добавить в таблицу запись? Вам ответят.Сформулируйте кратко и конкретно вопрос.

Не добавить запись, в том и дело. Нужна как оценка со стороны - имеет ли смысл копать в сторону одной формы на N кнопок, на которые можно повесить запрос с параметром (как я это вижу) вместо N запросов плюс N форм. И, во-вторых, реализация. Как записать этот параметр, который должен быть фильтром отбора, в конкретное поле таблицы при добавлении записи? Сами записи пишутся, с ними проблемы нет. Проблемное именно поле отбора, невидимое в форме, заполнение которого я реализовал через CurrentDb.TableDefs(EditDBName).Fields(EditFieldName).DefaultValue То есть, менеджер нажал кнопку "Жен." - открылась форма с отбором по "Жен.", внес новое значение - и это "Жен." тоже должно записаться в поле "тип" новой записи. В моем случае оно записывается, поскольку для новых записей значение поля устанавливается по умолчанию при нажатии на кнопку. Но это неправильно, костыль. Реализовано было как-то иначе, угадывать - смысла нет. Но хочу сделать нормально. А перевести в термины access не могу, не владею, получается многословно.
30 май 19, 18:27    [21897935]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
Predeclared
Member

Откуда: And God I know I'm one
Сообщений: 908
Якорь
... Но как при добавлении данных в форме сделать, чтобы в поле "тип" записывалась строка, переданная через stLinkCriteria? Вернее, не вся строка, а именно параметр?...

Можно пользуйте НЕ аргумент stLinkCriteria,
а аргумент OpenArgs,
которым передавать значение "тип".
В описании процедуры обработки события "Open" формы:
1. присваивать дефолтное значение соответствующему контролу формы, переданное аргументом OpenArgs,
2. присваивать значение свойству RecordSource формы, с учетом значения переданного/пропущенного аргумента OpenArgs.

Есть более изящные решения, но этот вариант, полагаю, будет Вам по скилам.
30 май 19, 18:36    [21897941]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
alecko
Member

Откуда: Башкирия
Сообщений: 551
CurrentDb.TableDefs(EditDBName).Fields(EditFieldName).DefaultValue = "Муж."
это Вы в форме применяли?таким костылем и убиться можно!
по делу -
открыли Вы форму общим запросом
изменяйте в форме фильтр кнопками
Me.filteron=true
Me.filter=EditFieldName & "=Муж."
' потом когда нужно детский ставите 
Me.filter=EditFieldName & "=детский"

и т.д.-это
если в форме все это происходит, но сдается мне что если субформа, в которой оный ассортимент и вызывается, потому Me и не прикручивается.
30 май 19, 20:16    [21897983]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 6260
Якорь,
разместите на форме combo с источником
SELECT Name, Type FROM MSysObjects WHERE Name Not Like "~*" AND Type=5 
и после его обновления открывайте тот запрос,который выберите,а в запросе сошлитесь на поле формы, в которое вводите критерий
(учитывайте что критерии для разных запросов могут быть разные и примите меры к тому что записи должны содержать значения которые есть в соответствующем поле. Короче-как обеспечить правильность отбора решайте сами. Я в этом сообщении хотел сказать что в скрытой таблице MSysObjects есть имена всех пользовательских объектов. Запросы имеют Type-5)
30 май 19, 20:46    [21897999]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
Якорь
Member

Откуда:
Сообщений: 10
Спасибо большое, но именно с учетом скилла даже с этим проблема -
Predeclared
1. присваивать дефолтное значение соответствующему контролу формы, переданное аргументом OpenArgs,
Есть более изящные решения, но этот вариант, полагаю, будет Вам по скилам.

В самой форме нет этого контрола. В запросе на выборку это поле invisible (вывод на экран - птицы нет), в конструкторе запроса следующее:
Поле                 Название  Модель  Цвет  Материал  Плотность    Тип
Видимость Да Да Да Да Да Нет
Условие отбора "Муж."
Материал и его плотность тянутся из другой таблицы по ключу "Код материала".

При обновлении в таблицу записываются значения "Название", "модель", "код материала". А поле "тип" не пишется.

PS Получилось записать, если изменить в запросе видимость и добавить столбец с данными "тип" и с указанием значения по умолчанию (строковая константа). Видимость столбцу поставил "нет". Это адекватное решение? Если я значение этого поля по умолчанию исправлю на Forms.OpenArgs, будет ли это отличаться от
Predeclared
В описании процедуры обработки события "Open" формы присваивать дефолтное значение соответствующему контролу формы
31 май 19, 10:35    [21898318]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
Якорь
Member

Откуда:
Сообщений: 10
Всем большое человеческое спасибо за помощь!
alecko
CurrentDb.TableDefs(EditDBName).Fields(EditFieldName).DefaultValue = "Муж."
это Вы в форме применяли?таким костылем и убиться можно!

Безусловно, можно. Хотя при моих ограничениях и работало, но... очевидно, что надо переделывать, а кроме меня - некому. Вот и приходится выставлять свое незнание на обозрение.
alecko
по делу -
открыли Вы форму общим запросом
изменяйте в форме фильтр кнопками
Me.filteron=true
Me.filter=EditFieldName & "=Муж."
' потом когда нужно детский ставите 
Me.filter=EditFieldName & "=детский"

и т.д.-это
если в форме все это происходит, но сдается мне что если субформа, в которой оный ассортимент и вызывается, потому Me и не прикручивается.

Я думаю, оно не прикручивается из-за моей безграмотности в MS Access :) Только у меня основная проблема с записью данных (значения фильтра в конкретное поле каждой добавляемой записи), а не фильтрацией.

sdku
Якорь,
разместите на форме combo с источником
SELECT Name, Type FROM MSysObjects WHERE Name Not Like "~*" AND Type=5 
и после его обновления открывайте тот запрос,который выберите,а в запросе сошлитесь на поле формы, в которое вводите критерий

Идея интересная, но пока не для моего уровня... хотя смысл я понял. Попробую в качестве "улучшайзинга" прикрутить в другое место этой базы...
31 май 19, 10:57    [21898355]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4599
Якорь
Вызов запроса по нажатию кнопки, как я понимаю, стандартный - DoCmd.OpenForm stDocName, , , stLinkCriteria
Как я понимаю, для выборки из таблицы мне будет достаточно в stDocName указать имя формы и задать stLinkCriteria - тогда не нужно будет запроса в целом и понадобится только одна форма


Обычное решение
--ленточная форма
--5-10 полей для ввода условий
----муж/жен/дет/подр,
----48/50/52,,,
----обувь/одежда,,,
----блузки/брюки/юбки.....
----китай/турция/польша/белорус

в зависимости от заполненных условий --формирование строки для фильтра

думаю, что менеджер будет достаточно доволен, хотя бы некоторое время
31 май 19, 11:46    [21898454]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 6260
Якорь,
гляньте это-может что пригодится:

К сообщению приложен файл (формированиеСтрокиWhere.rar - 25Kb) cкачать
31 май 19, 13:01    [21898620]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
Якорь
Member

Откуда:
Сообщений: 10
sdku
Якорь,
гляньте это-может что пригодится:

Да, примерно так и организовано, если предположить, что это - вызываемая форма. Аналог ctl5 - там как раз значение фильтра хранится, а на форме оно не представлено. Вот его мне и надо сохранить в таблицу.
Я попытался наспех приблизить к тому, как реализовано в базе. Соответственно, там две кнопки на форме и вызов запроса по нажатию (на каждую кнопку свой запрос и своя форма). Значение фильтра в запросе должно попасть в ctl5 при добавлении записи. Это два момента, которые я хочу реализовать:
- на любое количество кнопок вызывать одну и ту же форму и один запрос (или ни одного) с параметром - строковой константой;
- записывать значение константы, с которой был вызов, в ctl5

В принципе, по совету Predeclared получилось - со скрытым столбцом ctl5 на форме.

К сообщению приложен файл (формированиеСтрокиWhere1.rar - 34Kb) cкачать
31 май 19, 14:14    [21898785]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
alecko
Member

Откуда: Башкирия
Сообщений: 551
Якорь, тож костыль, вобщем-то, но - как вариант.

К сообщению приложен файл (формированиеСтрокиWhere.zip - 97Kb) cкачать
31 май 19, 16:42    [21898967]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 6260
sdku
Сформулируйте кратко и конкретно вопрос.
просмотрел еще раз топик, но понимания так и не возникло.
Что,в зависимости от чего, и куда надо записать (или что открыть).
Что и где вводит оператор (как-то так:оператор открывает форму(ленточную,одиночную) с такими-то данными,затем заполняет поле.... для ввода критерия отбора и нажимает кнопку...,на форме отражаются такие-то данные,создает новую запись которая сохраняется в такую-то таблицу,при этом в таблице....создается новая запись со значением поля ...=ID,поля...=полю...внесенной оператором записи)
31 май 19, 17:33    [21899033]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
Якорь
Member

Откуда:
Сообщений: 10
sdku
Сформулируйте кратко и конкретно вопрос.

Пользователь нажимает кнопку "Жен.", открывается форма (ленточная? Не уверен, в понедельник проверю), источник данных - запрос с параметром "тип"="Жен." из таблицы "ассортимент". В форме табличное представление выбранных данных. Для ввода новых данных пользователь ставит курсор на новую строку, заполняет поля. Например, наименование="Пальто", модель="Мисс Север-2019", материал="код материала" (тянется из другой таблицы, работает). При установке курсора на другую строку должна произойти запись в таблицу "ассортимент" record'а:
Наименование      Модель        Материал  Тип
Пальто Мисс Север-2019 15 "Жен."
но поле "тип" не записывается, хотя когда-то было реализовано, записывается
Наименование      Модель        Материал  Тип
Пальто Мисс Север-2019 15

Если брать выложенный пример: на форме1 кнопка "Обувь" вызывает по нажатию форму "Обувь", источник данных для которой - запрос "ЗОбвуь". Он из Таблица1 выбирает записи с полем ctl5="Обувь" При сохранении записи поля ctl1-ctl4 он берет из заполненных полей, а в ctl5 должен записать "Обувь" и сохранить именно так в таблицу.
Как заставить сохранить критерий отбора в ctl5?
31 май 19, 18:11    [21899095]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 6260
я бы имел 2 таблицы-с товарами для женщин и для мужчин т.к.некоторые поля должны быть в тбл.для женщин при отсутствии таковых в тбл.для мужчин (и наоборот-например размер груди)
"Пользователь нажимает кнопку "Жен.", открывается форма" на таблице "товары для женщин"(кнопку "М" на таблице "товары для мужчин") - это предложение потребует полной переделки БД (изменение структуры БД).Если это не возможно(по веской причине)-разместите в заголовке формы свободное поле которому задавайте значение при открытии формы,в зависимости от нажатия кнопки "М" или "Ж".При сохранении записи поле [tbl]![тип]=полю формы
31 май 19, 19:59    [21899175]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 6260
или просто DefaultValue скрытому полю [тип](в зависимости от того для какого пола открывается форма)
31 май 19, 20:10    [21899184]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 6260
Private Sub Form_Open(Cancel As Integer) ' форма Fname
If Forms!выбор.группа = 1 Then
      Me.RecordSource = "select*from tbl where тип='М'"
      Me.тип.DefaultValue = "М"
Else
      Me.RecordSource = "select*from tbl where тип='Ж'"
      Me.тип.DefaultValue = "Ж"
End If
End Sub

Private Sub cmb_Click() 'форма выбор
DoCmd.OpenForm "Fname"
'на форме разместить группу переключателей [группа]
End Sub
ну и фсе...
31 май 19, 20:37    [21899191]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
Якорь
Member

Откуда:
Сообщений: 10
К сожалению, там исторически сложилось такое, что я не распутаю - это о глобальной переделке. О чем говорить, если для склада до сих пор маячат "кв м" ткани, хотя пошивом/ремонтом сейчас не занимаются (но материалы на складе числятся)? Может, поэтому и материалы отдельной таблицей сделаны. И размеры почему-то нужны только на связке "менеджер - склад" (которая пока работает и устраивает). Потому же и предложение ПЕНСИОНЕРКА не пройдет - они так не работают...
sdku
я бы имел 2 таблицы-с товарами для женщин и для мужчин т.к.некоторые поля должны быть в тбл.для женщин при отсутствии таковых в тбл.для мужчин (и наоборот-например размер груди)
При сохранении записи поле [tbl]![тип]=полю формы

Вот реализацию этого действа я и не потянул, пришлось пользоваться костылем на всю таблицу... а потом вопросы задавать. Куда его тогда поставить, это присвоение [tbl]![тип]=полю формы? В BeforeUpdate?

На неделе буду все-таки мучить OpenArgs.

Всем спасибо за участие, советы и помощь!
31 май 19, 21:16    [21899212]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4599
Якорь
Потому же и предложение ПЕНСИОНЕРКА не пройдет - они так не работают.

раз таблицы разные, то и форм поиска должно быть столько же или одна, но с настройкой на таблицу
+union запрос для связи складов, если склад неизвестен
31 май 19, 22:20    [21899241]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
Якорь
Member

Откуда:
Сообщений: 10
sdku
ну и фсе...

Значит, я структур Ме крутил неправильно...
"Фсе" - это для тех, кто понимает... я к таким не отношусь, но код - то, что мне и надо, огромное спасибо!
2 июн 19, 17:05    [21899851]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
Якорь
Member

Откуда:
Сообщений: 10
Всем добра!
sdku
или просто DefaultValue скрытому полю [тип](в зависимости от того для какого пола открывается форма)

Итоги:
- OpenArgs прикрутил, он передается в форму. В итоге на выборку - все хорошо, как и хотелось, одна форма плюс в ней параметрический запрос SQL через RecordSource и OpenArgs.
Вылезла проблема с формой - после изменения источника данных в свойствах формы она при открытии и в конструкторе почему-то отображается в свернутом до заголовка виде (по ширине отображается нормально).

UPD: ругайте решение.
1 - RecordSource выбросил из кода. Причина - не смог связать скрытое поле в форме со столбцом таблицы "тип".
2 - источником данных стал стандартный запрос через конструктор запросов, критерий отбора по полю "тип" - [Forms]![ИмяФормы].[OpenArgs]
3 - значение Me.поле_для_тип.DefaultValue=Me.OpenArgs, выставленное при открытии формы, почему-то не дало нужного эффекта - при создании новой записи в поле_для_тип и, соответственно, в таблицу ассортимента новое значение не вносится, поле пустое. Причину не понял
4 - выругался и в свойствах формы в событии "после вставки" добавил строку
Me.поле_для_тип.Value = Me.OpenArgs
6 июн 19, 14:00    [21903497]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
Predeclared
Member

Откуда: And God I know I'm one
Сообщений: 908
Якорь
...
3 - значение Me.поле_для_тип.DefaultValue=Me.OpenArgs, выставленное при открытии формы, почему-то не дало нужного эффекта - ...

Присваиваемое значение нужно обернуть апострофами или счетверенными кавычками.
Во встроенном хелпе есть пример.
6 июн 19, 21:37    [21904037]     Ответить | Цитировать Сообщить модератору
 Re: CurrentDb.TableDefs...DefaultValue как плохой костыль  [new]
Якорь
Member

Откуда:
Сообщений: 10
Predeclared
Присваиваемое значение нужно обернуть апострофами или счетверенными кавычками.

Апострофами - помогло. Спасибо большое! Думал, строка же... :)

Ну, вот - попросил хоть какое-то ТЗ на изменения. В итоге дошли в ТЗ до девяти кнопок вместо двух О_О
Пошел курить подключение группы радиобаттонов либо поле со списком...
7 июн 19, 09:54    [21904247]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить