Для запуска примера кликните 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) - генерация зависимого отчета - описание ниже
где,
"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 листа "Сальдо" (запуск генерации подчиненного отчета):
где,
"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 строк (продолжение - на новом листе) + задание своего лимита на каждый лист.