Добрый день.

Хотелось бы уточнить, можно ли как нибудь организовать процесс автоматической отправки отчета из планировщика заданий, т.е. из со стороны сервера.

Есть некий скрипт, который формирует отчет в FastReport, сохраняет его в виде файла .xls и автоматически отправляет его адресату.

Запихал данную функцию в планировщик заданий, Задание выполнилось без ошибок, но ничего не произошло. Может ли сервер построить отчет, сохранить его и отправить?

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

Реализовал данный процесс через планировщик Windows, но хотелось бы через планировщик Terrasoft.

Нравится

20 комментариев

Здравствуйте, Константин!
Уточните, пожалуйста, выполняются ли правильно другие скрипты планировщиком?
Нет ли в скрипте обращение к визуальным элементам?
Также даю ссылку на комментарий с прикрепленной информацией по планировщику, возможно найдете ответы там:
http://www.community.terrasoft.ru/forum/topic/10248#comment-46358

Да все хорошо выполняется. Строится FastReport и формируется Excel.
Уточнил про сервер, там нет office (из-за него видимо не формировался файл)и скорее всего не будет, поэтому все таки оставлю данный процесс на windows планировщике другого компьютера.

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

Константин, а как Вы отправляете письмо?

Ещё можно так.

TempFileName - сформированный excel документ

function SendMail(TempFileName, Dataset){
	 AddressListing = new Array();
	 Address1 = 'Когут Константин' + ' <kogut@kodeks.ru>';
	 AddressListing.push(Address1);
	 SendTaskEmailToAction(AddressListing, TempFileName, Dataset);
}
 
function SendTaskEmailToAction(AddressList, TempFileName, Dataset) {
	var ID = Dataset.Values('ID');
	var TemplateID = GetSystemParameterValueEx('ContactMarketingActionReport');   // шаблон
	var Service = Services.GetSingleItemByUSI('scr_MailUtils');
	Service.ScriptControl.CodeObject.SendEmailByTemplate( TemplateID,
		{Attachments: [TempFileName], Dataset: Dataset, Address: AddressList, AutoSend: true, 
		SkipQueryAddresses: true, Silent: true});
}

Причем есть еще загвоздка, если выполнять windows планировщиком с 7ки, то все ок, а например с server 2003, то аналогичный запуск застревает на входном окне Terrasoft (ждет нажатия OK)

Константин, правильно ли я понял, что Вы по планировщику запускаете свое окно? Если да, то уточните, указываете ли Вы параметр "-pwd" при запуске?
Пробовали отправлять письма вручную (по нажатию на кнопку, например)?
Поставьте отладчик в функцию SendEmailByTemplate и посмотрите, где есть проблема.

В планировщике все указано, еще раз повторюсь, на 7ке все выполняется корректно, а на servere 2003 застревает на входе.

Но даже на 7ке не выполняется в фоновом режиме например при выходе из сеанса, при указании в планировщике от кого запустить задачу. Процессы появляются в диспетчере, но нет оправки

Константин, повторюсь. Проверяли ли Вы, работает ли код по отправке письма, если выполнять его не по планировщику, а привязать к кнопке, например?

Да по кнопке работает, даже по планировщику работает, но на 7ке, а на servere застревает на входе

Константин, предоставьте, пожалуйста, листинг .bat файла, который запускает Terrasoft.

"C:\Program Files\Terrasoft\Bin\TSClient.exe" /wnd=wnd_AutoReport -сfg="Terrasoft" -usr="Supervisor" -pwd="***"

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.3" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2014-02-06T13:19:24.8797741</Date>
    <Author>USO\kogut</Author>
  </RegistrationInfo>
  <Triggers>
    <CalendarTrigger>
      <StartBoundary>2014-02-06T10:20:23</StartBoundary>
      <Enabled>true</Enabled>
      <ScheduleByDay>
        <DaysInterval>1</DaysInterval>
      </ScheduleByDay>
    </CalendarTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>USO\kogut</UserId>
      <LogonType>InteractiveToken</LogonType>
      <RunLevel>HighestAvailable</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>true</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
    <UseUnifiedSchedulingEngine>false</UseUnifiedSchedulingEngine>
    <WakeToRun>true</WakeToRun>
    <ExecutionTimeLimit>P3D</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>"C:\Program Files (x86)\Terrasoft\Bin\TSClient.exe"</Command>
      <Arguments>/wnd=wnd_AutoReport -cfg=Terrasoft -usr=Supervisor -pwd=***</Arguments>
    </Exec>
  </Actions>
