Поиск и ввод данных с помощью VB 6 в СУБД Access

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Юля Крюкова
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 04.11.2008 (Вт) 16:37

Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение Юля Крюкова » 04.11.2008 (Вт) 17:38

Как это водится - Хелп!!! :)
Пишу на VB 6.0
База данных - Акцесс.
Задача выглядит так:
Есть 2 формы Main (Главная) и Find (Поиск). На Главной несколько полей ввода с кнопочками справа, заполнение полей ввода хочу сделать автоматическим на основе данных полученых с помощью формы Поиска. Поиск должен быть реализован по таблицам из базы на Акцесс.
Проблемы на этом пути:
Не знаю как лучше всего организовать поиск по таблицам (таблицы в основном из 2х колонок ID и Name). Хочется на форме поиска организовать еще добавление и редактирование данных в таблицах - как бонус и чтобы все можно было делать в одном месте (если поискали и не нашли нужных данных, то тут же и добавили если такого названия нет, а хочется чтобы было).

Что пробовала и что не получилось: Пробовала сделать поиск в ListBox с помощью SendMessage - не подходит, т.к. нет возможности реализовать редактирование данных в таблице - или я не знаю как это сделать и список некрасиво листается вправо, а хочется чтобы прокрутка была вертикальная. Если использовать ListBox из компонента MS Form 2.0 - там есть вертикальная прокрутка, но там вообще эта функция (SendMessage) не фурычит или опять же не знаю как ее заставить работать. Так же ведет себя и любой DataListBox.
Короче я в панике.
Кто может чем помочь - буду очень благодарна. Мне кажется я просто не тот путь выбрала, т.к. опыта очень мало - подскажите как Вы бы это организовали. Мне кажется задача то тривиальная - и путь должен быть сто раз пройден. Подскажите пожалуйста...

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение SLIM » 04.11.2008 (Вт) 19:00

Вариантов тут конучно много. Можно поийти и путем ListView. Я допустим для осуществления поиска по ListView не использую поиск непосредственно в самом контроле, а ищу просто с рекордсета. Например если в форме поиска введен определенный ID, то ищу не в ListView а в БД Access. Так получается быстрее, да и впринципе удобно. Ну а если найдено, то уже делаешь что хочешь. По поводу редактирования. Ну опять таки есть там ListItem, а у него SubItem. То есть зная номер ListItem-а (индекс) можно исправить и его самого (ListItem - это сама первая колонка в ListView) и принадлежащие к нему SubItem-ы (все остальные, нумеруются с 1). Смотря что нужно редактировать. К сожалению нет прямого редактирования SubItem-ов, есть только если не ошибаюсь самих ListItem-ов (где-то в свойствах).
Также для данной задачи можно использовать разные гриды. Но я не пользовался, здесь советовать не буду. Мне по душе родной ListView
Пишите жизнь на чистовик.....переписать не удастся.....

Бяка
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 21.09.2005 (Ср) 21:28

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение Бяка » 04.11.2008 (Вт) 19:39

DBGrid тебе в помошь и Data1 тоже(для простоты работы)

Код: Выделить всё
Sub find(namefio As String)
Data1.Recordset.FindLast "[Name] = '" & namefio & "'"
If Data1.Recordset.NoMatch Then MsgBox "Ф.И.О. не найдено"
Text1 = Data1.Recordset.AbsolutePosition + 1
End Sub

использовать
....
Data1.DatabaseName=база аксеса ' типа-->(App.Path & "\Base\Base.mdb")
предварительно у Text2  и DBGrid1 выставить DataSource=Data1

Text2.DataField=Name
Data1.RecordSource = "select * from какаято _таблица" или так Data1.RecordSource = "select ID as [Дело №] , Name as [Фамилия Имя Отчество]  from какаято _таблица"

Data1.Refresh
....
call find ("Вася Пупкин")
....
в результате фамилия найденного пупкина выведется в Text2 и выделится строка с нам в DBGrid-е, вроде....

Юля Крюкова
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 04.11.2008 (Вт) 16:37

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение Юля Крюкова » 04.11.2008 (Вт) 20:13

DBGrid тебе в помошь и Data1 тоже(для простоты работы)

Я рассматривала, но DBGrid очень некрасиво выглядит. Первая колонка (пустая, где стрелочка рисуется, звездочка и подобная хрень во время добавления записи и т.д.) мне очень не нравится, а MS FlexGrid где можно эту колонку скрыть не устраивает тем, что там нельзя редактировать данные... Правда я не думала на тему программного редактирования, но это все как то уж очень замудрёно... как сказал один умный человек: "Люблю программирование за то что в нем можно гланды вырезать и через задницу" но не хочется в данный момент этим заниматься. Я точно такую же базу уж е один раз в Access'е написала, там как раз этим я и занималась, на VB хочу как нибудь проще и правильней что ли сделать. И опыта заодно набраться. Акцесс же не у всех стоит, а на VB можно на любой комп поставить. А вообще DATA и ADODC если сравнивать ADODC типа лучше в книжках пишут? Или на каждый конкретный случай нужно тот или другой использовать? По поводу совместимости контрлов - если раньше ADODC контролов было мало, то теперь навалом. И ADODC вроде ничем на первый взгляд не хуже...

