Научная статья на тему 'Разработка модуля генерации отчетности, позволяющего экспортировать данные в форматы pdf, xls, doc'

Разработка модуля генерации отчетности, позволяющего экспортировать данные в форматы pdf, xls, doc Текст научной статьи по специальности «Экономика и бизнес»

CC BY
436
219
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ИНФОРМАЦИОННЫЕ ТЕХНОЛОГИИ / БАЗЫ ДАННЫХ / ПРОГРАММИРОВАНИЕ / СУБД ORACLE / OLAP CUBE БИБЛИОТЕКИ BIRT

Аннотация научной статьи по экономике и бизнесу, автор научной работы — Белов Д. Е., Шалин А. Ф., Кузнецов И. М., Макеев М. В.

Был использован OLAP CUBE библиотеки Birt. Данный инструмент позволил организовать агрегацию данных в требуемых разрезах, однако вместе с тем это значительно увеличило нагрузку на серверную часть при формировании отчетов. В связи с вышеизложенным повторно рассматривается возможность использования СУБД Oracle для оптимизации быстродействия приложения, существенного увеличения которого можно достичь путем предварительной (преагрегации) данных.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Разработка модуля генерации отчетности, позволяющего экспортировать данные в форматы pdf, xls, doc»

УДК 519.6:004.4

Разработка модуля генерации отчетности, позволяющего экспортировать данные в форматы pdf, xls, doc

Д.Е. Белов, к. б. н., А.Ф. Шалин, гл. специалист по информационной безопасности

И.М. Кузнецов, зам. зав. отделом, к. т. н.,

М.В. Макеев, научный сотрудник

Всероссийский НИИ электрификации сельского хозяйства

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

Отчет - это конечный итог, предоставляющий ряд аналитических возможностей, направленных на совершенствование экономического механизма управления производством, анализа информации, сопоставленной между географически распределенными подотчетными единицами, составляющими в своей совокупности единый комплекс непротиворечивых данных, изменяющихся во времени.

Феномен времени, который является неотъемлемой частью любой темпоральной информационно-вычислительной системы, заставляет нас при разработке программного обеспечения продумывать организацию данных таким образом, чтобы при необходимости пользователи системы имели возможность путешествовать во времени и получать актуальные данные о состоянии системы за любой период. В этой связи необходимым становится понимание значения слова «период». В переводе с греческого языка оно означает «окружность, обход». Однако понимание этого термина неоднозначно в разрезе различных наук. В данной работе суть периода определяется хронологическим пониманием этой метафоры, а именно, отрезком времени, установленным в прошлом, характеризующим связь с рядом событий и обладающим двумя обязательными свойствами - датой начала и датой окончания в двух возможных состояниях -определенном и неопределенном.

Что касается технологий, используемых для формирования отчетности, основополагающими факторами, от которых отталкивалась наша команда, была стоимость использования сторонних библиотек, возможности по интеграции с существующим проектом, последующей доработке, использованию хранимых процедур.

Тщательная проработка существующих решений позволила выявить два основных продукта, которые вписываются в концепцию

реализуемого проекта, ими стали Birt и JasperReport.

Библиотеки Birt и JasperReport представляют собой движки, которые подразумевают дальнейшее развитие разработки на основе данных библиотек.

Изучение интеграционных возможностей JasperReport и среды разработки Eclipse позволило обнаружить проблемы совместимости при использовании визуального построителя отчетов «iReport». Для решения данной проблемы был использован визуальный построитель отчетов «JasperWave», поддерживаемый сообществом «JasperWave community» и являющийся open source-продуктом. JasperWave позволяет создать шаблон отчета в виде XML, разметки которого затем обрабатываются движком JasperReport и позволяют осуществить вывод информации путем передачи ее через поток. При этом следует учитывать, что шаблоны отчета не должны участвовать в обработке java компилятором. То есть формирование отчета происходит во время работы программы из XML - файла, который должен быть размещен на сервере и не быть откомпилированным. Для этой цели была использована папка в «reports», которая не включается в bildPath.

