Complex Data Binding

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Complex Data Binding

Сообщение tyomitch » 08.09.2004 (Ср) 18:21

Мне нужен грид. Он должен привязываться к базе, и отображать её особым (не 1-в-1 поле-в-ячейку) образом.
Я прикрутил флексгрид, и заполняю его из рекордсета. Красиво и хорошо.
Встал вопрос - как синхронизировать содержимое моего грида с базой. У меня на форме Master/Details view, и изменения, внесённые в Details, должны тут же отображаться в гриде.
Сейчас я перезаполняю весь грид в Data1_Reposition. Это некрасиво и медленно.
Есть слухи, что мои проблемы решаются с помощью сабжа. Кто-нибудь им пользовался, или хотя бы знает, как им пользоваться?
Если есть другие решения, буду рад услышать.
На чужие, особенно ворованные, гриды - буду переходить с большой неохотой. Хочется, чтобы был свой.
Изображение

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

Сообщение alibek » 09.09.2004 (Чт) 8:50

Свой... Грид эта такая штука, понимаш... :)
С базами данных лучше всего работает, ИМХО, TrueDB Grid. Но помоему Access для этих целей был бы гораздо удобнее. Может перейдешь на него?
Lasciate ogni speranza, voi ch'entrate.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 09.09.2004 (Чт) 9:53

Н-да, должен признаться, что только слышал. Как-то раз решил просто сваять тестовый проект, чтобы посмотреть, шо це такэ, но это так давно было...

В данном случае я бы сделал так. Во-первых, все изменения в базе делать исключительно с помошью операторов INSERT/UPDATE, но никак не через связанные контролы. В идеале - через соотв. хранимки/функции с транзакциями внутри. Иначе понятие целостности данных... в общем, сделает оно тебе ручкой рано или поздно.

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

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.09.2004 (Чт) 10:13

Ennor, я понимаю, что ты хочешь сказать. Но отказываться от удобства связанных контролов очень и очень не хочется... Дожен же быть способ?
У меня появилась бредовая идея - понавесить триггеров на мою таблицу, чтобы они писали ID изменённой/удалённой/добавленной записи в отдельную таблицу, и я в Data1_Reposition обновлял те записи, на которые есть ссылки во второй таблице. Но это же ещё больший бред, так?
Изображение

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 09.09.2004 (Чт) 10:26

С базами данных лучше всего работает, ИМХО, TrueDB Grid.


Спорно - тут многое от привычки зависит. Мне к примеру Janus нравится - с базами и без - все удобно и просто.
TrueDB я когда-то смотрел - не понравился, ибо неудобен.


Но помоему Access для этих целей был бы гораздо удобнее.


Я до VB работал с Access-ом. Но сейчас меня на него не затащишь. Хотя работаю именно с базами. Ибо неудобно и масса ограничений.
На мой взгляд Access больше подходит для пытающихся что либо самостоятельно сделать менеджеров, а не для проф. разработки...

В данном случае я бы сделал так. Во-первых, все изменения в базе делать исключительно с помошью операторов INSERT/UPDATE, но никак не через связанные контролы.


Чтобы усложнить себе жизнь чтоли?
Все прекрасно работает. Контрол обновляет Recordset, а тот отправляет на сервер Insert/Update - чего ради я сам его должен формировать? Он и без меня это сделает.

Иначе понятие целостности данных... в общем, сделает оно тебе ручкой рано или поздно.


Целостность данных тут абсолютно не причем.

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


И это тоже.

Хочешь чтобы измененные записи отображались другим цветом и запоминались в базе при нажатии на какую-то кнопку? Дык это делается элементарно - открывается Recordset c BatshOptimistic, редактируется и по кнопке делается UpdateBath. Ну а красишь измененные записи (см. статус записи).

IMHO ты все переусложняешь - на порядок. Проще надо быть ;)
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 09.09.2004 (Чт) 10:26

По своей сути триггер - это заплатка. Быстрое закрытие функциональной дыры, про которую забыли на стадии проектирования. Мне рассказывали про одну базу на Interbase, в которой вся серверная логика была построена на триггерах. Так это была вещь в себе - малейшее изменение чего бы то ни было в структуре приводило к крушению всего и вся, ибо взаимосвязи совершенно не прослеживались. Написал ее какой-то mad scientist, после чего уволился, есессно :) . Можешь себе представить, какой был кошмар - поддерживать такое после него.

