Как прицепить MasterBand к не сущ-му Dataset'у?

jonny3djonny3d Чебоксары
отредактировано 01:49 Раздел: FastReport 3.0

Создаю frDB = CREATEOBJECT('FastReport.TfrxADODatabase'), цепляю его к базе.

Создаю frDataSet = CREATEOBJECT('FastReport.TfrxADOQuery'), даю ей имя 'c_Data', цепляю к frDB, назначаю запрос.


Создаю объект FR = CREATEOBJECT('FastReport.TfrxReport') и загружаю в него шаблон. В этом шаблоне только MasterData Band с Memo1, в которой - [c_Data."link"].

При выводе - ошибка отсутствия источника и это логично. Вопрос - как прицепить источник данных к отчету после его загрузки? По сути, всё сделано по примеру, идущему в комплекте с Fast Report Studio.

Если же c_Data (TfrxADOQuery) создать в самом шаблоне, то тогда d самом дизайнере я смогу прицепить MasterData1.DataSet = c_Data и, логично, всё заработает. Если же в шаблоне этого c_Data нет, а создаю его я извне, то как его прицепить к источнику MasterData?

ПС. Среда раз работки - Visual Fox Pro
ПС2. Есть опыт работы с FR2.54 в среде Делфи, а сейчас вот в VFP с FR3..

