Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Генерация отчета на основе xml-бланка, созданного в Excel  [new]
maple4
Member

Откуда: Советский Союз :), Москва
Сообщений: 164
Блог
Доброго дня!
Хочу узнать мнение по данной разработке.
Самый новый версия с сайта:
http://www.maple4.ru/a_downloads_for_maple4_ru/maple4_xmlbuilder.zip
(zip-архив, прямая ссылка, ~40Кб)


Что делает представленный пример:
а) считывает данные xml-файла (подготовленного заранее в Excel-е) для получения структуры генерации (причем, без использования специальных объектов для работы с xml)
б) формирует на основе структуры листы-отчеты (если их несколько) в книге, причем каждый лист может формироваться на своей таблице данных (это задается в процедуре инициализации - procedure Init)

Зачем?
Хотелось объединить мощь Excel (по визуальному редактированию и форматированию данных) с foxpro для получения нестандартных (несколько листов в одной книге - что достаточно удобно) и информативных отчетов.

Программа собирает итоги по группам и всего по отчету.

На будущее...
Отработка реакции на ошибки исполнения - сейчас такого нет вообще.
Задание бланка-xml и файла вывода готового отчета в строке запуска.
Решение проблемы с "пустым" отчетом (т.е. если нет данных).
Доступ к изменению имен листов.
Исправление багов и оптимизация программы.


Работа с примером:
1. В zip-архиве находится весь проект.
2. После запуска файла start.prg необходимо выбрать файл-бланк test_lists.xml
3. Программа сформирует xmlnew.xml на осное бланка и разместит его в том же каталоге.
4. Открыть xmlnew.xml в Excel (или, во основном - просто кликнув по нему - Excel должен подхватить его и отобразить в виде обычной таблицы)

***********************************************************

Структура бланка-xml.
Первые 3 колонки - служебные.
После того, как будет сделан xml-бланк отчета, их нужно будет скрыть.
1 колонка - имя строки (можно не указывать, тем более, что пока работа с ним пока не идет)
2 колонка - тип строки отчета (один из 3 вариантов - reportheader,detail,reportfooter)
3 колонка - параметр группировки, для detail можно и нужно не указывать

***********************************************************
Типы строки отчета (их ВСЕГО ТРИ!):
reportheader - заголовок отчета, если НЕ указан параметр группировки, ЛИБО заголовок группы
detail - данные
reportfooter - подвал отчета, если НЕ указан параметр группировки, ЛИБО подвал группы

Так как невозможно проконтролировать правильность ввода группировки пользователем (xml-файл редактируется в Excele или в NotePade), то считается, что
самый первый встреченный параметр - это параметр самого верхнего уровня, второй - следующего и т.д.
Если не указан тип - считается, что это reportheader самого высого уровня.

***********************************************************
Значение в ячейке (само значение, формулу и комментарий) можно задать с помощью специальных переменных.
Текст, в виде процедуры foxpro заносится в комментарий к ячейке, т.е. НЕ В САМУ ЯЧЕЙКУ!
Пример такой процедуры:
thisdata=test_.t1+"; "+test_.addr && присваивание значения
if test_.t1="Бендеры" && условие
thiscomment="Бендерам - Привет!" && занесение комментария к ячейке
endif

Список управляющих переменных:
thiscomment - примечание к ячейке
thiscomment="Примечание"

thisdata - ОСНОВНАЯ переменная, т.к. она определяет значение ячейки.
thisdata=25+formir.a
thisdata="Строка:"+formir.b
При генерации отчета цифровое значение будет переведено в символьное
в виде ltrim(str(thisdata,15,2)), если есть дробное значение, или в
ltrim(str(thisdata)) при целом.
Поэтому, если нужно иное - можно воспользоваться сразу:
thisdata=ltrim(str(25+formir.a,15,4))

thisformula - формула (вида =RC[-3]+RC[-2])
thisformula="RC[-3]+RC[-2]"

thistype - тип ячейки
thistype="String"
thistype="Number"

viewthisrow - участвует ли строка (со всеми ячейками) в формировании отчета, по умолчанию, если пусто - то да
viewthisrow=formir.kat

Функция работы со строками:
rowssum(N) - вставляет в ячейку формулу для получения суммы по колонке, где N-смещение относительно текущей ячейки.
т.е. если этот оператор находится в подвале отчета, то просчитаются все ячейки, относящиеся к данному отчету
если оператор находится в группе (в заголовке группы или в подвале) - просчет по данным, находящимся ТОЛЬКО в данной группе (или подгруппе)