Насчет удобства связанности. Знаешь, не разу с таким не работал, поэтому не в курсе всех удобств :) . Попробуй сделать класс, выступающий в роли Complex Data Provider (или Source, не помню точно). Не исключено, что сможешь засунуть в него свой smart binding...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.09.2004 (Чт) 14:34

Ennor писал(а):По своей сути триггер - это заплатка. Быстрое закрытие функциональной дыры, про которую забыли на стадии проектирования. Мне рассказывали про одну базу на Interbase, в которой вся серверная логика была построена на триггерах. Так это была вещь в себе - малейшее изменение чего бы то ни было в структуре приводило к крушению всего и вся, ибо взаимосвязи совершенно не прослеживались. Написал ее какой-то mad scientist, после чего уволился, есессно :) . Можешь себе представить, какой был кошмар - поддерживать такое после него.

Не поверишь - у нас в (другом) проекте именно Interbase, и именно с обилием триггеров. Вот я и заразился дурным примером :-)

Ennor писал(а):Насчет удобства связанности. Знаешь, не разу с таким не работал, поэтому не в курсе всех удобств :) . Попробуй сделать класс, выступающий в роли Complex Data Provider (или Source, не помню точно). Не исключено, что сможешь засунуть в него свой smart binding...

Я тоже со связыванием не работал до этой недели, но много слышал про него, в том духе, что это сплошной рулез. Вот начал разбираться, и оказалось - грабля на грабле...
Про Data Source не понял. Мне же нужно как раз сделать клиента для существующего датасорса - зачем мне ещё один? Идти методом "от противного"? :-)
Последний раз редактировалось tyomitch 09.09.2004 (Чт) 14:40, всего редактировалось 1 раз.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.09.2004 (Чт) 14:38

Andrey, плз помоги мне! Как (свой) грид с датасорсом связать?
Судя по твоим постам, ты знаешь :-)
Изображение

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 09.09.2004 (Чт) 17:13

Если Janus GridEx нужно связать с Recordset-ом, то просто

Set Grid.ADORecordset = r

Для других Grid-ов это может несколько варироваться (свойство по разному у них называется).

А DataControl я не пользую из-за полной ненадобности. Как и Grid-ы идущие в комплекте с VB. Так что по ним не подскажу - это смотреть надо...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.09.2004 (Чт) 17:54

Andrey Fedorov писал(а):Для других Grid-ов это может несколько варироваться (свойство по разному у них называется).

Ты меня не понял. Я хочу написать data-bound грид на основе флексгрида. Как мне использовать сабж для его связи с датасорсом?
Чужие гриды мне совсем не так интересны.

DataControl - а чем предлагаешь его заменить?
Изображение

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 10.09.2004 (Пт) 7:31

Ты меня не понял. Я хочу написать data-bound грид на основе флексгрида.


Тяжко это. MSFlexGrid довольно ограничен в своих возможностях.
Потратишь кучу времени, причем зря - уродца трудно реанимировать.
Если очень хочется бесплатного, с исходниками и не требующего лицензии то посмотри, к примеру, сюда:

http://vbaccelerator.com/home/VB/Code/Controls/S_Grid_2/S_Grid_2/article.asp
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение alibek » 10.09.2004 (Пт) 9:58

А помоему человеку уже не грид нужен, помоему он в азарт вошел :) Сдается мне, что ему интересно, как Data Control внутри устроен :)
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 10.09.2004 (Пт) 10:04

Сдается мне, что ему интересно, как Data Control внутри устроен


Ну какие проблемы - пусть смотрит пример AxData идущий с тем-же VB в комплекте - там все просто до ужаса...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 10.09.2004 (Пт) 10:17

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

Чужой open source грид ИМХО хуже, поскольку можешь промахнуться и не заметиь важной баги, а отступать будет поздно. Но это мое личное мнение.