При тестировании движка Jasper Report был выявлен ряд особенностей данной библиотеки, которые накладывают существенные ограничения на процесс формирования отчетов. Например, дизайнер отчетов не поддерживает такую структуру отчета, как CrossTab, это обстоятельство не являлось бы большой проблемой при использовании СУБД Oracle, так как нативные расширения языка SQL позволяют производить эффективную консолидацию данных. Однако в случае использования СУБД Oracle существенно возрастает совокупная стоимость владения (TCO - total cost ownership), что неприемлемо на данном этапе развития проекта. Значительное снижение этого показателя было достигнуто при использовании СУБД MySQL под лицензией community edition. Тем не менее для решения вышеуказанной проблемы мог бы использоваться другой визуальный редактор отчетов - JasperReport Studio, однако его использование сопряжено с рядом проблем, которые определяются тем, что этот продукт должен быть инсталлирован в операционную систему, при этом теряется единство проекта и его связь с репозиторием.

Другой проблемой использования JasperReport стала невозможность построения отчетов произвольной ширины, а именно этот фактор наш потенциальный заказчик считает необходимым для эффективной работы.

Исследование возможностей библиотеки Birt при создании отчетов показало, что данный продукт можно интегрировать в среду разработки Eclipse (рис. 1). Однако использование Birt несет за собой ряд проблем, которых не было при использовании JasperReport, нивелирующихся четкой разметкой отчета. Тем не менее дизайнер BIRT поддерживает Table и CrossTab, а также обладает возможностью отображения в

формате HTML отчета с достаточно большим количеством колонок, хотя, по факту, формирование отчетов с количеством колонок большим, чем 25-30, представляется весьма неудобным. Для решения этой проблемы возможно использование Design Engine API, однако сложность и требования к коду при этом повышаются. Кроме того, Birt обладает встроенным OLAP-кубом, и при достижении его совместимости с компонентом CrossTab удалось реализовать эффективную консолидацию данных, которая была недоступна при использовании СУБД MySQL.

Рисунок 1 - Скриншот рабочей области BIRT Designer, интегрированной в Eclipse.

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

При этом модуль отчетности должен работать по следующему алгоритму:

1. Выборка подотчетных предприятий, в период существования которых входила первая выбираемая пользователем дата.

2. Выборка подотчетных предприятий, в период существования которых входила вторая выбираемая пользователем дата.

3. Присоединение отчетных данных к предприятиям на указанные даты.

4. Вычисление показателя (+/-, %) между первой и второй датами с учетом выведения информации о существовавших, но не отчитавшихся за указанную дату подотчетных единицах с поддержкой иерархической структуры. В результате реализации данного алгоритма был составлен SQL -запрос (СУБД MySQL), который выводит информацию о поголовье животных в Ставропольском крае по всем подотчетным единицам с учетом трехуровневой иерархии и времени их существования:

select 'id', 'parent_id', 'entity_type', 'nameO', 'namel', 'name2', company_id,

c_milk1, c_milk2, c_milk_calc,

cow_milk1, cow_milk2, cow_milk_calc,

c_meat1, c_meat2, c_meat1_calc,

cow_meat1, cow_meat2, cow_meat1_calc,

pigs1, pigs2, pigs1_calc,

sow1, sow2, sow1_calc,

sheeps1, sheeps2, sheeps1_calc,

ewe1, ewe2, ewe1_calc,

y_ewe1, y_ewe2, y_ewe1_calc,

goats1, goats2, goats1_calc,

s_goats1, s_goats2, s_goats1_calc,

bird1, bird2, bird1_calc