Вариантов тут конучно много. Можно поийти и путем ListView. Я допустим для осуществления поиска по ListView не использую поиск непосредственно в самом контроле, а ищу просто с рекордсета. Например если в форме поиска введен определенный ID, то ищу не в ListView а в БД Access. Так получается быстрее, да и впринципе удобно. Ну а если найдено, то уже делаешь что хочешь. По поводу редактирования. Ну опять таки есть там ListItem, а у него SubItem. То есть зная номер ListItem-а (индекс) можно исправить и его самого (ListItem - это сама первая колонка в ListView) и принадлежащие к нему SubItem-ы (все остальные, нумеруются с 1). Смотря что нужно редактировать. К сожалению нет прямого редактирования SubItem-ов, есть только если не ошибаюсь самих ListItem-ов (где-то в свойствах).


Это звучит заманчиво, но не могли бы Вы как то более предметно, я просто только начинаю изучение VB и не все понимаю. Может пример есть какой или ссылка?

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение SLIM » 04.11.2008 (Вт) 21:36

Юля Крюкова писал(а):а MS FlexGrid где можно эту колонку скрыть не устраивает тем, что там нельзя редактировать данные...

Неверно
Юля Крюкова писал(а):Правда я не думала на тему программного редактирования, но это все как то уж очень замудрёно... как сказал один умный человек: "Люблю программирование за то что в нем можно гланды вырезать и через задницу" но не хочется в данный момент этим заниматься.

Все так замудрено всегда
Юля Крюкова писал(а):Я точно такую же базу уж е один раз в Access'е написала, там как раз этим я и занималась, на VB хочу как нибудь проще и правильней что ли сделать.

В Accesse это в VBA? Там все проще потому что VBA заточен под такие дела
Юля Крюкова писал(а):Акцесс же не у всех стоит, а на VB можно на любой комп поставить.

Это откуда такие великие знания? Для того чтобы программа работала - VB ставить не надо. А вот Access-кую программу не запустиш без Access. Но можно вполне использовать Access даже если он не установлен с VB.
Юля Крюкова писал(а):А вообще DATA и ADODC если сравнивать ADODC типа лучше в книжках пишут?

Это какие такие книги опять пишут. Они для печи-буржуйки сойдут
Юля Крюкова писал(а):Это звучит заманчиво, но не могли бы Вы как то более предметно, я просто только начинаю изучение VB и не все понимаю. Может пример есть какой или ссылка?

Так. Значится так. Сначала определись что нужно. Сначала видимо визуализировать данные. С Listview это просто.
Далее - нужно определить как искать - внутри контрола-обертки или внутри Recordset-а. Если последний вариант - то что использовать Ole, ADO, DAO и т.д?
Пишите жизнь на чистовик.....переписать не удастся.....

Юля Крюкова
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 04.11.2008 (Вт) 16:37

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение Юля Крюкова » 05.11.2008 (Ср) 21:38

Ценю что возитесь со мной. Спасибо!
Начну попорядку чтобы о моих скудных знаниях сложилось верное представление =) :
Юля Крюкова писал(а):
а MS FlexGrid где можно эту колонку скрыть не устраивает тем, что там нельзя редактировать данные...

Неверно


Поправьте меня:
Как я понимаю в MS FlexGrid данные редактировать можно, но только программно, а сам контрол служит только для отображения данных. Удобство в том, что можно более просто организовать поиск, т.к. есть встоенные методы Find и т.п. как у любого грида. Ну и еще ряд достоинств о которых пока речь не идет, т.к. задача на данный момент стоит научиться отображать данные и извлекать ссылку на ID записи.

Все так замудрено всегда


Все относительно... Все замудрено, если не знаешь ( я как раз в таком положении), а когда узнаешь все сразу вроде и не замудрено. Я думала что для конкретного случая есть очень простое решение, как я понимаю придется все таки идти путем программного извлечения и редактирования данных. Это не самое страшное. На VBA я как то же это делала - главное разобраться как это делать на VB. При беглом взгляде различие не сильное, здесь даже многие вещи можно легче сделать.

Акцесс же не у всех стоит, а на VB можно на любой комп поставить.
Это откуда такие великие знания? Для того чтобы программа работала - VB ставить не надо. А вот Access-кую программу не запустиш без Access. Но можно вполне использовать Access даже если он не установлен с VB.

Я имела ввиду что программа на VB будет работать на любом компе, даже если там Access не установлен. А с массовым переходом на OpenOffice не богатых фирм (да и богатых впринципе) т.к. оно дешевле, Access везде посносили и моя База теперь не работает. А она мне очень нужна... ну ладно это все лирика.
Это какие такие книги опять пишут. Они для печи-буржуйки сойдут

Это я прочитала в книжке под названием "Visual Basic на практике" под общей редакцией Г.М. Магданурова на стр. 222 русским по белому " ...Для работы с базой данных в Visual Basic существует специальный компонент Data (рис. 6.1), но в настоящее время этот компонент считается устаревшим и использовать его не рекомендуется." :wink: Плохая книжка, да? Ладно выкину...

