Помогите неопытной программистке разобраться =)

отредактировано June 2006 Раздел: FastReport 3.0
У меня возникла такая проблема. Есть frxDBDataSet, который привязывается к конкретному ADOQuery, но тот в свою очередь не активен (потому что в нем запрос с ипользованием параметров). То есть ADOQuery становится активным и содержит какие-то записи уже в ходе выполнения программы. Поэтому в frxDataSet нельзя как обычно принято в режиме дизайна кликнуть два раза и чтобы там появился список полей. Возможно ли в ходе выполнения программы изменять содержимое этого frxDataSet и уже эти параметры толкать в отчет? Помогите пожалуйста... Как это сделать?
Делаю в дельфях

Комментарии

  • отредактировано 15:06
    написал:
    Поэтому в frxDataSet нельзя как обычно принято в режиме дизайна кликнуть два раза и чтобы там появился список полей.
    Почему нельзя?
    У меня тоже НД(набор данных) тоже собирается с использованием отбора по значению в определенных полях по значению переменных. Без передачи значений в запрос данные тебе просто не выдадуться и в отчете не будет ничего в тех местах, где используесч содержимое НД.
    А двойной щелчок нормально отрабатывает...
    тока что проверил....
  • отредактировано 15:06
    Есть несколько вариантов, для примера возьмем два крайних:
    <span style='font-size:12pt;line-height:100%'>1. Когда знаешь, какой набор данных получится в итоге</span> (т.е. знаешь, какие поля будуть на выходе запроса ADOQuery1).
    Считаем, что у нас есть следущие компоненты:
    <span style='font-family:Courier'><span style='color:blue'>TADOConnection: ADOConnection1;
    TADOQuery: ADOQuery1;
    TfrxDBDataset: frxDBDataset1;
    TfrxReport: frxReport1;
    TButton: Button1;</span></span>
    Далее настраиваем отчет:
    Создаем стандартный отчет с <span style='font-family:Courier'><span style='color:blue'>ReportTitle1, MasterData1, PageFooter1</span></span>. Задаем данные: меню <span style='font-family:Courier'><span style='color:blue'>Report -> Data</span></span> выбираем галочкой <span style='font-family:Courier'><span style='color:blue'>frxDBDataset1</span></span> (появится пустой набор данных <span style='font-family:Courier'><span style='color:blue'>frxDBDataset1</span></span>).
    Далее наполняем отчет по своему усмотрению.
    MasterData1 привязываем к набору данных (далее НД) <span style='font-family:Courier'><span style='color:blue'>frxDBDataset1</span></span>, и неважно, что он пустой.
    В тех местах, где необходимы данные с НД, пишем руками <span style='font-family:Courier'><span style='color:blue'>[frxDBDataset1."Название поля"]</span></span>.
    Для примра в <span style='font-family:Courier'><span style='color:blue'>MasterData1</span></span> кидаем два <span style='font-family:Courier'><span style='color:blue'>Memo</span></span>, заполняем их следущим образом:
    <span style='font-family:Courier'><span style='color:blue'>Текст Memo1 = [frxDBDataset1."ID"],
    Текст Memo1 = [frxDBDataset1."Name"]</span></span>.
    Допустим, что отчет у нас вызывается кнопкой <span style='font-family:Courier'><span style='color:blue'>Button1</span></span>, ее обработчик будет выглядеть следущим образом:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	try	//на случай ошибки
        {
      // создаем коннект к БД, на данном этапе соединение может уже быть создано
            ADOConnection1->ConnectionString = "Provider=ASAProv.90;User ID=1;Password=1..."; // строка коннекта
            ADOConnection1->LoginPrompt = false;    // отключаем запрос на ввод пароля
            ADOConnection1->Connected = true;    	// подключаемся
      //-------------------------------------------------------------------
      // задаем запрос, здесь можно заполнить хоть 1000 параметров! Можно создать заранее
            ADOQuery1->Close ();        // на всякий случай
            ADOQuery1->Connection = ADOConnection1;
            ADOQuery1->SQL->Text = "CALL Owner.GetClient()";	// сам запрос, у меня без параметров, но можно и заполнить
            ADOQuery1->Open ();        	// открываем НД
      //-------------------------------------------------------------------
      // передаем данные в FastReport
            frxDBDataset1->DataSet = ADOQuery1;    	
      //-------------------------------------------------------------------
      // показываем уже заполненный отчет
            frxReport1->ShowReport(true);
      //-------------------------------------------------------------------
            ADOQuery1->Close ();        //освобождаем память
      //-------------------------------------------------------------------
        }
        catch (...)
        {
        	Application->MessageBoxA("Ошибка", "Ошибка", MB_OK);
      //-------------------------------------------------------------------
        }
    }
    //---------------------------------------------------------------------------
    
    В данном примере данные беруться из набора, который заполняется по ходу выполнения программы, но мы заранее знаем, что конкретный отчет под конкретный запрос.

    <span style='font-size:12pt;line-height:100%'>2. Когда известно о данных из запроса становится только в ходе выполнения программы.</span>
    Аналогично, компоненты:
    <span style='font-family:Courier'><span style='color:blue'>TADOConnection: ADOConnection1;
    TADOQuery: ADOQuery1;
    TfrxDBDataset: frxDBDataset1;
    TfrxReport: frxReport1;
    TButton: Button1;</span></span>
    Далее создаем отчет:
    Создаем стандартный отчет с <span style='font-family:Courier'><span style='color:blue'>ReportTitle1, MasterData1, PageFooter1</span></span>.Далее наполняем шапку и константные выражения. В тех местах, где необходимы данные с НД, выкладываем пустые <span style='font-family:Courier'><span style='color:blue'>Memo</span></span>.
    Для примра в <span style='font-family:Courier'><span style='color:blue'>MasterData1</span></span> кидаем два <span style='font-family:Courier'><span style='color:blue'>Memo</span></span> (<span style='font-family:Courier'><span style='color:blue'>Memo2</span></span> и <span style='font-family:Courier'><span style='color:blue'>Memo3</span></span>) и никак их не заполняем:
    Допустим, что отчет у нас вызывается кнопкой <span style='font-family:Courier'><span style='color:blue'>Button1</span></span>, ее обработчик будет выглядеть следущим образом:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    	try	//на случай ошибки
        {
      // создаем коннект к БД, на данном этапе соединение может уже быть создано
            ADOConnection1->ConnectionString = "Provider=ASAProv.90;User ID=1;Password=1..."; // строка коннекта
            ADOConnection1->LoginPrompt = false;    // отключаем запрос на ввод пароля
            ADOConnection1->Connected = true;    	// подключаемся
      //-------------------------------------------------------------------
      // задаем запрос, здесь можно заполнить хоть 1000 параметров! Можно создать заранее
            ADOQuery1->Close ();        // на всякий случай
            ADOQuery1->Connection = ADOConnection1;
            ADOQuery1->SQL->Text = "CALL Owner.GetClient()";	// сам запрос, у меня без параметров, но можно и заполнить
            ADOQuery1->Open ();        	// открываем НД
      //-------------------------------------------------------------------
      // передаем данные в FastReport
            frxDBDataset1->DataSet = ADOQuery1;    	
      //-------------------------------------------------------------------
      // добавляем НД в отчет и выводим нужные поля
            frxReport1->DataSets->Add(frxDBDataset1);  	// добавляем НД в отчет
      // передаем MasterData1 НД
            ((TfrxMasterData *) frxReport1->FindObject("MasterData1"))->DataSet = frxReport1->GetDataset("frxDBDataset1");
      // передаем в Memo нужные данные
            ((TfrxMemoView *) frxReport1->FindObject("Memo2"))->Text = "[frxDBDataset1.\"ID_Client\"]";
            ((TfrxMemoView *) frxReport1->FindObject("Memo3"))->Text = "[frxDBDataset1.\"NameForChoice\"]";
      //-------------------------------------------------------------------
      // показываем уже заполненный отчет
            frxReport1->ShowReport(true);
      //-------------------------------------------------------------------
            ADOQuery1->Close ();        //освобождаем память
      //-------------------------------------------------------------------
        }
        catch (...)
        {
        	Application->MessageBoxA("Ошибка", "Ошибка", MB_OK);
      //-------------------------------------------------------------------
        }
    }
    //---------------------------------------------------------------------------
    

    P.S. Надеюсь не составит труда перевести с Builder'а на Delphi.
  • NauNau
    отредактировано 15:06
    если не зависимо от параметров ADOQuery возвращает данные одинаковой структуры (кол-во и названия полей одинаково) то можно поступить проще.
    Можно задать некоторые значения этим параметрам и активизировать ADOQuery в дизайн-тайме, а потом дизайнить отчет.
Дискуссия закрыта.