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


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


PROCEDURE Print()
LOCAL aSetKey:=SaveSetKey() //запоминаем навешанные ранее горячие клавиши
LOCAL cScreen:=SAVESCREEN() //запоминаем экран
LOCAL nTop:=5,nBottom:=17 //сделаем 17, чтобы сделать подвал
LOCAL cHead:='Мой номенклатурный справочник' //первый заголовок
LOCAL cHead1:='тестовый пример' //второй заголовок (под первым)
//строка помощи внизу экрана, добавляем F9 
LOCAL cHelp:="ENTER:Правка F4:Ввод F3:Сортировка F6/Alt-F6:Фильтр F7/Alt-F7:поиск F9:Печать"
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))'//макровыражение для контекстного поиска
//выражение в кавычках описывает операцию, которая выполняется при каждом переборе записи

LOCAL aHeads:={; //массив описания полей ввода
      {'Код группы.................... ','Grup'},;
      {'Н/номер....................... ','NNum'},;
      {'Наименование.................. ','Name'},;
      {'Единица измерения............. ','Ed'};
        }
//В процессе ввода автоматически образуется privat-vfccbd aIn:
//Например в данном примере:
//aIn[1] - будет содержать значение кода группы
//aIn[2] - значение номенклатурного номера
//aIn[3] - значение наименования
//aIn[4] - значение единицы измерения
//Элементы массива aIn можно использовать в WHEN-VALID-выражениях,
//которые задаются массивами aWhen, aValid, подробнее см. s_lib.prg

LOCAL aPict:={,,"@KS30"}//массив aPict, скроллинг для наименования



LOCAL aEd:={; //МАССИВ ВОЗМОЖНЫХ ЕДИНИЦ ИЗМЕРЕНИЯ (ДЛЯ ПЕРЕКЛЮЧАТЕЛЯ)
"шт   ",;
"кг   ",;
"грамм",;
"тонна",;
"пара ";
}

LOCAL aRefers:={"GrupRefer",; //МАССИВ СПРАВОЧНИКОВ
                 NIL,; //НА ВТОРОЕ ПОЛЕ НИЧЕГО НЕ ВЕШАЕМ
                 {|oGet|RotateReader(oGet,aEd)}; //НА ТРЕТЬЕМ ПОЛЕ ПЕРЕКЛЮЧАТЕЛЬ
               }

LOCAL aPrintHeads:={; //данные для простейшего отчета
"Номенклатурный справочник",; //наименование отчета
{"Группа","Grup"},;  //{заголовок,поле или выражение}
{"Ном.номер","NNum"},;
{"Наименование","Name"},;
{"ЕИ","Ed"};
}


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


//открываем таблицу по пути sclad\mlabel.dbf c алиасом MLabel;
//функция БЭСТ LoadPath() возвращает путь до папки с БД выбранного предприятия
IF NetUse("MLabel",LoadPath()+"sclad\mlabel.dbf").AND.;  //если открытие успешно
   NetUse("MGrup",LoadPath()+"sclad\mgrup.dbf")


   //Изготовление справочника групп
   SELECT MGrup
   MakeRefer(; //Универсальная функция построения справочника (pll\s_refer.prg)
   "GrupRefer",; //имя справочника
   "Справочник групп",; //наименование справочника
    1,; //вид: 1-обязательный ввод по справочнику
    {"Код","Наименование"},; //заголовки полей в реестре справочника
    {3,23,7},,; //координаты отображения справочника: строка,колонка,кол-во строк 
    {"CODE"},; //из какого поля взять данные
    {"aIn[1]"},; //куда заслать
    "UPPER(aIn[1])",; //выражение поиска в справочнике при наличии данных в приемнике
    {{||MGrup->Code},{||MGrup->Name}}; //какие поля отображать в реестре справочника
    )


   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" //нарисуем разделительную черту перед подвалом 

   //ДОБАВЛЯЕМ aPrintHeads в InitList
   InitList(nTop,nBottom,cColHead,aBlockCols,bCoProc,aHeads,aRefers,aPict,,,,,,aSortSeek,;
            aPrintHeads,,,,,,,,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 автоматически "прицепились" функции 
контекстного поиска и фильтрации.
После задания массива описания полей ввода aHeads - стали доступны клавиши:
ENTER-для редактирования, F4 - для добавления, F6 - для фильтра по полям.
Кроме того, на поле группы мы навесили справочник групп, а ввод единицы 
измерения реализовали в виде переключателя из заранее заданных значений.
С помощью массива aPrintHeads получена возможность печати простейшего отчета. 
При этом автоматически обеспечивается вывод в Word,Excel,Xml и в другие форматы.
*********/