Так. Значится так. Сначала определись что нужно. Сначала видимо визуализировать данные. С Listview это просто.
Далее - нужно определить как искать - внутри контрола-обертки или внутри Recordset-а. Если последний вариант - то что использовать Ole, ADO, DAO и т.д?

Да, лучше всего, как мне кажется начать с визуализации данных. Подскажите пожалуйста где взять Listview, среди стандартных контролов не вижу что то...

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение SLIM » 05.11.2008 (Ср) 22:34

Юля Крюкова писал(а):Ценю что возитесь со мной. Спасибо!

Я не вожусь. Я учусь вместе с тобой (если можно на ты конечно)
Юля Крюкова писал(а):Как я понимаю в MS FlexGrid данные редактировать можно, но только программно, а сам контрол служит только для отображения данных

Наверное разачарую если скажу что 80% контролов (если не все 95) ведут себя именно так -просто отображают что-то. Действия программирует программист. Все взаимодействие с внешней БД будет программным (впрочем также как и в VBA)
Юля Крюкова писал(а):Все относительно... Все замудрено, если не знаешь ( я как раз в таком положении), а когда узнаешь все сразу вроде и не замудрено.

Именно
Юля Крюкова писал(а):Я думала что для конкретного случая есть очень простое решение, как я понимаю придется все таки идти путем программного извлечения и редактирования данных. Это не самое страшное.

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

Смотря различие чего с чем. Опять таки пример
Юля Крюкова писал(а):Я имела ввиду что программа на VB будет работать на любом компе, даже если там Access не установлен. А с массовым переходом на OpenOffice не богатых фирм (да и богатых впринципе) т.к. оно дешевле, Access везде посносили и моя База теперь не работает. А она мне очень нужна... ну ладно это все лирика.

Еще раз повторяю. Если использовать родные Access-вские ODBC драйвера доступа к данным, то сам Access не нужен вовсе. Все необходимые средства есть в Windows. Т.е. если приложене написано на VBA - то да, ты действительно его не запустиш. Но если перенести код для обращения к данным Access на VB6, то он вообще (Access имеется в виду) не нужен. И не важно какой офис там стоит. Даже версия не важна.
Юля Крюкова писал(а):База теперь не работает. А она мне очень нужна... ну ладно это все лирика.

И здесь есть выходы кстати
Юля Крюкова писал(а):Это я прочитала в книжке под названием "Visual Basic на практике" под общей редакцией Г.М. Магданурова на стр. 222 русским по белому " ...Для работы с базой данных в Visual Basic существует специальный компонент Data (рис. 6.1), но в настоящее время этот компонент считается устаревшим и использовать его не рекомендуется." :wink: Плохая книжка, да? Ладно выкину...

Таки да. Есть такой контрол. И он действительно устарел - он просто демонстрирует элементарное использование визуализации БД. Не стоит иногда доверять книжкам. Но и ВЫКИДЫВАТЬ сразу так не стоит. Всегда есть что-то важное. Например я вот стер одну книжку - а там была ф-я так нужная мне, без которой скорость моей программы в сотни раз увеличилась.....ну это так отступление
Юля Крюкова писал(а):Да, лучше всего, как мне кажется начать с визуализации данных. Подскажите пожалуйста где взять Listview, среди стандартных контролов не вижу что то...

Действительно среди стандартных контролов нет. Данный контрол относится к семейству контролов Common Controls. Можно подключить через меню Project>>Components>>>там можно выбрать Microsoft Common Controls 6.0 и другие версии (я именно этот использую). После этого на стандартной панели ниструментов появится несколько контролов - один из которых ListView.
Пробуй, эксперементируй, будут вопросы, обращайся.
Пишите жизнь на чистовик.....переписать не удастся.....

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение alibek » 06.11.2008 (Чт) 10:09

Юля Крюкова писал(а):Я рассматривала, но DBGrid очень некрасиво выглядит. Первая колонка (пустая, где стрелочка рисуется, звездочка и подобная хрень во время добавления записи и т.д.) мне очень не нравится, а MS FlexGrid где можно эту колонку скрыть не устраивает тем, что там нельзя редактировать данные... Правда я не думала на тему программного редактирования, но это все как то уж очень замудрёно... как сказал один умный человек: "Люблю программирование за то что в нем можно гланды вырезать и через задницу" но не хочется в данный момент этим заниматься. Я точно такую же базу уж е один раз в Access'е написала, там как раз этим я и занималась, на VB хочу как нибудь проще и правильней что ли сделать. И опыта заодно набраться. Акцесс же не у всех стоит, а на VB можно на любой комп поставить. А вообще DATA и ADODC если сравнивать ADODC типа лучше в книжках пишут? Или на каждый конкретный случай нужно тот или другой использовать? По поводу совместимости контрлов - если раньше ADODC контролов было мало, то теперь навалом. И ADODC вроде ничем на первый взгляд не хуже...

