powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Динамический ToolTip
13 сообщений из 13, страница 1 из 1
Динамический ToolTip
    #38240873
Добрый день всем.

Столкнулся с такой проблемой.
Есть база документов. Каждый документ имеет набор признаков, реализованных в виде битовой маски (т.е., если бит "поднят", то признак = true). Есть еще таблица, где фиксируется дата и время изменения каждого признака.
При просмотре реестра документов (список документов в гриде) для каждого признака выводится свой чекбокс.
Пользователь хочет, чтобы в ToolTip'e для соответствующего признака отображались дата и время, когда он был "поднят"...
Собирать дату-время события в тот же курсор, что и основные данные, получается очень долго - несколько минут даже если ограничить отбор данных одним днем (а интервал дат задает пользователь, так что может получиться еще дольше). Так что это не вариант

Программа написана на VFP 8; база данных PostgreSQL.

Были мысли реализовать "динамику" через событие MouseMove, но не представляю, как координаты мышки преобразовать в recordid записи, на которую она (мышка) указывает....
...
Рейтинг: 0 / 0
Динамический ToolTip
    #38240885
провел замеры:
Запрос документов для реестра - 1,5 - 2 сек
Запрос событий для одного документа - 80 - 100 мсек.
Объединенная выборка (для каждого документа выбраны все события по интересующим битам; событие, соответствующее каждому биту, помещены в отдельные поля) - 15 мин !!!
...
Рейтинг: 0 / 0
Динамический ToolTip
    #38240888
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав С...кий,

Не знаю, насколько это поможет, но...
Была примерно такая же проблема, выкрутился так:
myForm.Init() :
PUBLIC nY
PUBLIC crd(1)
DIMENSION crd(34) && кол-во строк грида, можно с запасом
crd(1)=Thisform.Grid1.Top+Thisform.Grid1.HeaderHeigth-1
FOR i=2 TO 34
crd(i)=crd(i-1)+Thisform.Grid1.RowHeigth
ENDFOR

Grid1.Column(i).Text1.MouseDown():
nY=nYCoord

Grid1.Column(i).Text1.RightClick():
* выводится textbox-подсказка над (поэтому -39) текущей строкой
Thisform.text1.Value="текст подсказки" (инфа из текущей строки таблицы)
Thisform.text1.Left=246
Thisform.text1.Alignment=0
Thisform.text1.Top=C_Y(nY)-39
Thisform.text1.Visible=.T.

Grid1.Column(i).Text1.Click():
* подсказка закрывается
Thisform.text1.Visible=.F.

* в файле процедур:
FUNCTION C_Y
PARA nYY
FOR jj=1 TO ALEN(crd)
IF nYY < crd(jj)
EXIT
ENDIF
ENDFOR
RETURN crd(jj)
MouseMove не прокатил, т.к. строку грида, над которой мышка, надо было сделать активной.

Не очень изящно, но все-таки... :)
...
Рейтинг: 0 / 0
Динамический ToolTip
    #38240978
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав С...кийпровел замеры:
Запрос документов для реестра - 1,5 - 2 сек
Запрос событий для одного документа - 80 - 100 мсек.
Объединенная выборка (для каждого документа выбраны все события по интересующим битам; событие, соответствующее каждому биту, помещены в отдельные поля) - 15 мин !!!
Попробуй несколькими запросами: список документов в курсор, затем даты, затем все склеить. Может вытаскивать инфу как есть в несколько запросов, а на клиенте допиливать (средствами фокса). Хотя в ToolTip все равно будет проблематично воткнуть.

Точно вычислить запись над которой мышка в гриде муторное занятие. Штатных средств нет.

Как вариант выводить только по выбранной записи, т.е. встал пользователь на строку, на форме снизу/сверху показались даты.
...
Рейтинг: 0 / 0
Динамический ToolTip
    #38241003
Dima TКак вариант выводить только по выбранной записи, т.е. встал пользователь на строку, на форме снизу/сверху показались даты.
Это пока и сделал... Но хочется большего...
...
Рейтинг: 0 / 0
Динамический ToolTip
    #38241008
Jonny540Станислав С...кий,

Не знаю, насколько это поможет, но...
Была примерно такая же проблема, выкрутился так:
myForm.Init() :
PUBLIC nY
PUBLIC crd(1)
DIMENSION crd(34) && кол-во строк грида, можно с запасом
crd(1)=Thisform.Grid1.Top+Thisform.Grid1.HeaderHeigth-1
FOR i=2 TO 34
crd(i)=crd(i-1)+Thisform.Grid1.RowHeigth
ENDFOR

