powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как реализовать выбор в поле со списком, если список большой
43 сообщений из 43, показаны все 2 страниц
Как реализовать выбор в поле со списком, если список большой
    #39296740
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Подскажите пожалуйста -
В табличной форме одно из полей - поле со списком связанное с таблицей в которой может быть несколько сотен записей. Выбирать значение из списка заманаешься. Фильтровать по вводимым символам тоже не выход, особенно если не знаешь что имеется в исходной таблице. Наилучшим выходом вижу выбор из вспомогательной формы в которой можно было бы вывести записи в виде какого-то структурированного списка. Но как это сделать представляю плохо -т.к. в базах данных вообще и программировании в частности не очень хорошо разбираюсь к сожалению. Видимо должна быть какая-то всплывающая форма с передачей значения из это формы по клику мышкой, или по кнопке в исходное поле. Может кто-нибудь показать пример подобного решения? Или предложить что-нибудь более подходящее?
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39296758
Фотография Tarasios
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для удобства вам надо разбивать информацию на "составляющие" и хранить в разных таблицах, связанных между собой с отношением "один ко многим". В форме ставите несколько полей со списком, каждый из которых берёт данные из своей таблицы с ограничением по другим полям со списком. Грубый пример: есть зал с кучей народа, одним списком. Вы сделали разбивку и теперь последовательно выбираете критерии: мужчина/женщина, старик/взрослый/ребёнок, брюнет/шатен/блондин. Таким образом выбором пары категорий вы быстро определите маленький список, в котором легко найдёте искомое. Такой тип разбивки, если не ошибаюсь, вы можете изучить в "Борее".
Если дадите пример пары записей из вашего поля, попробую подсказать критерии разбивки.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39296759
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну и вдогонку еще, что бы отдельную тему не создавать -
на форме имеется две подчиненные формы. При перемещении по записям одной подчиненной формы записи другой должны фильтроваться. Поставил на событие Текущая запись одной подформы код типа:
Код: vbnet
1.
2.
3.
4.
Private Sub Form_Current()
  Me.Parent.subMod.Form.Filter = "iEquipment = " & Me.iEquipment
  Me.Parent.subMod.Form.FilterOn = True
End Sub



Но при первой загрузке основной формы выдается ошибка чтения/записи. Если же ее игнорировать то далее все работает нормально. В чем проблема? И как ее избежать?
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39296763
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Я понимаю о чем вы. Теорию плотно читал, в том числе и на этом форуме. Практики нет. Таблицы уже вроде как разбил и схему данных сделал. Вопрос по выбору из поля со списком которое связано с уже готовой таблицей. Ее дальше разбивать некуда.
Ну например таблица "поставщики". В форме "счета" имеется поле со списком в котором выбираются поставщики, а их много.

