Проблемы отображения при наложенном фильтре

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

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

Ответить
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Проблемы отображения при наложенном фильтре

Сообщение Nikos »

Добрый день!
Есть небольшой самописный интерфейс, в котором реализована возможность устанавливать фильтр. Если фильтр не установлен, то все работает отлично. Если же установить фильтр, то при навигации (колесиком, например) вверх и вниз происходит замещение строк. В нормальный вид все приходит только если нажать на кнопку "обновить". Причем данная проблема возникает в случае если результаты отбора не помещаются на один экран. Что нужно сделать, чтобы отображалось все корректно?
Вот часть интерфейса:

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

interface bdrFaktRules 'Настройка фактического исполнения БДР'; show at (,,,30);

create view mainView
var
  iGetKau	 : GetKau;
  cplsch   : comp;
  sch, ss  : string;
  lastkau, lastbud, laststat, lastelem : comp;
  bud_form : string;
  comp_var, comp_var_filt : comp;
  kodkau   : word;
  title_form : string;
as select * from BUDRULES, SPKAU STATZATR, SPKAU ELZATR, SPKAU BUHCODE, SPKAU KODBUD
where ((
    bud_form           == BUDRULES.BUDFORM
and BUDRULES.STZATR    == STATZATR.NREC
and BUDRULES.ELEMZATR  == ELZATR.NREC
and BUDRULES.CKAU      == BUHCODE.NREC
and BUDRULES.KODBUDJET == KODBUD.NREC
))
condition byStBud = BUDRULES.KODBUDJET = comp_var_filt;

browse brSp table BUDRULES;
fields
  BUDRULES.SCHET 'Счет'                          : [10], pickButton;
  BUDRULES.SUBSCH 'Субсчет'                      : [10], pickButton;
  STATZATR.CODE 'Статья затрат'                  : [15], pickButton;
  ELZATR.CODE 'Элемент затрат'                   : [15], pickButton;
  BUHCODE.CODE 'Код БУ'                          : [15], pickButton;
  KODBUD.CODE 'Код бюджета'                      : [15], pickButton;
  BUDRULES.FILTSTAT 'Фильтр по статьям затрат'   : [15], noprotect;
  BUDRULES.FILTELEM 'Фильтр по элементам затрат' : [15], noprotect;
  BUDRULES.FILTKAU   'Фильтр по КАУ'             : [15], noprotect;
end; // browse

HandleEvent
  cmHotKeys:
  {
    case GetCurrentFormat of
      brSp:
      {
        PutHotCommand(RunMenu('MenuFaktBDR'));
      } 
    end;
  }
  cmInit:
  {
    bud_form := '6.3.1';
    cplsch := coGetTune('FIN.USER.CPLANSSCH');
    kodkau := '10078'
  }
  cmValue1:
  {
    iGetKau.GetCodeKau(cgiPick, kodkau, comp_var_filt);
    if comp_var_filt = 0 break;
    lastbud := comp_var_filt;
    if not ConditionActive(tcbyStBud)
			PushCondition(tcbyStBud);
		reReadRecord;
  }
  cmValue2:
  {
    if ConditionActive(tcbyStBud)
    	PopCondition(tcbyStBud);
    reReadRecord;
  }
end;  

end.

MenuFaktBDR menu
{
  -'Установить фильтр по статье бюджета',cmValue1,'Установить фильтр по статье бюджета';
  -'Снять фильтр',cmValue2,'Снять фильтр';
}
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Проблемы отображения при наложенном фильтре

Сообщение m0p3e »

Как сказал один умный человек: "Всегда используй наложение фильтров с указанием узла".

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

procedure PushConditionForLeave (iNum : integer; iLeaf : integer);
Ну и остальные функции тоже должны быть узловыми (ConditionActiveInLeave,PopConditionForLeave)
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Re: Проблемы отображения при наложенном фильтре

Сообщение Nikos »

Исправил на PushConditionForLeave - результат тот же.
Заработало на тестовой базе при изменении Condition на Bounds, причем изначально индекса по нужным полям не было, пришлось добавлять. Bounds с (noindex) работает так же как и Condition (точнее, не работает). Видимо, придется удалять журнал, добавлять индекс, делать с Bounds... Если будут еще предложения - с радостью попробую (очень не хочется удалять журнал).
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Проблемы отображения при наложенном фильтре

Сообщение m0p3e »

А можно код с ForLeave увидеть?
У меня была такая же фигня с навигацией и он помог. Может неправильно функции используются?
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Re: Проблемы отображения при наложенном фильтре

Сообщение Nikos »

