| |
 57 Кб. |
|
| | Всем привет! В моей базе в Форме2 в листбоксе фильтруются записи по двум комбобоксам. Значение второго комбобокса зависит от результата по первому комбобоксу. Теперь я хочу добавить еще три таких же комбобоксов, все значения во всех комбобоксах берутся из справочных таблиц. И чтобы эти комбо не зависели друг от друга, а зависели от результата отфильтрованных записей в списке. То есть результаты должны отсеиваться по мере осуществления выбора из комбобоксов. Может имеются подобные примеры? Нашел похожий пример, но там результирующий контрол - ленточная форма, а у меня список. Всем заранее спасибо! | |
| |
| |
| |
|
|
| | из ленточной формы легко сделать список с минимальными переделками | |
| |
| |
| |
|
|
| | Я пытался его переделать, но плохо получается. Не могли бы вы мне помочь? Что конкретно нужно переделать? Это единственный вопрос | |
| |
| |
| |
|
|
| | это?
http://hiprog.com/index.php?option=com_content&task=view&id=693 | |
| |
| |
| |
|
|
| | Есть у меня этот пример, тут выборка и отображение производится в листбоксах, а у меня выборка в комбобоксах | |
| |
| |
|
|
| |
|
|
| | вроде был где-то какой-то еще пример - именно с комбами | |
| |
| |
| |
|
|
| | кажется это
http://hiprog.com/index.php?option=com_content&task=view&id=516 | |
| |
| |
|
|
| |
|
|
| | У меня не совсем то, господа ... Ладно, спасибо и на этом | |
| |
| |
| |
|
|
| |
У меня не совсем то, господа
|
что то в этом духе я и предполагал, собственно. :)
иначе какй смысл задавать вопросы | |
| |
| |
| |
|
|
| | Хвостатый plus_stick, ты там на них не обижайся.
Пример выбора записи из таблицы или запроса при помощи нескольких полей со списком (ComboBox-ов)
http://am.rusimport.ru/MSAccess/topic.aspx?ID=663&find=%ea%ee%ec%e1%ee%e1%ee%ea%f1 | |
| |
| |
| |
|
|
| | Ухватите мысль и все у Вас получится
что у ComboBox-а(поле со списком) что у ListBox-а(список) есть свойство RowSource
это текстовая строка - источник строк для этих контролов(т.е. то что отображается в виде списка)
источником строк может быть имя таблицы или имя запроса
или же строка написанная на SQL (по сути запрос) - а вот это уже интересно
таким образом эту строчку можно написать ручками под VBA а потом подсунуть контролу (изменить RowSource)
и все что вам нужно написать код который будет в зависимости от выбранных значений в ваших комбобоксах собирать строку на SQL и подсовывать ее листбоксу и в тоже время другую строку SQL не активным комбобоксам
поверьте сложного ни чего нет | |
| |
| |
| |
|
|
| | А как в SQL запросе указать условие WHERE значение - это то, что выбрано в одном комбобоксе? | |
| |
| |
| |
|
|
| | Forms!ИмяФормы.ИмяКомбоБокса.Value | |
| |
| |
| |
|
|
| | При этом не надо имена контролов окаймлять угловыми скобками? Напрмер, вот так:
SELECT D.document_id, D.document_name, D.document_date FROM document AS D WHERE facility_id = Forms!document.select_facility.Value
|
| |
| |
| |
| |
|
|
| | Это же все можно в конструкторе построить
SELECT Цены.[Наименование продукта], Цены.КодПроизводитель
FROM Цены
WHERE Цены.КодПроизводитель=[Forms]![Форма2]![ПолеСоСписком133]; | |
| |
| |
| |
|
|
| | Вот недавно писал примерчик
http://hiprog.com/forum/read.php?id_forum=1&id_theme=6809&page=1
там правда меняется RecordSource
но поверьте принцип тот же
Ухватите принцип - выпью за Вас пива | |
| |
| |
| |
|
|
| | Да я сам нажрусь до усрачки, когда все это это закончу Осталось только это | |
| |
| |
| |
|
|
| | Я не могу вложить Вам свои ничтожные мозги
однако пытался писать комметарии
если что спрашивайте | |
| |
| |
| |
|
|
| | похоже твоё
http://am.rusimport.ru/MSAccess/f2.aspx?type=1&id=60479 | |
| |
| |
| |
|
|
| | В Форме2 надо добавить еще три комбобокса. Первый комбобокс доступен, остальные нет. После выбора на нем, становится доступным второй комбобокс. Выборка на втором осуществляется на основании первой выборки, то есть записи отсеиваются по критериям и так далее. В примерах в основном результат выборки отображается в табличных или ленточных формах, а у меня листбокс. Еще в примерах значения комбобоксов формируются по значениям существующих данных, а у меня фиксированный набор значений, которые берутся из справочных таблиц. Это последнее, что осталось сделать. Вот сижу, копаюсь в коде  | |
| |
| |
| |
|
|
| | Ну и в чем проблемы?
После выбора в первом комбобоксе меняйте источник записей во втором комбобоксе, затем в третьем.
После выбора в комбобоксах меняйте источники записей в своем листбоксе.
Тут ничего сложного нет.
Пропишите запросы-источники комбобоксов и листбокса в коде VBA и фсе. | |
| |
| |
| |
 48 Кб. |
