Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Работа с MS Excel  [new]
faustgreen
Member

Откуда:
Сообщений: 507
Поделитесь, как вы формируете отчеты в Excel ?

В моем представлении формирование отчета разбито на 2 части?:
1) Нарисовать шаблон отчета (Шапка отчета, строка данных, строка итогов, подвал, ...).
2) Получить в FoxPro данные для вывода и используя шаблон сформировать отчет.

Сейчас при формировании отчета я просто копирую области шаблона на лист отчета, и вставляю нужные данные (+ добавляется различное форматирование при необходимости). Все это дело жестко привязано к адресам областей и ячеек. Например, где то в отчете:
1) скопировать область R1:R3 (1-3 строка) из шаблона и вставить в отчет (в отчете это допустим будут строки 5-6).
2) затем я в эти скопированные строки вставляю значения, cell(R5:C4) = "2021.12.12" ...

Сейчас думаю как сделать, что то наподобие следующего:
1) Отчет = лист отчета.
2) ОбластьШапка = Шаблон.получитьОбласть("Шапка").
3) ОбластьШапка.Параметры.ИмяОтчета = "Отчет по приходу товара"
4) ОбластьШапка.Параметры.ДатаОтчета = "2021.12.12"
5) Отчет.вывести.ОбластьШапка.
6) ...

Приветствуются любые идеи или примеры кода ....

Сообщение было отредактировано: 26 окт 21, 10:47
26 окт 21, 10:38    [22388199]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
faustgreen
Member

Откуда:
Сообщений: 507
Хотелось бы разделить работу на две части:
1) Дизайн отчета.
2) Наполнение отчета данными.

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

Т.е. как реализовать паттерн MVC при выводе данных foxpro в Excel?

Сообщение было отредактировано: 26 окт 21, 10:43
26 окт 21, 10:42    [22388202]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
PaulWist
Member

Откуда:
Сообщений: 2300
faustgreen,

Поищите eReport от Жени Банщикова, если его использовать, то достаточно будет в шаблоне определить поля для вывода, для 99% отчетов подойдёт.
26 окт 21, 10:54    [22388209]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1595
faustgreen,
вариантов несколько.

Вот два варианта без использования Excel для формирования файла:
(подозрительная ссылка!) https://github.com/s-s-a/XLSX-Workbook-Class
(подозрительная ссылка!) https://github.com/s-s-a/Advanced-RTF-Report
26 окт 21, 11:29    [22388229]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
faustgreen
Member

Откуда:
Сообщений: 507
Спасибо за инфу!
26 окт 21, 13:39    [22388330]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
faustgreen
Member

Откуда:
Сообщений: 507
На рисунке приведен шаблон, на основании которого делается отчет.
Из шаблона на рабочий лист копируются области, затем в определенные точки области подставляются данные.

Я для себя задал формат переменной в шаблоне: {!variable}
С помощью команды replace пытаюсь подменять эти значения

XLRange1 = XLApp.Range(L1_DETAIL)
VAR_GPART_PRICE = "{!gpart_price}"
XLRange1.replace(VAR_GPART_PRICE, lnGPartPrice)


Значение переменной lnGPartPrice = 8.5 (значение поля курсора, N(10,2))

Текстовые переменные заменяются норм, пробемы возникают с числами.
Все ячейки шаблона куда подставляются числа имеют формат числовой с двумя знаками после запятой.
Так некоторые значения выводятся с разделителем "." - точка, некоторые с разделителем "," - запятая.
А некоторые, как в приведенном выше примере, вообще конвертятся в другое число.

К сообщению приложен файл. Размер - 147Kb
1 ноя 21, 14:05    [22390984]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
faustgreen
Member

Откуда:
Сообщений: 507
Результат:

К сообщению приложен файл. Размер - 112Kb
1 ноя 21, 14:06    [22390985]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
faustgreen
Member

Откуда:
Сообщений: 507
Можно ли как то задать формат конвертации данных FoxPro в данные Excel?