В примере, в test_list.xml во вкладке Сальдо, отчет формируется с группировкой по Городу/Услуге
Соответственно, итоги ТАКЖЕ формируются по этим группам.

Использование - только в типах reportfooter или reportheader (итоговые данные можно разместить и в заголовке группы!).
в примечании к ячейке нужно вписать:
thisformula=rowssum() && сумма по текущей колонке
thisformula=rowssum(-1) && сумма по колонке на одну слева от текущей
thisformula=rowssum(1) && сумма по колонке на одну справа от текущей

ПРимер размещения - вкладка Сальдо в test_list.xml


В прикрепленных файлах - скрины бланка test_lists.xml (с отображенными примечаниями, в которых задаются параметры) и готового отчета, сформированный по бланку.




Не стреляйте в пианиста, он играет как умеет

К сообщению приложен файл. Размер - 0Kb
30 июл 10, 10:16    [9182513]     Ответить | Цитировать Сообщить модератору
 Re: Генерация отчета на основе xml-бланка, созданного в Excel  [new]
Sea_Cat
Member

Откуда: Запорожье
Сообщений: 189
maple4,

Идея вполне здравая. Я (уже не помню сколько лет) для этих целей использую E-Report Евгения Банщикова и вполне им доволен. В нем не хватает разве что многострочных полей Detail, но есть возможность "подхватить" готовый отчет и программно доработать его через Excel.Application.
Единственный существенный недостаток E-Report - его нельзя использовать с Оpen Оffice Calc, а многие заказчики начинают просить использовать именно ОО. Приходится напрямую работать через автоматизации OO Calc без шаблонов и генераторов.
Ваш генератор должен без проблем работать и с Excel, и с OO Calc (XML - он и в Африке XML), поэтому может стать более универсальным продуктом.
Только не понял на скрине, почему Вы не убрали (скрыли) из готового отчета служебные колонки - они будут несколько пугать юзеров.
30 июл 10, 12:26    [9183665]     Ответить | Цитировать Сообщить модератору
 Re: Генерация отчета на основе xml-бланка, созданного в Excel  [new]
maple4
Member

Откуда: Советский Союз :), Москва
Сообщений: 164
Блог
Отчеты можно делать по разному:
Встроенными средствами FoxPro (reportlistener), спец.программами (платными и не очень), использующими формат frx FoxPro, с помощью объекта Excel (генерация на основе бланков xls), формирование в html (я тут, кстати тоже ранее засветился :-) ).

Ну вот, еще один способ - с помощью бланков xml (предварительно созданных в Excel-е).
Самое главное, чего реализовать, наверное, не удастся - так это использование в отчете файлов графики.
В силу того, что сам Excel не сможет такой xml показать.
С другой стороны, КАК ЧАСТО нужно формировать отчет с картинками?
У меня, допустим, такой необходимости нет.

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

Кстати, насчет соответствия - для ячейки адреса выставлено свойство "переносить по словам", поэтому ее высота автоматически меняется в зависимости от содержимого.

В отличие от других отчетов по бланку, данные для ячейки задаются в поле примечания к ней (самое оптимальное поле для редактирования многострочного текста программы FoxPro!).
Доступно изменение значения ячейки, формулы и примечания.
Можно задать множество строк типа detail, reportheader или reportfooter. Кроме того для строки можно задать условие включения в отчет, и, естественно, отчет в зависимости от данных может значительно измениться.
Есть суммирование по колонке (текущей, либо отстоящей слева или справа на какое-то значение). Суммирование ведется только по данным, т.е. ячейки хедеров и футеров в сумму не входят (!!!), и сумма является формулой (а не конечной цифрой!) по данным, размещенным в отчете.
Доступна даже сумма по нескольким колонкам (естественно, кроме ячеек в хедерах).

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

Т.к. xml-бланк создается в Excel, то доступны почти возможности форматирования (если что-то xml не поддерживается - об этом будет сообщено при сохранении).
30 июл 10, 14:52    [9185134]     Ответить | Цитировать Сообщить модератору
 Re: Генерация отчета на основе xml-бланка, созданного в Excel  [new]
maple4
Member