|
| | Взгляните на эти два запроса:
SELECT D.document_id, D.document_number, PP.progress_phase_code, F.facility_code,
DI.discipline_code, D.sheet, DL.document_language_code, DT.document_type_code,
D.document_title, D.document_title_rus, R.revision_number, RS.revision_status_name,
D.etk_transmittal_number, D.kte_transmittal_number, D.ktn_transmittal_number,
D.ntk_transmittal_number, D.ktkoa_transmittal_number, D.koatk_transmittal_number,
D.client_approval_status
FROM ((((document_type AS DT INNER JOIN ((discipline AS DI
INNER JOIN document AS D ON DI.discipline_id=D.discipline_id)
INNER JOIN document_language AS DL ON D.document_language_id=DL.document_language_id)
ON DT.document_type_id=D.document_type_id)
INNER JOIN facility AS F ON D.facility_id=F.facility_id)
INNER JOIN progress_phase AS PP ON D.progress_phase_id=PP.progress_phase_id)
INNER JOIN revision AS R ON D.revision_id=R.revision_id)
INNER JOIN revision_status AS RS ON D.revision_status_id=RS.revision_status_id;
|
и
SELECT D.document_id, D.document_number, PP.progress_phase_code, F.facility_code,
DI.discipline_code, D.sheet, DL.document_language_code, DT.document_type_code,
D.document_title, D.document_title_rus, R.revision_number, RS.revision_status_name,
D.etk_transmittal_number, D.kte_transmittal_number, D.ktn_transmittal_number,
D.ntk_transmittal_number, D.ktkoa_transmittal_number, D.koatk_transmittal_number,
D.client_approval_status
FROM revision AS R
INNER JOIN (revision_status AS RS INNER JOIN (progress_phase AS PP
INNER JOIN (facility AS F
INNER JOIN (document_type AS DT
INNER JOIN (document_language AS DL
INNER JOIN (discipline AS DI
INNER JOIN document AS D ON DI.discipline_id = D.discipline_id)
ON DL.document_language_id = D.document_language_id) ON DT.document_type_id = D.document_type_id)
ON F.facility_id = D.facility_id) ON PP.progress_phase_id = D.progress_phase_id)
ON RS.revision_status_id = D.revision_status_id) ON R.revision_id = D.revision_id;
|
Дело в том, что эти два по разному составленные в конструторе запросы дают один и тот же результат, по крайней мере должны давать. Если я вешаю на RowSource первый запрос, то все работает, а по второму нет. И что странное - теперь я не могу получить в конструкторе запрос, подобный первому, замечаете, чем они отличаются? Поднял бэкап, там запрос стоит как надо, пробую его изменить чуть-чуть - все, запрос становится подобным второму и ничего не поделаешь. В чем фокус? Вот база с самим запросом (как первый) и с таблицами | |
| |
| |
| |
|
|
| | отдаю должное академическому подходу к разработке объектов и не хочу показаться занудой,
но у вас очень плохо проработана схема данных - что-то совсем не то вы собираетесь учитывать, столкнетесь вы с этим со всей очевидностью примерно на 60% законченой разработки
сообщаю об этом только потому, что переделать БД потом будет весьма непросто - судя по всему вас ждет много сюрпризов.
больше внимания уделите проработке схемы, не пренебрегайте таблицами для связей many-to-many
заведите таблицы для сохранения истории изменений статусов документа и других его атрибутов
заведите таблицы для хранения иерархии соотношений документов и приложений к ним...
посмотрите - может быть где-то нужно поменять ключи на нативные, вместо суррогатных
никогда не используйте слеши (и другие символы *+- и т.п.) в кодах документов - это зло
везде пишите примечания и дескрипшен на начальном этапе разработки - скоро это сэкономит вам время :)
------------------------------------
половина проблем с написанием запросов решается на уровне отимизации схемы данных - не забывайте об этом правиле :) | |
| |
| |
| |
|
|
| | схема данных была создана, еще тогда, когда с Аксессом у меня был полный ноль. И щас менять уже поздновато. База на 98% готова, осталось только вот фильтрацию по пяти комбобоксам сделать. | |
| |
| |
| |
|
|
| | я честно говоря не понял в чем проблема с этими запросами
то, что аксес по своему их перелывает - так это да, он такой
SELECT "a" AS DD
FROM ((((document_type AS DT
INNER JOIN ((discipline AS DI
INNER JOIN document AS D
ON DI.discipline_id=D.discipline_id)
INNER JOIN document_language AS DL
ON D.document_language_id=DL.document_language_id)
ON DT.document_type_id=D.document_type_id)
INNER JOIN facility AS F
ON D.facility_id=F.facility_id)
INNER JOIN progress_phase AS PP
ON D.progress_phase_id=PP.progress_phase_id)
INNER JOIN revision AS R
ON D.revision_id=R.revision_id)
INNER JOIN revision_status AS RS
ON D.revision_status_id=RS.revision_status_id;
|
SELECT "b" AS BB
FROM revision AS R
INNER JOIN (revision_status AS RS
INNER JOIN (progress_phase AS PP
INNER JOIN (facility AS F
INNER JOIN (document_type AS DT
INNER JOIN (document_language AS DL
INNER JOIN (discipline AS DI
INNER JOIN document AS D
ON DI.discipline_id = D.discipline_id)
ON DL.document_language_id = D.document_language_id)
ON DT.document_type_id = D.document_type_id)
ON F.facility_id = D.facility_id)
ON PP.progress_phase_id = D.progress_phase_id)
ON RS.revision_status_id = D.revision_status_id)
ON R.revision_id = D.revision_id;
|
| |
| |
| |
| |
|
|
| | Но почему он переделывает, основываясь на чем? Базу с формами завтра выложу, резать надо его, щас поздно... Поздно в Алматы | |
| |
| |
| |
|
|
| | тут два варианта - либо делать так как переделывает Access
либо держать текст запроса не как объект Access а задавать его из кода - прописывая ручками или подхватывая его текст из таблицы
AFAIK | |
| |
| |
| |
|
|
| | Вот ссылка на почти полную версию базы
http://depositfiles.com/files/8icy6cagi
Мне подсказали, это все из за ORDER BY, он должен в отдельной строке стоять | |
| |
| |
| |
|
|
| | У мну эти запросы нормально работают. Возвращают, вроде , одно и то же.
Роусоурс на обоих нормально отрабатывает. | |
| |
| |
| |
|
|
| | khvostatyy
чувствую не попью я пива
вот это зачем?
s = s & IIf((Nz(Me.search_by_progress_phase, 0) <> 0) Or (Nz(Me.search_by_document_type, 0) <> 0), " where ", "") & IIf((Nz(Me.search_by_progress_phase, 0) <> 0), "(D.progress_phase_id=" & Str(Me.search_by_progress_phase.Value) & ")", "") & IIf((Nz(Me.search_by_progress_phase, 0) <> 0) And (Nz(Me.search_by_document_type, 0) <> 0), " AND ", "") & IIf((Nz(Me.search_by_document_type, 0) <> 0), "(D.document_type_id =" & Str(Me.search_by_document_type.Value) & ")", "")
|
зачем в строке SQL Вам нужны iif?
вам надо дособирать Where
т.е. ваши действия должны быть примерно такие (по моему мнению)
имеем некую текстовую переменную strWhere
изначально strWhere=""
спрашиваем первое поле на значение
если поле пустое то ничего не делаем
если не пустое strWhere присваиваем первое условие
спрашиваем второе поле на значение
если поле пустое то ничего не делаем
если не пустое
спрашиваем strWhere на ""
если "" то strWhere присваиваем второе условие
если не пустое то strWhere = strWhere & "and второе условие"
спрашиваем третье поле на значение
если поле пустое то ничего не делаем
если не пустое
спрашиваем strWhere на ""
если "" то strWhere присваиваем третье условие
если не пустое то strWhere = strWhere & "and третье условие"
....
....
....
спрашиваем N поле на значение
если поле пустое то ничего не делаем
если не пустое
спрашиваем strWhere на ""
если "" то strWhere присваиваем N условие
если не пустое то strWhere = strWhere & "and N условие"
Спрашиваем strWhere на ""
если "" то RowSource присваиваем значение s
если не пустое то RowSource присваиваем значение s & " Where " & strWhere & ";" | |
| |
| |
| |
|
|
| | Можете выпить, я уже выпил. Сделал все намного проще, может не умно, но проще и понятнее.
Прописал каждому комбо свой АфтерАпдейт, присвоил три переменных: саму строку с запросом, строку условий и сортировку - все работает, а большего и не надо. Тем не менее спасибо за советы | |
| |
| |
| |
|
|
| | о майн гот!
и всего-то следовало лишь выпить пива! | |
| |
| |