ThisWindow.Reset и Interface WindowComponent

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

ThisWindow.Reset и Interface WindowComponent

Сообщение RaFaeL »

Есть у нас в проекте небольшая проблема, а именно: если открыть форму с полями из базы (обычный update, пусть это будет допустим накладная), затем в отдельном треде открыть какое-нибудь другое окно (допустим, это справочник клиентов), затем закрыть его и вернуться в первую форму, то на форме очистятся поля, но не все, а только тех таблиц, которые участвуют во втором окне, при этом не сами по себе, а как алиасы. Попытка обращения из формы к этой таблице выдает ошибку "Неправильное состояние курсора". База у нас MSSQL, шаблоны ABC. Копание в исходниках ABC очень быстро приводит к тому, что проблема уходит, если убрать WindowManager.Reset (SELF.Reset) на EVENT:GainFocus. В самом этом методе все сводится к SELF.CL.WC.Reset и SELF.CL.WC.UpdateWindow где WC это Interface WindowComponent, видимо где-то в этих методах что-то неправильно работает с таблицами SQL, а вот дальше не могу найти, куда копать - методы WindowComponent в рантайм вшиты что ли? Есть иное решение проблемы, кроме как тупо убрать этот Reset?
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7330
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

ThisWindow.Reset и Interface WindowComponent

Сообщение Игорь Столяров »

RaFaeL писал(а): 03 Июнь 2019, 22:51видимо где-то в этих методах что-то неправильно работает
Я не работаю с MSSQL, но судя по описанию вопроса - получается все потоки и алиасы используют общий буфер обмена с БД. :(
Можно, конечно, так или иначе вырубить обновление экранных полей по буферу таблицы, но сути проблемы это не изменит ...
За теми кто отстал - не возвращаться. (С) Кодекс
gopstop2007
✯ Ветеран ✯
Сообщения: 1702
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 9 раз
Поблагодарили: 4 раза

ThisWindow.Reset и Interface WindowComponent

Сообщение gopstop2007 »

RaFaeL писал(а): 03 Июнь 2019, 22:51 ...а только тех таблиц, которые участвуют во втором окне, при этом не сами по себе, а как алиасы...
не совсем понятен вопрос, почему бы для начала не посмотреть на лог sql запроса отправляемого на сервер в момент закрытия формы и еще как вариант справочники перевести в IMDD или еще проще вариант, перед открытием справочника запоминать позицию и после закрытия восстанавливать
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

ThisWindow.Reset и Interface WindowComponent

Сообщение RaFaeL »

Игорь Столяров писал(а): 04 Июнь 2019, 5:06Я не работаю с MSSQL, но судя по описанию вопроса - получается все потоки и алиасы используют общий буфер обмена с БД.
Можно, конечно, так или иначе вырубить обновление экранных полей по буферу таблицы, но сути проблемы это не изменит ...
Наверное не совсем так, буфер свой и он пытается обновиться из таблиц, но как-то криво это делает и SQL выдает ошибку. Не могу понять, где собственно нужный код
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

ThisWindow.Reset и Interface WindowComponent

Сообщение RaFaeL »

gopstop2007 писал(а): 04 Июнь 2019, 8:41не совсем понятен вопрос
Вопрос: где находится код методов Interface WindowComponent? В ABWINDOW.INC описание есть, в ABWINDOW.CLW кода нет
gopstop2007 писал(а): 04 Июнь 2019, 8:41почему бы для начала не посмотреть на лог sql запроса отправляемого на сервер в момент закрытия формы
Закрывать не обязательно, можно просто переключиться. Запросов там сотни, справочники используют по 20-30 таблиц
gopstop2007 писал(а): 04 Июнь 2019, 8:41еще проще вариант, перед открытием справочника запоминать позицию и после закрытия восстанавливать
Не поняли суть проблемы. У нас MDI, окна открываются с тулбаров независимо, а даже если и так, восстановить данные после переключения руками не получится, так как таблица будет в ошибочном состоянии в этот момент (если пройдет ThisWindow.Reset), пока не переоткроешь.
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

ThisWindow.Reset и Interface WindowComponent

Сообщение kreator »

Никогда такого не встречал. Правда и MSSQL плотно не юзал. Может проблема именно в драйвере MSSQL? Специально посмотрел как у нас работает ФБ. Ничего подобного нет. Другой тред никак не оказывает влияния. Те же таблицы, те же алиасы. С алиасами у нас вообще мрак. Их много, и они сильно используются.
We are hard at work… for you. :)
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

ThisWindow.Reset и Interface WindowComponent

Сообщение RaFaeL »

kreator писал(а): 04 Июнь 2019, 10:37Может проблема именно в драйвере MSSQL?
Скорее всего, так как в сборке на tps такой проблемы нет и ошибку выдает именно SQL. Но сменить драйвер не предлагать ))
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

ThisWindow.Reset и Interface WindowComponent

Сообщение kreator »

Припоминаю, что в стародавние времена была настройка окна на автообновление при получении фокуса. Я его (автообновление) всегда отключал. Может, действительно, не нужно окно ресетить при получении фокуса?
We are hard at work… for you. :)
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

ThisWindow.Reset и Interface WindowComponent

Сообщение RaFaeL »

Галочку Reset On Gain Focus я нашел, она везде снята
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

ThisWindow.Reset и Interface WindowComponent

Сообщение kreator »

Сейчас это называется "AutoDisplay". Добавляет атрибут "AUTO" для окна. Вот это свойство я имел ввиду. И да, оно отключено. Раньше, кажется, по дефолту был включен. Но это давно было.
Ещё есть в WindowManager свойство AutoRefresh. Но оно должно быть включено.
А "Reset On Gain Focus" это тоже свойство WindowManager'а. Разве есть галка? По дефолту всё равно ноль.
We are hard at work… for you. :)
Ответить