Как написать обращение к процедуре (vb)?

отредактировано March 2010 Раздел: FastReport Studio
Здравствуйте все
Немного предисловия:
Сам пишу на Visual Basic 6, базу использую Access. Отчеты всегда писал на Crystal Report.
Решил поискать альтернативу Crystal Report и случайно наткнулся на FRS.
Приятно удивлен как все в нем здорово сделано, да и цена адекватная.
Прочитал мануалы - теперь могу написать все что нужно, однако остался один
вопрос, с которым сам так и не смог разобраться - это вызов хранимых процедур из скрипта в отчете.
В примерах и мануале подробно расписано как сделать параметрический TfrxADOQuery - c ним
вопросов нет - все ясно.
Вижу в классах есть TAdoStoredProc - получается такая возможность теоретически есть, но
как написать это практически на BasicScript - никак не могу разобраться :)
Можно конечно переписать процедуры в базе в обычные вьюхи и дальше реализовать все
через стандартный TfrxADOQuery, но так не интересно - хочется помучаться для начала :)

Может у кого-нибудь может выложить здесь какой-нибудь маленький примерчик как это делается?
Буду очень признателен.

Комментарии

  • отредактировано 11:56
    Прорыв форум и мануалы, смог написать следующий код:
    procedure cmdOKOnClick(Sender: TfrxComponent);
    var
    sp: TADOStoredProc;
    sppar: TParameter;                                     
      
    begin
    
    sp := TADOStoredProc.Create(nil);                                                                            
    sp.Connection := conn.Database;
    sp.ProcedureName := 'qOpersN1_Full';                                                     
    sppar := TParameter.Create;
    with sp.Parameters.AddParameter do begin
           Name := 'tod';
           DataType := ftInteger;     
           Value := int(DateEdit1.Date);
    end;
    
    sp.Open;
     
    end;
    

    Проверил - на выходе открытый рекордсет с моими данными, вроде полдела сделано.
    Подскажите плиз - как его теперь "подсунуть" отчету в бенд как источник данных?
  • отредактировано 11:56
    написал:
    Подскажите плиз - как его теперь "подсунуть" отчету в бенд как источник данных?
    Через свойство DataSet.
  • отредактировано 11:56
    OlegK написал: »
    Через свойство DataSet.

    да, я так и пытался сделать, но у бенда DataSet есть, а у открытого мною рекордсета я так и не смог понять как его вызвать. Прорыл всю иерархию в классах, но ни в одном предке класса TAdoStoredProc я не нашел Dataset :)
    Как к нему обратиться чтобы "закинуть" в датасет бенда? Я так понимаю, что у меня не хватает одной строки в коде - но никак не пойму как её сформулировать :)
    Подскажите пожалуйста, если не сложно...
  • отредактировано 11:56
    Попробуйте свойству бэнда Dataset присвоить рекордсет.
    Если не сработает, тогда нужно как-то преобразовать рекордсет в датасет.
  • отредактировано 11:56
    OlegK написал: »
    Попробуйте свойству бэнда Dataset присвоить рекордсет.
    Если не сработает, тогда нужно как-то преобразовать рекордсет в датасет.

    конечно спасибо за ответ, но собственно, что надо сделать - понятно
    вопрос как раз в том - как это сделать?
    эх...
  • отредактировано 11:56
    Можно вообще использовать другой способ.
    Допустим в отчете есть бенд MasterData с именем MasterData1.
    Насколько я понял, вам нужно в качестве источника данных для него, использовать результат вызова хранимой процедуры.
    Допустим имя хранимой процедуры proc1.
    Тогда можно создать (в дизайнере или из скрипта) ADOQuery, например с именем ADOQuery1.
    И из ADOQuery1 вызвать хранимую процедуру, запрос будет выглядеть так: exec proc1.
    ADOQuery1 можно использовать в качестве источника данных для бенда MasterData1.
    Из скрипта это будет выглядеть так:
    // создание ADOQuery1, если его нужно создавать из скрипта
    ...
    ...
    // создание запроса с вызовом хранимой процедуры
    ADOQuery1.SQL.Add('exec proc1');
    // привязка результата к бенду
    MasterData1.DataSet := ADOQuery1;
    
  • отредактировано March 2010
    спасибо за вариант - красиво :)
    извиняюсь за тупость, а как передать при таком варианте параметр для этой хранимки?
  • отредактировано March 2010
    Через пробел после exec proc1:
    ADOQuery1.SQL.Add('exec proc1 param1');
    
  • отредактировано 11:56
    объединив свой текст и то что было предложено OlegK, дописал последнюю необходимую строку, которая позволила передать открытый рекордсет в MasterData.
    ADOQuery1 это пустой ADOQuery1, привязанный в конструкторе к MasterData:
    procedure cmdOKOnClick(Sender: TfrxComponent);
    var
    sp: TADOStoredProc;
    sppar: TParameter;
    
    begin
    
    sp := TADOStoredProc.Create(nil);
    sp.Connection := conn.Database;
    sp.ProcedureName := 'qOpersN1_Full';
    sppar := TParameter.Create;
    with sp.Parameters.AddParameter do begin
      Name := 'tod';
      DataType := ftInteger;
      Value := int(DateEdit1.Date);
    end;
    
    sp.Open;
    
    ADOQuery1.Dataset := sp;
    
    end;
    

    теперь все заработало
  • отредактировано 11:56
    OlegK написал: »
    Через пробел после exec proc1:
    ADOQuery1.SQL.Add('exec proc1 param1');
    

    а в данном случае param1 - это просто значение этого параметра или нужно как то по особому это написать?
    попробывал просто написать значение - выдает ошибку "Несоответствие типов данных в выражении условиям отбора"
    sSql :=  'exec qOpersN1_Full ' + inttostr(int(DateEdit1.Date));                                                                                    
    AdoQuery1.SQL.Add(sSql);
    

    sSql получается вида 'exec qOpersN1_Full 40260'
    может синтаксис при передаче параметра должен быть каким то особым?
    например, кроме значения параметра указать его название?
    или дату надо передать в каком то особом формате? (хотя в том, что написал я работает с приведением к Int, но кто его знает...)
    хочется доразобраться с этим вариантом...
  • отредактировано 11:56
    написал:
    попробывал просто написать значение - выдает ошибку "Несоответствие типов данных в выражении условиям отбора"
    написал:
    хотя в том, что написал я работает с приведением к Int, но кто его знает...
    Допустим в базе есть поле custno типа int.
    Создаем процедуру:
    create procedure proc1 @cn int as
    select * from customer where custno=@cn
    
    Теперь вызываем ее:
    exec proc1 param1
    
    Параметр в процедуре @cn, и передаваемый процедуре при ее вызове параметр param1 должны быть того же типа что и поле custno в базе.

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

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