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

Как использовать Bounds?

Добавлено: 31 янв 2012, 18:54
denisag
В справке совсем как то скудно, почитал форум - тоже не прояснилось ничего.
Например у меня есть интерфейс в который выводится некая таблица 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?

Добавлено: 31 янв 2012, 19:16
spark
denisag писал(а): я хочу сделать чтобы при выборе во втором интерфейсе значения поля c или x в первом осталось только равное ему значение
...
накладывание идет через оператор addbounds где его дальше описать не понятно
снятие происходит через subbounds, я например хочу чтобы снималось при вызове 2 интерфейса - тоже не понятно как описать но предположение есть что описать надо в {} события вызова 2 интерфейса.
В вопросе уже есть ответ... Наложение фильтра нужно выполнять после вызова второго интерфейса, который в переменные cc и xx передаст значения, а если значения пустые, то снять фильтр.

Re: Как использовать Bounds?

Добавлено: 31 янв 2012, 19:48
denisag
Накидал как понял - а не понял то в общем то нифига:

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

.....
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.
...                 
компилятор выдал ошибки "Нужен ключ ADRES для TMPVOZVRATMC" и "Ошибка создания логической таблицы".

Если только с условием для filGruz то компилится, но условия не накладываются

Re: Как использовать Bounds?

Добавлено: 31 янв 2012, 20:02
spark
denisag писал(а):Накидал как понял - а не понял то в общем то нифига:

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

.....
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.
...                 
компилятор выдал ошибки "Нужен ключ ADRES для TMPVOZVRATMC" и "Ошибка создания логической таблицы".

Если только с условием для filGruz то компилится, но условия не накладываются
Потому что по CGRUZTO есть ключ во временной таблице, а по ADRES нет.
Либо добавить ключ по ADRES, либо использовать (noindex), либо вместо Bounds использовать Condition.

Re: Как использовать Bounds?

Добавлено: 31 янв 2012, 20:18
denisag
использовал (noindex) - все откомпилировалось - но условия не накладываются :???:

Re: Как использовать Bounds?

Добавлено: 31 янв 2012, 20:20
spark
denisag писал(а):использовал (noindex) - все откомпилировалось - но условия не накладываются :???:
RUNINTERFACE (L_SOPRDOC::Example2, _corg) ;
if _gruz !=0

Как-то не логично.

Наверное так:
RUNINTERFACE (L_SOPRDOC::Example2, _gruz) ;
if _gruz !=0

Re: Как использовать Bounds?

Добавлено: 31 янв 2012, 20:23
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.  
.....                        
Все равно фильтр не накладывается :???:

Re: Как использовать Bounds?

Добавлено: 31 янв 2012, 20:38
spark
denisag писал(а):RUNINTERFACE (L_SOPRDOC::Example2, _corg) - _corg это параметр который используется в интерфейсе, он нужен.
Тогда _gruz всегда равно 0

Re: Как использовать Bounds?

Добавлено: 01 фев 2012, 01:26
spark
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?

Добавлено: 01 фев 2012, 12:12
denisag
добавил message в начало и в конец события - выводятся нули и там и там.
Установил только 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.               
что в начале что в конце бондс = 0.
Я думаю что наверное надо написать какому полю должен быть равен _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?

Добавлено: 01 фев 2012, 12:55
edward_K
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 и при закрытии фейса задавать именно его

Re: Как использовать Bounds?

Добавлено: 01 фев 2012, 13:00
spark
denisag писал(а):добавил message в начало и в конец события - выводятся нули и там и там.
Установил только 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.               
что в начале что в конце бондс = 0.
Я думаю что наверное надо написать какому полю должен быть равен _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.
Судя по коду, интерфейс выбора вообще ничего не делает... нет ни одной операции присвоения, поэтому он не может менять _gruz и _adr

Re: Как использовать Bounds?

Добавлено: 01 фев 2012, 13:04
denisag
А если будет так написано
RUNINTERFACE (L_SOPRDOC::Example2, _corg, _gruz); ??
_corg - это фильтр который нужен для правильного формирования таблицы во втором интерфейсе, как я могу его убрать?
Судя по коду, интерфейс выбора вообще ничего не делает... нет ни одной операции присвоения, поэтому он не может менять _gruz и _adr
Так я и пытаюсь сказать что - хочу разобраться как это работает
Что такое "boundsactive"? в документации по поиску не находит, Viper ругается что нет такой функции поля или метода.

Re: Как использовать Bounds?

Добавлено: 01 фев 2012, 13:09
spark
denisag писал(а):А если будет так написано
RUNINTERFACE (L_SOPRDOC::Example2, _corg, _gruz); ??
_corg - это фильтр который нужен для правильного формирования таблицы во втором интерфейсе, как я могу его убрать?
Судя по коду, интерфейс выбора вообще ничего не делает... нет ни одной операции присвоения, поэтому он не может менять _gruz и _adr
Так я и пытаюсь сказать что - хочу разобраться как это работает
Ну это как написать: RUNINTERFACE (L_SOPRDOC::Example2, _corg, ВЕРНУТЬ_НУЖНОЕ_ЗНАЧЕНИЕ);

Нужно ж что-то присвоить этому _gruz... Тем более судя по исходнику у интерфейса один параметр и прежде чем просто приписывать еще один, надо объявить его в интерфейсе

Re: Как использовать Bounds?

Добавлено: 01 фев 2012, 13:11
spark
denisag писал(а):Так я и пытаюсь сказать что - хочу разобраться как это работает
Но в первом интерфейсе же все сделано правильно. В событии cmDefault