</Task>

Константин, передал информацию в департамент разработки. Сообщу, когда будет ответ.

Ок, буду ждать

Добрый день, Константин!
Попробуйсте изменить строку запуска в командном файле на следующую:

start "TSClient" /d "C:\Program Files (x86)\Bin" TSClient.exe –wnd=wnd_AutoReport -cfg=Terrasoft -usr=Supervisor -pwd=***

При этом командный файл запуска должен быть не *.bat, а *.cmd.

Как изменить батник задачи?

Если просто создать батник и его запускать, то он игнорирует окно которое должно запуститься

Константин, Вы имеете ввиду задачу планировщика?
Как я писал выше, попробуйте создать *.cmd файл, а не *.bat.

да планировщика

Изменять параметры задачи можно, открыв окно "Свойства" из контекстного меню задачи.

все ок, проблема была как ни странно в "-wnd" у параметра wnd, вот рабочий cmd на windows servere

start "TSClient" /d "C:\Program Files\Terrasoft\Bin" TSClient.exe /wnd=wnd_AutoReport -cfg=Terrasoft -usr=Supervisor -pwd=*** 
Показать все комментарии

Можно ли как-то настроить в TS XRM 3.3 свойства одного конкретного отчета Fast Report, чтобы он печатался в режиме двухсторонней печати (duplex)?

Все остальные отчеты печатаются в стандартном режиме. Хочется избавить пользователей от ручного переключения режимов для данного отчета.

Нравится

3 комментария

Владимир, Вам нужно смотреть в сторону настроек PrintOptions отчета (в Terrasoft Administrator откройте сервис отчета и в свойствах отчета Вы увидите группу свойств PrintOptions).

Там смотрел, ничего похожего не увидел

Измените свойство Duplex страницы:

/system/files/01-11-2013_9-53-26.png

Показать все комментарии

Здравствуйте У меня проблемы с выводом текста, который храниться в BLOB, в FastReport. В RichDataControl ничего не отображается. Так же пробовал получить текст из blob\'а как описано здесь https://community.terrasoft.ru/blogs/8544 , но выбрасывает ошибку(скрин в комментарии к статье). До события OnDatasetCalcFields не доходит, устанавливал debugger в начало обработчика.

Нравится

1 комментарий

Проблема решена. Был неправильно привязан MasterData. Спасибо тех. помощи. В версии, которую я использовал, 3.4.0 "вытаскивать" текст из blob'а в отдельное вычисляемое поле, все корректно отображается в RichDataControl.

Показать все комментарии

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

поле отчёта: Memo5
датасет: dsReportOfferingMovementRemain
Memo (значение) поля Memo5: [Sum()]

Нравится

12 комментариев

Если поле с sum убрать и работает, то предположу что sum не нравиться null в данных, в выборку добавить ISNULL(xxxxxx,0). Хотя текст об неоткрытом датасете.

"Борисов Михаил Евгеньевич" написал:

"причём только для одного определённого склада и только для одного определённого типа продукции" - если отчет в принципе работает, то предположу что sum не нравиться null в данных, в выборку добавить ISNULL(xxxxxx,0).


Михаил, вполне возможно, что вы правы, ранее добавлялось поле артикул, но ещё не все продукты его имеют. Если не сложно, можно поподробнее? Это добавить в селектквери? Если да, то куда именно и как?

В sq_ сервис добавить новое поле select, в нем написать ISNULL(Quantity,0) если БД MSSQL, в соотвествующем сервисе ds_ добавить числовое поле и указанть созданое поле в sq_, обновить отчет, вместо Quantity указать новое поле. Все это стоит делать только если отчет работает без этого поля. Как вариант поставить туда max например, если не заработает то не в данных проблема.