Действительно, все работает!
Видимо, первый раз где-то ошибся. Вот работающий код:

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

cmValue1:
  {
    iGetKau.GetCodeKau(cgiPick, kodkau, comp_var_filt);
    if comp_var_filt = 0 break;
    lastbud := comp_var_filt;
    if not ConditionActiveInLeave(tcbyStBud, tnBUDRULES)
    	PushConditionForLeave(tcbyStBud, tnBUDRULES);
    reReadRecord;
  }
  cmValue2:
  {
    if ConditionActiveInLeave(tcbyStBud, tnBUDRULES)
       PopConditionForLeave(tcbyStBud, tnBUDRULES);
    reReadRecord;
  }
Большое спасибо!
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Проблемы отображения при наложенном фильтре

Сообщение zna »

Делаю интерфейс выгрузки данных из производственного плана. Прошу помочь с проблемой потери позиции в таблице mnplan при наложении на узел ограничения по дате и шаблону:

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

Interface a_repMnPlan 'Отчёт ...' escclose,blue,AlwaysReturn;
  Show at (1,1,100,40);
Create View
Var
  dbeg, dend  : date;
As select * from mnplan
                ,spmnplan
                ,spmnpl
                ,valspmnp
                ,katusl
                ,dogovor
                ,katorg
                ,spkau
bounds byBn as
              spmnplan.cmnplan /== mnplan.nrec
          and spmnpl.cspmnplan  == spmnplan.nrec
          and valspmnp.cspmnpl  == spmnpl.nrec
          and spmnplan.cizd     == katusl.nrec
          and mnplan.canval4    == dogovor.nrec
          and mnplan.canval5    == katorg.nrec
          and spmnplan.canval1 /== spkau.nrec
condition byCn = dbeg <= mnplan.STATEMDATE and dend >= mnplan.STATEMDATE and mnplan.CWAYACCOU = 281474976710894
condition byUs = substr(katusl.kod, 1, 3) != '120'
condition byTp = spmnplan.typeizd = 2
;

Screen scMain_
  show at (, , , 5);
  fields
    dbeg: noProtect;
    dend: noProtect;
  Buttons
   cmSetBound,,,;
   cmPrintDoc,,,;
<<
     Период с: .@@@@@@@@@@ по .@@@@@@@@@@
  <. Установить период .>

  <. Печать отчёта в Excel .>
>>
end;
Panel Panel_;
  Table mnplan
  browse bmnpl
  show at (,6 , , )
  fields
     mnplan.statemdate 'Дата'   : [8], protect;
     mnplan.name  'Наименование'    : [12], protect;
     mnplan.cwayaccou 'Nrec шаблона'    : [10], protect;
     katusl.name 'Услуга ' : [20], protect;
  end;
end;

HandleEvent
cmSetBound:
{
  pushBounds(tbbyBn);                               //
  if not ConditionActiveInLeave(tcbyCn, tnMnplan)
       PushConditionForLeave(tcbyCn, tnMnplan);     //....это условие приводит к потере позиции
  reReadRecord;
  Message('Наложено ConditionForLeave(tcbyCn, tnMnplan), getFirst mnplan = '+modifier getFirst mnplan);
  if (modifier getFirst mnplan) = tsOk
    {
     Message('Период установлен, mnplan.statemdate = '+string(mnplan.statemdate)+'; mnplan.name = '+mnplan.name+'; mnplan.CWAYACCOU = '+mnplan.CWAYACCOU);
     RescanPanel(#mnplan);
    }
  else Message('Нет позиции mnplan..');
}
cmPrintDoc:
{
 var i, iLine : word;
 var xlREs : boolean;
 if (not xlOpenExcel(True))
  Message('Не открылся Excel.')
 else
  if (not xlIsExcelValid)
   Message('Не инициализирован Excel.')
  else
   if (not xlSetActiveWorkBookByName('c:\exampl.xlt') )
    if (not xlOpenWorkBook('c:\exampl.xlt'))
     Message('Не открылась книга Excel '+'c:\exampl.xlt')
    else
     if (not xlGetActiveWorkBookName('c:\exampl.xlt'))
        Message('Не активна книга Excel '+'c:\exampl.xlt')
     else
       {
!===========Все проверили и все Ok -> начинаем выгрузку========
          xlSetCellStringValue('Заказ'       ,1, 1, 1, 1);
          xlSetCellStringValue('Контрагент'  ,1, 2, 1, 2);
....
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Проблемы отображения при наложенном фильтре

Сообщение zna »

Разобрался- надо было перед наложением условия сделать getfirst.. :-)
Ответить