Начну с конца.
ADODC и Data — это специальные компоненты, упрощающие работу с базами данных. Они позволяют подключиться к источнику данных и связывать с собой остальные элементы управления формы, после чего обновление данных и отображение этих данных на элементах управления будет осуществляться автоматически, самим контролом ADODC или Data. ADODC больше предназначен для работы через ADO, Data больше предназначен для работы через DAO.
Но у этих компонентов есть ряд ограничений и глюков, из-за которых их лучше не использовать. Лучше работать непосредственно с ADO или DAO — для связывания с данными таких элементов управления, как текстовые поля и списки, код несложный, а различные гриды умеют и сами работать непосредственно с ADODB.Recordset или DAO.Recordset.
Для отображения набора данных я бы советовал использовать ListView или какой-нибудь удобный грид (я предпочитаю Janus Grid). ListView хорош тем, что довольно простой и с ним легко работать, но загружать данные нужно будет вручную (построчно), он не умеет сам связываться с источником данных. FlexGrid хорош для отображения, но если требуется редактирование данных непосредственно в гриде, то его не советую, слишком много кода потребуется, чтобы добавить "возможность" редактирования. Лучше использовать DataGrid (но у него мало возможностей по программированию поведения и внешнего вида) или коммерческий грид типа Janus Grid.
Я бы советовал использовать грид или ListView для отображения, а редактирование элементов сделать в отдельной форме или фрейме. Примерно как показано на рисунке в аттаче: на первом рисунке форма в режиме отображения элементов, при добавлении элемента или его изменении она автоматически переключается в режим редактирования.
Вложения
dataform.gif
Пример формы для отображения и редактирования.
(26.44 Кб) Скачиваний: 238
Lasciate ogni speranza, voi ch'entrate.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение SLIM » 06.11.2008 (Чт) 21:30

alibek писал(а):Лучше работать непосредственно с ADO или DAO

Да
alibek писал(а):ListView хорош тем, что довольно простой и с ним легко работать, но загружать данные нужно будет вручную (построчно)

ДА
alibek писал(а):Я бы советовал использовать грид или ListView для отображения, а редактирование элементов сделать в отдельной форме или фрейме.

Дааааа
alibek писал(а):при добавлении элемента или его изменении она автоматически переключается в режим редактирования.

Да дА да и еще раз да.
alibek если ты так действительно считаеш, то я только могу сказать - я не зря пришел на форум.
Пишите жизнь на чистовик.....переписать не удастся.....

Юля Крюкова
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 04.11.2008 (Вт) 16:37

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение Юля Крюкова » 07.11.2008 (Пт) 20:40

to alibek and SLIM - большое спасибо за помощь. Перевариваю полученую информацию и пытаюсь реализовать на практике. :drunken:

Юля Крюкова писал(а):
База теперь не работает. А она мне очень нужна... ну ладно это все лирика.
И здесь есть выходы кстати

SLIM, а подробнее про выход можешь рассказать.
Давай на ты, ОК? :0)

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение SLIM » 08.11.2008 (Сб) 0:45

Юля Крюкова писал(а):SLIM, а подробнее про выход можешь рассказать.

НУ наверное ты не верно меня поняла.
Я хотел сказать следующее. К БД Access ты обращаешься с помощью инструментов доступа к данным. Их несколько. Я использую в основном ADO. Так вот для того чтоьы например "взять" что-то из БД нужно "присоединиться" к БД (Connection string) и открыть какие-то записи из таблицы, ну или еще что-то использовать (обычный Recordset напрмер). Так вот. Я отошел от темы. Обращение к базе данных происходит с помощью провайдера (помоему его еще называют драйвером) Так вот для обращения к БД Access используется OLEDB 4.0 Jet (ну это так на память, точно не помню). Таким же образом происходит подключения и к другим видам баз данных (FoxPro например). У них свои драйвера. Так вот именно драйвер Access уже как бы встроен в Windows. Поэтому если ты хочешь использовать БД Access в программе VB, то сам Access и иметь не нужно совсем. Понимаешь о чем я.
А теперь о том что ты процетировала (по поводу выхода). Выход в следующем - не имея Access можено всетки запускать программы используя Run Time-ы. Я никогда так не делал, поэтому и учить не буду. Но точно знаю что возможно создать псевдо-приложение из Access. И подразумеваю что это кривой способ. Опять таки не берусь ничто утверждать.
Вот тебе и весь способ. Т.е. плюс ко всему нужно изучить основы доступа к данным....
Пишите жизнь на чистовик.....переписать не удастся.....

Юля Крюкова
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 04.11.2008 (Вт) 16:37

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение Юля Крюкова » 09.11.2008 (Вс) 20:15

Доброго всем времени суток!

Спасибо всем что подсказали воспользоваться ListItem - очень клевая штука. Есть ряд вопросов по отображению с помощью него данных, помогите разобраться, пожалуйста.
В основном вопросы связаны со свойствами ListItem и синтаксисом Set .
Заранее спасибо.

Вопросы я закомментировала в коде:
Код: Выделить всё
'code_vb
Private Sub Form_Load()
Dim i As Integer
Dim lst As ListItem
Dim lsi As ListSubItem
Dim j As Integer