Алексей, попробуйте подменить

[Sum(<dsReportOfferingMovementRemain."Quantity">)] 

на

[SUM(<dsReportOfferingMovementRemain."Quantity">,DetailData1)]

будет возникать ошибка?

"Бондарь Наталия" написал:

Алексей, попробуйте подменить

[Sum(<dsReportOfferingMovementRemain."Quantity">)] на [SUM(<dsReportOfferingMovementRemain."Quantity">,DetailData1)] будет возникать ошибка?


не помогло,
"Борисов Михаил Евгеньевич" написал:

В sq_ сервис добавить новое поле select, в нем написать ISNULL(Quantity,0) если БД MSSQL, в соотвествующем сервисе ds_ добавить числовое поле и указанть созданое поле в sq_, обновить отчет, вместо Quantity указать новое поле. Все это стоит делать только если отчет работает без этого поля. Как вариант поставить туда max например, если не заработает то не в данных проблема.


я так понимаю, ISNULL() - это вот эта функция?: http://msdn.microsoft.com/ru-ru/library/ms184325.aspx
в нем написать ISNULL(Quantity,0)
Куда в нем это написать? где написать?
что писать в каждом из этих полей?
Я правильно понимаю, что смысл в том, чтобы преобразовывать NULL в "0"?
Мне не понятно, как с помощью конструктора sq_ это сделать. Простите, но если не сложно, можно ещё подробнее, или хотя бы какую-нибудь ссылочку для понимания происходящего

А обязательно ли это делать через sq?
Создайте в датасете вычисляемое поле ('FieldX'), и на OnDatasetCalcFields пропишите

if (Dataset('Quantity')==null) Dataset('FieldX') = 0;
else Dataset('FieldX') = Dataset('Quantity');

И используйте в отчете это поле.

"Сазанов Александр Владимирович" написал:

А обязательно ли это делать через sq?

Создайте в датасете вычисляемое поле ('FieldX'), и на OnDatasetCalcFields пропишите

if (Dataset('Quantity')==null) Dataset('FieldX') = 0;

else Dataset('FieldX') = Dataset('Quantity');

И используйте в отчете это поле.


Попробовал, пишет ошибку: "Источник данных "%s" не открыт"
Не помогло

А мы вообще туда копаем? Глянул на рисунок. Хоть немного непонятно, но
В MasterData датасет ...RemainHeader, а поле склад относится к датасету ...MovementRemain, а используете в MasterData.
Я думаю вот оно.

"Сазанов Александр Владимирович" написал:

А мы вообще туда копаем? Глянул на рисунок. Хоть немного непонятно, но

В MasterData датасет ...RemainHeader, а поле склад относится к датасету ...MovementRemain, а используете в MasterData.

Я думаю вот оно.


Ок, Вы были правы я там исправил, но по-прежнему выскакивает та же ошибка.

Алексей, согласно телефонной договоренности направьте, пожалуйста, в техническую поддержку резервную копию БД.

"Бондарь Наталия" написал:

Алексей, согласно телефонной договоренности направьте, пожалуйста, в техническую поддержку резервную копию БД.


Направлена

Сервис отчета с исправлениями во вложении.

Показать все комментарии

У клиента есть устаканенная форма на ТЗ.
Сверху основные поля, а внизу слева направо три детали (делаю их через Subreport, потому что по другому не знаю как DetailData выводить на одном уровне, может подскажите если можно как-то по другому).
Суть в том, что в деталях разное кол-во записей и соответственно они заканчиваются на разной высоте.
Необходимо печатать пустые сроки до конца самой длинной из них.
Не подскажите как можно реализовать?

Нравится

4 комментария

Посмотрела в документации и на форумах FastReport, для вложенного отчета рекомендуют установить опцию "Печатать на родителе" (PrintOnParent).
Описание можно найти здесь: http://www.fast-report.com/public_download/html/UserManStudio-ru/index.html?45.htm
Если не поможет, нужно будет динамически прорисовывать ячейки.