Ну или в том же счете есть "товары/услуги", для которых существует отдельная таблица - перечень. И там позиций еще больше чем в таблице поставщиков. Выбор в "счетах" (вернее в "составе счета") реализован так же через поле со списком.
Неудобно.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39296764
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristВ чем проблема? И как ее избежать?Есть старый трюк. На Главной форме добавляешь поле (невидимое), в него прописываешь в данных "=ИмяСубформыСодержащейВедущуюФорму.Form!iEquipment" , естественно используешь свои названия. Потом в свойствах у контрола подчинённая форма, который содержит ведомую форму, в "подчинённых полях" ( LinkChildFields ) указываешь " iEquipment ", а в "основные поля" ( LinkMasterFields ) имя твоего текстового поля. Всё.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39296765
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39296771
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПанургЕсть старый трюк.
Обалдеть. Сработало!
Спасибо!
Еще бы по основному вопросу такое простое решение.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39296774
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristЕще бы по основному вопросу такое простое решение. тебе же предложили вполне решение 19582336 . В любом случае нужно что-то делать со списком - разбить на блоки. А выводить это уже потом, связанные списки там будут или форма. Я как-то даже в выпадающий список дерево (TreeView) запихивал...
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39296782
Фотография Tarasios
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Decabrist,
смотрю образец вашего счёта, поле "Наименование". И ясно вижу, что ни разу инфа в этом поле не "Ее дальше разбивать некуда". Или мы друг друга не поняли ;) У вас кроме неудобства визуального - перегруз таблиц дублирующейся инфой.
Например, пример разбивки: тип оборудования (условно): Конденсатор; Заклёпка; Эл.двигатель.
В отдельной таблице - маркировка, один или два параметра. Вот у меня компьютерный магазин - там вообще на 4 категории разбито. В большинстве случаев - хватает три категории.
Вот визуальный пример реализации (поле "Изготовитель" раскрыто для наглядности:
А на второй картинке - образец схемы:
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39296783
Фотография Tarasios
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tarasios, упс, первая картинка отвалилась, кидаю заново
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39296785
Фотография Tarasios
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по нескольким полям ты легко находишь нужную позицию, а уже в отчётах или где там надо она легко "сшивается" по необходимости из нескольких полей в одну строчку
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39296818
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristВыбирать значение из списка заманаешься.

На форме дополнительно чек бокс и поле фильтра
В запросе источнике записей списка добавить сам чек бокс из формы
поставить две пары условий:
Если чек бокс Да то у фильтруемого поля условие Like "*" & поле фильтра & "*"
Если чек бокс Нет то у фильтруемого поля нет условия
В событиях после обновления чек бокса и поля фильтра поставить Requery на Список
Результаты превзойдут все ожидания...

DecabristНо при первой загрузке основной формы выдается ошибка чтения/записи. Если же ее игнорировать то далее все работает нормально. В чем проблема? И как ее избежать?

Ответ в самом вопросе:
Код: vbnet
1.
2.
3.
4.
5.
6.
Private Sub Form_Current()
On Error GoTo er1
  Me.Parent.subMod.Form.Filter = "iEquipment = " & Me.iEquipment
  Me.Parent.subMod.Form.FilterOn = True
er1:
End Sub
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39296819
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmag,

[b] в коде зачеркнуть везде (хотел выделить жирным)
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39296824
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Tarasios]Decabrist,
смотрю образец вашего счёта, поле "Наименование". И ясно вижу, что ни разу инфа в этом поле не "Ее дальше разбивать некуда". /quot]

Это бухгалтерская таблица (или того кто будет заниматься учетом прихода/расхода).
Я одно время работал с бухгалтерами и понял одно - как им ни делай они будут вносить так как написано в документе. В одну строку. И им наплевать на то что это, где это и т.п.
Кроме того таки данное поле основано на запросе, в котором поля [наименование] и [единицы измерения] суммируются.

Разделение по колонкам, так как у вас происходит дальше, на уровне технического специалиста. Вот у него уже четко все разбито по наименованиям/обозначениям/единицам измерения/характеристиками и т.п.
Давайте приведу другой пример... из того же что и выше:
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39296831
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот из той же серии как это выглядит в форме с регистрацией счетов,
и как это выглядит в таблице. Вы видите что поле является суммой полей [наименование] и [город]
Выбирать отдельно город, а затем фирму поставщика - не факт что тот кто будет это делать знает в каком именно городе находится эта фирам.
Выбирать фирму - не факт что не найдется одноименных.
Поэтому сделано так.
Допустим поставщиков несколько сотен... да пусть даже десятков. И что крутить их в поле со списком до тех пор пока не найдется нужное?
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39296834
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и таблица:
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39296838
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну а вот на минуточку таблица технического специалиста, как раз так как вы говорили. И это разные таблицы с бухгалтерией - потому что те внести могут абы как (как в счете указали так и будет), а у технаря все будет четко и однозначно.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39296850
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vmag
На форме дополнительно чек бокс и поле фильтра
В запросе источнике записей списка добавить сам чек бокс из формы
поставить две пары условий:
Если чек бокс Да то у фильтруемого поля условие Like "*" & поле фильтра & "*"
Если чек бокс Нет то у фильтруемого поля нет условия
В событиях после обновления чек бокса и поля фильтра поставить Requery на Список



