Здравствуйте! Знакомлюсь с Fast Report'ами. В датасете репорта есть строковое поле "MembersOfMeeting", в нем хранится список присутствующих на встрече в формате:"Иванов Игорь; Петров Владимир; ..."Мне нужно вывести список присутствующих (см. Присутні в прилож.файле) на 3 строках, чтобы они выводились с переходом на след. строку, причем ФИО должны выводиться над горизонтальной линией. В каждой строке может быть по 3 фамилии. Думаю здесь нужно скрипт в репорте писать - брать поле MembersOfMeeting и формировать массив, в котором будут присутствующие. Как обращаться к данным датасета закладке Код FR не знаю. Подскажите правильно ли я мыслю, как это делать. Буду очень благодарен!
В прикрепленном файле можно посмотреть как нужно выводить информацию.
Нравится
Здравствуйте Антон,
Код в FastReport как правило пишется в синтаксисе Delphi (PascalScript)

для реализации вашей задачи будем использовать функцию
[javascript]
function ReplaceStr(Str, SubStr, Replace: string): string;
{замена подстроки в строке}
var
i:Integer;
begin
Result:= '';
repeat
i:=Pos(SubStr, Str);
if i > 0 then begin
Result:=Result+Copy(Str,1,I-1)+Replace;
Str:=Copy(Str,i+Length(SubStr),2147483647);
end else Result:=Result+Str;
until i<=0;
end;
[/javascript]
где 2147483647 - число которое примерно соотвествует MaxInt в Delphi
Данную функцию нужно добавить в код FastReport (в самой компоненте) до ее вызова в скрипте.
Дробить строку по разделителю ',' будем следующим образом
[javascript]
s:=;
Repeat //мы постепенно заполняем массив на каждом шаге цикла по 1 элементу
setlength(a,length(a)+1);//увеличиваем размер массива на 1
if pos(',',s)>0 then //если есть запятая то надо взять слово до пробела
begin
a[length(a)-1]:=copy(s,1, pos(',',s));//присвоение последнему элементу массива первого слова
s:=copy(s,pos(',',s)+1, length(s));//удаляем из строки первое слово
end
else//в строке осталось только одно слово
begin
a[length(a)-1]:=s;// присвоим последнее слово
break;//выход из цикла
end;
Until False;//цикл бесконечный, выход изнутри
//теперь проверяем что получили
a[1] := ReplaceStr(a[1],',','');
a[2] := ReplaceStr(a[2],',','');
a[3] := ReplaceStr(a[3],',','');
[/javascript]
Предварительно объявив переменные выше всего кода
[javascript]
var a:array of string;//наш массив
s:string;//строка которую мы будем разбивать
[/javascript]
В данном коде строчка
[javascript]
s:=;
[/javascript]
Получает первую запись датасета (в данном примере в датасете ds_SplitWordByDelimiter всего одна запись)
Для примера, строку 'Terrasoft CRM,BPMonline,Service Desk' мы делим на событии отчета frxReportOnStartReport

Дальше будем записывать в само значение Memo, на событии OnBeforePrint

[javascript]
procedure Memo2OnBeforePrint(Sender: TfrxComponent);
begin
Memo2.Text := a[1];
end;
[/javascript]
Пример работы:

Сервисы отчета, датасета и SQ во вложении