Конференция "Базы" » cxGrid6 - Access Violation [D7, IB6.x]
 
  • GRAND © (11.11.08 12:20) [0]
    Попытаюсь описать проблему как можно подробнее, ежели чего упущу, то доскажу потом.

    Вобщем, где-то пару лет как я с переменным успехом пытаюсь писать клиентские приложения с использованием визуальных компонентов исключительно от DevExpress. Иногда дело идет, как по маслу, а иногда (как сейчас, например) - не очень. Время от времени я сталкивался с этой проблемой, иногда удавалось бороть ее компромиссами в пользу других компонентов, но до глубинной сути возникающего непотребства докопаться мне так и не удалось. Суть проблемы в том, что, как мною замечено, компонент cxGrid очень не любит, когда какие-то изменения в датасете, им отображаемом, производятся помимо него. То есть, я имею в виду ситуацию, когда в OptionsData все операции (Insert, Delete etc.) зафолсены, а для вставки/редактирования записей используется отдельное диалоговое окно. Заметил также, что проблема проявляется, если в гриде заданы несколько вьюх, связанных между собой мастер-детальным отношением. При одной вьюхе с одним датасетом никаких AV почему-то не возникает. И самое интересное: после вставки новой записи AV возникает не всегда! От чего это зависит - тайна большая есть. Запись, кстати, при этом благополучно вставляется, но AV этот уже достал конкретно. Иногда бывает еще и так, что работаешь с формой спокойно, вставляешь-редактируешь, сколько хочешь, а потом только, когда форму закрываешь, вылетает AV.

    Кто подскажет, может быть, я чего-то не учел? Кривой ли вообще, по вашему мнению, cxGrid?

    Заранее спасибо!
  • GRAND © (11.11.08 12:22) [1]
    Да! Привожу строку кода, на которой вылетает этот самый AV:

    end;



    :)))
  • MsGuns © (11.11.08 12:43) [2]
    Мастер-делал, "гридное" редактирование и т.п. - методы файл-серверного "мышления", рано или поздно привозящие траблы. А если сюда добавить еще и сторонние компоненты, то вот вам, Волобуев...
  • GRAND © (11.11.08 12:49) [3]
    Гридного редактирования нету. Я же писал:


    > То есть, я имею в виду ситуацию, когда в OptionsData все
    > операции (Insert, Delete etc.) зафолсены, а для вставки/редактирования
    > записей используется отдельное диалоговое окно.
  • Sergey13 © (11.11.08 13:41) [4]
    > [0] GRAND ©   (11.11.08 12:20)

    А редактируешь таки через датасет или сторонними запросами?
  • GRAND © (11.11.08 13:45) [5]
    Через датасет. В диалоговых окнах компоненты TcxDBxxx
  • GRAND © (11.11.08 13:46) [6]
    Датасеты - FIBPlus 6.4
  • Sergey13 © (11.11.08 13:55) [7]
    > [0] GRAND ©   (11.11.08 12:20)
    > когда в OptionsData все операции (Insert, Delete etc.) зафолсены

    Шаманство конечно, но если их затруить, а отсекать редактирование в каком нибудь обработчике?
  • GRAND © (11.11.08 14:07) [8]
    Пробовал без отсекания в обработчике - не помогает.
  • MsGuns © (11.11.08 15:28) [9]
    Объясни разницу с т.зр. реализации компонент (если она не глючная, конечно) между редактированием в сетке и редактированием связанного с нею датасета.

    Датасету ведь глубоко фиолетово КТО изменил запись (поле): юзер кнопками или приложение кодом
  • GRAND © (11.11.08 15:45) [10]

    > Объясни разницу с т.зр. реализации компонент (если она не
    > глючная, конечно) между редактированием в сетке и редактированием
    > связанного с нею датасета.


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


    > Датасету ведь глубоко фиолетово КТО изменил запись (поле):
    >  юзер кнопками или приложение кодом


    Датасету - да. Но я и не на датасет вовсе грешу.
  • Sergey13 © (11.11.08 15:59) [11]
    > [10] GRAND ©   (11.11.08 15:45)
    А компоненты, стесняюсь спросить, правильные или с китайского рынка?
  • GRAND © (11.11.08 16:04) [12]
    Рыночные... :)
  • GRAND © (11.11.08 16:04) [13]
    Но с исходниками!
  • Sergey13 © (11.11.08 16:24) [14]
    > [12] GRAND ©   (11.11.08 16:04)

    Так может на рынке что попутали? Я конечно с ними мало работал, но с правильными и не помню подобной байды, хотя вся работа практически строилась по твоему сценарию.
  • MsGuns © (11.11.08 16:49) [15]
    Ты все-таки [2] внимательно почитай и подумай
  • GRAND © (11.11.08 16:56) [16]

    > Мастер-делал, "гридное" редактирование и т.п. - методы файл-
    > серверного "мышления", рано или поздно привозящие траблы.
    >


    Что можешь предложить взамен?
  • GRAND © (11.11.08 17:02) [17]
    Собственно говоря, я толком и не понял, Ганз, что ты в [2] нагородил-то вообще и чего всем этим хотел сказать. Мастер-детал фтопку? Гридное редактирование суксь? А причем здесь файл-сервер (мы вроде о СУБД архитектуры КС говорим), какой образ мышления этот файл-сервер формирует и какие траблы рано или поздно привозит? Объяснись плиз!
  • ANB (11.11.08 19:43) [18]

    > GRAND ©   (11.11.08 17:02) [17]

    Ставим халявый ЭхЛиб и наслаждаемся жизнью.
    :)
  • GRAND © (11.11.08 21:51) [19]
    Ждал, кто же будет первым с предложением ЭхЛиба! :)))
    ANB, у меня на той форме вверху два грида, в одном из которых две вьюхи замастердеталенные и внизу один тоже с двумя вьюхами замастердеталенными. Какой тут ЭхЛиб?

    Эххх... :(
  • MsGuns © (11.11.08 22:23) [20]
    Вова, ты не обижайся, но у тебя, ИМХО, типичный ламерский подход: ты хваьаешься за компоненты, пыжишься с их помощью решить задачу и, если не получается, начинаешь на них катить бочку.

    Что касается "файл-сервера". Очевидно, что ты не понял. Объяснить тебе в одном-двух постах нереально. Советую поискать статью, озаглавленную вроде так: "Блеск и нищета клиент-серверных технологий". Там очень здорово написано про главное
    Программирование клиент-сервера не стало проще за последние 10 лет, просто оно замаскировалось множеством оболочек, библиотек и компонентов, скрывающими от проектировщика тонкости клиент-сервера. И в большинстве случаев это работает. Но если возникает нештатная ситуация, не предусмотренная резработчиками "прослоек" (оно и понятно - невозможно предусмотреть все ситуации, которые могут возникнуть), то тогда вылазят ошибки, которые неопытный в КС программист спешит провозгласить глюками, да еще проорать на весь мир "Караул ! Не пользуйте ADO - там сплошой глюкодром !"
  • MsGuns © (11.11.08 22:29) [21]
    Вот ты ратуешь за FIBPlus. Я, когда работал с ИБ, вполне обходился IBX и когда поставил себе плас, долго не мог понять отчего я не вижу разницы ! А дело в том, что благодаря Вострикову и Ковязину ("Мир интербэйз") я сразу начал писать ПРАВИЛЬНО. Четко разделяя длинные читающие и короткие пишущие транзакции, избегая "гридного" (сиречь датасетного)редактирования, не ленясь "ручками" разруливать транзакции и переоткрывать датасеты после внесения изменений в таблицы. Короче, работать так, как пишут "великие и ужасные" ;)

    Чего и тебе советую.
  • GRAND © (12.11.08 00:04) [22]

    > Вова, ты не обижайся, но у тебя, ИМХО, типичный ламерский
    > подход: ты хваьаешься за компоненты, пыжишься с их помощью
    > решить задачу и, если не получается, начинаешь на них катить
    > бочку.


    Ганзыч, давай так: когда выяснится, что глюки происходят из-за того, что это я где-то накосячил, тогда и назовем мой подход ламерским, хорошо? Позор на седые пятки, обрывание волос, съедание котелка - все удовольствия, какие захочешь. А пока... Тебе не приходило в голову, что если я задаю вопрос на форуме, то это значит, что у меня есть проблема, а что именно я неправильно сделал, неизвестно? Причем, пока что, судя по развитию ветки, неизвестно это не только мне. А тебе уже все понятно! Гранд - ламер! ЛОЛ! :)


    > Что касается "файл-сервера". Очевидно, что ты не понял.
    > Объяснить тебе в одном-двух постах нереально.


    Ну где ж мне, грешному...


    > Советую поискать статью, озаглавленную вроде так: "Блеск
    > и нищета клиент-серверных технологий".


    Будет время - поищу.


    > Программирование клиент-сервера не стало проще за последние
    > 10 лет, просто оно замаскировалось множеством оболочек,
    > библиотек и компонентов, скрывающими от проектировщика тонкости
    > клиент-сервера. И в большинстве случаев это работает. Но
    > если возникает нештатная ситуация, не предусмотренная резработчиками
    > "прослоек" (оно и понятно - невозможно предусмотреть все
    > ситуации, которые могут возникнуть), то тогда вылазят ошибки,
    >  которые неопытный в КС программист спешит провозгласить
    > глюками, да еще проорать на весь мир "Караул ! Не пользуйте
    > ADO - там сплошой глюкодром !"


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


    > А дело в том, что благодаря Вострикову и Ковязину ("Мир
    > интербэйз") я сразу начал писать ПРАВИЛЬНО. Четко разделяя
    > длинные читающие и короткие пишущие транзакции, избегая
    > "гридного" (сиречь датасетного)редактирования


    На всяк случай уточню: что ты понимаешь под гридным (датасетным) редактированием? Редактирование в DB-привязанных компонентах с использованием UpdateSQL? Да, можно, конечно, зашарабанить и простые Edit'ы (не DB), после чего содержимое этих Edit'ов валидируется и в случае успеха валидейшена вываливается в датасет, но смысл? Это, извините меня, как сношаться в гамаке...

    Но не будем уходить в сторону, куда ты меня увел. Еще раз повторю: проблема не в датасетах, проблема не в фибах и не в транзакциях. Поэтому давай, Ганз, как-то больше по сути и без нравоучительно-менторских лекций о файл-серверах и великих и ужасных писателях по Вострикову. Да еще и с Ковязиным - надо ж было такое на ночь...!
  • MsGuns © (12.11.08 00:15) [23]
    >без нравоучительно-менторских лекций о файл-серверах

    Как скажешь..
    На сем с наилучшими
  • Sergey13 © (12.11.08 08:46) [24]
    > [21] MsGuns ©   (11.11.08 22:29)
    > я сразу начал писать ПРАВИЛЬНО

    Свои тараканы всегда самые тараканистые тараканы в мире. 8-)
  • GRAND © (13.11.08 09:12) [25]
    Ну вот. Значит, по сути вопроса сказать таки нечего. А то "Окстись! Опомнись! Покайся!"...
  • MsGuns © (13.11.08 11:19) [26]
    >GRAND ©   (13.11.08 09:12) [25]

    Тебе указали на места, где надо искать ошибки,- это не по сути ?
    Или ты думаешь, что здесь кто-то будет усердно исследовать твои халявные гриды и телепатировать каким образом ты пишешь в датсет (не в таблицы БД, а именно в датасет) и при этом обновляешь деталы (или наоборот, модифицитруешь деталы и при этом что происходит с полями-связками) ?

    Одно могу сказать почти со 100% гарантией - оракл тут ни при чем
  • MsGuns © (13.11.08 11:21) [27]
    Пардон, не оракл, конечно, а ИБ и ФБПлас :)
  • Игорь Шевченко © (13.11.08 11:34) [28]
    У меня вопрос к итальянскому коллеге - а что, для DataSet-а существенна разница, через какой DataLink к нему поступают данные, в смысле через GridDataLink или через FieldDataLink ?

    Не совсем понятно, чем механизм редактирования в гриде отличается от механизма редактирования через набор полей с точки зрения DataSet-а.
  • stas © (13.11.08 11:52) [29]

    > GRAND ©   (11.11.08 12:22) [1]
    > Да! Привожу строку кода, на которой вылетает этот самый
    > AV:end;:)))

    На самом деле это не так ))). После того как в проекте появляются некоторые компоненты из DevExpress, то Debugger отображает ход процесса на несколько строчек в перед, это можно определить создав явную ошибку и посмотреть в каком месте остановится курсор.
  • GRAND © (13.11.08 12:08) [30]

    > Пардон, не оракл, конечно, а ИБ и ФБПлас :)


    Я об этом и говорил! А ты мне начал о транзакциях и о том, как великие и ужасные пишут правильно...
  • GRAND © (13.11.08 12:12) [31]

    > У меня вопрос к итальянскому коллеге


    Это ко мне, что ли? А почему "итальянскому"?


    > а что, для DataSet-а существенна разница, через какой DataLink
    > к нему поступают данные, в смысле через GridDataLink или
    > через FieldDataLink ?
    >
    > Не совсем понятно, чем механизм редактирования в гриде отличается
    > от механизма редактирования через набор полей с точки зрения
    > DataSet-а.


    Игорь, просмотри ветку чуть внимательнее. Я писал:


    > В сетке не все поля визибле, а в диалоговом окне они отображаются
    > и вводятся. Кроме того, есть поля, значения которых по умолчанию
    > выставляются в зависимости от выбора юзером записи в некоем
    > лукап-комбобох и значения соответствующего поля в другом
    > датасете. При этом тупой лукап по иду не нужен, а нужно
    > копирование значения с возможностью его последующего изменения.
    >
  • Игорь Шевченко © (13.11.08 12:40) [32]
    GRAND ©   (13.11.08 12:12) [31]

    Это вопрос противникам редактирования в гриде.

    Почему итальянскому - по аське отправил
  • GRAND © (13.11.08 13:29) [33]
    Я тоже не сторонник редактирования прямо в гриде - разве что на скорую руку что-то лепится. А так, у меня давно заготовлено два базовых класса форм, работающих в связке: форма просмотра с гридом и форма редактирования записи. Когда нужно сбацать справочник, то создаются наследники этих форм, в которых нужно всего лишь задать DataSource, расставить DB-компоненты, как нравится, и... все. Вся рутина типа добавления записи по нажатию Insert (или кнопы на тулбаре), редактирования по дабл-клику или энтеру, удаления по Del - все это наследуется и в наследниках уже само работает. Такой стиль выдерживаю везде, и тогда приложение получается понятным, прозрачным и полностью предсказуемым для пользователя.


    > Почему итальянскому - по аське отправил


    На работе я без аськи, только вечером могу связаться.
  • MsGuns © (14.11.08 10:54) [34]
    Если ты меняешь датасет программно, то это ничем не отличается от редактирования в гриде. О чем тебе здесь талдычат. "Правильная" технология заключается в том, что датасет не редактируется вообще (длинная читающая транзакция), а все правки идут через отдельные запросы (короткие пишущие транзакции), после чего датасет переоткрывается и позиционируется.
    Помимо "правильности" такая технология освобождает от массы кода, необходимого для обработки событий датасета, связанных с изменением полей (в том числе "ключевых", используемых в отношениях мастер-детал).
    На первый взгляд может показаться, что такой подход не совсем удобен из-за постоянного переоткрытия и перепозиционирования. Однако он много "правильнее" потому, что позволяет работать всегда со "свежей" информацией БД, даже в том случае, если она изменялась другими пользователями. Твой Фибплас практически это и делает, только неявно.

    Все-таки очень рекомендую почитать "великих и ужасных"
  • Sergey13 © (14.11.08 11:13) [35]
    > [34] MsGuns ©   (14.11.08 10:54)
    > "Правильная"
    > "свежей"

    Это хорошо, что ты не забыл использовать кавычки. 8-)
  • GRAND © (14.11.08 11:21) [36]

    > MsGuns ©   (14.11.08 10:54) [34]


    Именно таким подходом я и руководствуюсь: длинная читающая транзакция + короткая пишущая.


    > Твой Фибплас практически это и делает, только неявно.


    При определенных настройках. А именно, если Transaction и UpdateTransaction суть разные объекты и при этом DataSet.AutoCommit:=True DataSet.Options.poStartTransaction:=True.

    P.S. Моя проблема, кстати, решилась. Никакие компоненты в ней не виноваты, просто долгое время я в упор не замечал одной подленькой строчечки - не та диалоговая форма освобождалась, которую было нужно. Заслуженные пинки принимаются.
  • MsGuns © (14.11.08 11:24) [37]
    >Sergey13 ©   (14.11.08 11:13) [35]
    >> "Правильная"
    >> "свежей"
    >Это хорошо, что ты не забыл использовать кавычки. 8-)

    "Правильная" в кавычках потому, что существуюют и другие технологии, дающие "правильный" результат. Спорить о достоинствах и недостатках каждой из них можно до бесконечности, однако сути этот спор не меняет - если поставленная задача решается успешно, то по большому счету все равно, каким образом это осуществляется на программном уровне. Другое дело, что многие выбирают способы работы с БД не исходя из четкого понимания поставленной задачи, а исключительно от того, как ПРОЩЕ и БЫСТРЕЕ это сделать. Вот отсюда, ИМХО, произростают почти все проблемы.

    "Свежая" информация применительно к любой многопользовательской среде взята в кавычки потому, что ее не может быть в принципе, если брать хоть сколь-нибудь значительный отрезок времени. Поэтому "свежие" данные - это данные, соответствющие ЦЕЛОСТНОМУ СОСТОЯНИЮ БД на момент их извлечения.

    Не может быть, чтобы ты не пронимал этих прописных истин.
    Но поприкалываться любишь :))
  • MsGuns © (14.11.08 11:26) [38]
    >Заслуженные пинки принимаются.

    Приятно увидеть в тебе, Володя, адекватного товарища :)
  • Sergey13 © (14.11.08 11:36) [39]
    > [37] MsGuns ©   (14.11.08 11:24)

    Просто несколькими постами выше ты кавычки не использовал и это выглядело несколько пафосно и очень спорно.
    Тем более, что наличие возможности применения множества одновременных транзакций у ИБ это скорее исключение из правил, ИМХО.

    > Но поприкалываться любишь :))

    По пятницам особенно. 8-)
  • GRAND © (14.11.08 12:03) [40]

    > Приятно увидеть в тебе, Володя, адекватного товарища :)


    Меня самого вообще по жизни приятно видеть :)
  • Игорь Шевченко © (14.11.08 14:29) [41]
    MsGuns ©   (14.11.08 10:54) [34]


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


    Насколько мне не изменяет память, изменения в DataSet порождают те же  запросы (INSERT, UPDATE, DELETE). Я на протяжении почти 10 лет использовал BDE для работы с Interbase/Firebird, в BDE ручная работа с транзакциями Interbase и разнесение отдельных запросов по этим транзакциям, насколько, опять же, мне не изменяет память, невозможна.
    И тем не менее, все устойчиво работало, в том числе связки master-detail и т.п.
    Почти все использовало связку TQuery(c cached updates)+TUpdateSQL, и опять же, повторюсь, проблем не наблюдалось как у авторов, так и у заказчиков.

    Я не знаю, может компоненты, которые FibPLUS, IBX и им подобные требуют особого намаза - не использовал, как начали с BDE, так оно и продолжается, переделывать на другие компоненты дорого и невыгодно.
  • GRAND © (14.11.08 14:33) [42]

    > как начали с BDE, так оно и продолжается, переделывать на
    > другие компоненты дорого и невыгодно.


    А я б переделал...
  • Ega23 © (14.11.08 14:37) [43]

    > А я б переделал...


    Я бы вот тоже переделал один проект, если бы это время было бы оплачено.
  • Игорь Шевченко © (14.11.08 14:49) [44]
    GRAND ©   (14.11.08 14:33) [42]

    А смысл ? Функциональность, оплачиваемая заказчиками, от этого не меняется, а ошибки и надежность - так оно и так без ошибок и надежно работает.
  • GRAND © (14.11.08 15:24) [45]

    > А смысл ? Функциональность, оплачиваемая заказчиками, от
    > этого не меняется, а ошибки и надежность - так оно и так
    > без ошибок и надежно работает.


    ...и, "сынок, ради Бога, ничего там не меняй!" © :)))
  • MsGuns © (15.11.08 15:11) [46]
    >Игорь Шевченко ©   (14.11.08 14:29) [41]

    Ты эта.. [37] еще раз перечитай (первый абзац), а ?
  • Игорь Шевченко © (16.11.08 00:41) [47]
    MsGuns ©   (15.11.08 15:11) [46]

    Я эта...прочитал. Даже два раза. Только вот я не совсем уверен, что тот свет, который ты несешь в темные массы, имеет правильную длину волны и прочие характеристики. Я понимаю, что забота о просвещении дело святое и где-то даже благородное, но вот те, кто разрабатывал механизмы доступа к данным в Delphi они тоже как бы не совсем клинические идиоты и простота, по их мнению, обусловлена тем, что оно должно работать так, как задумано разработчиками. Причем, в моем случае, оно и работает, как задумано.
    Может, разработчикам стоит иногда доверять ?
  • Германн © (16.11.08 01:12) [48]
    Опять холивар с Ганзом.
    Уже давно не интересно.
 
Конференция "Базы" » cxGrid6 - Access Violation [D7, IB6.x]
Есть новые Нет новых   [134477   +39][b:0][p:0.001]