• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Помогите найти ошибку в отчете.....

Автор Марина Гаврилюк, 26.08.14, 10:59:03

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Марина Гаврилюк

Здравствуйте! Учеба откладывается, поэтому пытаюсь сама разобраться с FastReport. Набросала простенький отчет, вот его код:

var
DepUserRole : TDataSet;                                               

 
procedure MasterDataMainOnBeforePrint(Sender: TfrxComponent);
begin
  Memo2.Text := IntToStr(MasterDataMain.DataSet.RecNo + 1);       

  DepUserRole.Filter := Format('_TYPE=%d', [2]);            // подразделения                       
  DepUserRole.Filtered := True;

   MasterDataMain.RowCount :=  DepUserRole.RecordCount;       
 
  if DepUserRole.RecordCount>0 then

    DepUserRole.First;
 
      While Not DepUserRole.Eof do
      begin                 
       ShowMessage(DepUserRole.FieldByName('_NAME').AsString);
        begin
         Memo1.Text := DepUserRole.FieldByName('_TYPE').AsString;
         Memo10.Text := DepUserRole.FieldByName('_NAME').AsString;
         Memo17.Text := DepUserRole.FieldByName('_USERNAME').AsString;
        end;
       DepUserRole.Next;         
      end;
         
end;

procedure MasterDataMainOnAfterPrint(Sender: TfrxComponent);
begin
  if DepUserRole.Eof then
   begin     
    DepUserRole.Free;
   end
end;

begin
  DepUserRole := GetRoleTree(4);
end.


При отладке вижу, что отбирает 38 подразделений, перебирает их в цикле..... Но выводит в отчет только одну последнюю строку.

Заранее благодарю.

Нужно в цикле, компоненту Memo добавлять, а не присваивать.

Марина Гаврилюк

Можно пример привести?

Что значит добавлять - так?

While Not DepUserRole.Eof do
      begin                 
       ShowMessage(DepUserRole.FieldByName('_NAME').AsString);
        begin
         Memo1.Text := Memo1.Text + DepUserRole.FieldByName('_TYPE').AsString;
         Memo10.Text := Memo10.Text + DepUserRole.FieldByName('_NAME').AsString;
         Memo17.Text := Memo17.Text + DepUserRole.FieldByName('_USERNAME').AsString;
        end;
       DepUserRole.Next;         
      end;

как после каждого прохорда по циклу выводить строку в бэнд?

Можно и так, только придётся добавить #10+#13($0A0D), чтобы текст в одну строку не был.
А вообще в компоненте, есть функции Insert, Add и т.д. и т.п.

Марина Гаврилюк

Если так, то в одной строке вывелись все 38 подразделений.
Как бы 38 строк получить в бэнде, а не одну. Не понимаю...

Memo1.Text := Memo1.Text + DepUserRole.FieldByName('_TYPE').AsString+#10+#13;
Memo10.Text := Memo10.Text + DepUserRole.FieldByName('_NAME').AsString+#10+#13;
Memo17.Text := Memo17.Text + DepUserRole.FieldByName('_USERNAME').AsString+#10+#13;
+ Благодарностей: 1

chum

#6
Марина,  MasterDataMainOnBeforePrint выполняется перед печатью КАЖДОЙ строки отчета, поэтому не надо там перебирать весь цикл. Присваивайте Memo.Text значения текущей записи, а потом делайте переход на следующую. И еще: фильтр применяйте не  в MasterDataMainOnBeforePrint, а в основном коде, сразу после DepUserRole := GetRoleTree(4);

Вот на скорую руку переделала отчет из Демо-базы, только названия своих переменных подставьте :

var
  ds1: TDataSet; 

         
 
procedure MasterDataMainOnBeforePrint(Sender: TfrxComponent);
begin
  MemoN1.Text := IntToStr(MasterDataMain.DataSet.RecNo + 1);
     

  MemoN3.Text := ds1.FieldByName('_TYPE').AsString;   
  MemoN5.Text := ds1.FieldByName('_NAME').AsString;
                         
  ds1.Next;
end;

procedure frxReport1OnStopReport(Sender: TfrxComponent);
begin
  // освобождаем для предотвращения утечки памяти   
  ds1.Free;
end; 

   
                         
begin
  //---------------------------                                                                                     
  // Начало формирования отчета
  //---------------------------                                                                 
 
 
  ds1 := GetRoleTree(4);

  ds1.First;                           
  // применяем фильтр                                                             
  ds1.Filter := Format('_TYPE=%d', [2]);            // подразделения       
  ds1.Filtered := True;
  MasterDataMain.RowCount := ds1.RecordCount;

  MemoInfo.Visible := ds1.RecordCount = 0; 
end.


В справках к ЛОЦМАН:ПГС и к ЛОЦМАН:ОРД есть раздел "Примеры создания отчетов". В нем пошаговая инструкция в трех частях с иллюстрациями и кодом
+ Благодарностей: 2

Марина Гаврилюк

Всем спасибо, тема закрыта.