steklogalion.ru
Архитектурное и интерьерное стекло. Изготовление изделий из стекла
steklogalion.ru
bestmixer
bestmixer.biz

XML 
ODS 
ODT 
HTML/HTM 
Report Builder 


Что-то интересное

Чингисхан

Однажды на выборах в США...

Чернобыль и Фукусима - атомные катастрофы простым языком

Гиппократ и Гиппократовский корпус

Топ-5 мифов о ВИЧ. Ученые против мифов

Все интересное



Что-то политическое

Европа высосет Россию Северным потоком

Достойный ответ Александра Усика на провокационные вопросы со стороны журналистов

Петро Алексеевич опять нас всех спас

Атака на телемост. Зачем на самом деле кошмарят NewsOne

"Обмен" состоялся, заложники Порошенка на свободе. Зеленский идет к миру

Все о политике

Maple4 Site Creator\Еще\Maple4 Report Generator - генерация отчетов в Open Office и Excel\

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 строк (продолжение - на новом листе) задание своего лимита на каждый лист.

create by Maple4 Site Creator 8/2019

Яндекс.Метрика Рейтинг@Mail.ru