Как прорисовывать динамически, не в смысле ставить свойство visible или создать датасет, мастердетайл и там ставить количество записей, это понятно.
Как определить количество записей в привязанных датасетах. Пробовал на OnPrepare, но датасеты там пустые (кол-во записей 0), где это узнавать? или как узнать ID записи, которая пошла в отчет?

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

То что нужно, спасибо.

Показать все комментарии

Здравствуйте!
Меня "угораздило" удалить несколько FastReport-форм отчетов (счетов-фактур) для документов, которые не надо было удалять. Но имеются другие FastReport-формы, в этом же подразделе, для других отчётов, из которых очень просто сделать такие-же как удалённые. Что я и сделал, однако эти формы не видны в разделе отчёты в TSClient.exe. То есть сервисы есть, но не понятно как их привязать к отчётам Подскажите, как создать FastReport-форму отчета по шаблону существующей FastReport-формы?

P.S.
Восстановление из бэкапа не желательно, так как косяк замечен поздно и 1,5 дня работы будет на смарку... ОЧЕНЬ надеюсь на вашу помощь.

Нравится

2 комментария

если нужно восстановить удаленные формы - восстановите только записи из таблицы tbl_Services
например, удалили fr_ReportReport, тогда:

insert into [WORKBASE_Name].[dbo].[tbl_Services]
select * from [BACKUPBASE_Name].[dbo].[tbl_Services] where code = 'fr_ReportReport'

если вам надо восстановить настройки удаленных отчетов (в разделе отчеты) можете сделать тоже самое с отчетами (tbl_Reports)

Дмитрий, спасибо, всё восстановил. Маленькие заметочки для тех кто столкнётся с подобным:
1) Таблицы называются tbl_Service и tbl_Report (без 's' на конце).
2) Права также нужно восстановить (я это сделал не из бэкапа, но можно из таблиц tbl_ReportRight и tbl_ReportGroupRight).

Показать все комментарии

Здравствуйте. Столкнулся с след. проблемой. Стоит задача печатать большое кол-во документов(одного типа). У документа есть деталь "Мат. ценности". Если там пусто, нужно печатать 3 пустые строки. С этим все понятно. Создал отчет для выделенных записей. При построении отчета имеется проблема: Если в середину отчета попадает документ с пустой деталью, то для этой записи не печатается header и footer
1

Чтобы стало яснее, вот скриншот того, как печатает для документа с непустой деталью:
2

Ниже скрин печати, если id записи документа с пустой деталью попадает в конец отчета либо в начало.Это то, что мне нужно получать всегда, независимо от того, на каком месте(странице) в формируемом отчете она нах-ся. Правильность отображения должна сохраняться!
3

Вот картина отчета в общем:
Общий вид

Проблема в том, что для такого варианта(рис.1, первый скрин) не печатает хедер и футер.
Парадокс, когда документ с пустой деталью выпадает на начало отчета или конец, печатает ВСЕГДА нормально.... Также нормально печатает записи, где деталь не пустая.

Как мне бороться с такой проблемой?

TS XRM 3.4

Нравится

10 комментариев

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

Предлагаю:

а) предоставить резервную копию БД;
б) удаленное подключение для анализа проблемы;

Ответ можно направить в личном сообщении.

Ок, написал в личку

Уважаемые сотрудники компании "Terrasoft"!Ну что там с отчетом? жду 3 недели, надеюсь дождусь

Антон, добрый вечер!
Извините, нужен бекап Вашей БД.

Хорошо, я же уже давал)ссылка на скачку у вас в скайпе!

Антон, ок, спасибо! Занимаемся. В понедельник будет информация.

Антон, изменили отчет, протестируйте, пожалуйста (вместо MastrData1 добавлен Child2, который подчинен Child1).
Сервисы отчета во вложении.

Ок, спасибо, попробую!

Да, все получилось. Спасибо!

Показать все комментарии

Добрый день!

Подскажите, пожалуйста, как реализовать следующий отчет в FastReport:

есть таблица tbl_Contracts:

... | ID договора | Дата первого платежа | ...