Если времени на разработку своего грида мало, то лучше использовать проверенные линцензионные продукты типа того же True DB Grid'а. Понятно, что у него буду свои "особенности" - не без них. Но насколько я знаю, особых серьезных проблем у этого грида нет. Давно когда-то использовала 4ку, кажется... Но это не в счет. по поводу проблем у True DB Grid'а я консультировалась с более компетентными в этом смысле товарищами.

Недавно как раз смотрела True DBGrid Pro 7.0 на предмет, правда, unbound mode. Семерка по дизайну старовата, а функционально - подсветка ячеек, редактирование ячейки из встроенного комбо или текстбокса. Что мне супер-нравится в этом гриде - так это события. Приходит перед обновлением ячейки (с возможностью отмены), после обновления ячейки, потом перед обновлением строки (опять же с возможностью отмены), после обновления строки. Можно скрывать колонки, всегда можно узнать, какая колонка первая видна и тд...

А 8ка уже предлагает иерархический грид... Как раз то, что ты собираешься реализовывать.

P.S. а complex data binding - это случаем не умное название привязки грида к рекордсету? :roll:
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 10.09.2004 (Пт) 10:31

А 8ка уже предлагает иерархический грид... Как раз то, что ты собираешься реализовывать.


Да это есть во всех современных. Даже в том OpenSource ссылку на который я давал.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 10.09.2004 (Пт) 10:46

Ну, раз уж тут про TruDBGrid заговорили, то и я кое-что добавлю. Если тебе так нравится MSFlex, то попробуй контрол, который является его полной версией - VideoSoft FlexGrid. MS его урезала для включения в состав Студии, а в оригинале он, говорят, весьма и весьма крут. На уровне того же TrueDB...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.09.2004 (Пт) 12:49

1. Как устроен DataControl, мне (в рамках этой задачи) не интересно.
2. Сабж - это вроде как раз и есть умное название привязки грида к рекордсету. Вот как это устроено, и как вообще пишутся data-bound гриды, мне очень интересно.
3. Иерархии у меня нету. Задача, в сильно обобщённом виде, такая: в таблице есть поля ObjectType (круг/прямоугольник/треугольник), Param1 (аспект прямоугольника/один из углов треугольника), Param2 (второй угол треугольника). И ещё несколько текстовых. Нужно сделать Master/Details view этой таблицы. Какой грид это может? Т.е. хотелось бы, чтобы он мне говорил "нарисуй-ка такую-то строку, вот тебе данные, вот тебе DC", а я рисовал, что мне хочется.
4. Ограничения флексгрида меня (в рамках этой задачи) не волнуют. Т.е. работало бы, и ладно. На теперяшнем уровне - вроде работает всё правильно, кроме привязки.
Ссылка меня не удовлетворила:
S-Grid has no data-binding features whatsoever. To load records from a database you must write the code yourself!
Изображение

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 10.09.2004 (Пт) 13:01

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

Селай просто - по событию перемещения по записям (у MSFlexGrid это RowColChange) просто обновляй поля Detail формы. И ты получшь свои Master/Detail. Именно так я и делал (с другим Grid-ом).

Где проблема-то???
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.09.2004 (Пт) 15:22

Проблема в обратном - сделать, чтобы при изменении записей через Details они обновлялись и в гриде.
У меня в качестве Details для нетекстовых полей ипользуются невидимые текстбоксы, привязанные к всё тому же DataControl-у.
Или без явного программирования всей этой шняги через Update/Insert/Delete не обойтись?
Изображение

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 10.09.2004 (Пт) 15:32

сделать, чтобы при изменении записей через Details они обновлялись и в гриде.


Если Detail и Grid основаны на одном и том-же Recordset-e, то как правило достаточно после обновления Detail достаточно прорефрешить Recordset.

Но так как FlexGrid не DataBound-ный, то просто сам обнови в нем нужную строчку.

Никаких проблем в любом случае не вижу...

невидимые текстбоксы, привязанные к всё тому же DataControl-у.


У как... Текстбоксы да еще невидымые...

Я бы выкинул этих невидимых вместе с DataControl-ом и обошелся бы простым Recordset-ом...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


Вернуться в Базы данных

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList  
cron