With Me.ListView1
    .Appearance = ccFlat
    .AllowColumnReorder = False 'Объясните, пожалуйста, что это за свойство.
    .BorderStyle = ccNone
    .Checkboxes = True
    .FlatScrollBar = True 'Это свойство тоже не понятно.
    .FullRowSelect = True
    .GridLines = False
    .HideSelection = True ' И про это, если не трудно..
    .HotTracking = False ' И это не понятно...
    .HoverSelection = True 'Это прикольное свойство, но вопрос - можно ли цвет выделения менять?
    .LabelWrap = True ' Это тоже не понятно.
    .LabelEdit = lvwAutomatic ' Не понятно чем от lvwManual отличается, подскажите, плиз.
    .MultiSelect = False
    .Sorted = False ' Сортирует как текст, а по другому можно?
    .View = lvwReport ' Вот это мне больше всего понравилось!!! :) Тут все понятно. :)
   
    For i = 0 To 3
        .ColumnHeaders.Add , "header" & i, "Header " & i
    Next

    i = 0
    For i = 0 To 10
        Set lst = .ListItems.Add(, "item" & i, "Item " & i) 'Это присваивание ключей и значений ListItem-ов стандартное или есть какой то еще метод? И вообще эта синтаксическая конструкция с set и присваиванием некого сложного значения переменной, объявленой ранее (в данном случае как Dim lst as ListItem) где применяется? Много где видела, но как читать правильно до конца не понимаю?
           
        For j = 1 To .ColumnHeaders.Count
            Set lsi = lst.ListSubItems.Add(, lst.Key & "_subitem" & j, "SubItem " & j)
        Next
       
    Next

End With

End Sub

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение Alexanbar » 09.11.2008 (Вс) 22:32

Код: Выделить всё
Set lst = .ListItems.Add(, "item" & i, "Item " & i) 'Это присваивание ключей и значений ListItem-ов стандартное или есть какой то еще метод? И вообще эта синтаксическая конструкция с set и присваиванием некого сложного значения переменной, объявленой ранее (в данном случае как Dim lst as ListItem) где применяется? Много где видела, но как читать правильно до конца не понимаю?
           


Метод Add - Стандартный. Так добавляются новые элементы списка в Listview. Можно не писать вначале слово Set и не присваивать листайтему ключей. Но лучше это сделать, так как ключ у элемента списка уникальный, а индекс элемента меняется, в частности, при добавлении-удалении других элементов, либо, при изменении правила сортировки.
Для чего пишут Set lst = ......

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

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение SLIM » 10.11.2008 (Пн) 0:21

Ну половина свойств (наверное даже не половина - все, кроме одного из тех которые ты указала) я вообще не использую за ненадобностью. Если бы встала задача - наверное я бы использовал. Ни у меня ни у тебя такой задачи нет. Если чисто для интереса - попробуй найди документацию к данному контролу.
По поводу Set....
Код: Выделить всё
Dim lst as ListItem
Set lst = .ListItems.Add(, "item" & i, "Item " & i)

А теперь например можно добавить SubItem так
Код: Выделить всё
lst.SubItem(1) = "привет Юлия Крюкова"

и так для всех SubItem-ов.
Во всем остальном выкладываю тебе в помощь интересные вещи....скачанные откуда-то когда-то
Вложения
ListView,TreeView,.rar
(227.12 Кб) Скачиваний: 260
Пишите жизнь на чистовик.....переписать не удастся.....

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение iGrok » 10.11.2008 (Пн) 0:29

.AllowColumnReorder = False 'Объясните, пожалуйста, что это за свойство.
Разрешать менять местами колонки (по-моему, перетаскиванием).

.FlatScrollBar = True 'Это свойство тоже не понятно.
"Плоские" полосы прокрутки.

.HideSelection = True ' И про это, если не трудно..
При неактивном компоненте (когда он не в фокусе) скрывается выделение (вместо того, чтобы стать серым).

.LabelWrap = True ' Это тоже не понятно.
В режиме "иконок" включает переносы строк в подписях.

.LabelEdit = lvwAutomatic ' Не понятно чем от lvwManual отличается, подскажите, плиз.
В режиме иконок позволяет менять подписи двойным кликом мыши, или по F2. Если manual - нужно специально включать редактирование кодом.
label:
cli
jmp label

Юля Крюкова
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 04.11.2008 (Вт) 16:37

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение Юля Крюкова » 12.11.2008 (Ср) 22:12

SLIM писал(а):Вариантов тут конучно много. Можно поийти и путем ListView. Я допустим для осуществления поиска по ListView не использую поиск непосредственно в самом контроле, а ищу просто с рекордсета. Например если в форме поиска введен определенный ID, то ищу не в ListView а в БД Access. Так получается быстрее, да и впринципе удобно. Ну а если найдено, то уже делаешь что хочешь.