Пробовал писать так:
XLRange1 = XLApp.Range(L1_DETAIL)
VAR_GPART_PRICE = "{!gpart_price}"
XLRange1.replace(VAR_GPART_PRICE, "8.5")

и так
XLRange1 = XLApp.Range(L1_DETAIL)
VAR_GPART_PRICE = "{!gpart_price}"
XLRange1.replace(VAR_GPART_PRICE, "8,5")

В первом случае результат такой же.
Во втором случае выводится норм - 8,50

Сообщение было отредактировано: 1 ноя 21, 14:15
1 ноя 21, 14:08    [22390986]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1595
faustgreen
Можно ли как то задать формат конвертации данных FoxPro в данные Excel?
Можно задать оформление числовых данных для каждой ячейки.
1 ноя 21, 14:14    [22390988]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
faustgreen
Member

Откуда:
Сообщений: 507
Sergey Sizov, в Excel? И в шаблоне и на итоговом листе у меня все ячейки одинакового формата - числовой с двумя знаками после запятой.
Только вот почему одни данные выводятся, например, с точкой, другие с запятой, а третьи вообще меняют значение ?
1 ноя 21, 14:18    [22390990]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
faustgreen
Member

Откуда:
Сообщений: 507
У меня получается в шаблоне формат ячейки числовой с двумя знаками после запятой, но в самой ячейке стоит строковое значение - {!gpart_price}. Я потом эту область копирую на рабочий лист, и через команду замены, пытаюсь вставить значение. Получается не очень. Через XLSheet.Cells(20, 34).Value = lnGPartPrice все выводится ок.
1 ноя 21, 14:23    [22390994]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1595
faustgreen
Sergey Sizov, в Excel?
Ну а где ж ещё то?
И в шаблоне и на итоговом листе у меня все ячейки одинакового формата - числовой с двумя знаками после запятой.
Только вот почему одни данные выводятся, например, с точкой, другие с запятой, а третьи вообще меняют значение ?
Потому что данные туда надо правильно писать. И не вставлять строку в в ячейку для числа.
1 ноя 21, 16:17    [22391068]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1595
faustgreen
У меня получается в шаблоне формат ячейки числовой с двумя знаками после запятой, но в самой ячейке стоит строковое значение - {!gpart_price}.
Вот и я про то же. Пишем одно, подразумеваем другое, а надеемся на третье.
Я потом эту область копирую на рабочий лист, и через команду замены, пытаюсь вставить значение. Получается не очень. Через XLSheet.Cells(20, 34).Value = lnGPartPrice все выводится ок.
Разумеется. Число в число = нормальное число.
1 ноя 21, 16:19    [22391072]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
faustgreen
Member

Откуда:
Сообщений: 507
Sergey Sizov, если так, то все хреново (.
У меня цель была расставить в шаблоне маяки: {! variable }, а потом их заменять в коде. Как и писал выше:
Range.replace("{! variable }", значение)

При такой системе у меня код не менялся бы после редактирования шаблона, а так, допустим у меня стоит
...cells(10,20) = значение)

, потом я добавляю колонку в начало шаблона, и мне нужно лезть в код и менять на
...cells(10, 21) = значение)


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

