ODS
XML   ODS   ODT   HTML/HTM   Report Builder   Главная    
Бланк в ODS и готовый отчет по нему.

Для запуска примера кликните m4rg.exe, программа выведет форму для выбора бланка ( ODS, XML,ODT, HTML/HTM), после чего сформированный отчет будет тут-же показан на экране. 
ПРИМЕР ЗАПУСКА на основе бланка ODS
DO m4rg.exe WITH "test_lists_ods.ods","проба test_lists2.ods",0
или c конвертацией в xls (должен быть установлен Open Office!)
DO m4rg.exe WITH "test_lists_ods.ods","проба test_lists2.xls",0
Создание отчетов на основе бланков ODS. 
Код прописывается ТОЛЬКО в примечании именно к ячейке! 
Есть 2 версии синтаксиса: 
1. При помощи программного кода FoxPro. 
например, может быть такой код:
thisdata=test_.t1 && присваивание ячейке значения поля таблицы
или
thisdata=test_.t1 "; " test_.addr && присваивание ячейке адреса if test_.t1="Бендеры" && Если это город БендЕры - вывести примечание в готовом отчете thiscomment="Бендерам - Привет!" && Текст примечания к ячейке endif
или, в другой ячейке,
thisformula=rowssum() && вычислить сумму по колонке
(причем эта сумма будет ПРАВИЛЬНО собираться в группах и подгруппах!) 
или
thisdata=date()
Значения ячейке задаются с помощью управляющих переменных. 
Управляющие переменные ячейки: 
thisdata - собственно, само значение. Может быть ЛЮБЫМ по типу. 
thiscomment - примечание к ячейке. Текст будет отображен в отчете при наведении мышкой. Должно быть символьным. 
thisformula - назначение ячейке формулы. Должно быть символьным (вид формулы зависит от типа бланка, но обычно с помощью thisformula в основном задается расчет итогов, сумма строк и т.д. по колонкам). 
Управляющие переменные отчета (УЖЕ 2 ШТУКИ): 
viewthisrow - выводить или нет текущую строку при генерации. Должно быть логическим. Можно использовать ТОЛЬКО в 1 служебной колонке! 
maxrowsinlist - указание максимального количества строк на листе 
Плюс - полный контроль над содержимым ячейки - значением, формулой или примечанием. 
Вы не ограничиваетесь функциями, полями или переменными, можно ввести практически ЛЮБОЙ "валидный" (правильный) код FoxPro. 
Минус - медленная генерация, но обычно это проявляется при большом количестве строк. 
2. При помощи задания поля, переменной или функции. 
Например,
&test_.t1
или
&test_.t1 "; " test_.addr
или
&date()
Т.е. если примечание в ячейке начинается с & - предполагается, что значением ячейки может быть поле, переменная или функция. 
Плюс - ОЧЕНЬ БЫСТРАЯ генерация отчета(!!!!) , особенно это видно ПРИ большом количестве строк. 
Минус - можно внести только значение ячейки (но обычно это и надо в 90лучаев!) Т.е. примечания к ячейке или формулу (например сумму) этим способом не внесешь. 
ЕСЛИ ВАС В ЯЧЕЙКЕ ИНТЕРЕСУЕТ ТОЛЬКО ЗНАЧЕНИЕ - ПОЛЬЗУЙТЕСЬ ТОЛЬКО ВТОРЫМ ВАРИАНТОМ СИНТАКСИСА! 
Как это все применяется - можно посмотреть в файле test_lists_ods.ods 
Функции: 
1. rowssum() - вставка формулы суммы по колонке. 
применение:
thisformula=rowssum() && сумма по текущей колонке
Функция применяется ТОЛЬКО В ФОРМУЛЕ для ReportHeader или ReportFooter! И только в 1 синтаксисе. 
2. rowsrecno() - вставка номера строки (правильной № строки, т.к. отчет может содержать многострочный отчет). Возвращает номер как символьную строку. 
применение в 1 синтаксисе:
thisdata=rowsrecno()
или, во 2 синтаксисе - прямо в значение:
&rowsrecno()
Функция применяется ТОЛЬКО в Detail! 
3. rowscount() - вставка суммы количества строк (правильной суммы строк, т.к. отчет может содержать многострочный отчет). Возвращает результат как символьную строку. 
применение в 1 синтаксисе:
thisdata=rowscount() " аб."
или, во 2 синтаксисе - прямо в значение:
&rowscount()
Функция применяется ТОЛЬКО в ReportHeader или ReportFooter! 
4. add_report(бланк, название отчета, параметр1,параметр2 ...параметр10) - генерация зависимого отчета - описание ниже
add_report("blankГород","Город " alltr(test_.t1),test_.t1)
где, 
"blankГород" - имя бланка листа подчиненного отчета 
"Город " alltr(test_.t1) - как будет называться лист в готовом отчете 
test_.t1 - параметр, передаваемый подчиненному отчету (может быть до 10 параметров, через запятую, может быть числовым, символьным, логическим, датой или датой/временем) 
Может размещаться в reportheader, reportfooter и detail - в зависимости от того,что Вы хотите получить. 
Условие включения строки в генерируемый отчет. 
Прописывается ТОЛЬКО в примечании 1 колонки строки, в другом месте будет проигнорировано! - 
Пример включения в отчет строки в зависимости от числа текущей даты:
viewthisrow=iif(day(date())>15,.t.,.f.)
Естественно, нужно создать еще одну строку с прямо противоположным условием:
viewthisrow=iif(day(date())>15,.f.,.t.)
иначе данные просто не будут выведены :-) 
Задание максимального количества строк в листе:
maxrowsinlist=10000
максимум 10000 строк на листе - может применяться ТОЛЬКО в процедуре инициализации (верхняя левая ячейка, после строки Procedure Init)! 
Можно задавать параметры для отчета (до 10 штук, от xmlparam1 до xmlparam10), которые могут анализироваться в процедурах инициализации. 
Например, код инициализации листа "Адреса проживания" файла test_lists_ods.ods определяет, если нужно отобрать проживающих только по определенному городу (при передаче параметра):
procedure Init if vartype(xmlparam1)="C" and not empty(xmlparam1) && Выборка только по параметру select *,LEFT(addr,50) as adr from test where t1=xmlparam1 into cursor test_ order by t1,adr else select *,LEFT(addr,50) as adr from test into cursor test_ order by t1,adr endif
Вот код запуска для применения параметра:
DO m4rg.exe WITH "test_lists_ods.ods","проба test_lists2.ods",0,"Нижний Новгород"
test_lists_ods.ods - бланк отчета 
проба test_lists2.ods - готовый отчет 
0 - параметр вывода - отчет будет открыт на просмотр/изменение 
"Нижний Новгород" - задание значения параметра xmlparam1 - при символьном значении код инициализации выполнит запрос
select *,LEFT(addr,50) as adr from test where t1=xmlparam1 into cursor test_ order by t1,adr
.... и выведет все значения по Нижнему Новгороду. 
Обратите внимание! Процедура инициализации с выбором параметра прописана только в листе "Адреса проживания", соответственно и выборка по городу будет работать только в этом листе (все в Ваших руках).
Генерация зависимых/подчиненных отчетов. 
При формировании текущего отчета можно сформировать связанные (по каким-то параметрам) отчеты с основным. 
Например, в test_lists_ods.ods есть лист "blankГород", который применяется ТОЛЬКО для генерации подчиненного отчета по городу, и делается это при формировании основного отчета "Сальдо". 
blank в имени листа (blankГород) означает, что данный лист сам по себе отчет НЕ формирует, в ОТЛИЧИЕ от других листов. 
Код в примечании к ячейке G3 листа "Сальдо" (запуск генерации подчиненного отчета):
add_report("blankГород","Город " alltr(test_.t1),test_.t1)
где, 
"blankГород" - имя бланка листа подчиненного отчета 
"Город " alltr(test_.t1) - как будет называться лист в готовом отчете 
test_.t1 - параметр, передаваемый подчиненному отчету (может быть до 10 параметров, через запятую, может быть числовым, символьным, логическим, датой или датой/временем) 
Обратите внимание, где размещена команда add_report - в reportheader отчета, т.е. при появлении нового города формируется отчет по этому городу. 
Естественно, команду можно так же размещать в detail - для получения детализированного отчета по текущей строке (при необходимом создании такого отчета). 
Что происходит во время формирования основного отчета? 
add_report НЕ формирует зависимый отчет в момент запуска, команда всего лишь заносит в очередь выполнение данного отчета, и все зависимые отчеты начнуть формироваться ТОЛЬКО после генерации основных. 
Поэтому весь блок инициализации ДОЛЖЕН быть прописан на листе "blankГород" (в том листе,генерация которого вызывалась) 
А именно, в самой верхней левой ячейке листа "blankГород", после Procedure Init следующий код:
procedure Init select * from test where rtrim(t1)==Locxmlparam1 into cursor test_ order by t1,fam
где Locxmlparam1 - первый передаваемый в зависимый отчет параметр (т.е. test_.t1 из представленного примера выше) 
Locxmlparam1 ... Locxmlparam10 - переданные параметры из команды add_report 
Для каждого из листов эти параметры свои, в отличие от глобальных параметров отчета xmlparam1...xmlparam10, которые одинаковы для всех листов.
Сравнение с e_report 
Сначала о минусе... 
Microsoft Office изначально не поддерживает формат ODS.... но Вы можете установить специальное обновление с сайта Microsoft и проблема будет решена! 
Плюсы 
Возможность формирования нескольких листов в отчете (причем, по различным базам) "как есть" - на основе бланка с с включенными в него листами. 
Возможность ввода как любого программного кода FoxPro (1 синтаксис - сложный расчет значения, примечания или формулы) так и переменной, поля или функции (2 синтаксис - только значение) 
До 13 включительно уровней группировки (непонятно, правда зачем СТОЛЬКО может понадобиться, но главное - что такая возможность есть) 
Суммы по текущей колонке, либо по колонкам слева или справа от текущей (смещение задается в функции rowssum() ). 
Все суммы ПРАВИЛЬНО разбиваются по группам и подгруппам (записи НЕ ДУБЛИРУЮТСЯ!) , главное - что-бы в хедерах и футерах по этим колонкам не было числовых значений, КРОМЕ тех, которые генерируются отчетом. 
Возможность получения суммы по колонке не только в футере (как все обычно и привыкли) но и в хедере (группы или отчета). 
Нет ограничения на количество строк отчета в 65535 строк (продолжение - на новом листе) задание своего лимита на каждый лист.
| XML | |
| ODS | |
| ODT | |
| HTML/HTM | |
| Report Builder | 
Что-то интересное
Летучие мыши
Эволюция дуэли
Суд в Средние века
Древнеримский народ
10 мифов о России. Страна глазами английских болельщиков.
Что-то политическое
Россия вмешивается в выборы? Штаты нас спасут!
Польша, Шептицкий, французы братья и СБУ
Повоняют - и забудут
Почему нельзя продавать землю
Слуги Народа. В ожидании налога на воздух?