from (select 'id', 'parent_id', 'entity_type', 'nameO', 'name1', 'name2', company_id, c_milk1, c_milk2,

round(case when c_milk1 = 0 then NULL else (c_milk2-c_milk1)*100/c_milk1 end, 2) c_milk_calc, cow_milk1, cow_milk2,

round(case when cow_milk1 = 0 then NULL else (cow_milk2-cow_milk1)*100/cow_milk1 end, 2) cow_milk_calc,

c_meat1, c_meat2,

round(case when c_meat1 = 0 then NULL else (c_meat2-c_meat1)*100/c_meat1 end, 2) c_meat1_calc,

cow_meat1, cow_meat2,

round(case when cow_meat1 = 0 then NULL else (cow_meat2-cow_meat1)*100/cow_meat1 end, 2) cow_meat1_calc,

pigs1, pigs2,

round(case when pigs1 = 0 then NULL else (pigs2-pigs1)*100/pigs1 end, 2) pigs1_calc, sow1, sow2,

round(case when sow1 = 0 then NULL else (sow2-sow1)*100/sow1 end, 2) sow1_calc, sheeps1, sheeps2,

round(case when sheeps1 = 0 then NULL else (sheeps2-sheeps1)*100/sheeps1 end, 2) sheeps1_calc,

ewe1, ewe2,

round(case when ewe1 = 0 then NULL else (ewe2-ewe1)*100/ewe1 end, 2) ewe1_calc, y_ewe1, y_ewe2,

round(case when y_ewe1 = 0 then NULL else (y_ewe2-y_ewe1)*100/y_ewe1 end, 2) y_ewe1_calc, goats1, goats2,

round(case when goats1 = 0 then NULL else (goats2-goats1)*100/goats1 end, 2) goats1_calc,

s_goats1, s_goats2,

round(case when s_goats1 = 0 then NULL else (s_goats2-s_goats1)*100/s_goats1 end, 2) s_goats1_calc,

bird1, bird2,

round(case when bird1 = 0 then NULL else (bird2-bird1)*100/bird1 end, 2) bird1_calc from (select 'a'.'name' AS 'name2',

'b'. name' AS 'name1',

'c'. name' AS 'name0',

'a'. entity type' AS 'entity type',

'a'. id' AS 'id',

'a'. hierarchy_reference' AS 'parent_id'

'a'. beg_date',

'a'. 'end_date'

from

(('region' 'a' left join 'region' 'b' on(('a'.'hierarchy_reference' = 'b'.'id'))) left join 'region' 'c' on(('b'.'hierarchy_reference' = 'c'.'id'))) where a.'beg_date' is not null AND a.'beg_date' <= :dv1 AND C0ALESCE(a.'end_date',2500-01-01) > :dv1 UNION select

'a'.'name' AS 'name2',

'b'.'name' AS 'name1',

'c'.'name' AS 'name0',

'a'.'entity_type' AS 'entity_type',

'a'.'id' AS 'id',

'a'.'hierarchy_reference' AS 'parent_id',

'a'.'beg_date',

'a'.'end_date'

from

(('region' 'a' left join 'region' 'b' on(('a'.'hierarchy_reference' = 'b'.'id'))) left join 'region' 'c' on(('b'.'hierarchy_reference' = 'c'.'id'))) where a.'beg_date' is not null AND a.'beg_date' <= :dv2

AND C0ALESCE(a.'end_date',2500-01-01) > :dv2) as h_union left outer join

(select company_id company_id, sum(c_milk1) c_milk1, sum(c_milk2) c_milk2, sum(cow_milk1) cow_milk1, sum(cow_milk2) cow_milk2,

sum(c_meat1) c_meat1, sum(c_meat2) c_meat2,sum(cow_meat1) cow_meat1, sum(cow_meat2) cow_meat2,

sum(pigs1) pigs1, sum(pigs2) pigs2, sum(sow1) sow1, sum(sow2) sow2, sum(sheeps1) sheeps1, sum(sheeps2) sheeps2, sum(ewe1) ewe1, sum(ewe2) ewe2, sum(y_ewe1) y_ewe1, sum(y_ewe2) y_ewe2,

sum(goats1) goats1, sum(goats2) goats2, sum(s_goats1) s_goats1, sum(s_goats2)

s_goats2,

sum(bird1) bird1, sum(bird2) bird2

from (

select company_id, cattle_milk c_milk1, cow_milk cow_milk1, cattle_meet c_meat1, cow_meet cow_meat1,

pigs pigs1, sow sow1, sheeps sheeps1, ewe ewe1, young_ewe y_ewe1, goats goats1, she_goats s_goats1, bird bird1,

NULL c_milk2, NULL cow_milk2, NULL c_meat2, NULL cow_meat2,

NULL pigs2, NULL sow2, NULL sheeps2, NULL ewe2, NULL y_ewe2, NULL goats2, NULL s_goats2, NULL bird2 from animal_livestock where reporting_date_id = :d1 union all

select company_id, NULL c_milk1, NULL cow_milk1, NULL c_meat1, NULL cow_meat1, NULL pigs1, NULL sow1, NULL sheeps1, NULL ewe1, NULL y_ewe1, NULL goats1, NULL s_goats1, NULL bird1, cattle_milk c_milk2, cow_milk cow_milk2, cattle_meet c_meat2, cow_meet cow_meat2, pigs pigs2, sow sow2, sheeps sheeps2, ewe ewe2, young_ewe y_ewe2, goats goats2, she_goats s_goats2, bird bird2

from animal_livestock where reporting_date_id = :d2) as al GROUP by company_id) as heap on h_union.id = heap.company_id) as tot

