BEST logo логотип компании БЭСТ - программы для бизнеса ПРОДАЖИ
+7 (991) 312-04-37
trade@bestnet.ru
ПОДДЕРЖКА
+7 (495) 775-66-76
consult@bestnet.ru
СКАЧАТЬ
Обновления
Дистрибутивы
Авторизация

Логин:
Пароль:
Забыли свой пароль?
Регистрация
ВАШ ВОПРОС

Доступ к Личному кабинету закрыт!
Как получить доступ?


Главная  / Поддержка  / Форум  / Публичные форумы  / Программирование приложений  / Пример формирования пользовательского отчета в сводных таблицах

Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Пример формирования пользовательского отчета в сводных таблицах
 
Задача: Сформировать отчет для анализа продаж по:
фактическим срокам исполнения заказов;
по группам товара заказанного, отгруженного;
по продукции;
по покупателям;
........
прочим аналитическим признакам партнеров, групп продукции, продукции.

Решение:
Подобные задачи часто возникают на предприятиях. Для решения задачи возможно формирование отдельного отчета для каждого пункта требований.
Но более удобным способом для анализа, будет формирование массива необходимых данных и их анализ средствами офисных приложений.
А именно - режима сводных таблиц MS Office Excel или OpenOffice.Org Calc.
Задача решается в несколько этапов:
Определение структуры данных, содержащей необходимые сведения для анализа.
Выгрузка в таблицу сведений по заказам (выписанным счетам);
Выгрузка в таблицу сведений по отгрузкам;
Экспорт таблицы в офисное приложение (по выбору - OpenOffice.org Calc или MS Office Excel);
Формирование сводной таблицы по необходимым критериям.

Рассмотрим подробнее (текст программы приведен не полностью):

Этап 1. Определение структуры данных для анализа

Набор данных для анализа определяется на каждом предприятии индивидуально, исходя из используемой схемы ведения товарного и аналитического учета. Для примера будет достаточно следующего набора данных:
Документы в БЭСТ-5
Сведения
Заказы (счета)
Дата выписки, Дата отгрузки, Номер документа, Корсчет, Контрагент (тип, код, наименование), товар (код круппы, наименование группы, код товара, наименование), количество, цена, сумма
Накладная на отгрузку
Дата выписки,Номер документа, Корсчет, Контрагент (тип, код, наименование), товар (код круппы, наименование группы, код товара, наименование), количество, цена, сумма


Исходя из сведений (тип, размерность поля) полученых в описании таблиц, определяем итоговую таблицу:

Код
   aTable := {} // массив со структурой временной таблицы
   AADD(aTable,{"priznak","c",4,0})    // ПЛАН / ФАКТ
   AADD(aTable,{"orddate","D",8,0})    // Дата документа
   AADD(aTable,{"numdoc","C",6,0})     // Номер документа
   AADD(aTable,{"otgdate","D",8,0})    // Дата отгрузки
   AADD(aTable,{"schet","C",16,0})     // Счет
   AADD(aTable,{"agentcode","C",60,0}) // Код контрагента
   AADD(aTable,{"agentname","C",25,0}) // Наименование покупателя
   AADD(aTable,{"agenttype","C",25,0}) // Тип покупателя
   AADD(aTable,{"grup","C",5,0})       // Код группы товара
   AADD(aTable,{"grupname","c",60,0})  // Наименование группы
   AADD(aTable,{"nnum","C",13,0})      // Номенклатурный номер товара
   AADD(aTable,{"lname","c",60,0})     // Наименование товара
   AADD(aTable,{"kol","N",19,6})       // Количество по строке заказа
   AADD(aTable,{"cena","N",19,8})      // Цена по строке заказа
   AADD(aTable,{"sumout","N",19,3})    // Сумма по строке заказа        
   cFile := "user\u_plnfct.dbf"        // Определяем файл в папке USER базы данных
   cName := B6_DBF_PATH+cFile          // путь к файлу с временной таблицей
   DBCREATE(cName, aTable)             // создание временного файла, если есть, то перепишется


Этап 2. Формирование выборки по реестру заказов

Далее, для осуществления выборки необходимо сформировать область связаных таблиц, содержащих необходимые данные.

