ThisWindow.Reset и Interface WindowComponent

Clarion, Clarion 7

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

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

ThisWindow.Reset и Interface WindowComponent

Сообщение RaFaeL » 03 Июнь 2019, 22:51

Есть у нас в проекте небольшая проблема, а именно: если открыть форму с полями из базы (обычный update, пусть это будет допустим накладная), затем в отдельном треде открыть какое-нибудь другое окно (допустим, это справочник клиентов), затем закрыть его и вернуться в первую форму, то на форме очистятся поля, но не все, а только тех таблиц, которые участвуют во втором окне, при этом не сами по себе, а как алиасы. Попытка обращения из формы к этой таблице выдает ошибку "Неправильное состояние курсора". База у нас MSSQL, шаблоны ABC. Копание в исходниках ABC очень быстро приводит к тому, что проблема уходит, если убрать WindowManager.Reset (SELF.Reset) на EVENT:GainFocus. В самом этом методе все сводится к SELF.CL.WC.Reset и SELF.CL.WC.UpdateWindow где WC это Interface WindowComponent, видимо где-то в этих методах что-то неправильно работает с таблицами SQL, а вот дальше не могу найти, куда копать - методы WindowComponent в рантайм вшиты что ли? Есть иное решение проблемы, кроме как тупо убрать этот Reset?

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 4004
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

ThisWindow.Reset и Interface WindowComponent

Сообщение Игорь Столяров » 04 Июнь 2019, 5:06

RaFaeL писал(а):
03 Июнь 2019, 22:51
видимо где-то в этих методах что-то неправильно работает
Я не работаю с MSSQL, но судя по описанию вопроса - получается все потоки и алиасы используют общий буфер обмена с БД. :(
Можно, конечно, так или иначе вырубить обновление экранных полей по буферу таблицы, но сути проблемы это не изменит ...
«V» значит Вендетта !

gopstop2007
Ветеран
Сообщения: 1220
Зарегистрирован: 25 Март 2009, 21:55

ThisWindow.Reset и Interface WindowComponent

Сообщение gopstop2007 » 04 Июнь 2019, 8:41

RaFaeL писал(а):
03 Июнь 2019, 22:51
...а только тех таблиц, которые участвуют во втором окне, при этом не сами по себе, а как алиасы...
не совсем понятен вопрос, почему бы для начала не посмотреть на лог sql запроса отправляемого на сервер в момент закрытия формы и еще как вариант справочники перевести в IMDD или еще проще вариант, перед открытием справочника запоминать позицию и после закрытия восстанавливать
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 857
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

ThisWindow.Reset и Interface WindowComponent

Сообщение RaFaeL » 04 Июнь 2019, 9:41

Игорь Столяров писал(а):
04 Июнь 2019, 5:06
Я не работаю с MSSQL, но судя по описанию вопроса - получается все потоки и алиасы используют общий буфер обмена с БД.
Можно, конечно, так или иначе вырубить обновление экранных полей по буферу таблицы, но сути проблемы это не изменит ...
Наверное не совсем так, буфер свой и он пытается обновиться из таблиц, но как-то криво это делает и SQL выдает ошибку. Не могу понять, где собственно нужный код

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 857
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

ThisWindow.Reset и Interface WindowComponent

Сообщение RaFaeL » 04 Июнь 2019, 9:49

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
Ветеран
Сообщения: 3249
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

ThisWindow.Reset и Interface WindowComponent

Сообщение kreator » 04 Июнь 2019, 10:37

Никогда такого не встречал. Правда и MSSQL плотно не юзал. Может проблема именно в драйвере MSSQL? Специально посмотрел как у нас работает ФБ. Ничего подобного нет. Другой тред никак не оказывает влияния. Те же таблицы, те же алиасы. С алиасами у нас вообще мрак. Их много, и они сильно используются.
We are hard at work… for you. :)

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 857
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

ThisWindow.Reset и Interface WindowComponent

Сообщение RaFaeL » 04 Июнь 2019, 11:37

kreator писал(а):
04 Июнь 2019, 10:37
Может проблема именно в драйвере MSSQL?
Скорее всего, так как в сборке на tps такой проблемы нет и ошибку выдает именно SQL. Но сменить драйвер не предлагать ))

kreator
Ветеран
Сообщения: 3249
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

ThisWindow.Reset и Interface WindowComponent

Сообщение kreator » 04 Июнь 2019, 11:47

Припоминаю, что в стародавние времена была настройка окна на автообновление при получении фокуса. Я его (автообновление) всегда отключал. Может, действительно, не нужно окно ресетить при получении фокуса?
We are hard at work… for you. :)

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 857
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

ThisWindow.Reset и Interface WindowComponent

Сообщение RaFaeL » 04 Июнь 2019, 12:33

Галочку Reset On Gain Focus я нашел, она везде снята

kreator
Ветеран
Сообщения: 3249
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

ThisWindow.Reset и Interface WindowComponent

Сообщение kreator » 04 Июнь 2019, 15:20

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

Ответить