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

Форум: MS ACCESS

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

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

 
 

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

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

тема: наименования столбцов произвольной таблицы
 
 автор: joka   (08.02.2010 в 09:10)   личное сообщение
 
 

Помогите решить (или хотя бы подскажите в каком направлении смотреть) следующую задачу.
Необходимо на форме дать пользователю осуществить выбор из существующих таблиц (эту часть легко решить используя MSysObjects, сделав выборку столбца Name с необходимыми условиями из этой таблицы источником для поля со списком), а после выбора таблицы пользователю необходимо предоставить наименования всех столбцов выбранной таблицы чтобы он смог отметить необходимые (например через флажки). После чего надо сохранить именования столбцов которые выбрал пользователь, например св строковую переменную по нажатию кнопки "ОК"...
Вторую часть не понимаю как решить, ясно что взяв имя таблицы можно получать имена всех ее столбцов а вот как это отобразить на форме не понимаю что то а еще надо и дать возможность выбора пользователю???

подскажите как это сделать...

  Ответить  
 
 автор: Denis V.   (08.02.2010 в 09:40)   личное сообщение
 
 

Копать в направлении объекта Table (в поиске справочной системы). Пробежавшись по всем полям экземпляра объекта Table, полученного от выбранной таблицы, можно заполнить список на форме. Список может быть с возможностью множественного несвязанного выбора. Конечно, не галочки ставить, но уже кое-что. Вообще, я бы сделал два списка: один, это который со всеми полями, а в другой бы переносил выбранные пользователем поля, как в большинстве мастеров это сделано.

  Ответить  
 
 автор: joka   (08.02.2010 в 09:53)   личное сообщение
 
 

а примера у вас нигде не завалялось случайно:)?

  Ответить  
 
 автор: kot_k_k   (08.02.2010 в 10:00)   личное сообщение
 
 

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

  Ответить  
 
 автор: joka   (08.02.2010 в 10:03)   личное сообщение
 
 

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

  Ответить  
 
 автор: kot_k_k   (08.02.2010 в 11:15)   личное сообщение
 
 

есть стандартный поиск

  Ответить  
 
 автор: joka   (08.02.2010 в 11:25)   личное сообщение
 
 

поподробнее? что вы имеете ввиду под стандартным поиском?

  Ответить  
 
 автор: kot_k_k   (08.02.2010 в 11:31)   личное сообщение
 
 

в форме по нажатию Ctrl+F - выскочит формочка "Найти"
может проще открывать нужную таблу a форме и дальше пусть ищут сами что хотят

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

то есть под каждую таблицу надо нарисовать свою форму... не катит...

  Ответить  
 
 автор: kot_k_k   (08.02.2010 в 12:43)   личное сообщение
 
 

сделайте без всяких форм

DoCmd.OpenTable имяТаблицы [, режим] [, режимДанных]

Метод OpenTable выполняет макрокоманду ОткрытьТаблицу (OpenTable) в программе Visual Basic. Подробное описание макрокоманды и ее аргументов см. в разделе справки о макрокоманде.

  Ответить  
 
 автор: kot_k_k   (08.02.2010 в 12:58)   личное сообщение
 
 

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

  Ответить  
 
 автор: Denis V.   (08.02.2010 в 10:35)   личное сообщение
 
 

Все примеры в справочной системе имеются, или на сайте (как подсказывают старшие товарищи :-)). Если что конкретное не будет получаться, тогда спросите и подскажем. ;-)

  Ответить  
 
 автор: Explorer   (08.02.2010 в 12:27)   личное сообщение
46 Кб.
 
 


Вообще, я бы сделал два списка: один, это который со всеми полями, а в другой бы переносил выбранные пользователем поля



и еще нужен комбо бокс для выбора таблицы

  Ответить  
 
 автор: joka   (08.02.2010 в 14:09)   личное сообщение
 
 

выбор полей произвольной таблицы реализовал так

http://slil.ru/28612804

  Ответить  
 
 автор: Explorer   (08.02.2010 в 14:14)   личное сообщение
 
 

а сюда что - аттачем не помещается?

  Ответить  
 
 автор: joka   (08.02.2010 в 14:20)   личное сообщение
 
 

что то не захотело:) 268 Кб. за идею спасибо. теперь надо придумать куда результаты деть:)

  Ответить  
 
 автор: Explorer   (08.02.2010 в 14:25)   личное сообщение
 
 

