Еще раз...Множественный выбор в интерфейсе

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

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

Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

edward_K э...
есть таблица т1, со ссылками на другую таблицу т2

по т2 прошелся маркером, забил допустим 2 значения.

Как проще наложить условие на т1 чтобы попадали только те записи, которые имеют ссылки на т2, находящиеся в маркере, неужели SearchMarker() = true ?

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

Сообщение Den »

Ну например через condition не получится ?
condition mark searchmarker(....)=true ;

...
if GetMarkerCount(...)>0 // что то выбрано в маркер, то ложим фильтр на t2
then PushConditionforleave(tcmark)
...

т.е. после каждого "...забил допустим 2 значения..." проверяем на это условие..
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

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

Сообщение Den »

Ты тыщами собрался что ль маркировать то )

function SearchMarker (markers : longInt;
item : anyType;
indexNo : longInt
) : boolean;


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

Сообщение edward_K »

быстрее чем Pick.
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

edward_K т.е. я правильно сделал? Кондишн на фукнцич SearchMarker = true ?

А вы сами тестировали быстродействие, или информация от разработчиков?
alfmaster
Новичок
Сообщения: 24
Зарегистрирован: 30 окт 2009, 13:02

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение alfmaster »

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

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение RAJAH »

alfmaster писал(а):из любой таблицы
Это вряд ли. Для разных таблицы - свои интерфейсы, разные способы пометки (через pick - надо знать код pick.wlist, либо через маркер - надо знать имя маркера). Примеры и на предыдущей странице данной темы есть. ;) Вот ещё (выбор видов оплат):

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

...
.var
   ...
   MarkSt, MarkIn: longint;
   ...
.endvar
...
.begin
...
   RunInterface('Z_ZAR::marknach');
   MarkSt:=InitMarker ('VedNach_Marker_New1', 4, 200, 7);
   for(MarkIn:=0; MarkIn<=GetMarkerCount(MarkSt)-1; MarkIn:=MarkIn+1)
   begin
     if GetMarker(MarkSt, MarkIn, VO) then
     ...
   end;
   ClearMarker(MarkSt);
   DoneMarker(MarkSt, 'VedNach_Marker_New1');
   ...
end.
...
alfmaster
Новичок
Сообщения: 24
Зарегистрирован: 30 окт 2009, 13:02

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение alfmaster »

Попробовал преобразовать пример по маркерам из хелпа под другую таблицу, но что-то упускаю - записи в интерфейсе не помечаются Insert.

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

Interface MBPg 'Таблицы системы'
  (,hcDictInterface,scExtFiles) EscClose, Cyan;
  show at ( 3, 1, 76, 26);

  create view AllDictTables
  var
    Markers      : LongInt;
    FieldMarkers : LongInt;
    IndexNo      : LongInt;

  (MarkerStr)

  As Select
   if (SearchMarker(Markers, MBPMove.nrec, IndexNo) = True, 'v', ' '),

   * from MBPMove;

  Panel pnTablesList;
  Table MBPMove;
    Browse bwTableList;
      Fields
        MarkerStr        ''                 :[1], Skip;
        MBPMove.nrec  'Nrec'              : Protect;
        MBPMove.dmove 'дата акта' : Protect;
        MBPMove.nom  'номер акта'      : Protect;
    end;

    HandleEvent
      cmMarkRec    : begin
                       InvertMarker(Markers, MBPMove.nrec);
                       if ((GetNext MBPMove) = tsOk) {};
                       RescanPanel(tnMBPMove);
                     end;
      cmMarkAll    : begin
                       StartNewVisual( vtRotateVisual, vfTimer, 'Помечаю все', 1);
                       PushPos(tnMBPMove);
                       if ((Modifier GetFirst MBPMove) = tsOk)
                       begin
                         do
                         begin
                           InsertMarker(Markers, MBPMove.nrec);
                           NextVisual;
                         end;
                         while (Modifier GetNext MBPMove = tsOk)
                       end;
                       PopPos(tnMBPMove);
                       StopVisual('', 0);
                       RescanPanel(tnMBPMove);
                     end;
      cmInvertMark : begin
                       StartNewVisual( vtRotateVisual, vfTimer, 'Инвертирую список', 1);
                       PushPos(tnMBPMove);
                       if ((Modifier GetFirst MBPMove) = tsOk)
                       begin
                         do
                         begin
                           InvertMarker(Markers, MBPMove.nrec);
                           NextVisual;
                         end;
                         while (Modifier GetNext MBPMove = tsOk)
                       end;
                       PopPos(tnMBPMove);
                       StopVisual( '', 0);
                       RescanPanel(tnMBPMove);
                     end;
      cmUnMarkAll  : begin
                       ClearMarker(Markers);
                       RescanPanel(tnMBPMove);
                     end;
    end;
  end; // panel


  HandleEvent
    cmInit    : begin