Откуда: Советский Союз :), Москва
Сообщений: 164
Блог
Новая версия программы
Что появилось в данной версии:
Создание отчетов БЕЗ служебных колонок (хотя, сначала было желание просто их скрыть)
Возможность задания имен бланка и готового отчета - примеры запуска чуть ниже.
Возможность вывода сформированного отчета для просмотра/редактирования сразу после генерации на экран
Возможность передачи параметров в отчет.

Возможности:
Создание бланков с помощью Excel (форматирование, использование формул).
Использование кода FoxPro при формировании значений, формул, примечаний (весь код вносится в примечание к ячейке) - в отличие от многих программ, где значением ячейки может являться только функция, переменная или поле!
Многострочные Detail, ReportHeader и ReportFooter с возможностью задания условия выбора при генерации.
Генерация отчета с несколькими листами, с возможностью задания своей уникальной таблицы/курсора для каждого листа (за это отвечает процедура инициализации листа).
Передача дополнительных параметров для генерации отчетов по запросу.
Задание процедур инициализации прямо в бланке делает возможным отказаться от предварительных процедур в Вашей программе, т.е. бланк отчета САМОДОСТАТОЧЕН.

Самая новая версия с сайта:
http://www.maple4.ru/a_downloads_for_maple4_ru/maple4_xmlbuilder.zip - zip-архив проекта, ~42 кб


ПРИМЕР ЗАПУСКА
DO start.prg WITH "test_lists.xml","проба test_lists2.xml",1

где:
"test_lists.xml" - бланк отчета
"проба test_lists2.xml" - готовый отчет
1 - параметр вывода - отчет будет открыт на просмотр/изменение
0-отчет будет только сформирован
1-отчет будет выведен программой просмотра (обычно - Excel) на экран


Можно задавать параметры для отчета (до 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 start.prg WITH "test_lists.xml","проба test_lists2.xml",1,"Нижний Новгород"
test_lists.xml - бланк отчета
проба test_lists2.xml - готовый отчет
1 - параметр вывода - отчет будет открыт на просмотр/изменение
"Нижний Новгород" - задание значения параметра xmlparam1 - при символьном значении код инициализации выполнит запрос
select *,LEFT(addr,50) as adr from test where t1=xmlparam1 into cursor test_ order by t1,adr
.... и выведет все значения по Нижнему Новгороду.
Обратите внимание! Процедура инициализации с выбором параметра прописана только в листе "Адреса проживания", соответственно и выборка по городу будет работать только в этом листе (все в Ваших руках).

МОЖНО сформировать app и запускать его
DO xmlbuilder.app WITH "test_lists.xml","test.xml",1

СОЗДАВ exe-файл, и прикрепив к нему ярлык,
можно в строке Объект прописать что-то типа:
C:\xmlbuilder\xmlbuilder.exe "test_lists.xml" "otcet.xml" "1"
в этом случае при запуске отчет будет сформирован и тут-же показан на экране

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

РЕКОМЕНДУЮ сразу создать app или exe файл из проекта! После чего, наличие прочих файлов (естественно) необязательно.

Хотелось бы узнать мнения о примере (желательно - только после его опробования). Как и пожелания о дальнейшем развитии - что бы знать, куда двигаться.

P.S.
Возможно, понравятся следующие проекты:
Maple4 Site Creator - создание и ВЕДЕНИЕ сайта на HTML без использования PHP и ASP (off-line CMS)
http://www.maple4.ru/

Maple4 Style Creator - создание стиля из шаблона для использования в Maple4 Site Creator
http://www.maple4.ru/i_objects_create_style.htm
(более 100 стилей на странице http://www.maple4.ru/i_all_styles.htm созданы именно этой программой. Стили устанавливаются в один клик в любой момент редактирования проекта сайта).

Maple4 Report Builder - создание отчетов в виде файлов HTML со всей используемой графикой.
http://www.maple4.ru/rb/

Все три программы идут в одном пакете, загрузка со страницы
http://www.maple4.ru/i_downloads.htm
там же - дополнительные примочки (обратите внимание на стили в виде zip-архивов - от 20 до 30 штук в одном архиве)
Все представленные программы написаны на FoxPro и распространяются без ограничений (оплаты, регистрации и т.д.)

FoxPro forever! Ну, или хотя бы до 2015...

К сообщению приложен файл. Размер - 0Kb
4 авг 10, 10:54    [9205630]     Ответить | Цитировать Сообщить модератору
 Re: Генерация отчета на основе xml-бланка, созданного в Excel  [new]
Dag
Member

Откуда:
Сообщений: 842
Не могли бы Вы в 2х словах пояснить принцип работы вашей программы Maple4 Site Creator.
Каково ее назначение? Просто формирование набора статичных html-файлов?
Или возможно создание динамических страниц, когда есть возможность
выполнять скрипты, написанные на FoxPro, подобно тому как это делается на php.
На Ваш сайт зашел, но за общим многословием, этого понять не смог.
4 авг 10, 12:09    [9206352]     Ответить | Цитировать Сообщить модератору
 Re: Генерация отчета на основе xml-бланка, созданного в Excel  [new]
maple4
Member

Откуда: Советский Союз :), Москва
Сообщений: 164
Блог
Maple4 Site Creator - создание и ВЕДЕНИЕ сайта на HTML (из предыдущего поста)
Программа на основе бланков (их можно сменить в любой момент) и содержимого создает статичные html-страницы
Без использования серверных технологий
Для размещения сайта на хостингах по минимальной цене, либо вообще на бесплатных, например, на narod.ru


Назначение:
1. Создание и сопровождение сайтов-визиток или средних (по объему) сайтов БЕЗ частого обновления.
2. Электронная записная книжка (на локальном компьютере)
3. Создание сложных отчетов в html

Для внедрения в статичные html-страницы можно (это не обязательно) применять FoxPro-код
Пример на http://www.maple4.ru/i_teoria.htm

Архив программы:
http://www.maple4.ru/a_downloads_for_maple4_ru/maple4_ru.zip
4 авг 10, 12:33    [9206616]     Ответить | Цитировать Сообщить модератору
 Re: Генерация отчета на основе xml-бланка, созданного в Excel  [new]
Sea_Cat
Member

Откуда: Запорожье
Сообщений: 189
maple4,

Попробовал сделать реальный отчет. В принципе, все работает. Укажу, чего не хватает для нормальной реализации отчетов.

1. Нужен PageHeader (а желательно - и PageFooter) а не только ReportHeader. В Excel это легко реализуется.

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

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

4. Нужна возможность явного задания приложения, которым открывается отчет (у меня его открыл XMLEditor).

5. Генератор желательно оформить в виде класса - это сделает работу с ним более безопасной.

Ну и если будут средства для адресации между листами формируемой книги - это будет очень ценная фича.

Успехов !
6 авг 10, 15:14    [9224239]     Ответить | Цитировать Сообщить модератору
 Re: Генерация отчета на основе xml-бланка, созданного в Excel  [new]
maple4
Member

Откуда: Советский Союз :), Москва
Сообщений: 164
Блог
Sea_Cat,