Я пошла путем ListView - очень удобный контрол, в VBA это все гораздо сложнее было бы. Расскажи как в общем должен правильно организовываться поиск. Если можешь, то лучше оба способа: в ListView и с рекордсета. Если есть пример - не откажусь. Я пыталась сделать поиск сначала в листвью, но видимо не правильно что то указываю и курсор не переходит на нужную мне строку. Можно, как мне кажется, сделать еще поиск через фильтр (я пока не вникала в технологию как это исполнить, но это уже второй вопрос) или просто сделать запрос и отобразить результат в ЛистВью. Вариантов много, но хочется самый лучший. Какой он? :?:

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение iGrok » 13.11.2008 (Чт) 0:17

Юля Крюкова писал(а):Я пошла путем ListView - очень удобный контрол, в VBA это все гораздо сложнее было бы. Расскажи как в общем должен правильно организовываться поиск. Если можешь, то лучше оба способа: в ListView и с рекордсета. Если есть пример - не откажусь. Я пыталась сделать поиск сначала в листвью, но видимо не правильно что то указываю и курсор не переходит на нужную мне строку. Можно, как мне кажется, сделать еще поиск через фильтр (я пока не вникала в технологию как это исполнить, но это уже второй вопрос) или просто сделать запрос и отобразить результат в ЛистВью. Вариантов много, но хочется самый лучший. Какой он? :?:

Не помню, чего там с листвью.. Но по-моему правильнее будет так:
1. Найти через Recordset.Find("ИМЯ_КОЛОНКИ = ИСКОМОЕ ЗНАЧЕНИЕ")
2. Проверить, то ли нашлось, посмотрев на текущую запись рекордсета.
3. Выбирать в ListView запись с найденным ID.

М.б. поиском в листвью..
Во вложении. )
Вложения
lv.rar
набросал за пару минут
(1.63 Кб) Скачиваний: 207
label:
cli
jmp label

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение SLIM » 13.11.2008 (Чт) 10:31

Юля Крюкова писал(а):Я пошла путем ListView - очень удобный контрол, в VBA это все гораздо сложнее было бы. Расскажи как в общем должен правильно организовываться поиск. Если можешь, то лучше оба способа: в ListView и с рекордсета. Если есть пример - не откажусь. Я пыталась сделать поиск сначала в листвью, но видимо не правильно что то указываю и курсор не переходит на нужную мне строку. Можно, как мне кажется, сделать еще поиск через фильтр (я пока не вникала в технологию как это исполнить, но это уже второй вопрос) или просто сделать запрос и отобразить результат в ЛистВью. Вариантов много, но хочется самый лучший. Какой он?

Но вообще не рекомендую делать поимк в самом контроле. При большом количестве данных тормоза жуткие будут. Это ведь всего лишь удобная обертка. Я на такие грабли уже наступал. По поводу рекордсета. Тут принцип следующий(Как один из вариантов):
Допустим при Ctrl+F у тебя выходит форма поиска. Там указывается поле поиска, что собственно искать (ну можно даже на примере того же Accessa сделать). Далее нужно открыть рекордсет с параметром (то что ввела в поиске), если записей нет (RecordCount, но тока он работает при клиентском курсоре), то ничего не найдено, если записи есть, то....что-то там.
Второй вариант - использовать Find либо Filter. Но тогда тебе нужно держать открытым рекордсет, да и плюс к тому же нужно будет например при Filter "сбрасывать его на 0" после каждого поиска.
Еще можно.....да много что можно. Тут простор для фантазий - но я выбираю один из приведенных способов.
Еще очень важно разработать функционал вывода найденых значений. Либо они будут выводиться в список, в котором были все записи (тут проблемней), либо они будут просто подсвечиваться, либо будет выходить диалог редактирования, либо....в общем подумай прежде чем делать, иначе потом переписывать придется.
Пишите жизнь на чистовик.....переписать не удастся.....

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение alibek » 13.11.2008 (Чт) 10:56

SLIM, не говори глупости. Ты не понял ответ iGrok, он поиск осуществляет в рекордсете, а не в ListView.
Lasciate ogni speranza, voi ch'entrate.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение iGrok » 13.11.2008 (Чт) 12:36

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

Вообще, после раздумий, наиболее правильным вариантом(имхо) при использовании ListView будет примерно следующее:

1) Вытащить нужную инфу в рекордсет.
2) Отобразить её в листвью, при добавлении записей Key у ListItem для текущей строки строить на основе ID записи из рекордсета. (либо номера записи(сомневаюсь что-то я на этот счёт), либо, что точно правильно, ключевого поля БД)
3) При поиске, найти нужную запись в рекордсете (см. мой пост выше) и выбрать её в листвью по ключу. ( LIstView.LisItems(Key).Selected=True ).

Ну а для больших объёмов записей (к примеру > 10000, а то и > 1000), лучше уже оставить в покое листвью, и использовать нормальные гриды.

2SLIM:
Find и Filter - проще и быстрее, чем гонять SQL-запросы на каждый поиск записи. Впрочем, всё зависит от предполагаемого кол-ва записей в таблице. Если у тебя табличка на 5млн записей - то SQL-запросы будут лучше и быстрее.
label:
cli
jmp label

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение SLIM » 13.11.2008 (Чт) 13:31

