XML


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



Для запуска примера кликните m4rg.exe, программа выведет форму для выбора бланка ( ODS, XML,ODT, HTML/HTM), после чего сформированный отчет будет тут-же показан на экране.

ПРИМЕР ЗАПУСКА на основе бланка XML

DO m4rg.exe WITH "test_lists.xml","проба test_lists2.xml",0

 



Создание отчетов на основе бланков XML.

Код прописывается ТОЛЬКО в примечании именно к ячейке!

Есть 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.xml

Функции:
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.xml определяет, если нужно отобрать проживающих только по определенному городу (при передаче параметра):

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.xml","проба test_lists2.xml",0,"Нижний Новгород"


test_lists.xml - бланк отчета
проба test_lists2.xml - готовый отчет
0 - параметр вывода - отчет будет открыт на просмотр/изменение
"Нижний Новгород" - задание значения параметра xmlparam1 - при символьном значении код инициализации выполнит запрос

select *,LEFT(addr,50) as adr from test where t1=xmlparam1  into cursor test_ order by t1,adr


.... и выведет все значения по Нижнему Новгороду.
Обратите внимание! Процедура инициализации с выбором параметра прописана только в листе "Адреса проживания", соответственно и выборка по городу будет работать только в этом листе (все в Ваших руках).




Генерация зависимых/подчиненных отчетов.
При формировании текущего отчета можно сформировать связанные (по каким-то параметрам) отчеты с основным.
Например, в test_lists.xml есть лист "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
Сначала о минусах...
Размер получаемого файла несколько великоват (что поделать, чистый текст все таки).
XML Excel 2003 не поддерживает графику.

Плюсы
Возможность формирования нескольких листов в отчете (причем, по различным базам) "как есть" - на основе бланка с с включенными в него листами.
Возможность ввода как любого программного кода FoxPro (1 синтаксис - сложный расчет значения, примечания или формулы) так и переменной, поля или функции (2 синтаксис - только значение)
До 13 включительно уровней группировки (непонятно, правда зачем СТОЛЬКО может понадобиться, но главное - что такая возможность есть)
Суммы по текущей колонке, либо по колонкам слева или справа от текущей (смещение задается в функции rowssum() ).
Все суммы ПРАВИЛЬНО разбиваются по группам и подгруппам (записи НЕ ДУБЛИРУЮТСЯ!) , главное - что-бы в хедерах и футерах по этим колонкам не было числовых значений, КРОМЕ тех, которые генерируются отчетом.
Возможность получения суммы по колонке не только в футере (как все обычно и привыкли) но и в хедере (группы или отчета).
Нет ограничения на количество строк отчета в 65535 строк (продолжение - на новом листе) задание своего лимита на каждый лист.



 Контакты   Поиск   Карта сайта 

create by Maple4 Site Creator 9/2021
Яндекс.Метрика