Комментарии

  • jonny3djonny3d Чебоксары
    отредактировано 01:49
    Кроме того, есть метод FindObject..

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

    Вот что пытаюсь:

    fr = CREATEOBJECT('FastReport.TfrxReport')
    fr.LoadReportFromFile('test.fr3')
    frBand = fr.FindObject('MasterData1')
    frBand.DataSet = 'c_Data' && здесь происходит вылет..

  • отредактировано 01:49
    написал:
    frBand = fr.FindObject('MasterData1')
    А зачем?
    Разве нельзя написать:
    fr.Dataset:= 'c_Data'
    Хотя опыта работы с Visual Fox PRo у меня нет.
  • jonny3djonny3d Чебоксары
    отредактировано 01:49
    GloThin написал:
    GloThin написал:
    frBand = fr.FindObject('MasterData1')
    А зачем?
    Разве нельзя написать:
    fr.Dataset:= 'c_Data'
    Хотя опыта работы с Visual Fox PRo у меня нет.
    Ругается - OLE error: неизвестное имя..
    Что, в принципе, и логично. 'c_Data' - это лишь свойство объекта, определенного за пределами экземпляра FastReport'а..

    fr.Dataset = frDataset не катит с той же ошибкой..

    В общем, всё как я и подозревал - наличие области "подключенных" источников данных. Созданный объект присоединяется к fr через SelectDataset.

    Таким образом на данном этапе получаю:
    frDB = CREATEOBJECT('FastReport.TfrxADODatabase')
    frDB.LoginPrompt = .F.
    frDB.ConnectionString = 'Provider=SQLOLEDB.1; <...и так далее...>'
    
    * основной источник данных
    frDataSet = CREATEOBJECT('FastReport.TfrxADOQuery')
    frDataSet.Name = 'c_Data'
    frDataSet.Database = frDB
    frDataSet.Query = "SELECT link = 1"
    
    * основной объект FastReport'а
    fr = CREATEOBJECT('FastReport.TfrxReport')
    fr.LoadReportFromFile('test.fr3')
    
    frBand = fr.FindObject('MasterData1')
    fr.SelectDataset(.T., frDataSet)
    frBand.DataSet = 'c_Data' && вот сдесь загвоздка - выходит ошибка, как прицепить к бенду?
    
    * игнорируем предыдущую ошибку и грузим дизайнер
    fr.DesignReport() 
    
    * здесь уже руками для MasterData1 источник 'c_Data' проставить можно
    * т.е. к области видимости fr он уже "попал"..
    
    
  • jonny3djonny3d Чебоксары
    отредактировано 01:49
    Вопрос "как прицепить MasterData1 к c_Data" пока остаётся.. ;)
  • отредактировано 01:49
    написал:
    fr.SelectDataset(.T., frDataSet)
    frBand.DataSet = 'c_Data'
    А так нельзя:
    fr.SelectDataset(.T., frDataSet);
    frBand.DataSet = fr.DataSet;
    
    или
    fr.SelectDataset(.T., frDataSet)
    frBand.DataSet.Name = 'c_Data';
    
  • jonny3djonny3d Чебоксары
    отредактировано 01:49
    написал:
    fr.SelectDataset(.T., frDataSet);
    frBand.DataSet = fr.DataSet;
    OLE error: Не известное имя
    написал:
    fr.SelectDataset(.T., frDataSet)
    frBand.DataSet.Name = 'c_Data';
    OLE error: Не поддерживается


    Что ж танцы с бубном иногда помогают. Есть решение, но оно мне НЕ НРАВИТСЯ ;)

    Что имеем. Шаблон с бендом и мемо. У бенда пустой источник. У мемо Memo1.Memo = '[c_Data."link"]'. Благо значение memo1 можно заполнить каким угодно текстом. С бендом MasterData1.Dataset такое категорически не катит - на запись значения идёт проверка существования источника. Как следствие, несуществующий dataset к бенду не прицепить. Плохо. Но с бубном и нанцами решаемо.

    Первый шаг:
    fr.SelectDataset(.T., frDataSet)
    fr.DesignReport()
    
    Здесь уже источник имеется и c_Data свободно можно привязать к MasterData1.Dataset. После чего сохраняем шаблон.

    Второй шаг, уже рабочий:
    fr.SelectDataset(.T., frDataSet)
    fr.ShowReport()
    
    Теперь подгружается шаблон с уже настроенным MasterData1, но! Но таким образом имя датасета жёстко прошивается в шаблоне. А сам датасет создается во внешней среде. Логично и ПРАВИЛЬНО привязывать бенд к созданному источнику сразу после создания, ибо имя не факт что будет такое. Иначе - получаю сильное ограничение..


    Всё ещё остаюсь с вопросом как привязать MasterData1 к c_Data, которая уже видна в объекте FastReport (после SelectDataset) ;)
  • jonny3djonny3d Чебоксары
    отредактировано 01:49
    Вот нашёл обсуждение альфа-версии, уверенности не прибавило ;)
    написал:
    написал:
    QUOTE (vlad_galaxy @ Apr 8 2005, 05:01 PM)
    3. Так как датасеты у нас формируются динамически, возможна ли проверка
    корректности (соответствия) настроек отчета (наименований таблиц и полей ) с соответствующими таблицами и полями датасета с данными? ( Имею ввиду нетовский датасет)
    В текущей версии достучаться до внутренней структуры отчёта очень сложно, можно сказать что невозможно. Пожалуй, единственный способ - генерировать скрипт FastScript в прикладной программе, затем передавать скрипт в FastReport и уже скрипт может сам строить отчёт или, в простейшем случае, менять наименование таблиц и полей. Весьма трудоёмкий способ.

    В качестве варианта решения, вижу вынесение имени источника в скриптовую переменную в самом шаблоне. Перед генераций в самом шаблоне цеплять MasterData1 уже по содержимому переменной. А перенную эту уже инициализировать извне.. Пойду шаманить..
  • jonny3djonny3d Чебоксары
    отредактировано 01:49
    Всем спасибо. Проблема разрешилась сама собой.

    При неопределённом dataset'е бенда, датасет берётся из memo, в которой указан источник и имя поля. А в моем случае главное - указать дефолтный датасет (SelectDataset)

    Правда назрел любопытный вопрос - что будет, если в одном таком бенде с неопределённым источником будут две мемы с разными источниками? Позже проверю.. ;)

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

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