Однако набор данных, возвращаемый этим запросом, как мы можем видеть, является неполным и требует дополнительной агрегации в разрезе районов, сельскохозяйственных предприятий, крестьянских (фермерских) и личных подсобных хозяйств.

Для решения этой задачи и был использован OLAP CUBE библиотеки Birt. Данный инструмент позволил организовать агрегацию данных в требуемых разрезах (рис. 2), однако вместе с тем это значительно увеличило нагрузку на серверную часть при формировании отчетов.

В связи с вышеизложенным нашей командой повторно рассматривается возможность использования СУБД Oracle для оптимизации быстродействия приложения, существенного увеличения которого можно достичь путем предварительной (преагрегации) данных.

Для экспорта отчета в различные форматы был разработан следующий класс:

public class BirtConfig {

private WebApplication app;

public void configure(String type, String nameOfClass) throws BirtException, lOException {

EngineConfig config = null; config = new EngineConfig(); config.setLogConfig(forTemp, Level. FINEST);

Platform. startup(config);

final IReportEngineFactory FACTORY = (IReportEngineFactory) Platform .createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY); IReportRunnable design = null;

IReportEngine engine = null;

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

engine = FACTORY.createReportEngine(config);

String waveOfFile = WebApplication.get().getContext()

.getBaseDirectory().getAbsolutePath()

+ "/WEB-INF/classes/reports/" + nameOfClass + ".rptdesign"; design = engine.openReportDesign(waveOfFile);

IRunAndRenderTask task = engine.createRunAndRenderTask(design);

if (type.equals("HTML")) {

final HTMLRenderOption HTML_OPTIONS = new HTMLRenderOption();

// путь для сохранения html-файла

HTML_OPTIONS.setOutputFileName(new String(WebApplication.g©t() .getContext().getBaseDirectory().getAbsolutePath()

+ "/WEB-INF/classes/birt/BIRTfileHTML.html")); HTML_OPTIONS.setOutputFormat("html"); task.setRenderOption(HTML_OPTIONS); task.run(); task.close();

Log./n/o("it's work");

}

if (type.equals("Excel")) {

EXCELRenderOption Excel_OPTIONS = new EXCELRenderOption(); Excel_OPTIONS.setOutputFormat("xls");

// путь для сохранения xls-файла

Excel_OPTIONS.setOutputFileName(new String(WebApplication.g©t() .getContext().getBaseDirectory().getAbsolutePath()

+ "/WEB-INF/classes/birt/BIRTfileXLS.xls"));

task.setRenderOption(Excel_OPTIONS);

task.run();

task.close();

// скачивание файла

FileDownloadResource file = new FileDownloadResource(new File( WebApplication.get().getContext().getBaseDirectory() .getAbsolutePath()

+ "/WEB-INF/classes/birt/BIRTfileXLS.xls"),

app.getQ);

WebApplication.get().getMainWindow().open(file);

}

if (type.equals("Pdf")) {

// экспорт в PDF

PDFRenderOption PDF_OPTIONS = new PDFRenderOption(); PDF_OPTIONS.setOutputFileName(new String(WebApplication.get() .getContext().getBaseDirectory().getAbsolutePath()

+ "/WEB-INF/classes/birt/BIRTfilePDF.pdf"));

// путь для сохранения pdf-файла

PDF_OPTIONS.setOutputFormat("pdf");

task.setRenderOption(PDF_OPTIONS);

task.run();

task.close();

// скачивание файла

FileDownloadResource file = new FileDownloadResource(new File( WebApplication.get().getContext().getBaseDirectory() .getAbsolutePath()

+ "/WEB-INF/classes/birt/BIRTfilePDF.pdf"),

app.getQ);

WebApplication.get().getMainWindow().open(file);

}

if (type.equals("Doc")) {

// экспорт в PDF

DOCRenderOption DOC_OPTIONS = new PDFRenderOption(); DOC_OPTIONS.setOutputFileName(new String(WebApplication.get() .getContext().getBaseDirectory().getAbsolutePath()

+ "/WEB-INF/classes/birt/BIRTfilePDF.pdf"));

// путь для сохранения pdf -файла

DOC_OPTIONS.setOutputFormat("doc");

task.setRenderOption(PDF_OPTIONS);

task.run();

task.close();

// скачивание файла

FileDownloadResource file = new FileDownloadResource(new File( WebApplication.get().getContext().getBaseDirectory() .getAbsolutePath()

+ "/WEB-INF/classes/birt/BIRTfilePDF.pdf"),

app.getQ);

WebApplication.get().getMainWindow().open(file);

}

}

}

