RaveReports: как разделить поле?

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Annja
Сообщения: 5
Зарегистрирован: 20 май 2009, 16:32

Здравствуйте,помогите пожалуйста кто нибудь!!!

Делаю отчет по таблице *.dbf
В Delphi7 RaveReports5
С трудом удалось соединиться с помощью HalcyonDataSet :)

Но вдруг возникла неожиданно проблема: исходные данные в моей таблице представлены в неудобном виде: в одном поле несколько значений через запятую:
Например,
название поля: ФИО
данные: Фамилия,Имя,Отчество
:(
Мне же нужно, чтобы выводилось отдельно в разных строках отчета: отдельно фамилия, отдельно имя, отдельно отчество.

Программа по выбору n-того слова перечисления у меня написана(на Дельфи).
Пыталась запрограммировать ее во вкладке EventEditor.
Но недавно поняла, что никаких циклов, никаких даже условных операторов он не подерживает. :(
Что же делать-то? :confused: Неужели прийдется отказаться от RaveReports?

Усложняет задачу то, что исходную таблицу нельзя менять.
--------
Может быть, кто-нибудь посоветует как по-другому несложно решить эту головоломку? :confused:
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

не видел я RR...
А для чего вам циклы и условия?
Можно ли подключать к отчёту собственные функции?
Изображение
Annja
Сообщения: 5
Зарегистрирован: 20 май 2009, 16:32

Игорь Акопян писал:
А для чего вам циклы и условия?
А это нужно для того, чтобы выделить строчку, заключенную между запятыми. Например "Имя" из строчки "Фамилия,Имя,Отчество"
Я не знаю, как это сделать без циклов и условий. Наверное, это вообще не реально. :( Ведь длина слов может быть различной...

Игорь Акопян писал:
Можно ли подключать к отчёту собственные функции?
Я не знаю ответ на этот вопрос. :confused: Конечно, если бы было бы можно, то было бы просто замечательно!
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Вопрос снят. Проблема решена :)
Мне помогли решить эту проблему с помощью создания вычисляемых полей для фамилии, имени,отчества и тп. Оказывается, даже в HalcyonDataSet при нажатии на него правой клавиши мыши есть редактор, в котором можно создавать дополнительные поля. Далее в Дельфи можно вычислять им любые значения. А Rave Reports видит эти поля, как и обычные поля! :)
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

Annja, вот нарыл, не поможет?
Tip #021 - Calculated Fields in Rave
Изображение
Annja
Сообщения: 5
Зарегистрирован: 20 май 2009, 16:32

Боюсь, что вряд ли мне это поможет.
Текст мне непонятен, к тому же на английском :confused:

Ну все равно спасибо :)
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

&quot писал(а):вряд ли мне это поможет.
а разве не калькулируемое поле вам надо сделать?
Сначала определите OnGetCols обработчик для вашего data connection component

[syntax='delphi']
procedure TForm1.CustomerCXNGetCols(Connection:
TRPCustomConnection);
begin
With Connection do begin
DoGetCols;
WriteField('FirstName', dtMemo, 30, '', ''); // видимо сюда попадёт БЛОБдата из *** ниже
end; { with }
end;
[/syntax]

Вызов DoGetCols создаст дефлотовые колонки (поля). Остаётся вызвать WriteField для задания инфы по каждому полю, что вам нужны. Далее нужно определить OnGetRow обработчик для этого же data connection component'a.
далее доработал:
[syntax='delphi']
procedure TForm1.CustomerCXNGetRow(Connection: TRPCustomConnection);
var
Stream: TMemoryStream;
Memo: TMemo;
s1, s2: string;
i1: integer;
begin
With Connection do
begin
DoGetRow; // get data for table fields
s1 := GetToken(1, Table1.FieldByName('FIO').AsString);
// тут GetToken - ваша функция выдрающая из ФИО нужный кусок
Stream := TMemoryStream.Create;
Memo := TMemo.create(self);
try
Memo.Text := s1;
Memo.Lines.SaveToStream(Stream);
Stream.Position := 0;
WriteBlobData(Stream.Memory^, Stream.Size);// ***
finally
Stream.Free;
Memo.Free;
end;// tryf
end; { with }
end;
[/syntax]

попробуйте что-нить в этом роде (пишу на коленке) :)
Изображение
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Annja, в HalcyonDataSet (как и в любом DataSet) можно добавить вычисляемой поле. Т.е. физически в таблице будет поле FIO, а DataSet будет предоставлять всем визуальным компонентам и отчетам дополнительных три поля F, I, O. А алгоритм вычисления использует всю мошь паскаля.

Игорь дает очень правильный совет.
Annja
Сообщения: 5
Зарегистрирован: 20 май 2009, 16:32

Написала программу!
:)
В моем случае тип соединения не CustomConnection, а DataSetConnection, и поэтому, наверно, все получилось сделать гораздо проще, чем ответил Игорь Акопян.

1. Создание дополнительных колонок:


Naeel Maqsudov писал
DataSet будет предоставлять всем визуальным компонентам и отчетам дополнительных три поля F, I, O.

Значит, первую часть кода в сообщении Игоря можно сделать проще, не программно, а через DataSet. Я так и сделала!

2. Вычисление значений колонок.

И тут тоже, никакие TMemoryStream, к моей радости, использовать не пришлось:

Код: Выделить всё

procedure TForm1.HalcyonDataSet1CalcFields(DataSet: TDataSet);
begin
HalcyonDataSet1Name.Value:=GetToken(1, НalcyonDataSet1FIO.Value);// записываю в колонку с именем вынутое имя
HalcyonDataSet1FirstName.Value:=GetToken(2, НalcyonDataSet1FIO.Value);// записываю в колонку с фамилием вынутое фамилие
HalcyonDataSet1LastName.Value:=GetToken(3, НalcyonDataSet1FIO.Value);// записываю в колонку с отчеством вынутое отчество
end;
Дальше собираюсь делать в том же духе. Rave Reports видит эти колонки и они вполне удобны для отчета!
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

дык я ж никогда не пользовался RR :) чё нагуглил - то и написал :)
Изображение
Ответить