Страница 1 из 1

Странное поведение вьюхи

Добавлено: 21 фев 2014, 12:12
savov
Всем доброго времени суток.
Хотелось бы с вами, уважаемые, обсудить один вопрос.
Имею vip-отчет.
Там есть

Код: Выделить всё

Create View vtSpBox As 
Select KatMol.name, spbox.dopr, spbox.ATL_LASTTIME, spbox.csopr, spbox.kol, spbox.csporder, spbox.nrec, sklorder.cpodr, sporder.kol
from spbox, katbox, saldobox, sporder, sklorder, katmol
WHERE (( NrecKatBox==Katbox.nrec
       and katBox.nrec==SaldoBox.cbox
       and Katmcnrec==Saldobox.cmc
       and Npodr==Saldobox.cpodr
       and PartyNrec==Saldobox.cparty 
       and Saldobox.nrec==Spbox.csaldobox and (Spbox.vid=0)
       and SpBox.csporder/==SpOrder.nrec
       and Sporder.csklorder/==Sklorder.nrec 
       and Sklorder.cmol==Katmol.nrec)) 
order by spbox.dopr, spbox.ATL_LASTTIME;
Далее в этом отчете переменные NrecKatBox, Katmcnrec, PartyNrec (Npodr устанавливается в самом начале отчета ) получают некоторые конкретные значения, я делаю после этого r3:=vtSpBox.GetLast; ( для установки на последнюю запись сальдо по ячейке для конкретной МЦ, партии).
Так вот, если убрать из запроса order by spbox.ATL_LASTTIME, оставив только упорядочение по spbox.dopr, то все работает, если два поля в order by, то БЕРЕТСЯ ОДНА И ТА ЖЕ ЗАПИСЬ ДЛЯ ВСЕХ МЦ и партий.
Очень интересно то, что если запрос скопировать в SQL суппорта, подставив конкретные значения переменных, то запрос работает совершенно верно!
Т.е.

Код: Выделить всё

Select KatMol.name, spbox.dopr, spbox.ATL_LASTTIME, spbox.csopr, spbox.kol, spbox.csporder, spbox.nrec, sklorder.cpodr, sporder.kol
from spbox, katbox, saldobox, sporder, sklorder, katmol
WHERE (( NrecKatBox==Katbox.nrec
       and katBox.nrec==SaldoBox.cbox
       and Katmcnrec==Saldobox.cmc
       and Npodr==Saldobox.cpodr
       and PartyNrec==Saldobox.cparty 
       and Saldobox.nrec==Spbox.csaldobox and (Spbox.vid=0)
       and SpBox.csporder/==SpOrder.nrec
       and Sporder.csklorder/==Sklorder.nrec 
       and Sklorder.cmol==Katmol.nrec)) 
order by spbox.dopr, spbox.ATL_LASTTIME;
с данными выдает правильное количество записей соответствующих значениям переменных и упорядоченных по дате+время модификации.

Мне надо получить последнюю по времени запись сальдо по конкретной ячейке для конкретной МЦ и партии.
Почему запрос в отчете работает не так, как в суппорте и как победить сие?

Re: Странное поведение вьюхи

Добавлено: 21 фев 2014, 12:27
Den
r3:=vtSpBox.GetLast; // так писать не хорошо

Re: Странное поведение вьюхи

