Cross-tab старый стиль

отредактировано 03:25 Раздел: FastReport 4.0
Здравствуйте.

делаю кростаб старого стиля. Потожил все бэнды. Все вроде так. Выводятся строки как надо. Колонки вроед тоже как надо. В первом датасете выбираются инфа на строки. Во втором - на колонки. Какой запрос надо делать чтобы корректро выводились наднные на пересечении. Я так понимаю что необходим третий датасет с запросом. но не соображу какой.
Может у кого ест пример рабочий (с текстом запросов)

Спасибо

Комментарии

  • LutecijLutecij СПб
    отредактировано 03:25
    AndrewVL написал: »
    Здравствуйте.

    делаю кростаб старого стиля. Потожил все бэнды. Все вроде так. Выводятся строки как надо. Колонки вроед тоже как надо. В первом датасете выбираются инфа на строки. Во втором - на колонки. Какой запрос надо делать чтобы корректро выводились наднные на пересечении. Я так понимаю что необходим третий датасет с запросом. но не соображу какой.
    Может у кого ест пример рабочий (с текстом запросов)

    Спасибо

    Например вот так:
      qty.sql.add('SELECT S5.FACT_START, S5.FACT_END, S5."NUMBER", S5.PLANNED_START');                                  
      qty.sql.add('FROM');
      qty.sql.add('SM7DBA.CM3RM1 S3');  
      qty.sql.add('INNER JOIN SM7DBA.CM3TM1 S5 on S5."PARENT_CHANGE"=S3."NUMBER"');      
      qty.sql.add('WHERE');
      qty.sql.add('S5."CATEGORY_ID" = ' + IntToStr(<Equuipment."CATEGORY_ID">)+' AND ');                                        
      qty.sql.add('S3."NUMBER" = '+chr(39)+<BuildPlans."NUMBER">+chr(39));
    

    где Equuipment датасет вертикального бэнда а BuildPlans датасет горизонтального
  • отредактировано 03:25
    Lutecij написал: »
    Например вот так:
      qty.sql.add('SELECT S5.FACT_START, S5.FACT_END, S5."NUMBER", S5.PLANNED_START');                                  
      qty.sql.add('FROM');
      qty.sql.add('SM7DBA.CM3RM1 S3');  
      qty.sql.add('INNER JOIN SM7DBA.CM3TM1 S5 on S5."PARENT_CHANGE"=S3."NUMBER"');      
      qty.sql.add('WHERE');
      qty.sql.add('S5."CATEGORY_ID" = ' + IntToStr(<Equuipment."CATEGORY_ID">)+' AND ');                                        
      qty.sql.add('S3."NUMBER" = '+chr(39)+<BuildPlans."NUMBER">+chr(39));
    

    где Equuipment датасет вертикального бэнда а BuildPlans датасет горизонтального


    т.е. получается что в отчете 3 датасета? Тут приведен запрос для датасета на пересечения? Тогда вопрос - qty.sql.add когда формирует этот запрос? Можно четь пошире пояснить принцип старого кростаба?
  • LutecijLutecij СПб
    отредактировано 03:25
    AndrewVL написал: »
    т.е. получается что в отчете 3 датасета? Тут приведен запрос для датасета на пересечения? Тогда вопрос - qty.sql.add когда формирует этот запрос? Можно четь пошире пояснить принцип старого кростаба?

    В данном примере он формируется на OnBrforePrint у мемо стоящего на пересечении. Но теоретически он может и не формироваться динамически, а быть связаным с двумя датасетами через параметры.

    Принцип простой, допустим есть горизонтальный бенд привязаный к датасету А и вертикальный бенд привязаный к датасету Б.
    При формировании отчета сначала отображается первая строка - датасет А становится на первую запись, после этого отображается первый столбец - датасет Б становится на первую запись, в этот момент мы можем на основе первых записей датасетов вычислить некие данные, сформировать зависимый запрос и т.п. и вывести результат на пересечении этих бэндов. После этого отображается второй столбец - датасет Б становиться на вторую свою запись - исходные данные для вычислений на пересечении меняются и если есть некий датасет В у которого имеется привязка к датасетам А и Б то он будет пересчитан на основе новых данных. И так пока не закончится датасет Б. После чего отображается вторая строка - датасет А становится на вторую свою запись, а датасет Б вноь начинает отсчет с первой поиции.

    Вот примерно так.
  • RhinoFCRhinoFC Новосибирск
    отредактировано 03:25
    Lutecij написал: »
    В данном примере он формируется на OnBrforePrint у мемо стоящего на пересечении. Но теоретически он может и не формироваться динамически, а быть связаным с двумя датасетами через параметры.

    Принцип простой, допустим есть горизонтальный бенд привязаный к датасету А и вертикальный бенд привязаный к датасету Б.
    При формировании отчета сначала отображается первая строка - датасет А становится на первую запись, после этого отображается первый столбец - датасет Б становится на первую запись, в этот момент мы можем на основе первых записей датасетов вычислить некие данные, сформировать зависимый запрос и т.п. и вывести результат на пересечении этих бэндов. После этого отображается второй столбец - датасет Б становиться на вторую свою запись - исходные данные для вычислений на пересечении меняются и если есть некий датасет В у которого имеется привязка к датасетам А и Б то он будет пересчитан на основе новых данных. И так пока не закончится датасет Б. После чего отображается вторая строка - датасет А становится на вторую свою запись, а датасет Б вноь начинает отсчет с первой поиции.

    Вот примерно так.

    ХМ... Это всё, конечно, правильно, но в этом случае получается, что запрос С, вычисляющий значения на пересечениях будет выполняться чёрт знает сколько раз. А если он (запрос этот) сравнительно "тяжёлый"? У меня, например, запрос этот выполняется ~5 c.. Ждать замучаетесь.
    Есть другой вариант. Выполнить запрос С один раз. Пусть он возвращает три поля "select A, B, C from table..." и покрывает перечень всех возможных значений.
    Далее, на месте перечечения положите пустой Memo, на OnBeforePrint которого напишите:
    procedure memValueOnBeforePrint(Sender: TfrxComponent);
    var
      V: Variant;                                        
    begin
      if queryC.Locate('A;B', [<queryA."A">,<queryB."B">], 0) then
        if <queryC."C"> <> null then                                                                                                                    
          memValue.Text := <queryC."C">;
    end;
    

    И все.

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

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