Вариант хороший. А с всплывающей формой, в которой нашел, ткнул кнопку и оно в списке отобразилось никак?
А вдруг тут же еще и добавить новую запись надо в ту же форму? Я вот к чему подвожу.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39296973
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Decabrist,
Дословно не помню, но как-то так:"если в таблице поле имеет одно и то же значение во многих записях-её следует разбить" Посмотрите как это сделает мастер анализа таблиц. Кстати об этом Вам уже говорили 19582336 ("Эл.двигатель" в поле "наименование")
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39297310
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristВариант хороший. А с всплывающей формой, в которой нашел, ткнул кнопку и оно в списке отобразилось никак?
А вдруг тут же еще и добавить новую запись надо в ту же форму? Я вот к чему подвожу.

Да всё так же, и на подводной лодке тоже будет работать, можно галочку даже не использовать, а в выражение добавить это же поле поиска, если в поле поиска NULL, то без условия отбора, а если есть значение, то его же (поле) и в условие отбора.

Просто есть вопрос и есть совет, рассказывать про всплывающие формы, параллельно работающие формы и т.д. как-то в планы не входит...
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39297566
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо давайте так сформулирую конкретную задачу.
Необходимо
1. по правой кнопке мыши на поле со списком и выборе соответствующей команды меню вывести форму с таблицей, к которой привязано это поле со списком. Затем, после выбора нужной позиции во всплывшей форме мышкой, либо по кнопке на той же форме - форма должна закрыться, а выбранная позиция должна отобразится в поле со списком.

основной вопрос здесь не столько вывод формы, это понятно DoCmd OpenForm сколько о том как передать значение в исходный список.

2. Та же задача что и в п.1 но вместо выбора надо добавить новую запись в исходную таблицу, которая затем должна отразится в поле со списком.

помимо вопроса выше, здесь добавляется новая проблема. В поле со списком новая запись отсутствует, до тех пор пока я не закрою форму, и не открою ее заново.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39297574
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sdkuDecabrist,
Дословно не помню, но как-то так:"если в таблице поле имеет одно и то же значение во многих записях-её следует разбить" Посмотрите как это сделает мастер анализа таблиц. Кстати об этом Вам уже говорили 19582336 ("Эл.двигатель" в поле "наименование")
А кто вам сказал что это значение не вынесено в отдельную таблицу? ;)
Ну вообще да, не вынесено. Т.к. "эл.двигатель" это частный и достаточно редкий случай и видно их друг за другом несколько записей только потому что внес их туда друг за другом за один раз. Таких отдельных частных случаев хватает конечно (заклепки, провода и т.п), но я пока не вижу смысла делать для этого целую отдельную таблицу наименований.
А вот поле "группа" - к примеру как раз таки отдельная таблица.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39297587
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Decabristосновной вопрос здесь не столько вывод формы, это понятно DoCmd OpenForm сколько о том как передать значение в исходный список.