Критика и пожелания - двигатель прогресса :-)

1. Нужен PageHeader (а желательно - и PageFooter) а не только ReportHeader. В Excel это легко реализуется.
Если в колонке группировки (3 служебная колонка) НЕ ВНЕСЕНО значение группировки, предполагается, что это:
либо Хедер отчета (при значении ReportHeader во 2 служебной колонке),
либо Футер отчета (при значении ReportFooter во 2 служебной колонке).
Т.е. возможность вывода заголовка отчета или подвала есть, но реализуется это с помощью стандартных ReportHeader и ReportFooter без задания значения группировки.

2. Отчеты в Excel обычно используются в тех случаях, когда нужен документ с переменным и не известным заранее числом колонок (т.н. перекрестные отчеты). Excel в этом случае незаменим для удобной распечатки этих "простыней". Нужен встроенный механизм типа кросс-табуляции, динамического формирования колонок и подсчета сумм по горизонтали.
Кросстабуляцию достаточно сложно сделать (хотя, в принципе, понятно как :-) )...

3. Нужна возможность задания в шаблоне форматирования отдельных ячеек (фонт, выравнивание текста, тип - особенно это критично для полей типа DATE), и листа (размеры листа. ориентация, поля, ограничения по числу листов по ширине и т.п.)
Для каждой ячейки бланка отчета это сделать можно - средствами Excel. Так же - с настройками для каждого листа (рекомендую перед этим СКРЫТЬ служебные колонки).
А вот условное форматирование - уже в процессе генерации - такое можно сообразить, создав несколько detail,PageHeader,PageFooter и в зависимости от условия (оно прописывается ТОЛЬКО в примечании 1 колонки, в другом месте будет проигнорировано! - пример ниже) - будет вставлена та, или иная строка.

