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

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

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

Сообщение 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;
с данными выдает правильное количество записей соответствующих значениям переменных и упорядоченных по дате+время модификации.

Мне надо получить последнюю по времени запись сальдо по конкретной ячейке для конкретной МЦ и партии.
Почему запрос в отчете работает не так, как в суппорте и как победить сие?
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

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

Сообщение Den »

r3:=vtSpBox.GetLast; // так писать не хорошо
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

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

Сообщение savov »

Den писал(а):r3:=vtSpBox.GetLast; // так писать не хорошо
А что происходит? Собственно, всегда пользовался GetFirst, Getlast, GetNext и работало нормально, причем даже лучше, чем циклы .{Table....
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

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

Сообщение Den »

В Операторах навигации принято указывать узел навигации <table>
Zver
Местный житель
Сообщения: 204
Зарегистрирован: 13 ноя 2012, 12:47
Откуда: СПб
Контактная информация:

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

Сообщение Zver »

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

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

Могу высказать предположение, что найдя по связке Spbox.csaldobox == Saldobox.nrec запись в Saldobox Вы получите необходимое значение.
Возможно нужно поменять порядок подцепки таблиц
с Saldobox.nrec == Spbox.csaldobox
на Spbox.csaldobox == Saldobox.nrec (то есть задавать ячейку и по ней находить сальдо )
Программист-самоучка
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

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

Сообщение savov »

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

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

Сообщение Den »

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

Насчет view.getlast - указывайте всегда узел (я не настаиваю что именно это поможет решить Вашу проблему...). Поверьте просто - именно так правильнее, хоть и указано в документации что можно к view просто обращаться
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

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

Сообщение RAJAH »

Возможно, имеет смысл использовать SetOrder.
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

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

Сообщение savov »

В общем решил так: вывел поле как сумму полей dopr и ATL_LASTTIME со знаком ":" между склеиваемыми значениями и запустил SetOrder.
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

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

Сообщение 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);
....
Ничего не помогает. Хотя все в суппорте работает ( хоть с плюсом поля пиши, хоть через запятую, разница - где идет сортировка : на внешней выгрузке или нет).
В випе не работает ничего.
Как добиться сортировки именно по двум полям дата+время?
Неужели только через таблицу в памяти?
или я чего вообще не того творю?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

Времянка здесь будет идеална. Для нормальной сортировки поля для сортировки должны быть в таблах повыше. Вьюхи эта главная? Смущает что вы тут указали имя в set order. Учтите что в визуальных элементах можно юзать только главную вьюху. Альтернативой может быть push bounds, но не здесь
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

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

Сообщение RAJAH »

А если

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

vtspbox.setorder(vtspbox.tibydt);
?
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

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

Сообщение savov »

RAJAH писал(а):А если

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


?
то все подвисает
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

подвисает значит вы правильно все сделали :)
Запрос нужно все таки переписать, чтобы табле с полями в сортировке была наверху.
Опять же - что у вас в browse - viewtable?
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

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

Сообщение 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
забрали данные, сделали запросы, обработали и т.д.
Ответить