Как использовать Bounds?
Модераторы: m0p3e, edward_K, Модераторы
Как использовать Bounds?
В справке совсем как то скудно, почитал форум - тоже не прояснилось ничего.
Например у меня есть интерфейс в который выводится некая таблица 1 - с полями a, b, c, ....x, y, z
из него по клавише выскакивает еще один интерфейс в котором выводится таблица 2 - с полями с, x
(сразу оговорюсь что и там и там совпадающие поля одинаковы и имеют значение :string)
я хочу сделать чтобы при выборе во втором интерфейсе значения поля c или x в первом осталось только равное ему значение
как я понял из документации мне нужно установить эти самые bounds
и наверное это делается так :
var cc, xx :string
bounds filcc = cc == 1.c
bounds filxx = xx == 1.x
накладывание идет через оператор addbounds где его дальше описать не понятно
снятие происходит через subbounds, я например хочу чтобы снималось при вызове 2 интерфейса - тоже не понятно как описать но предположение есть что описать надо в {} события вызова 2 интерфейса.
В общем помогите, разъясните.
Например у меня есть интерфейс в который выводится некая таблица 1 - с полями a, b, c, ....x, y, z
из него по клавише выскакивает еще один интерфейс в котором выводится таблица 2 - с полями с, x
(сразу оговорюсь что и там и там совпадающие поля одинаковы и имеют значение :string)
я хочу сделать чтобы при выборе во втором интерфейсе значения поля c или x в первом осталось только равное ему значение
как я понял из документации мне нужно установить эти самые bounds
и наверное это делается так :
var cc, xx :string
bounds filcc = cc == 1.c
bounds filxx = xx == 1.x
накладывание идет через оператор addbounds где его дальше описать не понятно
снятие происходит через subbounds, я например хочу чтобы снималось при вызове 2 интерфейса - тоже не понятно как описать но предположение есть что описать надо в {} события вызова 2 интерфейса.
В общем помогите, разъясните.
Re: Как использовать Bounds?
В вопросе уже есть ответ... Наложение фильтра нужно выполнять после вызова второго интерфейса, который в переменные cc и xx передаст значения, а если значения пустые, то снять фильтр.denisag писал(а): я хочу сделать чтобы при выборе во втором интерфейсе значения поля c или x в первом осталось только равное ему значение
...
накладывание идет через оператор addbounds где его дальше описать не понятно
снятие происходит через subbounds, я например хочу чтобы снималось при вызове 2 интерфейса - тоже не понятно как описать но предположение есть что описать надо в {} события вызова 2 интерфейса.
Re: Как использовать Bounds?
Накидал как понял - а не понял то в общем то нифига:
компилятор выдал ошибки "Нужен ключ ADRES для TMPVOZVRATMC" и "Ошибка создания логической таблицы".
Если только с условием для filGruz то компилится, но условия не накладываются
Код: Выделить всё
.....
var _gruz, _adr :string;
.....
create view as select * from tmpVozvratMC
bounds filGruz = _gruz == tmpVozvratMC.CGRUZTO
bounds filAdr = _adr == tmpVozvratMC.ADRES
;
// Выводим то что будет отображаться в нашем интерфейсе
browse EmployeeBrowse;
.....
cmpick:
{
_gruz:=0;
_adr:=0;
RUNINTERFACE (L_SOPRDOC::Example2, _corg) ;
if _gruz !=0
{
subbounds(tbfilGruz);
addbounds(tbfilGruz);
}
else
subbounds(tbfilGruz)
PutCommand(cmRefreshBDdata)
if _adr !=0
{
subbounds(tbfilAdr);
addbounds(tbfilAdr);
}
else
subbounds(tbfilAdr)
PutCommand(cmRefreshBDdata)
}
end;
end.
...
Если только с условием для filGruz то компилится, но условия не накладываются
Re: Как использовать Bounds?
Потому что по CGRUZTO есть ключ во временной таблице, а по ADRES нет.denisag писал(а):Накидал как понял - а не понял то в общем то нифига:
компилятор выдал ошибки "Нужен ключ ADRES для TMPVOZVRATMC" и "Ошибка создания логической таблицы".Код: Выделить всё
..... var _gruz, _adr :string; ..... create view as select * from tmpVozvratMC bounds filGruz = _gruz == tmpVozvratMC.CGRUZTO bounds filAdr = _adr == tmpVozvratMC.ADRES ; // Выводим то что будет отображаться в нашем интерфейсе browse EmployeeBrowse; ..... cmpick: { _gruz:=0; _adr:=0; RUNINTERFACE (L_SOPRDOC::Example2, _corg) ; if _gruz !=0 { subbounds(tbfilGruz); addbounds(tbfilGruz); } else subbounds(tbfilGruz) PutCommand(cmRefreshBDdata) if _adr !=0 { subbounds(tbfilAdr); addbounds(tbfilAdr); } else subbounds(tbfilAdr) PutCommand(cmRefreshBDdata) } end; end. ...
Если только с условием для filGruz то компилится, но условия не накладываются
Либо добавить ключ по ADRES, либо использовать (noindex), либо вместо Bounds использовать Condition.
Re: Как использовать Bounds?
использовал (noindex) - все откомпилировалось - но условия не накладываются
Re: Как использовать Bounds?
RUNINTERFACE (L_SOPRDOC::Example2, _corg) ;denisag писал(а):использовал (noindex) - все откомпилировалось - но условия не накладываются
if _gruz !=0
Как-то не логично.
Наверное так:
RUNINTERFACE (L_SOPRDOC::Example2, _gruz) ;
if _gruz !=0
Re: Как использовать Bounds?
RUNINTERFACE (L_SOPRDOC::Example2, _corg) - _corg это параметр который используется в интерфейсе, он нужен.
Сделал вот так:
Все равно фильтр не накладывается
Сделал вот так:
Код: Выделить всё
.....
cmpick:
{
_gruz:=0;
_adr:=0;
RUNINTERFACE (L_SOPRDOC::Example2, _corg, _gruz, _adr);
if _gruz !=0
{
subbounds(tbfilGruz);
addbounds(tbfilGruz);
}
else
subbounds(tbfilGruz)
PutCommand(cmRefreshBDdata)
if _adr !=0
{
subbounds(tbfilAdr);
addbounds(tbfilAdr);
}
else
subbounds(tbfilAdr)
PutCommand(cmRefreshBDdata)
}
end;
end.
.....
Последний раз редактировалось denisag 31 янв 2012, 20:43, всего редактировалось 1 раз.
Re: Как использовать Bounds?
Тогда _gruz всегда равно 0denisag писал(а):RUNINTERFACE (L_SOPRDOC::Example2, _corg) - _corg это параметр который используется в интерфейсе, он нужен.
Re: Как использовать Bounds?
Как можно понять в чем ошибка, если по этим исходникам не видно как меняются переменные???denisag писал(а):RUNINTERFACE (L_SOPRDOC::Example2, _corg) - _corg это параметр который используется в интерфейсе, он нужен.
Сделал вот так:
Все равно фильтр не накладываетсяКод: Выделить всё
..... cmpick: { _gruz:=0; _adr:=0; RUNINTERFACE (L_SOPRDOC::Example2, _corg, _gruz, _adr); if _gruz !=0 { subbounds(tbfilGruz); addbounds(tbfilGruz); } else subbounds(tbfilGruz) PutCommand(cmRefreshBDdata) if _adr !=0 { subbounds(tbfilAdr); addbounds(tbfilAdr); } else subbounds(tbfilAdr) PutCommand(cmRefreshBDdata) } end; end. .....
Для начала нужно проверить накладываются ли bounds'ы безусловно.
Или отладчиком посмотреть что и почему происходит с переменными _gruz и _adr.
Иначе все это выглядит как черный ящик.
Re: Как использовать Bounds?
добавил message в начало и в конец события - выводятся нули и там и там.
Установил только 1 условие:
что в начале что в конце бондс = 0.
Я думаю что наверное надо написать какому полю должен быть равен _gruz при наложении условия? Как это описать?
А весь код вот:
Установил только 1 условие:
Код: Выделить всё
{
_gruz:=0;
message (_gruz)
RUNINTERFACE (L_SOPRDOC::Example2, _corg);
if _gruz !=0
{
subbounds(tbfilGruz);
addbounds(tbfilGruz);
message (_gruz)
}
else
subbounds(tbfilGruz)
PutCommand(cmRefreshBDdata)
message (_gruz)
}
end;
end.
Я думаю что наверное надо написать какому полю должен быть равен _gruz при наложении условия? Как это описать?
А весь код вот:
Код: Выделить всё
//Добавлять во все проекты -----------------
#param /linc:d:\viperprojekt\autoexec.vpp
#setcurenv "galnet" from 'c:\GAL810\exe\';
#define ComponentVersion
//-----------------------------------------
#include GALNET.CCM
//Выбираем с чем работаем (в данном случае ресурс L_SOPRDOC)
#Component "L_SOPRDOC"
//Выбираем интерфейс из ресурса (в данном случае AKTREC)
//Обозначаем переменные
var _corg, _cmc, _csporder, _cpodr:comp; // _gruz,
var _kol, _price:double;
var _dsopr :date;
var _gruz, _adr :string;
//Временная таблица для 'Возврат материальной ценности'
table struct tmpVozvratMC "Возврат материальной ценности"
(
NNAKL :string "№ Накладной" ,
DATA :date "Дата",
NAMEMC :string "Наименование товара",
CENA :double "Цена",
CGRUZTO :string "Наименование грузополучателя",
PARTYNAME :string "Название партии",
NORDER :string "№ Ордера",
SKLAD :string "Наименование склада",
ADRES :string "Адрес грузополучателя",
OTGRUZ :double "Количество отгруженного товара",
VOZVRAT :double "Количество возвращенного товара",
KONTRAGENT :string "Наименование контрагента",
KOLFACT :double "Кол-во фактическое",
SPORDERNREC :comp "NREC ордера",
CGRUZFROM :comp "Код грузоотправителя"
)
with index
(
ind = CGRUZTO //Индекс по грузополучателю
);
//Временная таблица для 'Грузополучатели'
table struct tmpGruzto "Грузополучатели"
(
CGRUZTO :string "Наименование грузополучателя",
ADRES :string "Адрес грузополучателя",
KATORG3 :string "Наименование контрагента",
CGRUZTONREC :comp "NREC грузополучателя"
)
with index
(
ind = CGRUZTONREC //Индекс по NREC грузополучателя
);
// тут временная таблица закончилась
//Выбираем интерфейс из ресурса (в данном случае AKTREC)
alter interface AKTREC;
// Будем изменять обработчики таблице "SPSOPR"
tableEvent table SPSOPR
// Объявляем обработчик который нам нужен
cmPick:
{
// выбираем случай из "#NAMEMCUSL:" и присваиваем запуск интерфейса
case curfield of
#NAMEMCUSL:
{
if runinterface (L_MCU::GETMC,spsopr.cmcusl) = cmdefault and spsopr.cmcusl != 0
if isnew()
insert current spsopr;
else
update current spsopr;
rereadrecord(#spsopr);
runinterface (L_SOPRDOC::Example, katsopr.corgbase, spsopr.cmcusl, spsopr.kolfact, spsopr.price, spsopr.csporder, katsopr.dsopr, katsopr.cpodrto);
spsopr.rprice:=spsopr.price;
update current spsopr;
PutCommand(cmRefreshBDdata)
}
// иначе обрабатываем обычный "cmPick"
else if(inherited::HandleEvent(cmPick) = heOk) {}
end;
}
end;
//Обработка события внутри родительского интерфейса только для этого окна
window EDITSOPR
handleEvent
cmRestoreDoc:
{
runinterface (L_MCU::GETMC,spsopr.cmcusl);
}
end;
end;
end.
// Создаем свой интерфейс с именем "Example"
Interface Example 'Возврат материальной ценности' (,,scinterface), escClose, cyan, doAccept;
//Передаем ему параметры
parameters _corg, _cmc, _kol, _price, _csporder, _dsopr, _cpodr
//Создаем представление для временной таблицы tmpVozvratMC
create view as select * from tmpVozvratMC
//bounds filGruz = _gruz == tmpVozvratMC.cgruzfrom(noindex)
bounds filGruz = _gruz == tmpVozvratMC.CGRUZTO
bounds filAdr = _adr == tmpVozvratMC.ADRES(noindex)
;
// Выводим то что будет отображаться в нашем интерфейсе
browse EmployeeBrowse;
table tmpVozvratMC
Fields
tmpVozvratMC.NNAKL '№ Накладной':[8], protect;
tmpVozvratMC.DATA 'Дата':[8], protect;
tmpVozvratMC.NAMEMC 'Наименование товара':[25], protect;
tmpVozvratMC.CENA 'Цена':[10], protect;
tmpVozvratMC.CGRUZTO 'Наименование грузополучателя':[25], protect;
tmpVozvratMC.PARTYNAME 'Название партии':[25], protect;
tmpVozvratMC.NORDER '№ Ордера':[10], protect;
tmpVozvratMC.SKLAD 'Наименование склада':[15], protect;
tmpVozvratMC.ADRES 'Адрес грузополучателя':[25], protect;
tmpVozvratMC.OTGRUZ 'Кол-во отгруженного товара':[5], protect;
tmpVozvratMC.VOZVRAT 'Кол-во возвращенного товара':[5], protect;
(tmpVozvratMC.OTGRUZ - tmpVozvratMC.VOZVRAT) 'Кол-во доступное для возврата':[5], protect;
tmpVozvratMC.KONTRAGENT 'Наименование контрагента':[25], protect;
end;
handleevent
cmInit :
{
//Присваиваем имя вызываемому интерфейсом окну
SetWindowTitle(wnMainWindow,'Возврат материальной ценности ' + tmpVozvratMC.NAMEMC);
//Обрабатываем прямой SQL для первого интерфейса
sql select
SET1.KATSOPRNSOPR
,SET1.KATSOPRDSOPR
,SET1.KATMCNAME
,SET1.SPSOPRPRICE
,SET1.katorg2name
,SET1.KATPARTYNAME
,SET1.SKLORDERNORDER
,SET1.KATPODRNAME
,SET1.KATORG2ADDR
,SET1.SPORDERKOL
,SET2.SPORDERKOL2
,SET1.KATORG1NAME
,SET1.SPSOPRKOLFACT
,SET1.SPORDERNREC
,SET1.KATSOPRCGRUZFROM
from
(select
SPORDER.NREC as SPORDERNREC
,KATSOPR.NSOPR as KATSOPRNSOPR
,KATSOPR.DSOPR as KATSOPRDSOPR
,KATMC.NAME as KATMCNAME
,SPSOPR.PRICE as SPSOPRPRICE
,katorg2.name as katorg2name
,KATPARTY.NAME as KATPARTYNAME
,SKLORDER.NORDER as SKLORDERNORDER
,KATPODR.NAME as KATPODRNAME
,KATORG2.ADDR as KATORG2ADDR
,SPORDER.KOL as SPORDERKOL
,KATORG1.NAME as KATORG1NAME
,SPSOPR.CSPORDER as SPSOPRCSPORDER
,SPSOPR.KOLFACT as SPSOPRKOLFACT
,KATSOPR.CGRUZFROM as KATSOPRCGRUZFROM
from
KATSOPR
INNER JOIN SPSOPR on KATSOPR.NREC = SPSOPR.CSOPR and 1 = SPSOPR.PRMC
INNER JOIN SKLORDER on KATSOPR.NREC = SKLORDER.CSOPR
INNER JOIN SPORDER on SPORDER.CSPSOPR = SPSOPR.NREC
LEFT OUTER JOIN KATORG as KATORG1 on KATSOPR.CORGBASE = KATORG1.NREC
LEFT OUTER JOIN KATORG as KATORG2 on KATSOPR.CGRUZTO = katorg2.NREC
LEFT OUTER JOIN KATMC on SPORDER.CMC = KATMC.NREC
LEFT OUTER JOIN KATPARTY on SPORDER.CPARTY = KATPARTY.NREC
LEFT OUTER JOIN KATPODR on SPORDER.CCPODR = KATPODR.NREC
where
201 = KATSOPR.VIDSOPR and
(katsopr.corgbase = :_corg ) and
(spsopr.cmcusl = :_cmc ) and
(katsopr.dsopr <= :_dsopr ) and
// (katpodr.nrec = :_cpodr ) можно фильтровать и так, и как представлено ниже. В КВЕРИ выглядит одинаково
(katsopr.cpodrfrom = :_cpodr )
) as SET1
LEFT OUTER JOIN
(select
SPSOPR.CSPORDER
,SUM (SPORDER.KOL) as SPORDERKOL2
from
KATSOPR
INNER JOIN SPSOPR on KATSOPR.NREC = SPSOPR.CSOPR and 1 = SPSOPR.PRMC
INNER JOIN SKLORDER on KATSOPR.NREC = SKLORDER.CSOPR
INNER JOIN SPORDER on SPORDER.CSPSOPR = SPSOPR.NREC
LEFT OUTER JOIN KATORG as KATORG1 on KATSOPR.CORGBASE = KATORG1.NREC
LEFT OUTER JOIN KATORG as KATORG2 on KATSOPR.CGRUZTO = katorg2.NREC
LEFT OUTER JOIN KATMC on SPORDER.CMC = KATMC.NREC
LEFT OUTER JOIN KATPARTY on SPORDER.CPARTY = KATPARTY.NREC
LEFT OUTER JOIN KATPODR on SPORDER.CCPODR = KATPODR.NREC
where
106 = KATSOPR.VIDSOPR
group by KATMC.NAME, KATORG1.NAME, katorg2.name, SPSOPR.CSPORDER, SPORDER.CSPORDV) as SET2
ON SET1.SPORDERNREC = SET2.CSPORDER
into tmpVozvratMC
;
}
cmDefault:
{
_kol:=tmpVozvratMC.KOLFACT
_price:=tmpVozvratMC.CENA
_csporder:=tmpVozvratMC.SPORDERNREC
}
cmpick:
{
_gruz:='0';
message (_gruz)
RUNINTERFACE (L_SOPRDOC::Example2, _corg);
if _gruz !='0'
{
subbounds(tbfilGruz);
addbounds(tbfilGruz);
message (_gruz)
}
else
subbounds(tbfilGruz)
PutCommand(cmRefreshBDdata)
message (_gruz)
}
end;
end.
// Вызов второго интерфейса для использования его в качестве фильтров для первого интерфейса
Interface Example2 'Грузополучатели' , escClose, cyan, doAccept;
//Передаем ему параметры
parameters _CORG
//, _gruz, _adr
//Создаем представление для временной таблицы tmpGruzto
create view as select * from tmpGruzto;
// Выводим то что будет отображаться в нашем интерфейсе
browse GruztoBrowse;
Fields
tmpGruzto.CGRUZTO 'Наименование грузополучателя':[25], protect;
tmpGruzto.ADRES 'Адрес грузополучателя':[25], protect;
end;
handleevent
cmInit :
{
//Обрабатываем прямой SQL для второго интерфейса
sql select distinct KATORG.NAME
,KATORG.ADDR
,KATORG3.NAME
,KATORG.NREC
from KATORG
,KATSOPR
,KATORG KATORG3
where KATSOPR.CGRUZTO = KATORG.NREC and
KATSOPR.CORGBASE = KATORG3.NREC and
(katsopr.corgbase = :_corg )
into tmpGruzto
}
end;
end.
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Как использовать Bounds?
1. вам же написали
RUNINTERFACE (L_SOPRDOC::Example2, _corg);
заменить на
RUNINTERFACE (L_SOPRDOC::Example2, _gruz);
2.
вместо
if _gruz !=0
{
subbounds(tbfilGruz);
addbounds(tbfilGruz);
message (_gruz)
}
else
subbounds(tbfilGruz)
надо юзать так
if boundsactive(tbfilGruz) subbounds(tbfilGruz)
if _gruz <>0
{ addbounds(tbfilGruz);
}
if getfirst ????? =0 {} // без позиционирования иногда не срабатывает обновление
rescanpanel(tn???????) // вместо tn можно юзать # - но это не везде.
Кроме того вопрос в вашем фейсе для выбора. Он вернет значение если его закрыть по cmDefault - closeinterface(cmDefault) или объявить его с опцией DoAccept. Можно добавить к объявлению фейса AlwaysReturn - тогда при любом закрытии вернет значение. Обратите внимание что в cmDefault или в cmDone для AlwaysReturn вы должны присвоить _corg что то.
Вообще в вашем случае надо добавить второй параметр к вызову - хоть тот же _gruz и при закрытии фейса задавать именно его
RUNINTERFACE (L_SOPRDOC::Example2, _corg);
заменить на
RUNINTERFACE (L_SOPRDOC::Example2, _gruz);
2.
вместо
if _gruz !=0
{
subbounds(tbfilGruz);
addbounds(tbfilGruz);
message (_gruz)
}
else
subbounds(tbfilGruz)
надо юзать так
if boundsactive(tbfilGruz) subbounds(tbfilGruz)
if _gruz <>0
{ addbounds(tbfilGruz);
}
if getfirst ????? =0 {} // без позиционирования иногда не срабатывает обновление
rescanpanel(tn???????) // вместо tn можно юзать # - но это не везде.
Кроме того вопрос в вашем фейсе для выбора. Он вернет значение если его закрыть по cmDefault - closeinterface(cmDefault) или объявить его с опцией DoAccept. Можно добавить к объявлению фейса AlwaysReturn - тогда при любом закрытии вернет значение. Обратите внимание что в cmDefault или в cmDone для AlwaysReturn вы должны присвоить _corg что то.
Вообще в вашем случае надо добавить второй параметр к вызову - хоть тот же _gruz и при закрытии фейса задавать именно его
Re: Как использовать Bounds?
Судя по коду, интерфейс выбора вообще ничего не делает... нет ни одной операции присвоения, поэтому он не может менять _gruz и _adrdenisag писал(а):добавил message в начало и в конец события - выводятся нули и там и там.
Установил только 1 условие:что в начале что в конце бондс = 0.Код: Выделить всё
{ _gruz:=0; message (_gruz) RUNINTERFACE (L_SOPRDOC::Example2, _corg); if _gruz !=0 { subbounds(tbfilGruz); addbounds(tbfilGruz); message (_gruz) } else subbounds(tbfilGruz) PutCommand(cmRefreshBDdata) message (_gruz) } end; end.
Я думаю что наверное надо написать какому полю должен быть равен _gruz при наложении условия? Как это описать?
А весь код вот:Код: Выделить всё
//Добавлять во все проекты ----------------- #param /linc:d:\viperprojekt\autoexec.vpp #setcurenv "galnet" from 'c:\GAL810\exe\'; #define ComponentVersion //----------------------------------------- #include GALNET.CCM //Выбираем с чем работаем (в данном случае ресурс L_SOPRDOC) #Component "L_SOPRDOC" //Выбираем интерфейс из ресурса (в данном случае AKTREC) //Обозначаем переменные var _corg, _cmc, _csporder, _cpodr:comp; // _gruz, var _kol, _price:double; var _dsopr :date; var _gruz, _adr :string; //Временная таблица для 'Возврат материальной ценности' table struct tmpVozvratMC "Возврат материальной ценности" ( NNAKL :string "№ Накладной" , DATA :date "Дата", NAMEMC :string "Наименование товара", CENA :double "Цена", CGRUZTO :string "Наименование грузополучателя", PARTYNAME :string "Название партии", NORDER :string "№ Ордера", SKLAD :string "Наименование склада", ADRES :string "Адрес грузополучателя", OTGRUZ :double "Количество отгруженного товара", VOZVRAT :double "Количество возвращенного товара", KONTRAGENT :string "Наименование контрагента", KOLFACT :double "Кол-во фактическое", SPORDERNREC :comp "NREC ордера", CGRUZFROM :comp "Код грузоотправителя" ) with index ( ind = CGRUZTO //Индекс по грузополучателю ); //Временная таблица для 'Грузополучатели' table struct tmpGruzto "Грузополучатели" ( CGRUZTO :string "Наименование грузополучателя", ADRES :string "Адрес грузополучателя", KATORG3 :string "Наименование контрагента", CGRUZTONREC :comp "NREC грузополучателя" ) with index ( ind = CGRUZTONREC //Индекс по NREC грузополучателя ); // тут временная таблица закончилась //Выбираем интерфейс из ресурса (в данном случае AKTREC) alter interface AKTREC; // Будем изменять обработчики таблице "SPSOPR" tableEvent table SPSOPR // Объявляем обработчик который нам нужен cmPick: { // выбираем случай из "#NAMEMCUSL:" и присваиваем запуск интерфейса case curfield of #NAMEMCUSL: { if runinterface (L_MCU::GETMC,spsopr.cmcusl) = cmdefault and spsopr.cmcusl != 0 if isnew() insert current spsopr; else update current spsopr; rereadrecord(#spsopr); runinterface (L_SOPRDOC::Example, katsopr.corgbase, spsopr.cmcusl, spsopr.kolfact, spsopr.price, spsopr.csporder, katsopr.dsopr, katsopr.cpodrto); spsopr.rprice:=spsopr.price; update current spsopr; PutCommand(cmRefreshBDdata) } // иначе обрабатываем обычный "cmPick" else if(inherited::HandleEvent(cmPick) = heOk) {} end; } end; //Обработка события внутри родительского интерфейса только для этого окна window EDITSOPR handleEvent cmRestoreDoc: { runinterface (L_MCU::GETMC,spsopr.cmcusl); } end; end; end. // Создаем свой интерфейс с именем "Example" Interface Example 'Возврат материальной ценности' (,,scinterface), escClose, cyan, doAccept; //Передаем ему параметры parameters _corg, _cmc, _kol, _price, _csporder, _dsopr, _cpodr //Создаем представление для временной таблицы tmpVozvratMC create view as select * from tmpVozvratMC //bounds filGruz = _gruz == tmpVozvratMC.cgruzfrom(noindex) bounds filGruz = _gruz == tmpVozvratMC.CGRUZTO bounds filAdr = _adr == tmpVozvratMC.ADRES(noindex) ; // Выводим то что будет отображаться в нашем интерфейсе browse EmployeeBrowse; table tmpVozvratMC Fields tmpVozvratMC.NNAKL '№ Накладной':[8], protect; tmpVozvratMC.DATA 'Дата':[8], protect; tmpVozvratMC.NAMEMC 'Наименование товара':[25], protect; tmpVozvratMC.CENA 'Цена':[10], protect; tmpVozvratMC.CGRUZTO 'Наименование грузополучателя':[25], protect; tmpVozvratMC.PARTYNAME 'Название партии':[25], protect; tmpVozvratMC.NORDER '№ Ордера':[10], protect; tmpVozvratMC.SKLAD 'Наименование склада':[15], protect; tmpVozvratMC.ADRES 'Адрес грузополучателя':[25], protect; tmpVozvratMC.OTGRUZ 'Кол-во отгруженного товара':[5], protect; tmpVozvratMC.VOZVRAT 'Кол-во возвращенного товара':[5], protect; (tmpVozvratMC.OTGRUZ - tmpVozvratMC.VOZVRAT) 'Кол-во доступное для возврата':[5], protect; tmpVozvratMC.KONTRAGENT 'Наименование контрагента':[25], protect; end; handleevent cmInit : { //Присваиваем имя вызываемому интерфейсом окну SetWindowTitle(wnMainWindow,'Возврат материальной ценности ' + tmpVozvratMC.NAMEMC); //Обрабатываем прямой SQL для первого интерфейса sql select SET1.KATSOPRNSOPR ,SET1.KATSOPRDSOPR ,SET1.KATMCNAME ,SET1.SPSOPRPRICE ,SET1.katorg2name ,SET1.KATPARTYNAME ,SET1.SKLORDERNORDER ,SET1.KATPODRNAME ,SET1.KATORG2ADDR ,SET1.SPORDERKOL ,SET2.SPORDERKOL2 ,SET1.KATORG1NAME ,SET1.SPSOPRKOLFACT ,SET1.SPORDERNREC ,SET1.KATSOPRCGRUZFROM from (select SPORDER.NREC as SPORDERNREC ,KATSOPR.NSOPR as KATSOPRNSOPR ,KATSOPR.DSOPR as KATSOPRDSOPR ,KATMC.NAME as KATMCNAME ,SPSOPR.PRICE as SPSOPRPRICE ,katorg2.name as katorg2name ,KATPARTY.NAME as KATPARTYNAME ,SKLORDER.NORDER as SKLORDERNORDER ,KATPODR.NAME as KATPODRNAME ,KATORG2.ADDR as KATORG2ADDR ,SPORDER.KOL as SPORDERKOL ,KATORG1.NAME as KATORG1NAME ,SPSOPR.CSPORDER as SPSOPRCSPORDER ,SPSOPR.KOLFACT as SPSOPRKOLFACT ,KATSOPR.CGRUZFROM as KATSOPRCGRUZFROM from KATSOPR INNER JOIN SPSOPR on KATSOPR.NREC = SPSOPR.CSOPR and 1 = SPSOPR.PRMC INNER JOIN SKLORDER on KATSOPR.NREC = SKLORDER.CSOPR INNER JOIN SPORDER on SPORDER.CSPSOPR = SPSOPR.NREC LEFT OUTER JOIN KATORG as KATORG1 on KATSOPR.CORGBASE = KATORG1.NREC LEFT OUTER JOIN KATORG as KATORG2 on KATSOPR.CGRUZTO = katorg2.NREC LEFT OUTER JOIN KATMC on SPORDER.CMC = KATMC.NREC LEFT OUTER JOIN KATPARTY on SPORDER.CPARTY = KATPARTY.NREC LEFT OUTER JOIN KATPODR on SPORDER.CCPODR = KATPODR.NREC where 201 = KATSOPR.VIDSOPR and (katsopr.corgbase = :_corg ) and (spsopr.cmcusl = :_cmc ) and (katsopr.dsopr <= :_dsopr ) and // (katpodr.nrec = :_cpodr ) можно фильтровать и так, и как представлено ниже. В КВЕРИ выглядит одинаково (katsopr.cpodrfrom = :_cpodr ) ) as SET1 LEFT OUTER JOIN (select SPSOPR.CSPORDER ,SUM (SPORDER.KOL) as SPORDERKOL2 from KATSOPR INNER JOIN SPSOPR on KATSOPR.NREC = SPSOPR.CSOPR and 1 = SPSOPR.PRMC INNER JOIN SKLORDER on KATSOPR.NREC = SKLORDER.CSOPR INNER JOIN SPORDER on SPORDER.CSPSOPR = SPSOPR.NREC LEFT OUTER JOIN KATORG as KATORG1 on KATSOPR.CORGBASE = KATORG1.NREC LEFT OUTER JOIN KATORG as KATORG2 on KATSOPR.CGRUZTO = katorg2.NREC LEFT OUTER JOIN KATMC on SPORDER.CMC = KATMC.NREC LEFT OUTER JOIN KATPARTY on SPORDER.CPARTY = KATPARTY.NREC LEFT OUTER JOIN KATPODR on SPORDER.CCPODR = KATPODR.NREC where 106 = KATSOPR.VIDSOPR group by KATMC.NAME, KATORG1.NAME, katorg2.name, SPSOPR.CSPORDER, SPORDER.CSPORDV) as SET2 ON SET1.SPORDERNREC = SET2.CSPORDER into tmpVozvratMC ; } cmDefault: { _kol:=tmpVozvratMC.KOLFACT _price:=tmpVozvratMC.CENA _csporder:=tmpVozvratMC.SPORDERNREC } cmpick: { _gruz:='0'; message (_gruz) RUNINTERFACE (L_SOPRDOC::Example2, _corg); if _gruz !='0' { subbounds(tbfilGruz); addbounds(tbfilGruz); message (_gruz) } else subbounds(tbfilGruz) PutCommand(cmRefreshBDdata) message (_gruz) } end; end. // Вызов второго интерфейса для использования его в качестве фильтров для первого интерфейса Interface Example2 'Грузополучатели' , escClose, cyan, doAccept; //Передаем ему параметры parameters _CORG //, _gruz, _adr //Создаем представление для временной таблицы tmpGruzto create view as select * from tmpGruzto; // Выводим то что будет отображаться в нашем интерфейсе browse GruztoBrowse; Fields tmpGruzto.CGRUZTO 'Наименование грузополучателя':[25], protect; tmpGruzto.ADRES 'Адрес грузополучателя':[25], protect; end; handleevent cmInit : { //Обрабатываем прямой SQL для второго интерфейса sql select distinct KATORG.NAME ,KATORG.ADDR ,KATORG3.NAME ,KATORG.NREC from KATORG ,KATSOPR ,KATORG KATORG3 where KATSOPR.CGRUZTO = KATORG.NREC and KATSOPR.CORGBASE = KATORG3.NREC and (katsopr.corgbase = :_corg ) into tmpGruzto } end; end.
Re: Как использовать Bounds?
А если будет так написано
RUNINTERFACE (L_SOPRDOC::Example2, _corg, _gruz); ??
_corg - это фильтр который нужен для правильного формирования таблицы во втором интерфейсе, как я могу его убрать?
Что такое "boundsactive"? в документации по поиску не находит, Viper ругается что нет такой функции поля или метода.
RUNINTERFACE (L_SOPRDOC::Example2, _corg, _gruz); ??
_corg - это фильтр который нужен для правильного формирования таблицы во втором интерфейсе, как я могу его убрать?
Так я и пытаюсь сказать что - хочу разобраться как это работаетСудя по коду, интерфейс выбора вообще ничего не делает... нет ни одной операции присвоения, поэтому он не может менять _gruz и _adr
Что такое "boundsactive"? в документации по поиску не находит, Viper ругается что нет такой функции поля или метода.
Последний раз редактировалось denisag 01 фев 2012, 13:12, всего редактировалось 1 раз.
Re: Как использовать Bounds?
Ну это как написать: RUNINTERFACE (L_SOPRDOC::Example2, _corg, ВЕРНУТЬ_НУЖНОЕ_ЗНАЧЕНИЕ);denisag писал(а):А если будет так написано
RUNINTERFACE (L_SOPRDOC::Example2, _corg, _gruz); ??
_corg - это фильтр который нужен для правильного формирования таблицы во втором интерфейсе, как я могу его убрать?
Так я и пытаюсь сказать что - хочу разобраться как это работаетСудя по коду, интерфейс выбора вообще ничего не делает... нет ни одной операции присвоения, поэтому он не может менять _gruz и _adr
Нужно ж что-то присвоить этому _gruz... Тем более судя по исходнику у интерфейса один параметр и прежде чем просто приписывать еще один, надо объявить его в интерфейсе
Re: Как использовать Bounds?
Но в первом интерфейсе же все сделано правильно. В событии cmDefaultdenisag писал(а):Так я и пытаюсь сказать что - хочу разобраться как это работает