Код
   // Открываем таблицы для первого этапа, получения сведений для плана отгрузки
   NetUseRo("u_rbook",B6_DBF_PATH+"real\rbook.dbf") //открыли реестр заголовков заказов
   ORDSETFOCUS("rbook0")// ставим индекс по коду
   NetUseRo("u_rbookm",B6_DBF_PATH+"real\rbookm.dbf") //открыли реестр содержимого заказов
   ORDSETFOCUS("tag_oper_")
   NetUseRo("u_mgrup",B6_DBF_PATH+"sclad\mgrup.dbf") //открыли справочник групп
   ORDSETFOCUS("mgrup")
   NetUseRo("u_mlabel",B6_DBF_PATH+"sclad\mlabel.dbf") //открыли номенклатурный справочник
   ORDSETFOCUS("mlabel")
   NetUseRo("u_partner",B6_DBF_PATH+"partner.dbf") //открыли справочник партнеров
   ORDSETFOCUS("code")
   NetUseRo("u_type_a",B6_DBF_PATH+"type_a.dbf") // открыли справочник типов
   ORDSETFOCUS("tag_oper")
   /// Блок запроса дат
   dDateOt:=BoM(DATE())// Ставим начальную дату периода
   dDateDo:=EoM(DATE())// Ставим конечную дату периода
   //Делаем запрос периода для формирования реестра
   aDates:=DIALOG({'Введите дату начала периода..','Введите дату завершения......'},{,},{dDateOt,dDateDo})
   dDateOt:=aDates[1]
   dDateDo:=aDates[2]
   SELECT u_rbook // ставим активной область заголовков заказов
   // Ставим фильтр на активные заказы и даты отгрузки по запросу
   Set Filter TO u_rbook->status="1" .And.( u_rbook->date1>=dDateOt .And. u_rbook->date1<=dDateDo)
   Count TO uncount //считаем записи для индикатора
   Go top//?
   Set Relation TO nnoper into u_rbookm //связываем заголовки с содержимым по ИД
   Set Relation TO part_code into u_partner Additive // свзываем реестр заказов со справочником партнеров
   SELECT u_partner
   Set Relation TO type_a into u_type_a Additive // связываем
   SELECT u_rbookm //делаем активной область перечня заказа
   //связываем строки со справочниками для детализации
   Set Relation TO UPPER(grup) into u_mgrup Additive  // справочник групп
   Set Relation TO UPPER(grup)+UPPER(nnum) into u_mlabel Additive//справочник товаров

На этом этапе получили массив связанных таблиц и теперь можно приступать к перебору и записи необходимых данных в итоговую таблицу.

Код
   NETUSE("File_tab",cName) // открываем временную таблицу с алиасом FILE_TAB
   SELECT u_rbook
   PROGRESSINIT(uncount,"Идет перебор картотеки заказов ...")
   Go top //Начинаем перебор заказов
   DO WHILE (u_rbook->(!EOF())) // Цикл 1
     uncurent:=uncurent+1     // счетчик +1
     PROGRESSUPD ATE(uncurent) // обновляем картинку в строке статуса
     SELECT u_rbookm          //переходим в содержимое текущего заказа
     // Начинаем перебор позиций по заказу
     DO WHILE u_rbookm->nnoper_=u_rbook->nnoper   // ставим условие для связанных таблиц Цикл 2
       IF FILE_TAB->(ADDREC())                    // добавляем в приемную таблицу новую запись
         FILE_TAB->priznak:="План"                // Значение для фильтрации в сводной таблице
         FILE_TAB->ordDate:=u_rbook->DATE         // Дата заказа
         FILE_TAB->numdoc:=u_rbook->numdoc        // Номер заказа
         FILE_TAB->schet:=u_rbook->schet          // Счет
         FILE_TAB->otgdate:=u_rbook->date2        // Дата отгрузки
         FILE_TAB->agentcode:=u_rbook->agentcode  // Код контрагента
         FILE_TAB->agentname:=u_rbook->agentname  // Название контрагента
         FILE_TAB->agenttype:=u_type_a->name      // Тип контрагента
         FILE_TAB->grup:=u_rbookm->grup           // Код группы товара
         FILE_TAB->nnum:=u_rbookm->nnum           // Номенклатурный номер товара
         FILE_TAB->kol:=u_rbookm->kol             // Количество поставки
         FILE_TAB->cena:=u_rbookm->cenaout        // Цена
         FILE_TAB->sumout:=u_rbookm->sumout       // Сумма поставки
         FILE_TAB->grupname:=u_mgrup->name        // Название группы товара
         FILE_TAB->lname:=u_mlabel->name          // Название товара
         FILE_TAB->(DBUNLOCK())
       ENDIF
       u_rbookm->(DBSKIP()) // переходим к следующей строке заказа
     ENDDO   // Конец 2 цикла
     // Переходим к следующему заказу
     SELECT u_rbook
     u_rbook->(DBSKIP())
   ENDDO   // конец 1 цикла
   PROGRESSHIDE() // убираем индикатор