Вобщем буду думать ...
1 ноя 21, 16:51    [22391097]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1595
faustgreen
Sergey Sizov, если так, то все хреново (.
У меня цель была расставить в шаблоне маяки: {! variable }, а потом их заменять в коде.
Ну так не пихай в такие маяки числа, а строки. Которые сам и формируй из своих чисел с нужными разделителями т.д. Функцию Transform() знаешь?
1 ноя 21, 16:56    [22391100]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
faustgreen
Member

Откуда:
Сообщений: 507
Sergey Sizov,
Так работает
SET POINT TO ','
XLRange1.replace(VAR_GPART_PRICE, TRANSFORM(lnGPartPrice, '9999999.99')) 

, но если придется поменять число знаков после запятой, опять же в код лезть нужно...

Ну да ладно, пока остановлюсь на этом варианте. Спасибо!
1 ноя 21, 17:23    [22391111]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7919
faustgreen
На рисунке приведен шаблон, на основании которого делается отчет.
Из шаблона на рабочий лист копируются области, затем в определенные точки области подставляются данные.


Сделайте наоборот

1. В одну строку шаблона (заранее отформатированный) вставляются данные
2. Затем эта заполненная строка шаблона копируется в нужное место рабочего листа. Со всем форматированием

В этом случае нужные ячейки можно идентифицировать по адресам ("A1") или указать имя ячейки. Нет необходимости делать replace. Вы же будете обращаться к ячейкам шаблона, а он структуру не меняет.

Единственный недостаток, придется каждый раз заполнять все поля строки шаблона даже если там пустые значения. Чтобы затереть результат заполнения предыдущей строки.
3 ноя 21, 11:04    [22391536]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
faustgreen
Member

Откуда:
Сообщений: 507
ВладимирМ, думал над этим вариантом. Из минусов:
1) . То, что вы и написали, нужно заполнять все поля, чтобы затирать старые значения. Есть опасность, что значение для одной строки перекочует в другую строку и останется не замеченным - по факту в отчете будут данные, но неверные. В моем же случае, если я забуду вставить значение, то вместо него останется маяк - {!Variable} и пользователь быстро заметит ошибку.
2). Конкретная адресация - это то, от чего я хотел уйти (когда мы для вставки значения в ячейку точно определяем ее значение в коде (номер строки, номер столюца)).

У меня ситуация такая:
После разработки отчета от пользователей периодически поступают запросы на изменение шаблона отчета. Например, добавить дополнительные подписи, добавить какой нибудь текст в определенное место, удалить определенную строку и тд. И если копируемый шаблон содержит несколько строк, например, 10, то при добавлении строки в начало шаблоне, мне в коде придется менять адресацию всех значений, которые вставляются ниже (было (2,2) = ..., (4,6) = ... станет (3,2) = ..., (5,6) = ...).

Я пока остановился на таком варианте (код приблизительный). Это простой отчет с шапкой, детальными записями и подвалом (набор подписей):
lnCurrentRow = 1
                        
