Здравствуйте! Знакомлюсь с 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);//увеличиваем размер массива на 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],',','');
Предварительно объявив переменные выше всего кода
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;
Пример работы:
Сервисы отчета, датасета и SQ во вложении