Этап 3. Формирование выборки по реестру накладных на реализацию

Часть необходимых таблиц уже открыта, поэтому на достаточно закрыть только таблицы реестра и содержимого заказов.
Код
   u_rbookm->(DBCLOSEAREA())
   u_rbook->(DBCLOSEAREA())

И далее по подобию первого этапа:
Код
   NetUseRo("u_mdoc",B6_DBF_PATH+"sclad\mdoc.dbf") //открыли реестр заголовков документов
   ORDSETFOCUS("mdoc")
   NetUseRo("u_mdocm",B6_DBF_PATH+"sclad\mdocm.dbf") //открыли реестр содержимого накладных
   ORDSETFOCUS("tag_oper_")
   SELECT u_mdoc  // Выделяем область заголовков накладных
   // Накладываем фильтр на перечень накладных, вид и тип - реализация со склада, период аналогично заказам
   Set Filter TO u_mdoc->vid="2" .And. u_mdoc->TYPE="1" .And. u_mdoc->DATE>=dDateOt .And. u_mdoc->DATE<=dDateDo
   Go top // сдвигаем указатель, для активации фильтра
   Count TO uncount
   Set Relation TO nnoper into u_mdocm
   Set Relation TO part_code into u_partner Additive
   SELECT u_partner
   Set Relation TO type_a into u_type_a Additive
   SELECT u_mdocm
   Set Relation TO UPPER(grup) into u_mgrup Additive
   Se t Relation TO UPPER(grup)+UPPER(nnum) into u_mlabel Additive
   SELECT u_mdoc
   Go top
   PROGRESSINIT(uncount,"Идет перебор картотеки накладных ...")
   DO WHILE (u_mdoc->(!EOF()))
     uncurent:=uncurent+1
     PROGRESSUPDATE(uncurent)
     SELECT u_mdocm
     DO WHILE u_mdocm->nnoper_=u_mdoc->nnoper
       IF FILE_TAB->(ADDREC())
         FILE_TAB->priznak:="Факт"
         FILE_TAB->ordDate:=u_mdoc->DATE
         FILE_TAB->numdoc:=u_mdoc->numdoc
         FILE_TAB->schet:=u_mdoc->schet_a
         FILE_TAB->otgdate:=u_mdoc->DATE
         FILE_TAB->agentcode:=u_mdoc->agentcode
         FILE_TAB->agentname:=u_mdoc->agentname
         FILE_TAB->agenttype:=u_type_a->name
         FILE_TAB->grup:=u_mdocm->grup
         FILE_TAB->nnum:=u_mdocm->nnum
         FILE_TAB->kol:=u_mdocm->kol
         FILE_TAB->cena:=u_mdocm->cenaout             // Количество поставки
         FILE_TAB->sumout:=u_mdocm->sumoutr
         FILE_TAB->grupname:=u_mgrup->name
         FILE_TAB->lname:=u_mlabel->name
         FILE_TAB->(DBUNLOCK())
       ENDIF
       u_mdocm->(DBSKIP())
     ENDDO
     SELECT u_mdoc
     u_mdoc->(DBSKIP())
   ENDDO
   PROGRESSHIDE()


Этап 4. Экспорт таблицы в офисное приложение по выбору

Заключительным этапом программы является экспорт таблицы для анализа в офисное приложение по выбору.
Для этих целей используем функции БЭСТ-5 ExportToCalc() и ExportToExcel()
Код
   SELECT file_tab
   nRetFormat:=NOORYES("Сформировать таблицу в формате..."+CHR(13)+CHR(10)+CHR(13)+CHR(10);
                   +"Примечание:"+CHR(13)+CHR(10)+"Цена и сумма без НДС",1,{"OpenOffice.org Calc ","MS Excel "})
   IF nRetFormat == 1
     exporttocalc()
   ELSEIF nRetFormat == 2
     exporttoexcel()
   ENDIF
   //закрытие таблиц
   u_partner->(DBCLOSEAREA())
   u_type_a->(DBCLOSEAREA())
   u_mlabel->(DBCLOSEAREA())
   u_mgrup->(DBCLOSEAREA())
   u_mdocm->(DBCLOSEAREA())
   u_mdoc->(DBCLOSEAREA())
   file_tab->(DBCLOSEAREA())

Этап 5. Формирование сводной таблицы

По инструкции выбранного инструмента...
С уважением,
Ильин Евгений
Страницы: 1
Читают тему (гостей: 1)