* Выводим шапку отчета.
XLRange1 = XLApp.Range(L1_HEADER)     && Получение области шаблона по имени.
lnHeaderSize = XLRange1.rows.count    && Определение размера области в строках.
XLRange1.Copy()
XLSheet.Rows(lnCurrentRow).Select
XLSheet.Paste                        && Вставка шаблона на рабочий лист.
XLRange1 = XLApp.Selection           && Подстановка значения для переменных типа {!variable}.
XLRange1.replace("{!year}", "2021")                  
XLRange1.replace("{!employee}",.И. Иванов")
XLRange1.replace("{!chief_engeneer}",.П. Петров")
			
lnCurrentRow = lnCurrentRow + lnHeaderSize

SELECT curDetails
SCAN
   * Выводим строку данных.
   XLRange1 = XLApp.Range(L1_DETAIL)     && Получение области шаблона по имени.
   lnDetailSize = XLRange1.rows.count    && Определение размера области в строках.
   XLRange1.Copy()
   XLSheet.Rows(lnCurrentRow).Select
   XLSheet.Paste                        && Вставка шаблона на рабочий лист.
   XLRange1 = XLApp.Selection           && Подстановка значения для переменных типа {!variable}.
   XLRange1.replace("{!price}", curDetails.price)                  
   XLRange1.replace("{!amount}", curDetails.amount)
			
   lnCurrentRow = lnCurrentRow + lnDetailSize
ENDSCAN

* Выводим подвал отчета.
XLRange1 = XLApp.Range(L1_FOOTER)     && Получение области шаблона по имени.
XLRange1.Copy()
XLSheet.Rows(lnCurrentRow).Select
XLSheet.Paste                        && Вставка шаблона на рабочий лист.
XLRange1 = XLApp.Selection           && Подстановка значения для переменных типа {!variable}.
XLRange1.replace("{!sign1}", "С балансом сверено")                  
XLRange1.replace("{!sign1_FIO}",.С. Сидоров")                  


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

Сообщение было отредактировано: 3 ноя 21, 14:29
3 ноя 21, 14:22    [22391619]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
faustgreen
Member

Откуда:
Сообщений: 507


К сообщению приложен файл. Размер - 135Kb
3 ноя 21, 14:24    [22391620]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7919
faustgreen
ВладимирМ, думал над этим вариантом. Из минусов:
1) . То, что вы и написали, нужно заполнять все поля, чтобы затирать старые значения. Есть опасность, что значение для одной строки перекочует в другую строку и останется не замеченным - по факту в отчете будут данные, но неверные. В моем же случае, если я забуду вставить значение, то вместо него останется маяк - {!Variable} и пользователь быстро заметит ошибку.

На самом деле, это, скорее, гипотетическая ситуация. Заполнять Вы будет все поля для каждой строки. Всегда. Все. Без вариантов. Вне зависимости от способа формирования отчета

Не заполненным поле может быть только если оно новое. Ранее не заполнялась. А оставить старое значение, так это и с метками можно сделать.

faustgreen

2). Конкретная адресация - это то, от чего я хотел уйти (когда мы для вставки значения в ячейку точно определяем ее значение в коде (номер строки, номер столюца)).

Опять же, это, скорее, гипотетическая проблема.

Во-первых, крайне редко изменение отчета - это всего-лишь перемещение из одного места в другое. Обычно кроме самого шаблона также меняется и код по его заполнению. Сами же написали, добавить/убрать то или иное значение. А как Вы это сделаете не меняя кода? Заодно и подвинуть ранее созданные ячейки - не проблема

В совсем уж простых случаях помогут именованные ячейки (также называют "именованный диапазон"). Почитайте в справке по Excel, что это такое. Вкратце, Вы можете одной или нескольким ячейкам присвоить имя. Скажем, "A1:D1" = NameReport, а затем обращаться к этим ячейкам по этому имени. Понятно, что вполне можно изменить адресацию. И под тем же именем NameReport будет уже другой набор ячеек, скажем "A2:D2". Т.е. в шаблоне сдвинули, а код заполнения не поменялся. "Имя" - это реквизит Excel. Будет хранится в самом шаблоне

На самом деле, баловство, но производит впечатление чего-то нужного и полезного... Ну, пока не сделаешь сотню другую отчетов


PS: Реально Вы бессмысленным занятием занимаетесь. На практике это все не нужно, поскольку изменение шаблона без изменения кода - крайне редкая и исключительная ситуация. В код Вам придется лезть в любом случае. И здесь изменения в шаблоне - это крайне незначительное время по сравнению с изменением кода.

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

Тем не менее, отговаривать не буду. Во-первых, это хорошая практика для программиста (Вам придется очень сильно напрягаться, чтобы решать элементарные задачки). А во-вторых, это одна из тех вещей, которые можно понять только на практике. Никакие теоретические рассуждения не убедят... В смысле, понять, что это реально не имеет смысла. Кроме как ради обучения
3 ноя 21, 19:40    [22391763]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
AK-Shah
Member

Откуда:
Сообщений: 155
Если актуально.. С очень минимальными приседаниями решается или через FoxyPreviewer, или чрез это https://github.com/VFPX/ExcelXML

На ФоксКлубк Сергей Сизов давно говорит, по рукой ссылки нет, но если надо - и найду, и в почту отправлю, мне не трудно. А советую посмотреть на первое.

1) бесплатно и поддерживается до сих пор (!)
2) сам юзаю, смогу подсказать и даже под хртелки (не все!) запилить
3) МНОГО форматов. Все это бесплатно.

Есть еще платный fox2any. Но по меркам РФ - дорого соотечественник.

И вообще - ар фоксу Вам быстрее и продуктивнее там помогут. Не умаляю этот ресурс, на котором тоже помогут. Но там спец-форум по фоксу. Решать вам. И да за рекламу мне не платят, я не гоню на этот ресурс, просто там тоже спецы, И многие здесь так-то. :)
5 ноя 21, 06:31    [22392085]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
AK-Shah
Member

