Работа с View в интерфейсах

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

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

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

Работа с View в интерфейсах

Сообщение savov »

Помогите, пожалуйста новичку! Задача примерно такая. Имееются поля ввода, есть сложный View (вообще он д.б. не один и все с одними и теми же таблицами) с несколькими подцепленными таблицами, результат выборки зависит от значений полей (это даты и nrec-и). Надо сделать так, чтобы после ввода значений и нажатия кнопки, обновлялся View и отображался в интерфейсе. У меня не получается, либо грузится очень долго и выборка идет при инициализации, либо вообще нет обновления броузера.
Вот примерный текст. Чего я тут не пытался сделать, все результата не дало.

Interface myfirst 'Пересчет средних цен расхода' DoAccept,EscClose,cyan;
show at (2,2,150,50);

var periods : date;
var periodpo: date;
var nrecm: comp;

Create View As Select *
From Katmc, katpodr
WHERE katpodr.sklad=1;


Panel P1;
screen vibper
show at(1,1,94,5);
table katmc;
Fields
PeriodS:[10], noprotect;
PeriodPo:[10], noprotect;
katmc.barkod:[20], protect;
katmc.name:[20], skip, protect;
<<
&За периoд с .@@@@@@@@@@ &по .@@@@@@@@@@ &Номен. номер МЦ .@@@@@@@@@@@@
&Наименование МЦ .@@@@@@@@@@@@@@@@@@@@@
>>
end;//screen
screen vibskl
show at(95,1,,5);
table katpodr;
Fields
katpodr.kod:[7], protect;
katpodr.name:[20], protect;
<<
&Код склада .@@@@@@@
&Наименование .@@@@@@@@@@@@@@@@@@@@@
>>
end;//screen

handleEvent
cmDefault:
{ ReDrawPanel(CurTable);
};
end;
end;//panel p1

Panel p2;
screen vibgr
show at(1,45,,47);

BUTTONS

cmgIn; cmgOut; cmgOst; cmgRas; cmgUp; cmgRes;
<<
<.Приход.> <.Расход.> <.Остаток.> <.Расчет.> <.Изменить.> <.Сброс.>
>>
end;//screen

handleevent
cmgIn:
{RedrawPanel(CurTable);
}
cmgOut:
{Message(String(katmc.barkod));
}
cmgOst:
{
}
cmInit:
{RereadRecord;
}
cmgRas:
{
}
cmgUp:
{
}
cmgRes:
{
}
end; // HandleEvent

end;// panel