Grid1.Column(i).Text1.MouseDown():
nY=nYCoord

Grid1.Column(i).Text1.RightClick():
* выводится textbox-подсказка над (поэтому -39) текущей строкой
Thisform.text1.Value="текст подсказки" (инфа из текущей строки таблицы)
Thisform.text1.Left=246
Thisform.text1.Alignment=0
Thisform.text1.Top=C_Y(nY)-39
Thisform.text1.Visible=.T.

Grid1.Column(i).Text1.Click():
* подсказка закрывается
Thisform.text1.Visible=.F.

* в файле процедур:
FUNCTION C_Y
PARA nYY
FOR jj=1 TO ALEN(crd)
IF nYY < crd(jj)
EXIT
ENDIF
ENDFOR
RETURN crd(jj)
MouseMove не прокатил, т.к. строку грида, над которой мышка, надо было сделать активной.

Не очень изящно, но все-таки... :)
Спасибо за идею. Примерно так и сделал...
...
Рейтинг: 0 / 0
Динамический ToolTip
    #38241151
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав С...кийДобрый день всем.

Столкнулся с такой проблемой.
Есть база документов. Каждый документ имеет набор признаков, реализованных в виде битовой маски (т.е., если бит "поднят", то признак = true). Есть еще таблица, где фиксируется дата и время изменения каждого признака.
При просмотре реестра документов (список документов в гриде) для каждого признака выводится свой чекбокс.
Пользователь хочет, чтобы в ToolTip'e для соответствующего признака отображались дата и время, когда он был "поднят"...
Собирать дату-время события в тот же курсор, что и основные данные, получается очень долго - несколько минут даже если ограничить отбор данных одним днем (а интервал дат задает пользователь, так что может получиться еще дольше). Так что это не вариант

Программа написана на VFP 8; база данных PostgreSQL.

Были мысли реализовать "динамику" через событие MouseMove, но не представляю, как координаты мышки преобразовать в recordid записи, на которую она (мышка) указывает....

1. Что говорит sys(3054)

2. Тестовый пример приведи, как и что выбираешь.
...
Рейтинг: 0 / 0
Динамический ToolTip
    #38241212
PaulWist1. Что говорит sys(3054)

2. Тестовый пример приведи, как и что выбираешь.
1. Выборка идет прямыми запросами к серверу PostgreSQL, поэтому sys(3054) даже и не проверял.... Все равно SQL'ный сервер сам все переоптимизирует...

2. Выборка данных для реестра документов (фрагмент из программы):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
TEXT TO lcSelect TEXTMERGE NOSHOW PRETEXT 7    
SELECT 
<skiped>, 
hd.kod,
0 as sel,
0 as num 
case when Hd.isflag&2 >0 then '&#254;' else CHR(32) end::char(1) as isbit1 ,
case when Hd.isflag&128 >0 then '&#254;' else CHR(32) end::char(1) as isbit7  -- и т.д. для всех значимых бит
from hd
inner join hdd on hdd.kodhd = hd.kod
left join <skiped>
where hd.kodtype in (4,3)        
and hd.begdata between '2013-02-22' and '2013-02-22'
GROUP by <skiped>
ORDER by <skiped>
ENDTEXT
SQLExecute(lcSelect,'curData')


SQLExecute() - доработанное расширение EXECSQL(), используемое в нашей программе

Выборка событий для одного документа:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select events.kodhd, min(events.kodtype) as typeoper, 
CASE 
when events.kodtype = 268 or events.kodtype = 274 then 13 
when events.kodtype = 269 or events.kodtype = 265 then 14 
when events.kodtype = 270 or events.kodtype = 276 then 15 
when events.kodtype = 271 or events.kodtype = 277 then 16 
when events.kodtype = 272 or events.kodtype = 278 then 17 
when events.kodtype = 273 or events.kodtype = 279 then 18 
when events.kodtype = 280 then 22 
end as bit_number,
 max(trim(to_char(events.stamp,'HH:MI:SS'),'both')) as timet,
 max(trim(to_char(events.stamp,'HH:MI:SS'),'both') || ' > '||TRIM(typeop.name) || 
 case when flagoper = 0 then ' - Отменена операции!!!' else '' end)::varchar(200) as operation 