Добавлю. Я могу написать код в котором по событию (клик мышки, клик кнопки) будет меняться значение поля в конкретной форме. Через обращение CurrentProject.Allforms Но мне кажется это фиговый выход. Т.к. эту форму, как отдельную я потом не использую - она будет пытаться изменить значение поля в заданной, возможно даже закрытой на тот момент форме.
Ну не программист, извините.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39298286
Фотография Tarasios
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Decabrist, думается мне, что вам будет удобнее сделать так.
В форме делаете "Поле1", куда вводится часть наименования (что помнится) товара или фирмы (смотря, какой список поле обслуживает). Рядом в форме разместите небольшой "Список", строк на 10-15. Именно элемент список, а не поле со списком. В этом списке отображается результат выборки данных по совпадающей части с значением поля "Поле1". Конструкция с Like это делает элементарно. То есть, вводите в "Поле1" буковки до тех пор, пока по всё большему совпадению в "Список" выборка данных не сократится до нескольких строчек. После чего уже не трудно тыкнуть в нужную запись и обработать её. Таким образом вы избавляетесь вообще от прокрутки (хотя Список можно снабдить вертикальным скроллом) и получаете возможность фильтрации и поиска.
Другой вариант, кардинальный. Если у вас уже фактически есть нормально заведённая база с удобной и правильной разбивкой данных по полям, то идя на поводу у бухгалтерии, вы делаете дурную и никому не нужную работу.
Бухгалтерия - это участок, который просто ОБСЛУЖИВАЕТ некое предприятие, причём ОБЯЗАНА вести свою работу по критериями и стандартам этого предприятия. И в масштабах предприятия тупо не выгодно, а порой и вредно подстраиваться под тупые хотелки каждого отдельного участка. Понятно, что бухгалтерия любой конторы - та ещё мафия, которая свято стоит на страже своих "свобод" и привычек ;) Но тут уже зависит от руководства. Если вы предоставили руководству логичный и грамотный анализ проблемы, с уже готовым решением (в данном случае - если вы объяснили руководству принципы и плюсы общей стандартизации), но руководству либо пофигу, либо он идёт на поводу бухгалтерии - то вам ничего не светит в этой конторе. Даже являясь убер-программистом, вы никогда не сможете обеспечить реализацию очередной хотелки очередной ленивой тушки и потом синхронизировать с остальными хотелками ;) Мало того, ваш эпический труд никогда (от слова вообще) не будет оценён под достоинству. А неизбежные косяки в ваших стараниях будут подаваться руководству как ваша персональная тупость и криворукость. И поверьте - все минусы перехода на другую работу в сумме дадут гораздо меньше геммора ;)
Если коротко, то простая логика выглядит так:
Если где то есть кучка принципиальных серунов, любящих гадить мимо унитаза, то варианты действий у вас такие:
1. Бегать и постоянно за ними всё подчищать, придумывая автоматизацию этого процесса ;)
2. Дать по башке этой кучке избранных, которые "так привыкли и не собираются ничего менять", заставив делать как надо и куда надо. Можно самому, если хватает умений, либо через директора.
3. Поменять серунов на нормальных, которые обязуются и могут выполнять правила предприятия
4. Уйти в другую команду, оставив руководителя с его командой избранных.

По роду своей работы, прошлой и настоящей, я очень много работаю с начальством, бухгалтерами, и остальными работниками. И стараюсь донести руководству, что автоматизация (магазинов, например), это не просто замена калькулятора на компьютер, а вообще другой подход плюс тотальный контроль на каждом участке. Сколько слёз, соплей и истерик мне довелось увидеть... (Даже когда у себя в магазине делал автоматизацию - хватило за глаза. Зато позволило выявить механизмы вороства). Что характерно: где руководство ХОЧЕТ иметь нормальный процесс и МОЖЕТ напрячь людей - резко падает кол-во непоняток, недостач, криков, скандалов и наездов на "тупого программиста, у которого программа сама что то не так делает".
А есть конторы, где каждый переучёт сопровождается перекрикиванием руководства (давай плати!) и виноватых (ничего не знаю, оно само, а у меня дети/кредит/больная мама и т.д.). И не смотря на всяческие ухищрения с моей стороны как программиста на предмет выявления и отслеживания махинаций персонала - из года в год одни и те же лица, одни и те же "аргументы" с обеих сторон, только суммы растут ;)
Как то так...
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39298303
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tarasios,

вы в 1С работали? Вы видели каким образом туда вносятся данные о товарах?
Я понимаю разные формы там могут быть наверное (сам я в 1С не работал). Но вот только что ходил в соответствующий отдел смотрел как и что туда вносится. Два поля "Наименование" и "Полное наименование". В "Полное наименование" хреначат просто фффсё. И никого не колышат мои хотелки. Это система. И она точно такая же на других предприятиях. Вы мне уволится предлагаете? ))) Кажется это самый распространенный совет на этом форуме. Я не говорю что эта система правильная, и я буду делать только так и никак иначе, я просто пытаюсь к ней приспособиться но в конечном итоге сделать так как мне надо. И я это сделаю. Нужны не отвлеченные рассуждения, а конкретные ответы на конкретный вопрос, который я задал одним сообщением выше.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39298305
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тремя сообщениями выше )))
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39298310
Фотография Tarasios
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Decabrist, так я дал своё видение реализации ответа на ваш вопрос. Или надо с конкретным работающим примером?
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39298320
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не нужно, я понял. Мне кажется со списками будет все громоздко. Особенно если подобных полей не одно.
Вообще хотелось какую-то вариативность. Хочет пользователь - набирает в поле сочетание символов, по этим символам содержимое поля фильтруется. Я так уже делал когда-то. Не знает что ищет - желает посмотреть - правый клик мышкой по полю со списком, меню, открываем форму со всеми значениями (присоединенными к полю со списком) так как они записаны в базе. Скроллит, находит что нужно, тыкает - форма закрывается, а значение остается в поле со списком. Ну или не находит и добавляет новую запись, которая затем и отображается в поле со списком.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39298321
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По последнему варианту хрен знает как это правильно сделать, не понятно как передавать значение из формы в форму так что бы потом проблем не было, но реализовать так хотелось бы.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39298322
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TarasiosИменно элемент список, а не поле со списком
А чем лучше просто список выпадающего списка? Только место занимает. Я давно использую для выбора из огромных списков со сложными названиями класс для комбобокса, который реализует гуглоподобный поиск при вводе: начинаем набирать текст в комбобоксе, после заданного минимального числа символов (обычно 2) включается таймер, и как только пользователь превысил заданную паузу, список автоматически раскрывается, показывая только элементы, содержащие введенные символы. Далее, если пользователь ввел пробел и продолжил ввод, то поиск идет уже по двум элементам и так далее. Если в списке остался только один элемент, то он может быть выбран автоматически, в зависимости от настроек класса. Быстродействие такого способа очень хорошее - даже на разделенной базе с бэкэнодом на сетевом диске при общем количестве элементов порядка 10000 задержек практически не заметно.