alibek писал(а):SLIM, не говори глупости. Ты не понял ответ iGrok, он поиск осуществляет в рекордсете, а не в ListView.

Я если честно пример не смотрел. Поэтому просто мнение высказывал. В чем глупость конкретно то?
iGrok писал(а):2SLIM:
Find и Filter - проще и быстрее, чем гонять SQL-запросы на каждый поиск записи. Впрочем, всё зависит от предполагаемого кол-ва записей в таблице. Если у тебя табличка на 5млн записей - то SQL-запросы будут лучше и быстрее.

Возможно и так. Не возможнол а так. Просто я обычно отбираю данные и потом с ними много работаю, что-то делаю - и тут уместно использовать SQL-ки. В поиске возможно и через Find и Filter. А по поводу количества записей я говорил уже не раз. Это этого многое зависит...Кстати большой плюч Filtеr-а в том что можно всегда вернуть первоначальное значение RecordSet-a - а это в данном случае будет очень полезно (ну если конечно итог поиска будет в том же списке отображаться)
Пишите жизнь на чистовик.....переписать не удастся.....

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение alibek » 13.11.2008 (Чт) 13:42

SLIM писал(а):Я если честно пример не смотрел. Поэтому просто мнение высказывал. В чем глупость конкретно то?

Но пост то читал?
iGrok предлагает при загрузке указывать элементам ключи, при поиске использовать Find и получать доступ к элементу по ключу.
В отличии от твоего ответа, в котором ты так и не предложил способа, чтобы найденный элемент отыскать в списке ListView.
Lasciate ogni speranza, voi ch'entrate.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение SLIM » 13.11.2008 (Чт) 15:25

Но пост то читал?
iGrok предлагает при загрузке указывать элементам ключи, при поиске использовать Find и получать доступ к элементу по ключу.
В отличии от твоего ответа, в котором ты так и не предложил способа, чтобы найденный элемент отыскать в списке ListView.

мммм....да. Действительно. Не предложил.
Пишите жизнь на чистовик.....переписать не удастся.....

Юля Крюкова
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 04.11.2008 (Вт) 16:37

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение Юля Крюкова » 15.11.2008 (Сб) 10:31

Доброго времени суток!
Пытаюсь реализовать поиск в ListView, а Неведомые силы пытаются разрушить мне мозг. :twisted:

Стопорнулась на моменте непосредственно поиска. На сайте более менее подходящая ссылка есть http://bbs.vbstreets.ru/viewtopic.php?f=1&t=7962&p=46039&hilit=listitem.finditem#p46039, но там вопрос не раскрыт (ИМХО).

Основная загвоздка в методе FindItem. В примере от iGrok все работает как часы, но когда пытаюсь перенести на свои данные - ничего не находит.
Думаю, что если выкладывать сюда весь мой код - будет не совсем понятно и вообще, тем более что данные я подгружаю из базы. Поэтому проще всего, как мне кажется, поговорить на тему метода .FindItem и понять че он делает в различных жизненных ситуациях.

Итак:
Dim itm as ListItem
Set itm = ListView1.FindItem(sz as Sting, [Where],[Index],[fPartial]),
где sz as Sting - значение для поиска типа String, здесь вроде все понятно.
Дальше начинаются не до конца прозрачные вещи:
[Where] - может принимать значения lvwSubItem, lvwTag, lvwText и наверно что то еще... Вопрос - какое значение по умолчанию? И как вообще это можно применить? Например, если хочу поискать по столбцу не с ListItem, а с ListSubItem.

[Index] - с какого элемента начинаем поиск - имеют индекс у нас толко ListItem'ы, в отличие от SubItem'ов, соответственно как правило это значение =1, т.е. поиск начинаем с первого элемента. По умолчанию видимо это значение = 1. Поправьте меня, если я не права.

[fPartial] - ваще не понятно что это, у iGrok это равно "1", обратите внимание, [fPartial] - это строковой выражение (?). Объясните, пожалуйста, что это?
Если есть примеры, не откажусь никогда :), ибо так в 100 раз понятнее.
Спасибо!

Юля Крюкова
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 04.11.2008 (Вт) 16:37

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение Юля Крюкова » 15.11.2008 (Сб) 11:32

Я еще поковырялась и поняла, что поиск работает, а не работает строка lstFind.ListItems(itm.Index).Selected = True, не показывает и все тут найденную запись. От чего это может зависеть? Код поиска и отображения формы привожу ниже. На форме есть adodcFind, txtFind, lstFind,cmdFind

Код: Выделить всё
Private Sub cmdFind_Click()
Dim itm As ListItem
    Set itm = lstFind.FindItem(txtFindValue.Text)
    If Not itm Is Nothing Then
        Debug.Print itm.Text
        lstFind.ListItems(itm.Index).Selected = True
    End If
End Sub


