генирация в определенном порядке

отредактировано 13:52 Раздел: FastReport 3.0
Существует определенной количество записей, скажем N (порядка 10 000).
Необходимо чтобы отчет формировался по две записи на листе следующим образом:
первый лист
первая запись
N/2 запись
второй лист
вторая запись
N/2+1 запись
...
N/2-1 лист
N/2-1 запись
N запись


Есть идея печатать отчет в два прохода. На первом проходе печатаем первую половину каждого листа. На втором - вторую половину. Но вот не могу найти способа возврата к первому листу. Или есть какие-нибудь другие варианты решить такую задачу?

Комментарии

  • Andrew_ShAndrew_Sh г.Минск
    отредактировано December 2005
    SELS написал:
    Существует определенной количество записей, скажем N (порядка 10 000).
    Необходимо чтобы отчет формировался по две записи на листе следующим образом:
    первый лист
          первая запись
                N/2 запись
    второй лист
          вторая запись
            N/2+1 запись
    ...
    N/2-1 лист
          N/2-1 запись
              N  запись


    Есть идея печатать отчет в два прохода. На первом  проходе печатаем первую половину каждого листа. На втором - вторую половину.  Но вот не могу найти способа возврата к первому листу. Или есть какие-нибудь другие варианты решить такую задачу?

    Вариант 1:
    А возможности произвести сортировку данных в запросе нет?
    Тогда можно было бы свести к использованию такого скрипта:
    var
      iLineCount: integer = 0;
    const
      LINES_PER_PAGE = 2; // строк на лист
    
    procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
    begin
      inc(iLineCount);
      if iLineCount > LINES_PER_PAGE
        then begin
          iLineCount := 1;
          Engine.NewPage;
        end;
    end;
    
    begin
    
    end.
    
    где MasterData1OnBeforePrint - это обработчик для события OnBeforePrint вашего Master-бэнда.

    Вариант 2:
    Разделить данные на два датасета - DataSet1, DataSet2. DataSet1 привязать к MasterData и в обработчике OnBeforePrint выполнять
      DataSet2.Next;
    
    На MasterData выводить поля DataSet1 и DataSet2
  • LexLex
    отредактировано 13:52
    Как вариант в обработчике OnBeforePrint напиши что-то типа
    написал:
    if <line#> > 1 then
    begin
      if <line#> mod 2 =0 then
      begin
        // next-ами в цикле перемещаешься на N/2 + <line#> запись
      end else
      begin
        // prior-ами в цикле перемещаешься на <line#>/2 запись
      end;
    end;
    мог ошибиться в номерах записей но думаю смысл понятен,
    ну и плюс
    написал:
    Тогда можно было бы свести к использованию такого скрипта:


    CODE 

    var
    iLineCount: integer = 0;
    const
    LINES_PER_PAGE = 2; // строк на лист

    procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
    begin
    inc(iLineCount);
    if iLineCount > LINES_PER_PAGE
      then begin
        iLineCount := 1;
        Engine.NewPage;
      end;
    end;

    begin

    end.



    где MasterData1OnBeforePrint - это обработчик для события OnBeforePrint вашего Master-бэнда.


    Хотя всеже лучше отсортировать в запросе.
  • отредактировано 13:52
    Next и Prior в цикле не спасают компьютер не справляется.
    И записи это скорее готовые отчеты в которых есть masterData и много DetailData и почти на каждый бенд есть onBefore....
    Можно по подробнее про два DataSet`а?
    Сортировка в запросе тоже не возможна.
  • отредактировано 13:52
    Как это сортировка невозможна ?

    А можно увидеть запрос (SQL) или таблицы-dataset в Delfi (указание индексного поля) ?, список полей ?

  • Andrew_ShAndrew_Sh г.Минск
    отредактировано 13:52
    SELS написал:
    Next и Prior в цикле не спасают компьютер не справляется.
    И записи это скорее готовые отчеты в которых есть masterData и много DetailData и почти на каждый бенд есть onBefore....
    Можно по подробнее про два DataSet`а?
    Сортировка в запросе тоже не возможна.
    Переосмыслил вопрос с разделнием DataSet-а на 2 DataSet и пришел к выводу, что это очень трудоемко будет.

    Если невозможна сортировка, то может стоит попробовать создать виртуальный датасет и скопировать записи из исходного источника с нужным порядком записей?

    Еще вариант - использовать событие OnManualBuild для страницы отчета, гонять указатель на нужные номера записей и печатать бэнды.
  • gpigpi
    отредактировано 13:52
    А если попробовать создать два одинаковых датасета, сделать выборку в оба (или скопировать данные из первого во второй) и в начале формирования отчёта во втором датасете переместиться на запись с номером N/2+1 и затем выводить строку первого датасета, строку второго, DataSet2.Next и т. д.
    Если SQL-сервер позволяет, можно сначала определить N, а затем в первый датасет отобрать SELECT FIRST N/2 .... ,а во второй - SELECT SKIP N/2 .... или что-нибудь подобное
  • отредактировано 13:52
    Всего в программе используются 7 запросов и 7 DataSet`ов. Шесть запросов привязаны к первому.
    написал:
    Если невозможна сортировка, то может стоит попробовать создать виртуальный датасет и скопировать записи из исходного источника с нужным порядком записей?
    А как копировать в нужном порядком? Я так понял, что копиравание создать DataSet с уже нужным порядком записей?

    написал:
    гонять указатель на нужные номера записей и печатать бэнды.
    Чем гонять, next и prior не подходят. Получается надо в цикле 5000 раз next потом 4999 вверх и так для каждой строчки.
    Если кто-нибудь знает как перемещаться иным способом подскажите.
    написал:
    переместиться на запись с номером N/2+1 и затем выводить строку первого датасета, строку второго, DataSet2.Next и т. д.
    А как при это будут отрабатывать другие DataSet`ы т.е. остальные 6 привязанные к первому по id?


    Как альтернатива. Есть ли возможность вы водить на печать (на принтер) готовые страницы отчета в заданном порядке, т.е. печатать страницы: 1, н/2+1, 2, н/2+2 итд?
  • отредактировано 13:52
    Все это должно делаться средствами движка базы данных. Ты ж формулы написал. Выбери данные во временную таблицу и перенумеруй.

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

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