результаты (все) можно хранить в локальной таблице "favorites" или "layouts" - сохранять по запросу пользователя, или не хранить, или хранить только последний...

  Ответить  
 
 автор: joka   (08.02.2010 в 14:31)   личное сообщение
 
 

так число столбцов будет произвольным. я думаю от 1 до 5-ти 6-ти, как правильно тогда создавать таблицу?

  Ответить  
 
 автор: Explorer   (08.02.2010 в 15:49)   личное сообщение
 
 

SchemeID - идентификатор схемы запроса (может быть автономер или что угодно еще)
PartitionID - идентификатор места применения (в каком контексте применяется схема)
SchemeName - название схемы - дает сам пользователь "фильтр-список поставщиков по типу"
Statement - сохраненное в таблице SQL выражение запроса SELECT * FROM tblCustomers WHERE InustryCode = "строители"
CreatedBy - Get UserName
CreatedOn - дата создания сохраненного запроса

возможны разные варианты... отмечу что речь идет не о таблице а о представлении

  Ответить  
 
 автор: osmor   (08.02.2010 в 10:34)   личное сообщение
 
 

http://hiprog.com/index.php?option=com_content&task=view&id=437

  Ответить  
 
 автор: joka   (08.02.2010 в 14:18)   личное сообщение
 
 

а теперь и встал вопрос как грамотно вывести результаты поиска по этим полям, как и написал ранее kot_k_k... что ту посоветуете умные головы??? отчет собрать как нибудь или еще как нибудь?

  Ответить  
 
 автор: kot_k_k   (08.02.2010 в 15:09)   личное сообщение
 
 

вариантов несколько - вот только что дальше пользователь будет делать?

1. на форму собрать в строку "Название столбца " + "содержание" - скрыто держим поле с кодом записи - юзер выбирает понравившееся - переходим на него -> обрабатываем....

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

3. можно откырть таблу в ленточной форме - с фильтром по собраным полям - работай юзер....

  Ответить  
 
 автор: joka   (08.02.2010 в 15:32)   личное сообщение
 
 

ну вот форма примерно такая у меня будет
http://slil.ru/28613242

наверно вариант три подошел бы, только пока не понимаю как создать заранее такую форму в которой неизвестно сколько полей...

  Ответить  
 
 автор: joka   (08.02.2010 в 15:37)   личное сообщение
 
 

то есть сделать подчиненную ленточную форму пустую как бы, а после того как юзер все выбрал выставить, усточником строк - выбранную таблицу а все выбранные столбцы впихать в фильтр? правильно я понял?

