Объединить строки столбца в ячейку

DelphistDelphist Россия - Воронеж
отредактировано 11:46 Раздел: FastReport 3.0
Как в отчете объединить строки столбца в ячейку см. архив там 2 рисунка как сейчас выводится и как надо.

Комментарии

  • отредактировано 11:46
    Допустим, Field1 - одно из полей запроса m_pDataQuery. Оно строковое, и по нему надо объединять ячейки. Field1Memo, - ячейка для этого поля, находится в MasterData1.
    Код на C++Script:
    String sField1;     //значение поля на предыдущем шаге
    
    void MasterData1OnAfterCalcHeight(TfrxComponent Sender)
    {
      if ((Engine.freespace < 2*Field1Memo.Height) && (Engine.freespace > Field1Memo.Height))
        Field1Memo.Frame.Typ += ftBottom;
      //----------------------------------------------------------------------
    }
    //------------------------------------------------------------------------
    
    void Field1MemoOnBeforePrint(TfrxComponent Sender)
    {
      if (sField1 == <m_pDataQuery."Field1">)
        Field1Memo.Frame.Typ = ftLeft + ftRight;
      else
        Field1Memo.Frame.Typ = ftLeft + ftRight + ftTop;
      //----------------------------------------------------------------------
      m_pDataQuery.Next;
      if (m_pDataQuery.Eof)
        Field1Memo.Frame.Typ += ftBottom;
      else
        m_pDataQuery.Prior;
      //----------------------------------------------------------------------
      sField1 =  <m_pDataQuery."Field1">;
      //----------------------------------------------------------------------
    }
    //------------------------------------------------------------------------
    
    {
      sField1   = "";
      //----------------------------------------------------------------------
    }
    //------------------------------------------------------------------------
    
  • DelphistDelphist Россия - Воронеж
    отредактировано July 2006
    aseroff написал:
    Допустим, Field1 - одно из полей запроса m_pDataQuery. Оно строковое, и по нему надо объединять ячейки. Field1Memo, - ячейка для этого поля, находится в MasterData1.
    Код на C++Script:
    Можно пример на Delph'ях
  • отредактировано 11:46
    на Delph'ях
    
    - Создайте одноименные события;
    - Поменяйте { на begin, } на end;
    - Поменяйте знаки сравнения и присваивания;
    - Замените конструкции if (...) {...} else {...} на if ... then begin...end else begin...end
    - Измените инициализацию строковой константы с "" на '';
    - Исправьте оставшиеся ошибки;



  • DelphistDelphist Россия - Воронеж
    отредактировано July 2006
    String sField1;     //значение поля на предыдущем шаге
    
    void MasterData1OnAfterCalcHeight(TfrxComponent Sender)
    {
      if ((Engine.freespace < 2*Field1Memo.Height) && (Engine.freespace > Field1Memo.Height))
        Field1Memo.Frame.Typ += ftBottom;
      //----------------------------------------------------------------------
    }
    
    Где ты берешь событие AfterCalcHeight.
    И какой тип у MasterData1
  • DelphistDelphist Россия - Воронеж
    отредактировано 11:46
    aseroff написал:
    на Delph'ях
    
    - Создайте одноименные события;
    - Поменяйте { на begin, } на end;
    - Поменяйте знаки сравнения и присваивания;
    - Замените конструкции if (...) {...} else {...} на if ... then begin...end else begin...end
    - Измените инициализацию строковой константы с "" на '';
    - Исправьте оставшиеся ошибки;
    && это аналог or или and
  • отредактировано 11:46
    && это and
  • DelphistDelphist Россия - Воронеж
    отредактировано 11:46
    aseroff написал:
    .....
    m_pDataQuery.Next;
    ....
    
    При компилировании пишет что m_pDataQuery не определ.
    У меня m_pDataQuery это
    frdsTechCardRaw: TfrxDBDataSet
  • отредактировано 11:46
    А почему не воспользоваться вложенным отчетом???
  • DelphistDelphist Россия - Воронеж
    отредактировано 11:46
    Troglodit написал:
    А почему не воспользоваться вложенным отчетом???
    Это как?
  • отредактировано 11:46
    Есть такой компонент вложенный отчет, первая колонка будет в основном отчете, а все остальное во вложенном и будет тебе счастье...
  • DelphistDelphist Россия - Воронеж
    отредактировано 11:46
    Troglodit написал:
    Есть такой компонент вложенный отчет, первая колонка будет в основном отчете, а все остальное во вложенном и будет тебе счастье...
    Нет мне больше понравился способ aseroff. Только на мой вопрос он что-то не отвечает.
  • DelphistDelphist Россия - Воронеж
    отредактировано July 2006
    String sField1;     //значение поля на предыдущем шаге
    void Field1MemoOnBeforePrint(TfrxComponent Sender)
    {
    ...
      m_pDataQuery.Next;
    ...
    
    Все разобрался я с m_pDataQuery надо за место m_pDataQuery писать YourDataBand.
    И тогда m_pDataQuery.Next надо писать как YourDataBand.DataSet.Next

    Теперь к тебе большая просьба прокоментировать как функционирует приведенный тобой код.
    И как отцентровать результат в полученной ячейке?
  • отредактировано 11:46
    ;)
    Почитал, прикольно!

    В общем, "как вы яхту назовете, так она и поплывет", неважно как называется переменная или объект, важно, чтобы программист отличал одно от другого по названию.
  • отредактировано 11:46
    написал:
    как отцентровать результат в полученной ячейке?
    Не пробовал, думаю, что это и не надо. Название в первой строчке - это более официально и больше подходит под ГОСТ.

    Можно при втором проходе по отчету, сделать заранее расчитанную строчку видимой. Но это будет непросто.
    написал:
    большая просьба прокоментировать
    String sField1;     // значение поля на предыдущем шаге
    
    // определяем окончание страницы
    void MasterData1OnAfterCalcHeight(TfrxComponent Sender)
    {
     // Если на следущем шаге поле не поместится на страницу,
     if ((Engine.freespace < 2*Field1Memo.Height) && (Engine.freespace > Field1Memo.Height))
       // то отчертить нижнюю границу у мемо
       Field1Memo.Frame.Typ += ftBottom;
     //----------------------------------------------------------------------
    }
    //------------------------------------------------------------------------
    
    void Field1MemoOnBeforePrint(TfrxComponent Sender)
    {
     // Если значения на текущем и на предыдущем шагах совпадают,
     if (sField1 == <m_pDataQuery."Field1">)
       // то границы - левая и правая
       Field1Memo.Frame.Typ = ftLeft + ftRight;
     else
       // иначе - левая, правая, верхняя
       Field1Memo.Frame.Typ = ftLeft + ftRight + ftTop;
     //----------------------------------------------------------------------
     // Проверяем на окончание данных.
     m_pDataQuery.Next; // перемещаемся на следущую запись
     // Если она указывает на окончание данных,
     if (m_pDataQuery.Eof)
       // то отчерчиваем нижнюю границу
       Field1Memo.Frame.Typ += ftBottom;
     else
       // иначе возврашаемся в наборе данных на шаг назад
       m_pDataQuery.Prior;
     //----------------------------------------------------------------------
     // Устанавливаем значение предыдущего шага текущим.
     sField1 =  <m_pDataQuery."Field1">;
     //----------------------------------------------------------------------
    }
    //------------------------------------------------------------------------
    
    {
     sField1   = ""; // начальная инициализация значения на предыдущем шаге
     //----------------------------------------------------------------------
    }
    //------------------------------------------------------------------------
    
  • DelphistDelphist Россия - Воронеж
    отредактировано August 2006
    Отцентровать реально. Я поступил так:
    создал новое поле Flag в котором на против каждой записи ставится цифра 1 или 2 или 3 или 0
    1-начало записи
    2 - запись по середине
    3 - конец записи
    0 - обычная запись
    значение записи 1,3,0 приcваевается ''
    После этого с помощью FastScript'a ведется обработка и соответственно добавляются ftBottom или ftTop
    procedure DozatorNameOnBeforePrint(Sender: TfrxComponent);
    begin
    //DozatorName - типа TfrxMemoView
     DozatorName.Frame.Typ := ftLeft + ftRight;
     if <frdsTechCardRaw."Flag"> = 1 then
       DozatorName.Frame.Typ := DozatorName.Frame.Typ + ftTop
     else if <frdsTechCardRaw."Flag"> = 3 then
       DozatorName.Frame.Typ := DozatorName.Frame.Typ + ftBottom
    end;
    
    Спасибо всем кто участвовал в обсуждении данной темы.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.