Добавлено: 21 фев 2014, 12:34
savov
Den писал(а):r3:=vtSpBox.GetLast; // так писать не хорошо
А что происходит? Собственно, всегда пользовался GetFirst, Getlast, GetNext и работало нормально, причем даже лучше, чем циклы .{Table....

Re: Странное поведение вьюхи

Добавлено: 21 фев 2014, 12:41
Den
В Операторах навигации принято указывать узел навигации <table>

Re: Странное поведение вьюхи

Добавлено: 21 фев 2014, 13:09
Zver
В несколько раз сталкивался с тем, что добавление сортировки по некоторым полям может ломать всю выборку по логической таблице, то есть в конечную выборку попадает только один элемент.
Пока есть только предположение, что такое поведение может быть связано с тем, что указанный порядок сортировки не укладывается ни в один из существующих индексов.

Другой вопрос, связанный с постановкой задачи. Вы уверены, что нужна сортировка по spbox.ATL_LASTTIME?
С таблицей SaldoBox не знаком, но по структуре полей она похожа на знакомую мне SklOst. В SklOst хранится актуальное количество на складе на текущий момент.

Могу высказать предположение, что найдя по связке Spbox.csaldobox == Saldobox.nrec запись в Saldobox Вы получите необходимое значение.
Возможно нужно поменять порядок подцепки таблиц
с Saldobox.nrec == Spbox.csaldobox
на Spbox.csaldobox == Saldobox.nrec (то есть задавать ячейку и по ней находить сальдо )

Re: Странное поведение вьюхи

Добавлено: 21 фев 2014, 13:17
savov
Zver писал(а):Другой вопрос, связанный с постановкой задачи. Вы уверены, что нужна сортировка по spbox.ATL_LASTTIME?
Не уверен. Но ячейки организованы так, что по одной ячейке по одному сальдо по конкретной МЦ существует несколько записей по операциям ( т.е. приход, расход, перемещение). Плюс по одной ячейке может быть несколько сальдо. Единственное, что приходит в голову ( хотя, понимаю, не со 100 % уверенностью, что это верно) задействовать еще и время записи операции, т.к. по одному сальдо может быть несколько операций в течение суток.
Смущает другое, что копирование запроса в суппорте дает совершенно верные результаты!
Как сказал Den, GetLast не хорошо, но читаем, что:
"getlast - переход к последней строке физической таблицы, если таблица указана в секции <таблица для навигации>. Иначе переход к последней строке текущей логической таблицы."
В чем же тогда причина разного поведения запроса?

Re: Странное поведение вьюхи

Добавлено: 21 фев 2014, 13:24
Den
Да там все же есть отличия некоторые от того что запускаешь в sql саппорта, и в FCOM (хотя Вы в топике указывали что делаете отчет на VIP ..)
Баг такой быстрее всего именно из за того что на внешнюю выгрузку уходит т.к. нет индекса нужного

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

Re: Странное поведение вьюхи

Добавлено: 21 фев 2014, 16:07
RAJAH
Возможно, имеет смысл использовать SetOrder.

Re: Странное поведение вьюхи

Добавлено: 24 фев 2014, 14:45
savov
В общем решил так: вывел поле как сумму полей dopr и ATL_LASTTIME со знаком ":" между склеиваемыми значениями и запустил SetOrder.

Re: Странное поведение вьюхи

Добавлено: 27 май 2014, 19:44
savov
В связи с тем, что задача откладывалась, а в момент написания последнего сообщения было мало документов, я не отловил проблему. А именно: setorder не работает.
Более того, не работает и order by по одному полю ( в выборку не попадают записи, что совсем странно). Да, по некоторым соображениям пришлось перейти на дату и время модификации ордера ( spbox.dopr как было в предыдущих сообщениях не работает при формировании актов на перемещение между объектами)
Итак, пробовал все что внизу вьюхи закомментировано:

Код: Выделить всё

Create View vtSpBox As 
Select sklorder.ATL_LASTDATE,sklorder.ATL_LASTTIME, KatMol.name, spbox.csopr, spbox.kol, spbox.csporder, spbox.nrec, sklorder.cpodr, sporder.kol
from spbox, katbox, saldobox, sporder, sklorder, katmol
WHERE (( NrecKatBox==Katbox.nrec
       and katBox.nrec==SaldoBox.cbox
       and Katmcnrec==Saldobox.cmc
       and Npodr==Saldobox.cpodr
       and PartyNrec==Saldobox.cparty 
       and Saldobox.nrec==Spbox.csaldobox and (Spbox.vid=0)
       and SpBox.csporder/==SpOrder.nrec
       and Sporder.csklorder/==Sklorder.nrec 
       and Sklorder.cmol==Katmol.nrec)); 
//      order by sklorder.ATL_LASTDATE+sklorder.ATL_LASTTIME; 
//       order by sklorder.ATL_LASTDATE;
//      order by sklorder.ATL_LASTDATE,sklorder.ATL_LASTTIME; 
Позиционировался через

Код: Выделить всё

r3:=vtSpBox.getfirst sklorder;
и без :

Код: Выделить всё

r3:=vtSpBox.getfirst.
Делал setorder:

Код: Выделить всё

...
order bydt by sklorder.ATL_LASTDATE,sklorder.ATL_LASTTIME;
...
setorder(vtspbox.tibydt);
....
Ничего не помогает. Хотя все в суппорте работает ( хоть с плюсом поля пиши, хоть через запятую, разница - где идет сортировка : на внешней выгрузке или нет).
В випе не работает ничего.
Как добиться сортировки именно по двум полям дата+время?
Неужели только через таблицу в памяти?
или я чего вообще не того творю?

Re: Странное поведение вьюхи

Добавлено: 28 май 2014, 09:02
edward_K
Времянка здесь будет идеална. Для нормальной сортировки поля для сортировки должны быть в таблах повыше. Вьюхи эта главная? Смущает что вы тут указали имя в set order. Учтите что в визуальных элементах можно юзать только главную вьюху. Альтернативой может быть push bounds, но не здесь

Re: Странное поведение вьюхи

Добавлено: 28 май 2014, 11:27
RAJAH
А если

Код: Выделить всё

vtspbox.setorder(vtspbox.tibydt);
?

Re: Странное поведение вьюхи

Добавлено: 28 май 2014, 14:15
savov
RAJAH писал(а):А если

Код: Выделить всё
vtspbox.setorder(vtspbox.tibydt);


?
то все подвисает

Re: Странное поведение вьюхи

Добавлено: 28 май 2014, 14:37
edward_K
подвисает значит вы правильно все сделали :)
Запрос нужно все таки переписать, чтобы табле с полями в сортировке была наверху.
Опять же - что у вас в browse - viewtable?

Re: Странное поведение вьюхи

Добавлено: 28 май 2014, 15:10
savov
А нету у меня browse-ов. Идут чисто вьюхи и обработанные данные кидаются в эксель через ф-ии галактики для экселя.
Т.е. выводится окно для запроса параметров

Код: Выделить всё

Panel P1;
Table TParam   
screen vibgr
show at(1,,,8);
Fields
TParam.tPodrName('Склад',hcAllVSomeGroup,sci13Esc):[45], pickButton, Noprotect;
TParam.VidAanlis('Выбрать ячейки:',,sci1EnEsc):[list 0 'Только свободные', 1 'Занятые (частично или полностью)', 2 'Все'], centered, protect;
TParam.VirtSklad('Выбрать вирт. склад',hcallvsomegroup,sci13esc):[25], pickButton, protect;

<<

&Склад.@@@@@@@@@@@@@@@@@@@@@@@@@
&Выбрать ячейки .@@@@@@@@@@@@@@@@@@@@@@@@@@@
&Выбрать вирт. склад .@@@@@@@@@@@@@@@@@@@@@@

>>
end;

screen vibbut
show at(1,9,,);

 BUTTONS

 cmgOK; cmgEsc;
<<
 <.   OK  .> <. Выход .>
>>
end;//screen
забрали данные, сделали запросы, обработали и т.д.