тогда все равно не понимаю как на данной форме появятся нужные мне текстовые поля?
откырть таблу в ленточной форме - это как? что то туплю:(

  Ответить  
 
 автор: Explorer   (08.02.2010 в 15:52)   личное сообщение
 
 


откырть таблу в ленточной форме - это как? что то туплю:(



не в ленточной а в табличной - почувствуй разницу

  Ответить  
 
 автор: kot_k_k   (08.02.2010 в 16:04)   личное сообщение
 
 

1. Explorer - прав, протупил, дурной день сегодня.

2. ты хочешь обойтись одной формой. Выбирая ее источником однй из любого кол-ва таблиц - задачка даже для неНачинающего.

3. Самый простой вариант :
- создаешь Таблу (назовем TMP_Запрос) с полями Название_Поля, Содержание_Записи, Код_Записи /добавить что еще нужно по вкусу/
- на основании этой таблы делаешь форму любого вида.
- при нажатии кнопки Найти/Поиск/Посмотреть - из твоей формы с выборкой происходит следующее:
- обнуляем таблу TMP_Запрос, запросом/программно ее заполняем, открываем форму на оновании созданной таблы - дальше юзер работает с полученными результатами.

самое простое - открыть юзеру таблу с фильтром и все. но так не кошерно.
да и давать юзеру доступ к таблице которая хуже контролируется чем форма - наживать себе бесплатно гемор.

  Ответить  
 
 автор: Explorer   (08.02.2010 в 16:15)   личное сообщение
 
 


обнуляем таблу TMP_Запрос, запросом/программно ее заполняем



не надо временной таблицы - это незачем.

нужно сохранить шаблонную болванку запроса qryUserData "по умолчанию" и потом программно менять в ней текст запроса (самого SQL выражения)

  Ответить  
 
 автор: kot_k_k   (08.02.2010 в 16:27)   личное сообщение
 
 


нужно сохранить шаблонную болванку запроса qryUserData "по умолчанию" и потом программно менять в ней текст запроса (самого SQL выражения)



а вот с этого места по подробней, с шаблонами не работал - могу не знать - открой очи мне, о Исследователь

  Ответить  
 
 автор: joka   (08.02.2010 в 16:30)   личное сообщение
 
 

да уж вот себе придумал задачу:) надо было нарисовать 20 формочек для поиска для каждой таблицы.... хм...

может покажете пример мне в моей простой базе? второй пример базы я выложил чуть выше ...

  Ответить  
 
 автор: kot_k_k   (08.02.2010 в 16:45)   личное сообщение
 
 

или имел в виду создаем запрос на основании одной из табл:


"select naimen as Выражение1, kol_vo as Выражение2, Data_1 as Выражение3 from Spisok"


на основании его делаем форму и програмно меняем текст запроса

  Ответить  
 
 автор: Explorer   (08.02.2010 в 16:53)   личное сообщение
 
 


на основании его делаем форму



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

  Ответить  
 
 автор: kot_k_k   (08.02.2010 в 17:11)   личное сообщение
 
 

ну я обычно использую временные таблы для редактирования/ввода с последующей перезаливкой в основные, поэтому и написал.

  Ответить  
 
 автор: joka   (09.02.2010 в 09:20)   личное сообщение
 
 

в итоге решил так, после всех выборов пользователя собрал строчку SELECT'a и использовал данную выборку в конструкции SELECT * INTO tmp_tab FROM собранный_запрос

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

  Ответить  
 
 автор: Explorer   (09.02.2010 в 09:27)   личное сообщение
 
 


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



временные таблицы делай во временных БД - не плоди мусор в основной - рабочей

  Ответить  
 
 автор: Explorer   (09.02.2010 в 09:33)   личное сообщение
 
 


на основании его делаем форму и програмно меняем текст запроса



именно это я и сказал - только форму делать не надо

  Ответить  
 
 автор: joka   (09.02.2010 в 10:50)   личное сообщение
 
 

а чем принципиально отличается создание\удаление временной таблицы от постоянного наличия болванки запроса в которой программно меняется sql-код???

да кстати а как отредактить в коде вба sql текст запроса?

  Ответить  
 
 автор: joka   (09.02.2010 в 11:14)   личное сообщение
 
 

Explorer я правильно понял вас что вы имели ввиду что то типа

sqlstr = "select " & str & " from " & ПолеСоСписком0.Text
Set qs = CurrentDb.QueryDefs("q")
qs.SQL = sqlstr
DoCmd.OpenQuery "q", , acReadOnly

  Ответить  
 
 автор: Explorer   (09.02.2010 в 12:20)   личное сообщение
 
 


что вы имели ввиду что то типа



есть разные способы - в хелпе все подробно расписано для DAO для ADO.
можно например глянуть сюда: Build SQL Statements That Include Variables and Controls

текст запроса можно хранить в служебной таблице "сохраненных запросов пользователя"

плюс будет в том, что системных объектов (в частности сохраненных запросов в БД) будет определенное нормированное количество и следовательно

не придется разгребать завалы запросов сохраненных пользователем
и тщательно контролировать пространство имен объектов в разных БД

кроме того, тексты сохраненных запросов можно сделать общедоступными - дав пользователям права доступа к таблицам-хранилищам запросов и лэйаутов.

что касается временных таблиц в БД - если ты часто сохраняешь удаляешь данные во временных таблицах или создаешь удаляешь сами таблицы - БД пухнет и появляется отнюдь не нулевой шанс вымучить себе какой-нибудь сбой либо при работе с данными либо при обслуживании БД

если ты вынужден создавать временные таблицы - например для ускорения работы с данными или работы с агрегированными данными из основных таблиц (разные варианты - агрегированные аналитические данные за прошлые периоды, OLAP кубы, варианты решений и т.п.)

создавай такие таблицы во временных БД - создаешь временную БД, создаешь в ней таблицы, потом все удаляешь по окончании работы (тут есть несколько важных моментов связанных с безопасностью данных)

------------
да, а еще это подходит для MDE

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