from events inner join typeop on events.kodtype = typeop.kod 
where events.kodhd = ХХХХХХХХ
group by 1,3
order by timet
...
Рейтинг: 0 / 0
Динамический ToolTip
    #38241290
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Ну терперь рассказывай какие индексы есть и показывай какие планы запроса строит сервер.

2. Кстати, а умеет PostgreSQL строить вычисляемы поля, что бы избавиться от case в списке полей?
...
Рейтинг: 0 / 0
Динамический ToolTip
    #38241637
PaulWist1. Ну терперь рассказывай какие индексы есть и показывай какие планы запроса строит сервер.

2. Кстати, а умеет PostgreSQL строить вычисляемы поля, что бы избавиться от case в списке полей?
1. Подумал хорошо, перестроил запрос. :)
Сейчас он выполняется в течение примерно 2 секунд и дает ту выборку, которую я хотел:
все колонки, отображаемые в гриде + колонки с сообщениями по битам событий...
Запрос стал таким:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
with w as (
SELECT
 <здесь выборка для документов реестра>
)
select w.*,bit22,bit13,bit14,bit15,bit16,bit17,bit18
from w left join (
select kodhd, max(case when kodtype = 280 then to_char(stamp,'HH:MI:SS') || ' > ' ||name else chr(32) end) as bit22,
max(case when kodtype = 274 or kodtype = 268 then  to_char(stamp,'HH:MI:SS') || ' > ' ||name else chr(32) end) as bit13,
max(case when kodtype = 275 or kodtype = 269 then  to_char(stamp,'HH:MI:SS') || ' > ' ||name else chr(32) end) as bit14,
max(case when kodtype = 276 or kodtype = 270 then  to_char(stamp,'HH:MI:SS') || ' > ' ||name else chr(32) end) as bit15,
max(case when kodtype = 277 or kodtype = 271 then  to_char(stamp,'HH:MI:SS') || ' > ' ||name else chr(32) end) as bit16,
max(case when kodtype = 278 or kodtype = 272 then  to_char(stamp,'HH:MI:SS') || ' > ' ||name else chr(32) end) as bit17,
max(case when kodtype = 279 or kodtype = 273 then  to_char(stamp,'HH:MI:SS') || ' > ' ||name else chr(32) end) as bit18
from (
select events.kodhd, events.kodtype, 
max(events.stamp) as stamp, max(trim(typeop.name)) as name 
from events inner join typeop on events.kodtype = typeop.kod 
where events.kodtype > 268 and events.kodhd in (select ttn_kod
from w)
group by 1,2
order by 3 
) as foo
group by 1 
) as foo1 on w.ttn_kod = foo1.kodhd


Но с дальнейшим (поместить сообщение из поля в ToolTipText) пока затык. Размышляю....

2. case (в синтаксисе MS SQL, PostgreSQL) ~ iif (в синтаксисе FoxPro)
Или что Вы имели в виду под "вычисляемые"?
...
Рейтинг: 0 / 0
Динамический ToolTip
    #38241730
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав С...кийНо с дальнейшим (поместить сообщение из поля в ToolTipText) пока затык. Размышляю....
Это решаемо.
Как-то так надо: в колонке должна содержаться дата, а показывать картинку
Колонку грида инициализировать так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with ThisForm.Grid.ColumnX
	.AddObject('imgFill', 'Image')
	.imgFill.Picture = 'Fill.bmp'
	.imgFill.Stretch = 2
	.AddObject('imgEmpty', 'Image')
	.imgEmpty.Picture = 'Empty.bmp'
	.imgEmpty.Stretch = 2
	.Text1.Visible = .F.
	.Sparse = .F.
	.AlignMent = 2
	.ControlSource = 'MyCursor.tMyDate'
	.DynamicCurrentControl = 'iif(empty(MyCursor.tMyDate) or isnull(MyCursor.tMyDate), "imgEmpty", "imgFill")'
endwith


при наведении на картинку в тултипе покажется содержимое колонки, т.е. дата (MyCursor.tMyDate). Можешь текстовое поле сделать и туда еще что-то кроме даты написать.
...
Рейтинг: 0 / 0
Динамический ToolTip
    #38242988
Нашел интересное обсуждение. Вопрос один-в-один мой:
"DYNAMIC" TOOLTIPTEXT
Там тоже пришли к мнению, что все не так просто, как кажется... И проще отступиться...
...
Рейтинг: 0 / 0
Динамический ToolTip
    #38243212
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем отступаться? Я же написал что сделать. В аттаче пример, допиливай.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Динамический ToolTip
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]