Перенос слов в FR

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

Нравится

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

Здравствуйте Антон,
Код в FastReport как правило пишется в синтаксисе Delphi (PascalScript)
1
для реализации вашей задачи будем использовать функцию

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
2
Дальше будем записывать в само значение Memo, на событии OnBeforePrint
3

procedure Memo2OnBeforePrint(Sender: TfrxComponent);
begin
Memo2.Text := a[1];    
end;

Пример работы:
4
Сервисы отчета, датасета и SQ во вложении

Спасибо,Алексей!Буду пробовать

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