Код: Выделить всё
Private Sub Form_Activate()
Dim i As Long
Dim lst As ListItem
Dim lsi As ListSubItem
Dim intColumnWidthText As Integer
Dim intColumnWidthAPI As Integer
'Внешний вид
With Me.lstFind
    .AllowColumnReorder = True
    .BorderStyle = ccNone
    .Checkboxes = False
    .FlatScrollBar = False
    .FullRowSelect = True
    .GridLines = True
    .LabelEdit = lvwManual
    .MultiSelect = False
    .Sorted = False
    .View = lvwReport

    ' Именую заголовки
    .ColumnHeaders.Add , , "Заголовок 1"
    .ColumnHeaders.Add , , "Заголовок 2"

     'Загружаю данные в ListView   
    adodcFind.Refresh
    adodcFind.Recordset.MoveFirst
    For i = 1 To adodcFind.Recordset.RecordCount
        Set lst = .ListItems.Add(, , i)
        Set lsi = lst.ListSubItems.Add(, "ID" & adodcFind.Recordset.Fields(0).Value, adodcFind.Recordset.Fields(1).Value)
        adodcFind.Recordset.MoveNext
    Next

    'Выравниваю колонки или по ширине текста заголовка или по ширине текста самого длинного поля   
    For i = 0 To .ColumnHeaders.Count - 1
        intColumnWidthText = CInt(TextWidth(.ColumnHeaders(i + 1).Text) + 14 * 15)
        SendMessage .hwnd, LVM_SETCOLUMNWIDTH, i&, LVSCW_AUTOSIZE
        intColumnWidthAPI = .ColumnHeaders(i + 1).Width
       
        If intColumnWidthText >= intColumnWidthAPI Then
            .ColumnHeaders(i + 1).Width = intColumnWidthText
        Else
            .ColumnHeaders(i + 1).Width = intColumnWidthAPI
        End If
    Next
   
End With
End Sub

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение iGrok » 15.11.2008 (Сб) 16:17

А может быть, дело в .HideSelection = True? (оно такое по умолчанию)

fPartial - поиск по частичному совпадению строки. Если не задано, или 0 - по идее будет искать только полное совпадение.

З.Ы. Если честно, пример рисовал "на коленке", про FindItem узнал за полчаса до написания примера. Поэтому о значении параметров могу делать только предположения )
label:
cli
jmp label

Юля Крюкова
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 04.11.2008 (Вт) 16:37

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение Юля Крюкова » 15.11.2008 (Сб) 17:25

iGrok писал(а):А может быть, дело в .HideSelection = True? (оно такое по умолчанию)



ДА!!!! Ура! Все дело в .HideSelection!!! Для отображения данных должно быть .HideSelection = False

fPartial - поиск по частичному совпадению строки. Если не задано, или 0 - по идее будет искать только полное совпадение.

З.Ы. Если честно, пример рисовал "на коленке", про FindItem узнал за полчаса до написания примера. Поэтому о значении параметров могу делать только предположения )


А ты поставил "1" чтобы по первому знаку искало или...?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение iGrok » 15.11.2008 (Сб) 18:09

Юля Крюкова писал(а):
iGrok писал(а):А может быть, дело в .HideSelection = True? (оно такое по умолчанию)



ДА!!!! Ура! Все дело в .HideSelection!!! Для отображения данных должно быть .HideSelection = False

fPartial - поиск по частичному совпадению строки. Если не задано, или 0 - по идее будет искать только полное совпадение.

З.Ы. Если честно, пример рисовал "на коленке", про FindItem узнал за полчаса до написания примера. Поэтому о значении параметров могу делать только предположения )


А ты поставил "1" чтобы по первому знаку искало или...?

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

З.Ы. Нету. 0 - полное совпадение, 1 - частичное(с любой частью строки). Вот описание:
http://msdn.microsoft.com/en-us/library/aa443432(VS.60).aspx
label:
cli
jmp label

Юля Крюкова
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 04.11.2008 (Вт) 16:37

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение Юля Крюкова » 15.11.2008 (Сб) 18:49

iGrok - Спасибо за ссылку! Я никак научиться не могу по MSDN искать... :oops: Добавила в избранное :D

Кто знает как сделать чтобы до выбранной надписи автоматически прокручивало? Если найденное значение за пределами окошка ListView курсор перемещается, а на экране не видно, приходится руками ScrollBar крутить.
Заранее спасибо! :)

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Поиск и ввод данных с помощью VB 6 в СУБД Access

Сообщение iGrok » 15.11.2008 (Сб) 20:05

Юля Крюкова писал(а):Я никак научиться не могу по MSDN искать... :oops: Добавила в избранное :D

Хм.. Вообще это было первой ссылкой в Гугле по запросу FindItem+ListView =)

На второй вопрос гугль говорит:
"ListView.SelectedItem.EnsureVisible"

З.Ы. Опять же первой ссылкой по запросу "ListView+scroll" =)
З.З.Ы. Добавь в "избранное" гугль. Полезная штука. )
З.З.З.Ы. На всякий случай =) Сразу не заметил..
Debug.Print itm.Text
можно прибить. Эта строка выводит найденный текст в Immediate Window. Добавлено было потому, что у меня тоже стояло .HideSelection = True, и я проверял, ищет он элемент, или нет. )
label:
cli
jmp label

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 67

    TopList