viewthisrow=iif(day(date())>15,.t.,.f.)
т.е. в зависимости от числа текущей даты данная строка будет сгенерена в отчете (>15), либо нет.
И тогда нужно делать вторую строку, с другим условием (иначе строка за этот день не попадет в отчет):
viewthisrow=iif(day(date())>15,.f.,.t.)

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

4. Нужна возможность явного задания приложения, которым открывается отчет (у меня его открыл XMLEditor).
Сделал в новой версии :-) - запуск вида:
а) DO start.prg WITH "test_lists.xml","проба test_lists2.xml",1
открытие в Excel (естественно, Excel должен быть установлен)

б) DO start.prg WITH "test_lists.xml","проба test_lists2.xml",2
открытие в той программе, с которой xml ассоциирован.
Второй вариант - быстрее.

5. Генератор желательно оформить в виде класса - это сделает работу с ним более безопасной.
Пока можно сделать app (или exe) из проекта и применять его.
DO maple4_xmlbuilder.app WITH "test_lists.xml","проба test_lists2.xml",1
или
DO maple4_xmlbuilder.exe WITH "test_lists.xml","проба test_lists2.xml",2
На будущее - да, конечно, в который раз переработав код :-)

Ну и если будут средства для адресации между листами формируемой книги - это будет очень ценная фича.
Есть встречный вариант - формирование зависимых листов "на лету" (причем, реализуется это достаточно просто :-)).
Т.е., например, при формировании ТЕКУЩЕГО листа отчета, можно БУДЕТ запустить формирование ЗАВИСИМОГО (по какому-то критерия) от него листа на основе другого бланка, и этот лист будет добавлен в текущую книгу (возможно - и не один).
В общем, если будет интерес... можно заняться именно таким вариантом :-)


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

Новая версия программы (глобальные изменения):
Более быстрая (на порядок!) генерация за счет двойного варианта синтаксиса (можно задавать значения по другому) и ПЕРЕРАБОТАННОГО движка обработки итогов и генерации + измененная сумма подсчета по колонке (решение проблемы слишком длинной формулы) + функции расчета количества строк и номера строки.

Есть 2 версии синтаксиса внесения кода:
1. При помощи программного многострочного кода FoxPro.
например, может быть такой код:

thisdata=test_.t1 && присваивание ячейке значения поля таблицы

или

thisdata=test_.t1+"; "+test_.addr && присваивание ячейке значения поля
if test_.t1="Бендеры" && Если это город БендЕры - вывести примечание в готовом отчете
thiscomment="Бендерам - Привет!" && Текст примечания к ячейке в готовом отчете
endif

или, в другой ячейке,
thisformula=rowssum() && вычислить сумму по колонке (причем эта сумма будет ПРАВИЛЬНО собираться в группах и подгруппах!)

или
thisdata=date()

Значения ячейке задаются с помощью управляющих переменных.
Управляющие переменные ячейки:
thisdata - собственно, само значение. Может быть ЛЮБЫМ по типу.
thiscomment - примечание к ячейке. Текст будет отображен в отчете при наведении мышкой. Должно быть символьным.
thisformula - назначение ячейке формулы. Должно быть символьным.
Управляющие переменные отчета (пока одна):
viewthisrow - выводить ли текущую строку при генерации. Должно быть логическим.

Плюс - полный контроль над содержимым ячейки - значением, формулой или примечанием.
Вы не ограничиваетесь функциями, полями или переменными, можно ввести практически ЛЮБОЙ "валидный" (правильный) код FoxPro.
Минус - НЕсколько медленная генерация, но обычно это проявляется ТОЛЬКО при ОЧЕНЬ большом количестве строк.

2. При помощи задания поля, переменной или функции.
Например,

&test_.t1
или

&test_.t1+"; "+test_.addr
или

&date()
Т.е. ЕСЛИ примечание в ячейке начинается с & - предполагается, что значением ячейки может быть поле, переменная или функция (и далее идет, соответственно текст поля, переменной или функции до конца примечания).

Плюс - ОЧЕНЬ БЫСТРАЯ генерация отчета(!!!!) , особенно это видно ПРИ большом количестве строк.
Минус - можно внести только значение ячейки (но обычно это и надо в 90% случаев!) Т.е. примечания к ячейке или формулу (например сумму по колонке) этим способом не внесешь.
ЕСЛИ ВАС В ЯЧЕЙКЕ ИНТЕРЕСУЕТ ТОЛЬКО ЗНАЧЕНИЕ - ПОЛЬЗУЙТЕСЬ ТОЛЬКО ВТОРЫМ ВАРИАНТОМ!