есть таблица tbl_Payments:

 ... | ID договора     |   Сумма платежа      | Дата платежа | ...
___________________________________________________________________
     |        1         |        100 р.       |  01.01.2000
     |        1         |        200 р.       |  15.01.2000
     |        1         |        500 р.       |  25.02.2000
     |        2         |        150 р.       |  13.01.2000
     |        2         |        250 р.       |  13.02.2000

Нужно вот такой отчет:

... | ID договора | Сумма платежей за месяц первого платежа | ...

Т.е. если у нас у договора Дата первого платежа 01.01.2000 - то первым платежом считать все оплаты за январь, и в отчете вывести сумму всех платежей за январь одной строчкой.

Мне кажется как-то можно использовать Expressions у поля, но я могу ошибаться.

Заранее спасибо!

Нравится

4 комментария

Здравствуйте, Алексей.

Как вариант, Вы можете в sq выбрать дату платежа в формате "месяц.год" и в отчете использовать группировку (http://www.community.terrasoft.ua/forum/topic/8512) платежей по дате. А группировать Вы будете суммы платежей, что-то вроде:

[SUM(<ds_ReportPayments."PaymentAmount">,mdPayment)]

Максим, спасибо! Так все получилось. Но есть одна проблема - как избавиться от ненужных записей теперь? (выводимых в отчете)

Т.е. чтобы записи с другими месяцами не выводились в отчет, а выводилась ТОЛЬКО группа, у которой месяц и год = месяц и год поля "Дата первого платежа"? Что посоветуете?

Т.е. если совсем просто как сделать так, чтобы выводились только те записи, у которых, например, "Дата первого платежа" = '01.01.2013' ?

Здравствуйте, Алексей.

Воспользуйтесь фильтрами. В sq добавьте колонку даты платежа, добавьте это поле в ds отчета и в дизайнере воспользуйтесь функцией определения фильтра (Ctrl+R) и задайте фильтрацию по дате первого платежа.

Максим, здравствуйте.

Я сделал по-другому - в обработчике события MasterData1OnBeforePrint написал следующий код:

 if (<TSDataset1."OPLATA_DATE_MONTH"> = <TSDataset1."FirstPaymentDate_MONTH">)
     and (<TSDataset1."OPLATA_DATE_MONTH"> <> '')
     and (<TSDataset1."OPLATA"> <> 0) then
      begin
       MasterData1.Visible := true;
       GroupHeader2.Visible := true;
       GroupFooter2.Visible := true;             
      end else
       begin
        MasterData1.Visible := false;                                               
        GroupHeader2.Visible := false;
        GroupFooter2.Visible := false;              
       end;

и это оказалось именно тем, что было нужно! Может, поможет, кому-нибудь.

Показать все комментарии

Задача:
Реализовать корректную печать для раздела проекты для выделенного в реестре проекта
Подробнее о проблеме описано тут
Для построения выборки нам потребуется рекурсивный запрос, с помощью базовых компонентов SQ Terrasoft'a у меня такой придумать не получилось так как синтаксис CTE начинается со слова with. Решение - создать ADO Dataset, где можно написать любой запрос
1. Создаем ADO Dataset, пишем Connection string, задаем сам запрос :

WITH MyProject
AS
(
SELECT tbl_Project.*, 0 AS Level
 FROM tbl_Project
WHERE ID = :ID
UNION ALL
SELECT p.*, Level+1
 FROM tbl_Project p
INNER JOIN MyProject AS mp
        ON p.ParentID = mp.id
)
SELECT
                MyProject.ID,
                MyProject.ParentID,
                MyProject.Name,
                MyProject.EstimatedStartDate,          
                MyProject.EstimatedDueDate,            
                ContactOwner.Name AS OwnerName,
                ProjectState.Name AS StateName,
        Level
                FROM
                MyProject,
                tbl_Contact AS ContactOwner,
                tbl_ProjectState AS ProjectState
WHERE MyProject.OwnerID = ContactOwner.ID
AND ProjectState.ID = MyProject.StateID
ORDER BY MyProject.SortOrder

Колонки которые вынесены в последнем запросе нужно создать руками, также необходимо создать параметр ID с типом уникального идентификатора
Настройки Dataset'a следующие
1

2. Кнопка в реестре раздела [Проекты], передача параметра ID записи в отчет:

function btnPrintProjectOnClick(Control) {
                var SelectedIDs = GetProjectSelectedIDsArray();
                var Dataset = Services.GetNewItemByUSI('adods_PrintProject');
                var Report = Services.GetNewItemByUSI('fr_PrintProject');
                        if (!IsEmptyValue(SelectedIDs[0]))
                        {
                        SetAttribute(Report,'ProjectIDtoPrint',SelectedIDs[0]);
                ShowReport(Report);
                }
                else
                        MessageBox('Не выбран ни один проект');
}

ShowReport c скрипта scr_ReportUtils

3. Сама печатная форма
Получение параметров

function fr_PrintProjectOnPreview(ReportPreviewer) {
 var DatasetNameStr = "adods_PrintProject"; //датасет в котором мы хотим делать фильтрацию (необходимо помнить о том, что у отчета может быть несколько датасетов)
 var str = ReportPreviewer.DatasetUSIList.CommaText; //в строчке ReportPreviewer.DatasetUSIList.CommaText передаются USI датасетов, через запятую
 var ReportDatasetUSI =  str.substr(str.indexOf(DatasetNameStr), DatasetNameStr.length);
 var Dataset = ReportPreviewer.DatasetByUSI(ReportDatasetUSI);
 
                var ProjectIDtoPrint = GetAttribute(ReportPreviewer.Report,'ProjectIDtoPrint');
                Dataset.Parameters.ItemsByName('ID').Value = ProjectIDtoPrint;                                
}

К параметру ID в ADO Dataset получаем доступ так:

                Dataset.Parameters.ItemsByName('ID').Value = ...;

3. Сам отчет

var
 oldCurXBand: Extended;    
 oldBandWidth: Extended;    

procedure ProjectNameOnBeforePrint(Sender: TfrxComponent);
begin
 oldCurXBand := ProjectName.Left;
 oldBandWidth := ProjectName.Width;                      
ProjectName.Left := ProjectName.Left + 20 * Project.Value('Level');                                            
ProjectName.Width := ProjectName.Width - 20 * Project.Value('Level');                                            
end;

procedure ProjectNameOnAfterPrint(Sender: TfrxComponent);
begin
ProjectName.Left := oldCurXBand;
ProjectName.Width := oldBandWidth;                  
end;

begin

end.

Идея отступа взята с FastReport. Отчёты с деревьями, все остальное в статье у меня не заработало, даже на тестовых таблицах с совпадающими типами + в статье есть ошибки. Реализовано лучше с Документации по методам FR берем
Left (Integer) - Координата Х левого верхнего угла объекта.
Width (Integer) - Ширина объекта.
Отступаем по x нужную длину и кушаем это число с ширины бэнда. Выходит более красивее чем прыгающий бэнд.
Результат :
2

p.s Пожелания по улучшению:
1.Использовать текущие данные подключения для получения данных с ADO Dataset

Нравится

Поделиться

2 комментария

Добрый день.
Подскажите как в FastReport можно сделать так, чтобы два рядом находящихся (по горизонтали) компонента memo растягивались на одинаковую высоту, когда в одном из них нужно отобразить больше текста?

Вот пример того как сейчас:
Текущий результат

И желаемый результат:
Желаемый результат

Нравится

2 комментария

Вопрос решил тем, что подобавлял Child Band к MasterData:
1
и поместил каждый блок из двух горизонтально расположенных Memo в ChildData:
2
То есть количество ChildData, которое было добавлено, равно количеству таких пар Memo.
У каждого ChildData указал свойство Stretch:
3
У Memo, наполнение которого изменяется, указал свойство Stretch:
4
А у Memo, текст которого не меняется, указал свойство Stretcg to Max Height:
5
Получилось красиво:
6

Андрей, спасибо за публикацию решения.
Получилось, действительно, красиво.

Показать все комментарии