Задача: Сформировать отчет для анализа продаж по:
фактическим срокам исполнения заказов;
по группам товара заказанного, отгруженного;
по продукции;
по покупателям;
........
прочим аналитическим признакам партнеров, групп продукции, продукции.
Решение:
Подобные задачи часто возникают на предприятиях. Для решения задачи возможно формирование отдельного отчета для каждого пункта требований.
Но более удобным способом для анализа, будет формирование массива необходимых данных и их анализ средствами офисных приложений.
А именно - режима сводных таблиц MS Office Excel или OpenOffice.Org Calc.
Задача решается в несколько этапов:
Определение структуры данных, содержащей необходимые сведения для анализа.
Выгрузка в таблицу сведений по заказам (выписанным счетам);
Выгрузка в таблицу сведений по отгрузкам;
Экспорт таблицы в офисное приложение (по выбору - OpenOffice.org Calc или MS Office Excel);
Формирование сводной таблицы по необходимым критериям.
Рассмотрим подробнее (текст программы приведен не полностью):
Этап 1. Определение структуры данных для анализа
Набор данных для анализа определяется на каждом предприятии индивидуально, исходя из используемой схемы ведения товарного и аналитического учета. Для примера будет достаточно следующего набора данных:
Документы в БЭСТ-5
Сведения
Заказы (счета)
Дата выписки, Дата отгрузки, Номер документа, Корсчет, Контрагент (тип, код, наименование), товар (код круппы, наименование группы, код товара, наименование), количество, цена, сумма
Накладная на отгрузку
Дата выписки,Номер документа, Корсчет, Контрагент (тип, код, наименование), товар (код круппы, наименование группы, код товара, наименование), количество, цена, сумма
Исходя из сведений (тип, размерность поля) полученых в описании таблиц, определяем итоговую таблицу:
Этап 2. Формирование выборки по реестру заказов
Далее, для осуществления выборки необходимо сформировать область связаных таблиц, содержащих необходимые данные.
На этом этапе получили массив связанных таблиц и теперь можно приступать к перебору и записи необходимых данных в итоговую таблицу.
Этап 3. Формирование выборки по реестру накладных на реализацию
Часть необходимых таблиц уже открыта, поэтому на достаточно закрыть только таблицы реестра и содержимого заказов.
И далее по подобию первого этапа:
Этап 4. Экспорт таблицы в офисное приложение по выбору
Заключительным этапом программы является экспорт таблицы для анализа в офисное приложение по выбору.
Для этих целей используем функции БЭСТ-5 ExportToCalc() и ExportToExcel()
Этап 5. Формирование сводной таблицы
По инструкции выбранного инструмента...
фактическим срокам исполнения заказов;
по группам товара заказанного, отгруженного;
по продукции;
по покупателям;
........
прочим аналитическим признакам партнеров, групп продукции, продукции.
Решение:
Подобные задачи часто возникают на предприятиях. Для решения задачи возможно формирование отдельного отчета для каждого пункта требований.
Но более удобным способом для анализа, будет формирование массива необходимых данных и их анализ средствами офисных приложений.
А именно - режима сводных таблиц 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. Формирование сводной таблицы
По инструкции выбранного инструмента...
С уважением,
Ильин Евгений
Ильин Евгений