Функции:
1. rowssum() - вставка формулы суммы по колонке.
применение:
thisformula=rowssum() && сумма по текущей колонке
Функция применяется ТОЛЬКО В ФОРМУЛЕ для ReportHeader или ReportFooter! И только в 1 синтаксисе.

2. rowsrecno() - вставка номера строки (правильной № строки, т.к. отчет может содержать многострочный отчет). Возвращает номер как символьную строку.
применение в 1 синтаксисе:
thisdata=rowsrecno()

или, во 2 синтаксисе - прямо в значение:
&rowsrecno()
Функция применяется ТОЛЬКО в Detail!

rowscount() - вставка суммы количества строк (правильной суммы строк, т.к. отчет может содержать многострочный отчет). Возвращает результат как символьную строку.

применение в 1 синтаксисе:
thisdata=rowscount()+" аб."

или, во 2 синтаксисе - прямо в значение:
&rowscount()
Функция применяется ТОЛЬКО в ReportHeader или ReportFooter!

Как это все применяется - можно посмотреть в файле test_lists.xml (задание значений, формул, форматирование отчета и т.д.)
В файле readme.txt - краткое описание.

ICQ: 226-071-270 (ответы и помощь в режиме online :-) , при возможности)
Самая новая версия с сайта:
http://www.maple4.ru/a_downloads_for_maple4_ru/maple4_xmlbuilder.zip (около 50кб)
maple4@maple4.ru
Страница проекта в Интернете: http://www.maple4.ru/xmlbuilder.htm
Крошкин Игорь

P.S.

Сравнение с e_report - ну с кем-то же надо сравнить :-)
Сначала о минусах...
Несколько больший размер получаемого файла (вообще, стандарт xml-более текстовый, что ли :-) ).
НЕВОЗМОЖНОСТЬ внедрения картинок в сгенеренный файл (точнее, невозможность отображения такого файла самим Excel-ем).

Плюсы
Возможность формирования нескольких листов в отчете (причем, по различным базам) "как есть" - на основе бланка с с включенными в него листами.
Возможность ввода как любого программного кода FoxPro (1 синтаксис - сложный расчет значения, примечания или формулы) так и переменной, поля или функции (2 синтаксис - только значение)
До 13 включительно уровней группировки (непонятно, правда зачем СТОЛЬКО может понадобиться, но главное - что такая возможность есть)
Суммы по текущей колонке, либо по колонкам слева или справа от текущей (смещение задается в функции rowssum() ).
Все суммы ПРАВИЛЬНО разбиваются по группам и подгруппам (записи НЕ ДУБЛИРУЮТСЯ!) , главное - что-бы в хедерах и футерах по этим колонкам не было числовых значений, КРОМЕ тех, которые генерируются отчетом.
Возможность получения суммы по колонке не только в футере (как все обычно и привыкли) но и в хедере (группы или отчета).
Многострочные pageheader,pagefooter или detail с условием включения в отчет.
"Правильные" номер строк и сумма строк по группам и подгруппам.
10 авг 10, 11:18    [9238817]     Ответить | Цитировать Сообщить модератору
 Re: Генерация отчета на основе xml-бланка, созданного в Excel  [new]
Sea_Cat
Member

Откуда: Запорожье
Сообщений: 189
maple4,

По п.1 - похоже мы не поняли друг друга. ReportHeader - это то. что печатается один раз в начале отчета, а PageHeader - должен печататься на каждой странице - это "шапка" таблицы, ее то и не хватает.

По п.4 - документы с типом XML обычно ассоциируются с каким -либо XML-редактором, а нужно, чтобы сформированный документ открыл не Excel, а Open Office Cacl - без изменения ассоциаций Windows.

И вот какая еще крамольная мысль возникает. Может, стоит работать не XML-шаблонами, а перейти сразу к шаблонам в ODF формате? Ведь ODF - это ZIP-архив с теми же XML документами, только тут уже доступны все нюансы оформления документа - хоть картинки, хоть диаграммы вставляй. Все оффисы, начиная с 2007, отлично работают с ним, а для ОО - это основной формат. А XML-представление таблицы - это, имхо, промежуточный и тупиковый вариант - как и RTF формат. К тому же ODF хорошо документирован и принят стандартом ISO (ISO/IEC 26300). Может стоит над этим подумать ?
10 авг 10, 15:12    [9241104]     Ответить | Цитировать Сообщить модератору
 Re: Генерация отчета на основе xml-бланка, созданного в Excel  [new]