<- -> С 1 D Iocalhost:8090/f24a

2P MySQL Stored Funct... '£?• Новости науки Щ1 Red Hat Linux 12 A MySQL database on... в 15 Practical Usages ... ^ Tomcat - ArchWiki \9 Статья: "MySQL. Ие... Л Birt Д Creating and using r... [j org.eclipse.birt.repo...

Разделы отчета Выход

К.Р.С. мол. 2011-01-01 К.Р.С. мол. 2011-02-01 в % 2011-01-01 к 2011-02-01 Коровы мол. 2011-01-01 Коровы мол. 2011-02-01 в % 2011-01-01 К.Р.С. мясн. к 2011-02-01 2011-01-01 К.Р.С. мясн. в % 2011-0' 2011-02-01 к 2011-02-

Александровский район ’Колледж" 5 л 40 5 7 40 5 7

ЗАО МТС "Алексан-ское" 10 12 20 10 12 20 10 12

ОАО "Пятигорс. х/к" 20 15 -25 20 15 -25 20 15

ООО "Колос" 30 23 -23.33 30 23 -23,33 30 23 -2

ООО "Русь" 50 52] 4 50 52 4 50 щ

ПНИ 580 50 50

СПК к-з "Колос" 321 1351 132

СПК к-з им."Войтика" 313 132 32

СПК к-з"Северное" 132 321 132

Тест

Крестьянские (фермерские) хозяйства 100 120 20 100 120 20 100 120

Пичные подсобные хозяйства 200 250 25 200 250 25 200 250

Александровский район ИТОГО 1049 1191 13,54 1898 850 -55.22 579 661 1

Арзгирский район ОАО "Нива"

Арзгирский район ИТОГО ~ «

Благодарненский район ООО Сфера 90 95| 5,56 90 95 5,56 90 щ

СПКК Спасское

Благодарненский район ИТОГО 90 95 5,56 90 95 5,56 90 95

ИТОГО К(Ф)Х 100 120 20.00 100 120 20.00 100 120 2

ИТОГО ЛПХ 200 250 25.00 200 250 25.00 200 250 2

ИТОГО СХП 839 916 9.18 1688 575 -65,94 369 386

ИТОГО 1139 1286 12,91 1988 945 -52.46 669 756 1

22.03.2013 14:05

п

Рисунок 2 - Отображение отчета о поголовье животных в Ставропольском крае с агрегацией данных в разрезе региона, районов, сельскохозяйственных предприятий, личных подсобных и крестьянских (фермерских) хозяйств с учетом периодов их существования.

Литература:

1. Абонеев, В.В. Методика оценки мясной продуктивности овец /В.В. Абонеев, Ю.Д. Квитко, И.И. Селькин и др. //Ставрополь, 2009. -34 с.

2. Абонеев, В.В. Стратегия развития овцеводства в Российской Федерации //Достижения науки и техники АПК. -2008.-№10. -С. 37-39.

3. Абонеев, В.В. Приемы и методы повышения конкурентоспособности товарного овцеводства /В.В.Абонеев, Л.Н.Скорых, Д.В.Абонеев //ГНУ СНИИЖК, г. Ставрополь. -2011. -337 с.

4. Абонеев, В.В. Перспективные направления селекции овец в условиях рыночной экономики /В.В. Абонеев, А.Н. Соколов //Овцы, козы, шерстяное дело. -2007. -№ 1. -С. 7-11.

5. Абонеев, В.В. Развитие тонкорунного овцеводства в России /В.В. Абонеев, В.В. Марченко, А.И. Суров, А.А. Пикалов, А.И. Ерохин, С.А. Карасев //Овцы. Козы. Шерстяное дело. - 2012. - № 2. - С. 6-13.

6. Василенко, В.Н. Племенная база овцеводства Ростовской области /В.Н.Василенко, Ю.А. Колосов //Зоотехния, 2002. -№8. -С.9-12.

