
#include "s_public.ch" //обязательно указывать во всех листингах


FIELD Grup,NNum,Ed //объявление полей, чтобы компилятор не давал подозрительных ссылок


PROCEDURE SortAndSeek()
LOCAL aSetKey:=SaveSetKey() //запоминаем навешанные ранее горячие клавиши
LOCAL cScreen:=SAVESCREEN() //запоминаем экран
LOCAL nTop:=5,nBottom:=17 //сделаем 17, чтобы сделать подвал
LOCAL cHead:='Мой номенклатурный справочник' //первый заголовок
LOCAL cHead1:='тестовый пример' //второй заголовок (под первым)
//строка помощи внизу экрана, ДОБАВЛЯЕМ F3 
LOCAL cHelp:="F3:Сортировка F7/Alt-F7:поиск Alt-F6:Контекстный фильтр"
LOCAL cColHead:=; //заголовок колонок
"Группа Ном.номер  Наименование                                          Ед.изм"  
*12345 1234567890123 12345678901234567890123456789012345678901234567890  12345
*1234567890123456789012345678901234567890123456789012345678901234567890123456789
LOCAL aBlockCols:={;
{{||Grup},1},; //отображаем поле Grup, начиная со 1 позиции экрана
{{||NNum},7},; //поле NNUM, начиная с 7 позиции
{{||LEFT(Name,50)},21},; //первые 50 символа наименования, начиная с 21 позиции
{{||Ed},73}; //поле Ed, начиная с 73 позиции 
}
LOCAL bCoProc:={||CoPro()} //сопроцедура,выполняющаяся при каждом перемещении по реестру
//оформлена в виде блок-кода

LOCAL aSortSeek:={; //МАССИВ СОРТИРОВОК И ПОИСКОВ
{'- номерам ТМЦ внутри групп      ',;
{'Код группы?:','Ном. номер?: '},{'Grup','NNum'},;
'TRIM(UPPER(m->pSTATUS+aIn[1]+aIn[2]))',{'@K','@K'},;
{'ToRight(1)',NIL},{'MGrup',NIL},2},;
{'- наименованиям внутри групп ',{'Код группы?: ','Наименование?:'},;
{'Grup','Space(10)'},;
 'TRIM(UPPER(pStatus+aIn[1]+aIn[2]))',{'@K','@K'},;
 {'ToRight(1)',NIL},{'MGrup',NIL},5};
}

LOCAL cFindMacro:='cFind$UPPER(TRIM(Name))'//МАКРОВЫРАЖЕНИЕ ДЛЯ КОНТЕКСТНОГО ПОИСКА
//ВЫРАЖЕНИЕ В КАВЫЧКАХ ОПИСЫВАЕТ ОПЕРАЦИЮ, КОТОРАЯ ВЫПОЛНЯЕТСЯ ПРИ КАЖДОМ ПЕРЕБОРЕ ЗАПИСИ

PRIVATE pStatus:=" "//рассматриваем только открытые записи номенклатуры

//открываем таблицу по пути sclad\mlabel.dbf c алиасом MLabel;
//функция БЭСТ LoadPath() возвращает путь до папки с БД выбранного предприятия
IF NetUse("MLabel",LoadPath()+"sclad\mlabel.dbf").AND.;  //если открытие успешно
   NetUse("MGrup",LoadPath()+"sclad\mgrup.dbf")
   SELECT MLabel
   SetScope("Status",pStatus)
   SET RELATION TO UPPER(Grup) INTO MGrup //связываем таблицы
   InitScreen(cHead,cHead1,cColHead,,cHelp) //специальная функция БЭСТ для подготовки экрана
   @ 18,1 SAY REPLICATE("─",78) COLOR "w/b" //нарисуем разделительную черту перед подвалом 
   //ДОБАВЛЯЕМ aSortSeek
   InitList(nTop,nBottom,cColHead,aBlockCols,bCoProc,,,,,,,,,aSortSeek,;
            ,,,,,,,,cFindMacro) //основная процедура БЭСТ для работы с реестром
ENDIF
DbCloseArea() //закрываем таблицу
RestScreen(,,,,cScreen) //возвращаем экран, какой был до этого
RestSetKey(aSetKey) //возвращаем горячие клавиши, которые были до этого
RETURN


//сопроцедура (Static-функция - видна только в данном файле - листинге ),
//поэтому аналогичное название можно использовать и в других листингах
STATIC FUNCTION CoPro() 
@ 19,2 SAY "Группа: "+MGrup->Name //отображаем группу в подвале при каждом перемещении
RETURN 1 //возврат 1 - означает, что не надо перерисовывать экран


/**********
В результате выполнения этой процедуры, мы получили отображение простейшего
реестра, с уже готовыми горячими вызовами (по Alt) калькулятора, блокнота,
курсов валют и экспорта в Excel. Работает также клавиша F8 - удаление.
При каждом перемещении курсра работает сопроцедура, которая отображает 
наименование группы из связанной таблицы MGrup.
ПУТЕМ ВВЕДЕНИЯ МАССИВА aSortSeek - АВТОМАТИЧЕСКИ НА КЛАВИШИ F3 и F7 НАВЕСИЛИСЬ 
ФУНКЦИИ СОРТИРОВКИ И ПОИСКА. ПОСЛЕ ЗАДАНИЯ МАКРОВЫРАЖЕНИЯ КОНТЕКСТНОГО ПОИСКА
cFindMacro, К КЛАВИШАМ Alt-F6 и Alt-F7 АВТОМАТИЧЕСКИ "ПРИЦЕПИЛИСЬ" ФУНКЦИИ 
КОНТЕКСТНОГО ПОИСКА И ФИЛЬТРАЦИИ.
*********/