Если нужно, могу поделиться классом, цепляется двумя командами к любому комбобоксу. Ну и запрос для комбобокса должен быть сделан по определенным правилам.

Если пользователь вообще не знает, с чего начать при выборе данных, может просто раскрыть полный список и посмотреть, что там, но это не удобно для очень больших списков, поэтому можно реализовать своего рода помощь начинающему: по даблклику на комбобоксе открываем справочную форму с базовыми элементами, после выбора одного или нескольких базовых элементов подставляем в комбобокс ключевые элементы и раскрываем список, он будет содержать строки только с выбранными ключевыми элементами
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39298327
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Decabristне понятно как передавать значение из формы в форму так что бы потом проблем не было
А какие проблемы с передачей?

Я использую для передачи параметров между формами OpenArgs для передачи входящих параметров, где параметры идут в виде списка "ключ1=значение1|ключ2=значение2", принимающая форма открывается в виде модального диалога. Если в коде предполагается открывать диалог более одного раза, то создаю функцию, если один раз, то просто напрямую. Обратная передача параметров - диалог не закрывается, а делается невидимым, выполнение кода продолжается после команды открытия формы, там мы считываем возвращаемые параметры из полей формы или из созданных там свойств и закрываем диалог.

Ссылку на открывающую форму в открываемую при необходимости также передаю через текст в OpenArgs - в виде текстового пути "форма>подформа>подформа". Это, правда, не работает с формами, открытыми как инстанс.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39298331
Фотография Tarasios
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShin, интересный подход. Может даже, он идеален. И если выложите в доступ, буду благодарен. Но может выявиться некое противоречие: если мы исходим из того, что пользователь - не мы с вами, а является типичной бухгалтершей (условно), стремление которой к изучению новых методик стремится к нулю (а может - и сама способность к изучению), то такой подход может оказаться для неё слишком сложен. Это же изучить и осознать, что надо начинать набирать часть слова (а его ещё и вспомнить ведь надо, а там тысячи позиций), потом нажать пробел, потом опять буковки тыкать... А потом тыкать на найденное значение... А ещё ведь есть альтернативный способ поиска, скроллингом, а это ещё позиции знаний, которые надо изучить ;) Уверен, что вам встречалось множество таких юзеров, с реакций на необходимость что то менять и учить - даже если для вас это элементарно - от простых слёз до откровенного саботажа ;) Тут уже вопрос к психологам, но факт есть факт: подавляющее кол-во людей все силы готовы потратить на защиту от изменений своего маленького и привычного мирка, даже если эти изменения ничтожны и реально им на пользу пойдут ;)
Потому то я где то и ратую за реализацию замены длинного списка с пусть даже с хитрым поиском - на последовательный выбор по иерархии (Группа, подгруппа, позиция): максимум примитивизма, простейший алгоритм действий, максимум защиты от левых движений пользователя. В каждом блоке - выбор из небольшого списка (если получается все равно слишком много позиций в одной категории - значит, надо ещё больше дробить, добавлять кол-во веток иерархии).
Во всяком случае, такой метод много раз испытан и вопросов не возникает. Ну разве что некоторые привыкли к пользованию классическим "деревом".
ПыСы: пока не протестируешь всё на "бибизянках", то есть - юзерах, и не получишь их отзывы - любое самое идеальное решение - является просто предметом академического спора программеров ;)
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39298454
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пример. Описание в заголовке класса. Окно таймера используется для того, чтобы не использовать таймер основного окна, т.к. он может быть занят другими задачами.

