Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / ZEN "перемещение" екземпляров в tablePane / 5 сообщений из 5, страница 1 из 1
20.10.2009, 15:17
    #36262190
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZEN "перемещение" екземпляров в tablePane
Делаю "перемещение" строки вверх или вниз в tablePane...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
...
<tablePane 
	id="tpMenu" 
	tableName="wrk.Menu" 
	valueColumn="ID"
	pageSize="20" 
	useSnapshot="true" 
	caption="Меню" 
	onselectrow='zenPage.Select(zenThis.getValue("ID"))'
	ondblclick='zenPage.Run(zenThis.getValue("ID"));' 
	sql="Select ID,Name From wrk.Menu Order by Prio"
>
	...
</tablePane>
...
<fieldSet legend="Переместить">
	<button 
		id="bUp" 
		caption="Выше" 
		onclick="zenPage.Up();" 
		controlClass="btn"
	/>
	<button 
		id="bDown" 
		caption="Ниже" 
		onclick="zenPage.Down();" 
		controlClass="btn"
	/>
</fieldSet>
...
/// Элемент вверх
Method Up() [ Language = javascript ]
{
	var cn=zenPage.getComponentById('cnMenu')
	var id = cn.getModelId();
	if (id=='') {
		alert('Нужно выбрать элемент...')
		return
	}
	zenPage.cUp(id)
	zenPage.getComponentById('tpMenu').executeQuery();
}

/// Перемещение элемента вверх
Method cUp(Id) [ ZenMethod ]
{
	s sql="Select ID From wrk.Menu as c Where c.Prio = (Select max(a.Prio) From wrk.Menu as a Where a.Prio < (Select b.Prio From wrk.Menu as b Where b.ID=?))"
	s ors=##class(%ResultSet).%New("%DynamicQuery:SQL")
	s ok=ors.Prepare(sql)
	s:ok ok=ors.Execute(Id)
	if ors.Next() {
		d UP
	}
	d ors.Close()
	q ok
UP // Перемещение элемента
	s id=ors.Get("ID")
	q:id=""
	d ##class(wrk.Menu).SwapPrio(id,Id)
	q
}
...

Так же есть классовый метод

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
/// Обмен приоритетами
ClassMethod SwapPrio(Id1 As %String, Id2 As %String) As %String
{
	s o1=##class(wrk.Menu).%OpenId(Id1)
	s o2=##class(wrk.Menu).%OpenId(Id2)
	s val=o1.Prio
	s o1.Prio=o2.Prio
	s o2.Prio=val
	d o1.%Save()
	d o1.%Close()
	d o2.%Save()
	d o2.%Close()
}

В итоге элементы двигаются как нужно. Но часто появляется вот такое окно (см.вложение)... Как с этим бороться?
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
28.10.2009, 10:43
    #36276399
kolesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZEN "перемещение" екземпляров в tablePane
krvsa,

Насколько я понял, зен говорит о том, что обновлять нечего (содержание таблицы не изменилось). Видимо вот здесь проблема:

Код: plaintext
1.
2.
	zenPage.cUp(id)
	zenPage.getComponentById('tpMenu').executeQuery();

вторая строка начала выполняться до завершения первой (для js это норма)

иногда выручает

Код: plaintext
1.
2.
	var temp = zenPage.cUp(id);
	zenPage.getComponentById('tpMenu').executeQuery();

наверно, поможет и


Код: plaintext
1.
2.
	var temp = zenPage.cUp(id);
	if (temp ||  1 = 1 ) zenPage.getComponentById('tpMenu').executeQuery();

наверняка выручит управление zenSynchronousMode, но тормозить будет...
...
Рейтинг: 0 / 0
28.10.2009, 10:47
    #36276410
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZEN "перемещение" екземпляров в tablePane
kolesov , спасибо! Поэксперементирую...
...
Рейтинг: 0 / 0
28.10.2009, 11:02
    #36276476
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZEN "перемещение" екземпляров в tablePane
Код: plaintext
var temp = zenPage.cUp(id);

Не шибко-то оно и помогает...
Если делать

Код: plaintext
if (temp ||  1 = 1 ) zenPage.getComponentById('tpMenu').executeQuery();

тот же эффект...
Совственно сам вызов

Код: plaintext
zenPage.getComponentById('tpMenu').executeQuery();

Не несет никакого криминала и я всегда делаю кнопку "Обновить" с вызовом этого метода, на тот случай если другие пользователи чего-то там наменяли, а после обновления это можно посмотреть.
Если изменений небыло вызов метода все равно проходит успешно. А вот с "перемещениями" получается такая вот фигня.
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
28.10.2009, 11:15
    #36276520
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZEN "перемещение" екземпляров в tablePane
Дописал к методам

Код: plaintext
1.
2.
3.
4.
/// Перемещение элемента вверх
Method cUp(Id) As %String [ ZenMethod ]
...
/// Перемещение элемента вверх
Method cDown(Id) As %String [ ZenMethod ]

Применил как учил kolesov

Код: plaintext
1.
2.
3.
4.
var val=zenPage.cDown(id)
if (val== 1 ){
	zenPage.getComponentById('tpMenu').executeQuery();
}

Ошибка однозначно ушла и вроде как успевает перемещать.
----------
Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / ZEN "перемещение" екземпляров в tablePane / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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