Откуда:
Сообщений: 155
На фоксе давно все решено, его сколько лет хоронят, а удивлю, что еще работают на нем. И спецы находятся. Что еще хоронили? И еще Чен VFPA ( VFP 10) пилит потихоньку. Люди уже доказывали (например наработки Григорьева и Юры Шутенко), что при своих классах - разворачивается простой учет на коленке. Да и Паша Кручинин имел свой фреймворк.

Но да, будущего нет. Тут не поспоришь. "А не спешите вы хоронить..." :)
5 ноя 21, 06:42    [22392086]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
faustgreen
Member

Откуда:
Сообщений: 507
AK-Shah
Если актуально..

Всегда актуально, не мне, так кому то еще может пригодится. Я остановился на том варианте, что описал выше.
Пока все устраивает, разработка отчетов стала легче, понятнее и быстрее. Но это лично для меня, кто то может не согласится.

Кроме Foxpro для себя Javа занимаюсь, там вебпроекты строятся на паттерне MVC (Model View Controller). Model - данные, View - представление данных, Controller - управление данными. Это довольно удобно, так как разные разработчики могут делать свою работу независимо от других, кто то делает дизайн, кто то работает с серверной частью приложения.

Делал пару отчетов на 1C, там вообще есть СКД (система конструкторской документации). Простые отчеты вообще можно сделать без программного кода (не считая кода запроса).

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

AK-Shah
На фоксе давно все решено, его сколько лет хоронят, а удивлю, что еще работают на нем.

Тут спорно. Работаю на гос конторе, где есть приложения даже на foxpro 2.6. Но они все ждут своего времени, пока их не заменят.
У нас сейчас активно внедряется 1С, и все помаленьку переводится на него. Бывают доработки Foxpro-шных приложений, но только тех, которые стоят в конце очереди на замену. Да и если зайти на сайт вакансий, вбить в поиск "Foxpro", то станет грустно ...

Одна из причин, по которой Foxpro еще живет, возможно состоит в том, что проще доработать существующее, чем разработать что то с нуля. Вот похожий пример с языком Cobol - https://www.cnews.ru/news/top/2020-04-07_ssha_izza_koronavirusa_ponadobilis
5 ноя 21, 11:42    [22392137]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
olavrov
Member

Откуда:
Сообщений: 18
faustgreen, добрый день.
Вопрос по отчету. Удается ли связаться с ГИИС ДМДК?
Мне из под Foxpro надо кое-какие данные предать, а даже до тестового сервиса достучаться не получается.
5 ноя 21, 13:30    [22392173]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
faustgreen
Member

Откуда:
Сообщений: 507
olavrov
Вопрос по отчету. Удается ли связаться с ГИИС ДМДК?

Я не работаю с ГИИС ДМДК.
5 ноя 21, 14:47    [22392208]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1595
AK-Shah
На ФоксКлубк Сергей Сизов давно говорит, по рукой ссылки нет, но если надо - и найду, и в почту отправлю, мне не трудно. А советую посмотреть на первое.
Не надо ничего искать, отправлять и т.д. Ибо нужные ссылки уже опубликованы в этой теме.

Сообщение было отредактировано: 9 ноя 21, 13:44
9 ноя 21, 13:42    [22393623]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1595
faustgreen
Делал пару отчетов на 1C, там вообще есть СКД (система конструкторской документации).
Это вы так прикалываетесь? Вроде всегда это там называлось Системой компоновки данных. :)
9 ноя 21, 13:44    [22393626]     Ответить | Цитировать Сообщить модератору
 Re: Работа с MS Excel  [new]
faustgreen
Member

Откуда:
Сообщений: 507
Sergey Sizov
faustgreen
Делал пару отчетов на 1C, там вообще есть СКД (система конструкторской документации).
Это вы так прикалываетесь? Вроде всегда это там называлось Системой компоновки данных. :)


Да, чет тут я попутал ...
9 ноя 21, 14:34    [22393664]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / FoxPro, Visual FoxPro Ответить