Приложениями, использующими этот контрол пользуются операторы, далекие от ИТ, типа бухгалтерии или склада, проблем с освоением не возникало, достаточно сказать в двух словах как пользоваться или подсказку для контрола заполнить
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39315287
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пришлось на некоторое время прерваться..
MrShin А какие проблемы с передачей?

Я использую для передачи параметров между формами OpenArgs для передачи входящих параметров, где параметры идут в виде списка "ключ1=значение1|ключ2=значение2", принимающая форма открывается в виде модального диалога.


К сожалению я в программировании не силен. Программирую что-то когда необходимость вынуждает. С этим параметром не работал ни разу, и пока не очень представляю как его использовать в моем случае.
Еще судя по вашему описанию - вы подразумеваете нечто другое. Принимающей формой у меня является как раз инициирующая запрос форма. Т.е. например имеем на форме комбобокс на которые повешено 100500 значений. Работать с таким "списком" нормально не возможно. Отчасти это решаемо путем фильтрации списка при вводе символов пользователем, но если пользователь не знает что ищет - это не решение проблемы.
Необходимо по какому то действию (двойной щелчек на контроле) - вывести форму со списком всех значений, а так же с элементами управления, фильтрации, группировки и т.п. Здесь ничего сложного не вижу - по событию (двойной клик мышкой) DoCmd.OpenForm.
А вот дальше мне не понятно. Ну нашел пользователь нужную ему запись - ткнул на нее... как сделать так что бы эта запись отобразилась теперь на первой, инициирующей форме в комбобоксе?
Вообще нужно ли для этой операции создавать полностью отдельную форму? Я надеялся использовать независимо существующую форму для просмотра и редактирования списка.
Ваш пример с комбобоксом скачал и проверил, у меня выдает ошибку и требует переделать код под 64х битную систему.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39315310
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока сделал так:
Инициирующая форма с комбобоксом, по двойному клику мышкой на контроле:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Sub cmbComponent_DblClick(Cancel As Integer)

DoCmd.OpenForm "frmComponent", acNormal, , , acFormReadOnly, acDialog

If CurrentProject.AllForms("frmComponent").IsLoaded Then
   Me.cmbComponent.Value = Forms!frmComponent!subComponent.Form!fldComponent.Value
   DoCmd.Close acForm, "frmComponent"
Else
 
End If

End Sub



Форма со списком элементов комбобокса по двойному клику мышкой на контролах всех полей (знаю что криво, но лучше пока не придумал, так что бы клик срабатывал на всей записи в любом поле единой процедурой не получается):

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Private Sub fldComponent_DblClick(Cancel As Integer)
 Forms!frmComponent.Form.Visible = False

End Sub

Private Sub strDescription_DblClick(Cancel As Integer)
 Forms!frmComponent.Form.Visible = False

End Sub

Private Sub strName_DblClick(Cancel As Integer)
 Forms!frmComponent.Form.Visible = False

End Sub

Private Sub strProperty_DblClick(Cancel As Integer)
 Forms!frmComponent.Form.Visible = False

End Sub



Как бы еще добавить в код проверку открыта ли форма в виде диалога, или самостоятельно. Так что бы при открытии самостоятельной формы никаких действий по скрытию формы не производить.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39315347
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristНу нашел пользователь нужную ему запись - ткнул на нее... как сделать так что бы эта запись отобразилась теперь на первой, инициирующей форме в комбобоксе?
Я обычно для модальных диалогов, которые должны возвращать одно или несколько значений использую функции, подобные той, что приведена ниже. В основной форме по двойному щелчку вызываем эту функцию, если она вернула истину, то присваиваем измененную переменную комбобоксу. В диалоге вместо закрытия скрываем его, закрывается он уже в функции, после получения необходимых данных из диалога:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
Public Function SelectDatasetDialog(ByRef strDSFileName As String) As Boolean
' функция возвращает истину, если был сделан выбор. Выбранные данные возвращаются через аргументы, переданные по ссылке
Dim blnRet As Boolean

