Здравствуйте! Знакомлюсь с Fast Report'ами. В датасете репорта есть строковое поле "MembersOfMeeting", в нем хранится список присутствующих на встрече в формате:"Иванов Игорь; Петров Владимир; ..."Мне нужно вывести список присутствующих (см. Присутні в прилож.файле) на 3 строках, чтобы они выводились с переходом на след. строку, причем ФИО должны выводиться над горизонтальной линией. В каждой строке может быть по 3 фамилии. Думаю здесь нужно скрипт в репорте писать - брать поле MembersOfMeeting и формировать массив, в котором будут присутствующие. Как обращаться к данным датасета закладке Код FR не знаю. Подскажите правильно ли я мыслю, как это делать. Буду очень благодарен! В прикрепленном файле можно посмотреть как нужно выводить информацию.
Здравствуйте Антон,
Код в FastReport как правило пишется в синтаксисе Delphi (PascalScript)
для реализации вашей задачи будем использовать функцию
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;
где 2147483647 - число которое примерно соотвествует MaxInt в Delphi
Данную функцию нужно добавить в код FastReport (в самой компоненте) до ее вызова в скрипте.
Дробить строку по разделителю ',' будем следующим образом
s:=<ds_SplitWordByDelimiter."Name">;
Repeat //мы постепенно заполняем массив на каждом шаге цикла по 1 элементу
setlength(a,length(a)+1);//увеличиваем размер массива на 1if 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],',','');
Предварительно объявив переменные выше всего кода
var a:array of string;//наш массив
s:string;//строка которую мы будем разбивать
В данном коде строчка
s:=<ds_SplitWordByDelimiter."Name">;
Получает первую запись датасета (в данном примере в датасете ds_SplitWordByDelimiter всего одна запись)
Для примера, строку 'Terrasoft CRM,BPMonline,Service Desk' мы делим на событии отчета frxReportOnStartReport
Дальше будем записывать в само значение Memo, на событии OnBeforePrint
procedure Memo2OnBeforePrint(Sender: TfrxComponent);
begin
Memo2.Text:= a[1];
end;