7. Завгородняя, Г.В. Мясная продуктивность баранчиков разных генотипов и уровней кормления /Г.В. Завгородняя, Ю.Д. Квитко, И.И. Дмитрик, И.П. Будякова, И.Н. Шарко //Овцы. Козы. Шерстяное дело, 2012. - №2 -С. 42-44.

8. Квитко, Ю.Д. Проблемы и новые подходы в организации производства баранины /Ю.Д. Квитко //Сборник научных трудов Ставропольского научно-исследовательского института животноводства и кормопроизводства, 2005. -Т. 1. -№2. -С. 3-7

9. Квитко, Ю.Д. Мясная продуктивность и качество мяса молодняка овец разного происхождения /Ю.Д. Квитко, А.В. Скокова, С.Ф. Силкина //Овцы. Козы. Шерстяное дело, 2012. - № 2. - С. 39-41.

10. Ковалюк, Н. В. Молекулярно-биологические методы для оздоровления стад крупного рогатого скота от лейкоза /Н. В. Ковалюк //Ветеринария, 2008. -№2. -С. 22-26.

11. Ковалюк, Н. В. Методические рекомендации по использованию маркера ВоЬА DRB3 в селекционно-племенной работе с крупным рогатым скотом: Рекомендации СКНИИЖ /Н. В.Ковалюк, В.Ф. Сацук //Краснодар, 2010. -24 с.

12. Ковалюк, Н. В. Использование генетического маркера BOLA-DRB3 для оптимизации селекционного процесса при скрещивании /Н. В. Ковалюк, В.Ф. Сацук //Молочное скотоводство, 2010.-№2.-С.10-12.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

13. Ковалюк, Н.В. Современные методы диагностики лейкоза крупного рогатого скота /Н.В. Ковалюк, В.Ф. Сацук, Е.В. Мачульская //Вестник Кубани, 2007. -№ 1.

14. Ковалюк, Н.В. Современные методы диагностики лейкоза крупного рогатого скота /Н.В.Ковалюк, В.Ф.Сацук, Е.В. Мачульская //Ветеринария Кубани, 2007. -№ 1. -С. 18-20.

15. Колосов, Ю.А., Информационное сопровождение селекционного процесса в овцеводстве: учебное пособие /Ю.А. Колосов, А.И.

Бараников, В.Н. Василенко, Н.В. Михайлов //Изд-во Донского ГАУ, пос.Персиановский, 2012. -55 с.

16. Колосов, Ю.А. Продуктивность молодняка породы советский меринос и её помесей с эдильбаевскими баранами /Ю.А. Колосов, С. В. Шихов //Овцы, козы, шерстяное дело, 2006. -№ 3. -С. 7-10.

17. Колосов, Ю.А. Модель организации селекционно-племенной работы в овцеводстве с применением метода зависимых уровней отбора /Ю.А. Колосов, И.В. Засемчук //Новочеркасск, 2008.-С.76.

18. Новопашина, С.И. Переваримость питательных веществ рациона молочными козами при разном уровне протеина /С.И. Новопашина, Ю.Д. Квитко, М.Ю. Санников, Е.И. Кизилова //Овцы. Козы. Шерстяное дело, 2012. - № 2. - С. 64-67.

19. Ольховская, Л. В. Иммуногенетический анализ в селекции коз/Л. В. Ольховская, Л. Н. Чижова и др. //Ставрополь. ВНИИОК, 2000. -С. 3-11.

20. Тимошенко, Н.К. Состояние и перспективы развития первичной обработки шерсти /Н.К. Тимошенко //Овцы, козы, шерстяное дело, 2007. -№ 4. -С. 46-50.

21. Тимошенко, Н.К. Рынок шерсти: состояние и тенденции развития /Н.К. Тимошенко, В.В. Абонеев //Овцы, козы, шерстяное дело, 2012. -№2. -С. 50.

22. Чижова, Л.Н. Биохимические тест-системы, генетические маркеры продуктивности, их использование в селекции овец /Л.Н. Чижова //Автореф. дисс.... д-ра с.-х. наук. -Ставрополь, 2004. -58 с.

Чижова, Л.Н. Методические рекомендации комплексной оценки крупного рогатого скота мясных пород по фенотипу и генотипу /Л.Н. Чижова и др.//Ставрополь, 2008. -52с.

i Надоели баннеры? Вы всегда можете отключить рекламу.