maple4
Member

Откуда: Советский Союз :), Москва
Сообщений: 164
Блог
Sea_Cat,

По поводу открытия в другой программе
Самый простейший вариант решения "в лоб" - например, для открытия в notepad-е
в процедуре report_show.prg дописать следующий код :
........
DO CASE
CASE type_show=1
ShellExecute(0, "", "excel.exe", nazv_file__, "", 1)

CASE type_show=2
mkod=shellexecute(0, "edit", nazv_file__, NULL, nazv_dir__, 1)

**** открытие в notepad.exe****
CASE type_show=3
ShellExecute(0, "", "notepad.exe", nazv_file__, "", 1)

OTHERWISE
ENDCASE

И, далее, для открытия xml-файла в программе notepad.exe пользоваться строкой запуска:
DO start.prg WITH "test_lists.xml","проба test_lists2.xml",3

По формату ODF - интересный вариант, требующий, правда некоторых затрат времени и сил...
Буду думать.
10 авг 10, 16:23    [9241771]     Ответить | Цитировать Сообщить модератору
 Re: Генерация отчета на основе xml-бланка, созданного в Excel  [new]
maple4
Member

Откуда: Советский Союз :), Москва
Сообщений: 164
Блог
В новой версии программы:

Снято ограничение 65535 строк отчета! Теперь, при превышении, он продолжается в том же отчете на новом листе.
Если, допустим, лист назывался "Сальдо", при большем количестве строк, появится новый лист - Сальдо_001, и далее, Сальдо_002 и т.д.

Можно управлять максимальным количеством (в разумном пределе) строк для конкретного листа.
Делается это при помощи специальной управляющей переменной:
MaxRowsInList=10000 && ограничение на 10000 строк в листе
Задать значение можно только в процедуре инициализации (Procedure Init, верхня левая ячейка листа)!

НО нужно понимать, что это количество НЕ ЯВЛЯЕТСЯ СТРОГИМ!
И если, вместо 10000 строк на листе 10003 строки - это НЕ ошибка, это особенность алгоритма.
Дело в том что многострочные Detail, ReportHeader и ReportFooter могут в себе содержать формулы, КОТОРЫЕ просто НЕЛЬЗЯ переносить на следующий лист (например, ссылаются на ячейку снизу или сверху).

Пример деления по строкам - лист "Сальдо с делением" в test_lists.xml


Разбитие на листы НЕ ВЛИЯЕТ НА ИТОГИ по группам и подгруппам!

ИЗМЕНЕНЫ параметры запуска программы:

DO start.prg WITH "test_lists.xml","проба test_lists2.xml",0
где "test_lists.xml" - имя бланка
"проба test_lists2.xml" - имя готового отчета
0 - параметр вывода готового отчета:
0-сформировать и вывести программой по умолчанию (это может быть и не Excel! ОБРАТИТЕ НА ЭТО ВНИМАНИЕ!)
1-не выводить отчет на экран
2-вывести сформированный отчет Excel-ем (должен быть установлен)

При необходимости - можно добавить нужную ВАМ программу открытия. Как - было рассказано ранее.

Самая новая версия программы (zip-архив исходников, ~40 кб):
http://www.maple4.ru/a_downloads_for_maple4_ru/maple4_xmlbuilder.zip
13 авг 10, 09:31    [9257728]     Ответить | Цитировать Сообщить модератору
 Re: Генерация отчета на основе xml-бланка, созданного в Excel  [new]
malnevit
Member [заблокирован]

Откуда: -
Сообщений: 145
Как все сложно. Ну нипец. И сложно не тебе, а тому, кто всю эту "гуантаму" будет тянуть. Генераторы они пишут .. велосепидисты. Ну возьми ты F1 (TTF16.ocx ) из абудь о своих проблемах.
13 авг 10, 10:14    [9258056]     Ответить | Цитировать Сообщить модератору
 Re: Генерация отчета на основе xml-бланка, созданного в Excel  [new]
maple4
Member

Откуда: Советский Союз :), Москва
Сообщений: 164
Блог
malnevit,