panel P3;
/* Пробовал этот View и в основной помещать, ничего
Create view prih
As select sklorder.norder,
sklorder.vidorder,
sklorder.dord,
sporder.kol,
sporder.srprice,
katmc.barkod,
katmc.name,
katsopr.nsopr,
katsopr.dopr,
katpodr.name,
katpodr.kod
From sklorder,sporder,katsopr
WHERE (( root==sklorder.nrec and (sklorder.vidorder=0)and
sklorder.csopr==katsopr.nrec AND
sklorder.nrec == sporder.csklorder and
sporder.cmc == katmc.nrec
)) and ((periods<=katsopr.dopr)and(periodpo>=katsopr.dopr));

Browse BPrih show at(1,6,50,44);
Fields
sklorder.norder;
sklorder.dord;
sporder.kol;
sporder.srprice;
end;
HandleEvent
cmDefault:
{redrawpanel(curtable)};
cmInit:
{RereadRecord;}
end;
end;
end. // interface
Deinis
Местный житель
Сообщения: 783
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

Re: Работа с View в интерфейсах

Сообщение Deinis »

Так и не понял из интерфейса, что ты хочешь.
Предполагаю что ты хочешь иметь 2 панели.
На верхней - иметь возможность проставить даты, выбрать МЦ.
На нижней - отобразить список МЦ, удовлетворяющих условиям, установленным в верхней панели. В частности - показать только те спецификации накладных, где указана эта МЦ. И только за те даты, которые указаны. Так?

Тогда:
1. Чтобы увидеть список позиций спецификаций накладных использую броуз, но никак не скрин.
2. В HandleEvent верхней панели добавь обработку события cmCheckField и запускай оттуда команду
RescanPanel( #TableName ) ;
, где TableName - это корневая таблица твоего броуза (либо скрина, если понадобится в будущем). В частности:
RescanPanel( #SpSopr ) ; где SpSopr - корневая таблица 2-ой панели.
3. Вполне возможно что что-то будет идти долго, если нет соответствующего индекса. Подбирай условия подцепки в разделе WHERE так, чтобы они соответствовали каким-либо индексам.
Vitas
Местный житель
Сообщения: 230
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Сибирь

Re: Работа с View в интерфейсах

Сообщение Vitas »

1. Для выбоа МЦ и подразделения лучше использовать стандартные интерфейсы выбора.

2. Запрос написан не верно, в таком виде в запросе: katpodr.name,katpodr.kod - абсолютно не нужны.

3. Запрос параметров лучше вынести в виндовы, которые будут вызывать по инициализации фейса, т.е. по событию
cmInit

4. По cmDefault виндовов (пунк 3) выполняешь ReReadRecord и CloseWindow(имя виндова)
Ищу возможности довести и так отличный продукт до еще большего блеска
Vitas
Местный житель
Сообщения: 230
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Сибирь

Re: Работа с View в интерфейсах

Сообщение Vitas »

Кстати, а зачем ограничение накладывать на katsopr если корневая sklorder?
Ищу возможности довести и так отличный продукт до еще большего блеска
Max_Fin
На пенсии
Сообщения: 797
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:

Re: Работа с View в интерфейсах

Сообщение Max_Fin »

что-то вроде этого должно быть, не компилил, поэтому возможны очепятки ;-)

Create View As Select *
Var
cKatMC, cKatPodr: Comp;
periods : date;
periodpo: date;

From KatMC, KatPodr
WHERE
cKatMC == KatMC.nRec and
cKatPodr == KatPodr.nRec;

Panel P1;

screen vibper
show at(1,1,94,5);
table katmc;
Fields
PeriodS: noprotect;
PeriodPo: noprotect;
katmc.barkod: protect, pickbutton;
katmc.name: protect, pickbutton;
<<
&За периoд с .@@@@@@@@@@ &по .@@@@@@@@@@ &Номен. номер МЦ .@@@@@@@@@@@@
&Наименование МЦ .@@@@@@@@@@@@@@@@@@@@@
>>
end;//screen
screen vibskl
show at(95,1,,5);
table katpodr;
Fields
katpodr.kod: protect, pickbutton;
katpodr.name: protect, pickbutton;
<<
&Код склада .@@@@@@@
&Наименование .@@@@@@@@@@@@@@@@@@@@@
>>
end;//screen
HandleEvent
cmPick:
{
if (CurField = #Katmc.Barkod) or
(CurField = #Natmc.Name)
{
var cMC: Comp;
cMC := cKatMC;
if RunInterface('GetMC', cMC) <> cmCancel
{
set cKatMC := cMC;
ReScanPanel(#KatMC);
}
}
if (CurField = #Katmc.Barkod) or
(CurField = #Katmc.Name)
{
var cPodr: Comp;
cPodr := cKatPodr;
if RunInterface(GetAnyPodr, cPodr, 1) <> cmCancel
{
set cKatPodr := cPodr;
ReScanPanel(#KatPodr);
}
}
}
cmDelOnProtect:
{
if (CurField = #Katmc.Barkod) or
(CurField = #Natmc.Name)
{
set cKatMC := 0;
ReScanPanel(#KatMC);
}
if (CurField = #Katmc.Barkod) or
(CurField = #Katmc.Name)
{
set cKatPodr := 0;
ReScanPanel(#KatPodr);
}
}
end;
end;// panel
Жду выхода Вселенная 2.12!
Max_Fin
На пенсии
Сообщения: 797
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:

Re: Работа с View в интерфейсах

Сообщение Max_Fin »

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

Re: Работа с View в интерфейсах

Сообщение savov »

Во-первых, спасибо, Деинис!
Да, ты меня правильно понял. Задаем ограничения и по ним делаем выборку, причем это надо многократно (персечет средних цен тогда, когда гал-ка не считает).
Суть ответа я понял, но у меня возникли вопросы.
1. Броуз описывается в другой панели, не в той, в которой выборка условий?
2. Таблица для броуза - View с подцепкой, имеет ли этот вьюер имя? именно его указывать в Rescan? ведь мне в броуз нужны поля из разных таблиц!
Вообще, есть ли некоторый стандартный подход к таким вещам?
Deinis
Местный житель
Сообщения: 783
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

Re: Работа с View в интерфейсах

Сообщение Deinis »

>> 1. Броуз описывается в другой панели, не в той, в которой выборка условий?
Верно. Посмотри на стандартные интерфейсы Галактики. Например стандартный интерфейс, выводящий на экран бухгалтерские проводки. Перед тобой в общем-то броуз, а внизу - скрин с более подробной информацией по документу, на котором установлен курсор. Фильтр ты устанавливаешь по Alt+B, но никто не мешает его описать и в скрине (только небольшой, а то и скрина не хватит ;) ).

>> 2. Таблица для броуза - View с подцепкой, имеет ли этот вьюер имя? именно его указывать в Rescan? ведь мне в броуз нужны
>> поля из разных таблиц!
Таблица указывается та, которая является корневой для панели.

Panel panSpSopr;
browse brSpSopr
show at(1,6,50,44);
Table SpSopr;
Fields
...

Вот если ты напишешь так, то указывать RescanPanel( #SpSopr ) ;
Будет обновлена вся ПАНЕЛЬ, в которой, как ты пишешь - поля выводятся из разных таблиц.
Маверик уже писал про корпоративные стандарты. К каждой панели привязывай ТОЛЬКО одну таблицу (думаю, что корневую). Тогда команда RescanPanel( #TableName ) ; будет обновлять всю панель.
НЕ привязывай к одной панели несколько корневых таблиц с помощью команды
Table TableName;
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

Re: Работа с View в интерфейсах

Сообщение savov »

Благодарю Деиниса за помощь, работает все.
Ответить