!RunInterface   ('F_MBP::SPIS_MBP.GETMBPMOVESPIS')     // 'F_MBP::SPIS_MBP.GETMBPMOVESPIS.KATPODR.NAME'
                  Markers:=InitMarker('SPIS_MBPViewDictMarkers', 2, 1000, 100);
                  FieldMarkers:=InitMarker('', 2, 20, 20);
                end;
    cmDone    : begin
                  DoneMarker(Markers, 'ViewDictMarkers');
                  DoneMarker(FieldMarkers, '');
                end;
  end;
end.

RAJAH
Местный житель
Сообщения: 931
Зарегистрирован: 18 фев 2008, 12:49

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение RAJAH »

Так вы свой интерфейс хотите написать? Интересно, зачем? :)
По-моему, вначале надо вот так прописать:

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

#include GALNET.CCM
#include GALNET.CSC
end;
И команды, вроде бы, другие: cmdomarkunmark, cmselall, cmunselall
alfmaster
Новичок
Сообщения: 24
Зарегистрирован: 30 окт 2009, 13:02

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение alfmaster »

Да , конечно перед кодом кусок такой присутствует еще с описанием

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

#commands start at 50000 
const 
cmALTQ = 99999; scExtFiles=88888;
end;
StatGal statusline 
{
  (scExtFiles..scExtFiles)
  {
    '~F1~ Справка',          cmHelp,              kbF1;
    '~Enter~ Карточка',      cmDefault,           kbEnter;
    '~Ins,+/-, *~ Пометка',  cmMarkRec,           kbIns;
    '',                      cmMarkAll,           kbGrayPlus;
    '',                      cmUnMarkAll,         kbGrayMinus;
    '',                      cmInvertMark,        kbGrayMul;
    '',                      cmMenu,              kbF10;
    '',                      cmZoom,              kbF5;
    '',                      cmResize,            kbCtrlF5;
    '',                      cmNext,              kbF6;
    '',                      cmPrev,              kbShiftF6;
    '',                      cmSysMenu,           kbCtrlF10;
    '',                      cmLastHelp,          kbAltF1;
    '',                      cmQuit,              kbAltX;
    '',                      cmMenu,              kbF10;
  }

}
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение KATZ »

Размер элемента в маркере д. б. не 2, а 8. Если делать собственную статус-линию, то она перекроет стандартную, все остальные контексты пропадут, так что ищите подходящий контекст среди имеющихся, например, sci1EscIns=6960. И команды тоже стандартные берите cmDoMarkUnMark=1221, cmSelAll=1219, cmUnSelAll=1220.
alfmaster
Новичок
Сообщения: 24
Зарегистрирован: 30 окт 2009, 13:02

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение alfmaster »

Но галактический же пример работает из описания языка VIP?- заменил только таблицу и поля вывода, и пометка инсертом пропала :sad: Вот рабочий исходник с работающей пометкой записей

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