Да в чем сложность то?
Полный контроль над содержимым (+ prg.код FoxPro прямо в ячейках)
Простое редактирование бланка-xm в Excel
Самодостаточность - попробуйте создать exe-файл с ярлык на него с параметрами ( дописав "test_lists.xml" "otcet.xml" в конце строки Объект)
C:\xmlbuilder\maple4_xmlbuilder.exe "test_lists.xml" "otcet.xml"
а потом кликнуть по нему
13 авг 10, 10:28    [9258185]     Ответить | Цитировать Сообщить модератору
 Re: Генерация отчета на основе xml-бланка, созданного в Excel  [new]
maple4
Member

Откуда: Советский Союз :), Москва
Сообщений: 164
Блог
Новая версия программы:
Добавилась генерация подчиненных отчетов

В примере:
Формируются дополнительные листы вида "Город Воркута","Город Нижний Новгород" и т.д. со списком абонентов по городу.

При формировании текущего отчета можно сформировать связанные (по каким-то параметрам) отчеты с основным.
Например, в 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, которые одинаковы для всех листов.



Нюансы:
Есть ограничения Excel на длину заголовка листа и символов в заголовке.
Есть ограничения на количество листов в отчете.

Если зависимый отчет превысит количество допустимых строк (65000 по умолчанию), то он продолжится на новом листе автоматически.

****************************************************

По моему, из xml выжал все, что мог :)
Самое основное : снятие ограничения в 655635 строк (продолжение на новых листах), зависимые отчеты (формирование листов на основе данных другого листа), полная поддержка кода FoxPro и многое, многое другое (описанное ранее).

Хотелось бы разработать примерно такую же программу для формирования отчетов из файлов xlsx (Open XML от Microsoft) или ODF.
До сих пор стою на перепутье - что выбрать.
Поддерживает ли Microsoft Office ODF (точнее, степень поддержки)? И обратно, как поддерживается xlsx остальными производителями? Какие есть подводные камни каждого из форматов и т.д.?
Хотелось бы "правильной" загрузки xml файлов, поддержки рисунков, в общем, всего, что может предложить каждый из офисов.

НО!
Часов в дне всего 24, если заниматься всем - просто не хватит времени :) .

Большая просьба - давать советы и пожелания ТОЛЬКО после опробования программы (посты вида "изобретения велосипеда", "есть же другие решения", реклама платных библиотек - в топку :) )
В дистрибутиве - исходники в prg-файлах (~ 40 Кб).

http://www.maple4.ru/a_downloads_for_maple4_ru/maple4_xmlbuilder.zip

Считаю, что до сих пор в FoxPro нет (и уже, наверное, официально не будет - проблема 2015) нормального инструмента работы с отчетами. ReportListener - половинчатое решение, требующее непозволительно много времени на разработку при малой отдаче (это личное мнение).
Так почему бы не сделать такой инструмент самим?

P.S.
Поменял в листе "Сальдо с делением" ограничение количества строк на лист вместо 11 на 10000 (есть случаи, когда для проверки скорости обработки данные заносились прямо в тестовую таблицу test.dbf, поэтому, например, при 80000 строк отчета программа формировала 7272 листа - семь тысяч двести семьдесят два листа - что конечно же правильно, только сам Excel, по моему, с этим не справится :-) )

автор
MaxRowsInList=10000 && при 80000 строк - всего 8 листов

поэтому, если хотите увидеть прежнее деление по 11 строк - измените строку на
MaxRowsInList=11
18 авг 10, 09:43    [9280168]     Ответить | Цитировать Сообщить модератору
 Re: Генерация отчета на основе xml-бланка, созданного в Excel  [new]
Sea_Cat
Member

Откуда: Запорожье
Сообщений: 189
maple4,

Что касается ODF, то c ним все ясно - это стандарт ISO и его обязаны придерживаться разработчики. Поддержка его реализована MS Office начиная с версии 2007. Формат же описания электронных таблиц в XML не документирован и MS может в любой момент изменить его, не с кем не согласовывая, что чревато последствиями для тех, кто его использует.
Что касается ограничений в 65000 строк - не думаю, что это большая проблема. Формирование отчетов такого объема (более 700 страниц) свидетельствует о неправильной постановке задачи - нельзя "вываливать" человеку такой объем неструктурированных данных, он не в состоянии их воспринять. Тут нужно не разбивать отчет на части, а строить иерархию отчетов, для чего и пригодятся подчиненные отчеты.
18 авг 10, 12:30    [9281581]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить