Data bend

отредактировано 21:56 Раздел: FastReport 3.0
Есть дата бенд, там необходимо поместить несколько ячеек с результатами запросов, но дата бенд можно подключить только к одному дата сорсу, а там должны быть результаты нескольких запросов. Как сдлать не пойму. Кто знает подскажите!

Комментарии

  • отредактировано 21:56
    Подключаешь DataBend к Одному главному запросу У всех остальных запросов выставляешь Master - ом этот запрос и пишешь в полях.
    Memo1.Text := '[IBXQuery1."NAME"]';
    Memo2.Text := '[IBXQuery2."Phone"]';
    и т.д.
    А лучше соединить этот запрос Left join - ом
  • отредактировано 21:56
    к DB подключаю один из ADOQuery, в остальных ставлю его мастером, при чем запросы подключены в самом FR, если тут все правильно? то в итоге отображается только запрос подключенного, из остальных берется только льшь первое значение
  • отредактировано 21:56
    Может запрос возвращяет только одно значение или все одинаковые, проверь. Еще посмотри чтоб сами запросы были соединены условиями. Например Where id=:IDNAME
    в params прописываешь IDNAME=ADOQuery."ID"
  • отредактировано 21:56
    Запросы присоедененные к мастеру отдельно возвращают список различных значений. А вот как запрсы соеденить условиями я что то не понял(
  • отредактировано 21:56
    Чтоб запросы возвращяли списки значений нужно их объединить условиями
    например:
    В первом запросе пишешь: SELECT KOD,NAME FROM TABLENAME
    Во втором запросе выставляешь мастером 1 запрос
    а в селекте прописывваешь примерно так
    SELECT PHONE FROM TABLEPHONE WHERE KODNAME=:KOD
    А в params второго запроса, параметру KOD напротив пропишешь ADOQuery1."KOD"
    примерно так.
  • отредактировано 21:56
    написал:
    должны быть результаты нескольких запросов
    Ставим, как обычно, MasterData, задаем ему датасет (frxQuery1), одному Memo выставляем значение из этого запроса ([ADOQuery1."Field1"]).
    Далее обрабатываем событие и заполняем данными из ворого запроса (ADOQuery2).
    void MasterData1OnBeforePrint(TfrxComponent Sender)
    {
      Memo2.Text = FloatToStr (<ADOQuery2."Field4">);
      ADOQuery2.Next ();
    }
    
    {
      ADOQuery2.First ();
      //----------------------------------------------------------------------
    }
    
  • отредактировано 21:56
    В таком случае Данные 1 запроса не будут связанны с данными 2.
    Можно написать запрос таким образом
    SELECT T1.NAME, T2.PHONE
    FROM TABLE1 T1
    LEFT JOIN TABLE2 T2 ON T1.KOD=T2.KODNAME
    тогда получиться 1 запрос и данные привязанны друг к другу.
    но если конечно тебе не важно связанны они или нет то предидущий вариант тебе подойдет...
  • отредактировано 21:56
    Izolda, использовал твой первый предложенный способ, плчему в таком случае при нажатии на мемо и выплывании меню там нет необходимых ячеек? DB прикреплен к главному запрсу.
  • отредактировано 21:56
    Там будут только те ячейки которые есть в главном запросе, а остальные придеться в редакторе прописать [ADOQuery2."Field1"]
  • отредактировано 21:56
    Izolda написал:
    В первом запросе пишешь: SELECT KOD,NAME FROM TABLENAME
    Во втором запросе выставляешь мастером 1 запрос
    а в селекте прописывваешь примерно так
    SELECT PHONE FROM TABLEPHONE WHERE KODNAME=:KOD
    А в params второго запроса, параметру KOD напротив пропишешь ADOQuery1."KOD"
    примерно так.
    В первом запросе KODNAME или все таки KOD,NAME??
    Для дрегих запростов (где первый запрос ADOQuery1 выставлен мастером) в селектк пишу свой запрос и в конце просто добавляю WHERE KODNAME=:KOD? А в Params этого (подчененного) запроса пишу для KOD его тип и ADOQuery1."KOD" в этом случае вылазиет ошибка того что параметр не определен. Может я что то не так делаю?
  • отредактировано 21:56
    написал:
    В первом запросе KODNAME или все таки KOD,NAME??
    Для дрегих запростов (где первый запрос ADOQuery1 выставлен мастером) в селектк пишу свой запрос и в конце просто добавляю WHERE KODNAME=:KOD? А в Params этого (подчененного) запроса пишу для KOD его тип и ADOQuery1."KOD" в этом случае вылазиет ошибка того что параметр не определен. Может я что то не так делаю?

    В первом запосе все таки KOD, NAME(если ты написал в первом запросе KODENAME, то тогда в подчиненых запросах в params полю KOD присваивай ADOQuery1."KODENAME"), под полем код подразумеваеться поле по которому связаны две разные таблицы. Тип можешь не выставлять Fast Report сам определит какой тип.
  • отредактировано 21:56
    Izolda, выодит все, но как и раньше почему то подчиненные запросы выдают только одно и то же значение, хотя при их отдельном запуске фоормируются список с разными (как и надо)...разбираюсь...
  • отредактировано 21:56
    Izolda, вот если так
    написал:
    SELECT KOD,NAME FROM TABLENAME
    , то KOD должен быть полем? А есль нет то его надо где то описать?
  • отредактировано 21:56
    написал:
    Izolda, вот если так
    QUOTE 
    SELECT KOD,NAME FROM TABLENAME

    , то KOD должен быть полем? А есль нет то его надо где то описать?
    Естественно!
    Я делаю так(Правда я работаю с IBXQuery)
    Мой запроc IBXQueryZAK
    в селекте у него написал SELECT F_ID FROM ZAK WHERE KOD=100
    второй запрос IBXQueryZAK_
    в селекте у него пишу
    Select NAME FROM ZAK_ WHERE PARENT=:ID
    в params я ID присваиваю IBXQueryZAK."F_ID" мастером выставляю IBXQueryZAK и все у меня работает нормально!
  • отредактировано 21:56
    Я делаю так:
    в ADOQuery1 в SQl пишу
    SELECT top 10 LF
    FROM A INNER JOIN
    RAD ON A.ID = RAD.ID_A INNER JOIN
    P_RAD ON RAD.ID = P_RAD.ID_RAD
    В ADOQuery2 делаю мастером ADOQuery1 и в SQL пишу:
    SELECT LTRIM(RIGHT(A.Z, 4)) + '\' + LTRIM(STR(A.D) + '\' + A.I) AS Expr1
    FROM A INNER JOIN
    RAD ON A.ID = RAD.ID_A INNER JOIN
    P_RAD ON RAD.ID = P_RAD.ID_RAD
    WHERE LF=:COD
    И там же (в ADOQuery2) в Params: COD <data type> ADOQuery1."LF"

    Сам Master Data прикрплен к ADOQuery1.
    В итоге Expr1 выводится везде но только его первре значение.
    Может что то не так? Подскажите в чем моя ошибка пожалуйста ;)
  • отредактировано 21:56
    Felan Kell написал:
    SELECT    top 10 LF
    FROM        A INNER JOIN
                          RAD ON A.ID = RAD.ID_A INNER JOIN
                          P_RAD ON RAD.ID = P_RAD.ID_RAD
    Что у тебя означает top 10 LF? Если это функция которая возвращяет 10 верхних значений в таблице, то синтаксис не понятный у нее, может top(10,A.LF) AS LF, но бог с ней.
    А почему нельзя сделать так... Написать один запрос...
    Пробуй написать:
    ADOQuery1.SQL
    SELECT top 10 A.LF, (LTRIM(RIGHT(A.Z, 4)) + '\' + LTRIM(STR(A.D) + '\' + A.I)) AS Expr1
    FROM A
    INNER JOIN RAD ON A.ID = RAD.ID_A
    INNER JOIN P_RAD ON RAD.ID = P_RAD.ID_RAD
  • отредактировано 21:56
    Можно написать и в один запрос, я это уже сделал!), но все же остается вопрос почему не получалось по другому, так как если появится новое поле которое необходимо надо будет вывестито придется писать запрос весь заново ;)
  • отредактировано 21:56
    Во время заполнения мастердаты данными из одного запроса, в событии у мастердаты OnBeforePrint, заполняешь остальные мемо данными из других запросов при этом вручную переключаешь указатель на строчку в нужном наборе данных на следущую (Next).
    Две-три строчки кода.
  • отредактировано 21:56
    написал:
    вручную переключаешь указатель на строчку в нужном наборе данных на следущую (Next)
    Это как? (я тут с синтаксисом не очень знаком)
  • отредактировано 21:56
    написал:
    Это как?
    C++Script
    void MasterData1OnBeforePrint(TfrxComponent Sender)
    {
      Memo1.Text = <SomeQuery."SomeFieldName">;
      SomeQuery.Next ();
    }
    
    PascalScript
    procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
    begin
      Memo1.Text = <SomeQuery."SomeFieldName">;
      SomeQuery.Next;
    end;
    
  • отредактировано 21:56
    aseroff большое спасибо!!! правда я так и делал, но значит это не тут ошибка. а результат такой что прикрепленные запросы выводятся только первым полем
  • отредактировано 21:56
    Попробуйте создать заново простенький отчет с одной мастердатойи двумя запросами.
    У меня так получилось:
    Есть запрос m_pDataQuery, на нем висит MasterData1.
    В MasterData1 2 MEMO. Первое (Memo1) заполняется из m_pDataQuery (поставил значнеие в дизайнере отчета). А второе (Memo2) из дополнительного запроса ADOQuery1 через событие OnBeforePrint того самого MasterData вот так:
    void MasterData1OnBeforePrint(TfrxComponent Sender)
    {
      Memo2.Text = <ADOQuery1."Balance">;
      ADOQuery1.Next ();
    }
    
    И все работает четко.

    Я вам советую попробовать создать простенький отчет с нуля. И не играться особо настройками. Тогда поймете, где ошибка.
  • отредактировано 21:56
    aseroff ОГРОМНОЕ СПАСИБО!!! все работает!
  • отредактировано 21:56
    Так в чем же было дело?
    Очень интересно!
  • отредактировано 21:56
    сейчас проблема была лишь в том что я думал что Вы лишь дополняете те идеи которые были предложены ранее. Так, например, Izolda предложил такой подход
    написал:
    Чтоб запросы возвращяли списки значений нужно их объединить условиями
    например:
    В первом запросе пишешь: SELECT KOD,NAME FROM TABLENAME
    Во втором запросе выставляешь мастером 1 запрос
    а в селекте прописывваешь примерно так
    SELECT PHONE FROM TABLEPHONE WHERE KODNAME=:KOD
    А в params второго запроса, параметру KOD напротив пропишешь ADOQuery1."KOD"
    и я использовал те же запросы, после того как убрал where все стало нормально! Вот и все! ;)
  • отредактировано 21:56
    Можно было и так.
    Надо только постоянно формировать запрос (я про второй select) и его вызывать на событии OnBeforePrint.
    Тогда каждый раз запрос будет возвращать нужные значения.
    Но этот вариант мне кажется немного сложнее.

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

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