On Error Resume Next
'на всякий случай закрываем окно, если оно случайно осталось открытым и невидимым
DoCmd.Close acForm, "frm_DatasetSelect"
On Error GoTo ErrorHandler

blnRet = False
DoCmd.OpenForm "frm_DatasetSelect", , , , , acDialog
'сюда управление возвращается, как тольк диалог делается невидимым
If Nz(Form_frm_DatasetSelect.txtFileName, "") = "" Then ' - проверяем поле, которое содержит основные данные - если пустое, значит отменили диалог без выбора
    'cancel clicked
    GoTo ExitHere
End If
' получаем еще данные для возврата
strDSFileName = Form_frm_DatasetSelect.txtFileName

blnRet = True

ExitHere:
    On Error Resume Next
    SelectDatasetDialog = blnRet
    ' теперь закрываем диалог окончательно
    DoCmd.Close acForm, "frm_DatasetSelect"
    Exit Function

ErrorHandler:
Select Case Err
Case 0
    Resume Next
Case Else
    LogError Err.Number, Err.Description, Erl, "SelectDatasetDialog", "bas_Utilites"
    Resume ExitHere
End Select
End Function
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39315351
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristКак бы еще добавить в код проверку открыта ли форма в виде диалога, или самостоятельно.
Проверьте, есть ли Parent у формы. Есл есть, то она открыта как субформа:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Public Function IsFormStandalone(frm As Form) As Boolean
    Dim frmParent As Form
    
    IsFormStandalone = False
    
    On Error Resume Next
    Set frmParent = frm.Parent
    If Err.Number = 2452 Then
        On Error GoTo ErrorHandler
        Err.Clear
        IsFormStandalone = True
    ElseIf Err.Number <> 0 Then
        GoTo ErrorHandler
    End If
End Function
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39315365
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristВаш пример с комбобоксом скачал и проверил, у меня выдает ошибку и требует переделать код под 64х битную систему.
Добавил поддержку 64 бит
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39315372
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MrShin,

Я правильно понял форма открытая как acDialog уже является подчиненной, и имеет родительскую (Parent) форму?
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39315384
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо!
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39315400
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristЯ правильно понял форма открытая как acDialog уже является подчиненной, и имеет родительскую (Parent) форму?
Нет, это отдельная форма, acDialog обеспечивает только модальность этого окна.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39315406
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е. в данном случае проверить в каком режиме открыта форма нельзя?
В принципе не вопрос, я могу сделать копию существующей формы со списком модифицировать ее в части взаимодействия с вызывающей формой и использовать эту копию в данной конкретной ситуации. Приложение очень маленькое, путаницы в дальнейшем быть не должно. Но такой подход, думается, не корректен.
...
Рейтинг: 0 / 0
Как реализовать выбор в поле со списком, если список большой
    #39315443
КВВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DecabristА вот дальше мне не понятно. Ну нашел пользователь нужную ему запись - ткнул на нее... как сделать так что бы эта запись отобразилась теперь на первой, инициирующей форме в комбобоксе?Вот, увидев впервые на работе, подумал, что ленточные формы с окошком на каждом поле с выбором вида фильтра (начинается, кончается, входит, равно, не равно...) и самого значения фильтра, а также с галочками сортировки по каждому полю - простая и чрезмерная угодливость заказчику. А на практике, где ежемесячно сотни тысяч записей, где данными пользуются разные службы и подразделения, оказалось совсем даже удачно. Конечно же, предусмотрены рабочие формы для имеющих права редактирования, отчеты по отобранным значениям, экспорт в Excell, просмотр самого фильтра в текстовом виде и т.д. и т.п. И комбобоксы оказались совсем ненужными по сравнению с этими окошками.
...
Рейтинг: 0 / 0
43 сообщений из 43, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как реализовать выбор в поле со списком, если список большой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]