#commands start at 50000 
const 
cmALTQ = 99999; scExtFiles=88888;
end;
StatGal statusline 
{
  (scExtFiles..scExtFiles)
  {
    '~F1~ Справка',          cmHelp,              kbF1;
    '~Enter~ Карточка',      cmDefault,           kbEnter;
    '~Ins,+/-, *~ Пометка',  cmMarkRec,           kbIns;
    '',                      cmMarkAll,           kbGrayPlus;
    '',                      cmUnMarkAll,         kbGrayMinus;
    '',                      cmInvertMark,        kbGrayMul;
    '',                      cmMenu,              kbF10;
    '',                      cmZoom,              kbF5;
    '',                      cmResize,            kbCtrlF5;
    '',                      cmNext,              kbF6;
    '',                      cmPrev,              kbShiftF6;
    '',                      cmSysMenu,           kbCtrlF10;
    '',                      cmLastHelp,          kbAltF1;
    '',                      cmQuit,              kbAltX;
    '',                      cmMenu,              kbF10;
  }

}

Interface katmc 'Таблицы системы'
  (,hcDictInterface,scExtFiles) EscClose, Cyan;
  show at ( 3, 1, 76, 26);

  create view AllDictTables
  var
    Markers      : LongInt;
    FieldMarkers : LongInt;
    IndexNo      : LongInt;

  (MarkerStr)

  As Select
   if (SearchMarker(Markers, x$Files.xf$Code, IndexNo) = True, 'v', ' '),

   * from x$Files;

  Panel pnTablesList;
  Table x$Files;
    Browse bwTableList;
      Fields
        MarkerStr        ''                 :[1], Skip;
        x$Files.xf$Code  'Код'              : Protect;
        x$Files.xf$Name  'Имя таблицы'      : Protect;
        x$Files.xf$Title 'Заглавие таблицы' : Protect;
    end;

    HandleEvent
      cmMarkRec    : begin
                       InvertMarker(Markers, x$Files.xf$Code);
                       if ((GetNext x$Files) = tsOk) {};
                       RescanPanel(tnx$Files);
                     end;
      cmMarkAll    : begin
                       StartNewVisual( vtRotateVisual, vfTimer, 'Помечаю все', 1);
                       PushPos(tnx$Files);
                       if ((Modifier GetFirst x$Files) = tsOk)
                       begin
                         do
                         begin
                           InsertMarker(Markers, x$Files.xf$Code);
                           NextVisual;
                         end;
                         while (Modifier GetNext x$Files = tsOk)
                       end;
                       PopPos(tnx$Files);
                       StopVisual('', 0);
                       RescanPanel(tnx$Files);
                     end;
      cmInvertMark : begin
                       StartNewVisual( vtRotateVisual, vfTimer, 'Инвертирую список', 1);
                       PushPos(tnx$Files);
                       if ((Modifier GetFirst x$Files) = tsOk)
                       begin
                         do
                         begin
                           InvertMarker(Markers, x$Files.xf$Code);
                           NextVisual;
                         end;
                         while (Modifier GetNext x$Files = tsOk)
                       end;
                       PopPos(tnx$Files);
                       StopVisual( '', 0);
                       RescanPanel(tnx$Files);
                     end;
      cmUnMarkAll  : begin
                       ClearMarker(Markers);
                       RescanPanel(tnx$Files);
                     end;
    end;
  end; // panel


  HandleEvent
    cmInit    : begin
                  Markers:=InitMarker('ViewDictMarkers', 2, 1000, 100);
                  FieldMarkers:=InitMarker('', 2, 20, 20);
                end;
    cmDone    : begin
                  DoneMarker(Markers, 'ViewDictMarkers');
                  DoneMarker(FieldMarkers, '');
                end;
  end;
end.

KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение KATZ »

1). В примере ключевое поле x$Files.xf$Code типа word, и размер элемента маркера 2. Если вы хотите хранить в маркере NRec-ы, то надо задавать размер 8, а не 2.
2). Пример предполагает замену статус-линии, это возможно в экспериментально-познавательных целях, но никак не в реальной "Галактике".
alfmaster
Новичок
Сообщения: 24
Зарегистрирован: 30 окт 2009, 13:02

Re: Еще раз...Множественный выбор в интерфейсе

Сообщение alfmaster »

Ну конечно! Спасибо большое - действительно, дело было в длине поля, теперь помечает записи... Теперь надо мне понять, как передать нреки из маркера во вьюху, по которой затем отчет вывести. Продолжаю рыться...
Ответить