2014-12-25 5 views
0

У меня есть отчет, в котором я хотел бы выбрать, какие данные показывать/печатать.
Я использую UniDAC как dataconnection, и он отлично работает, когда я не выбираю данные, просто распечатайте все.
У меня есть varible в моем коде отчета varDiaryGuid, который я присваиваю значение, которое я хочу фильтровать мои записи.
В моем тесте перед открытием отчета этой переменной присваивается значение {A13CE6A0-7EB0-469A-87D7-3518FB9F365A}.
Когда отчет начинается, отображается окно сообщения. Начать отчет: {A13CE6A0-7EB0-469A-87D7-3518FB9F365A}, чтобы переменная была доступна, как и должно быть.
Но тогда я получаю сообщение об ошибке «Неожиданный символ» - после некоторого тестирования это выглядит как {в начале GUID.
Любой, у кого есть некоторые идеи, как я могу проверить дальше?Выбор записей для печати с использованием Fastreport

procedure frxReport1OnStartReport(Sender: TfrxComponent); 
begin 
    ShowMessage('Start report: ' + varDiaryGuid);               
    qryDiary.Close;        
    qryDiary.SQL.Clear; 
    qryDiary.SQL.Text := 'SELECT * FROM qrymd_diary WHERE (flddiary_guid = ' + varDiaryGuid + ')'; 
    qryDiary.Open;     
end; 

ответ

2

Вы должны использовать параметры для своих запросов (безопасность и производительность).

Определить запрос для qrydiary компонента с ОИ, как

SELECT 
    * 
FROM 
    qrymd_diary 
WHERE 
    flddiary_guid = :diary_guid 

и в вашем коде, вы просто присвоить значение параметра

procedure frxReport1OnStartReport(Sender: TfrxComponent); 
begin 
    ShowMessage('Start report: ' + varDiaryGuid);               
    qryDiary.Close;        
    qryDiary.ParamByName('diary_guid').Value := varDiaryGuid; 
    qryDiary.Open;     
end; 

В зависимости от компонентов SQL, которые вы используете, вы также для определения типа данных для параметра. Некоторые из них могут решить тип, а некоторые нуждаются в вашей помощи. Просто проверьте тип параметра с помощью OI.

Вы можете прочитать больше о об использовании параметров в documentation

+0

Спасибо за этот ввод Я так пробовал, но с той разницей, что использовал .AsSting, как я всегда делал в других запросах, но это не работает здесь, в FastReport, но .Value делает Извините за не отвечая ранее, но я был в больнице. – OZ8HP

+0

@ OZ8HP Нет проблем, вы уже упоминали причину в другом вопросе здесь. –

0
qry.SQL.Text := 'SELECT * FROM table WHERE (someTextField = ' + 
       varSomeText + 
       ')'; 

В этом виде запросов, где вы посылаете SQL команды с помощью кода, вы должны процитировать текст/строковые переменные, как:

qry.SQL.Text := 'SELECT * FROM table WHERE (someTextField = ' + 
       QuotedStr(varSomeText) + 
       ')'; 

QuotedStr() инкапсулирует параметр с "'" s

+1

Это неверно по двум причинам: 1) Нет, вы не должны цитировать переменный текст/строку - вы должны использовать параметры, а затем присвоить значение с помощью свойство 'AsString' параметра и 2), потому что вы не указываете GUID, поэтому цитаты или' QuotedStr' здесь не будут работать. –

+0

Если вы собираетесь с «should», тогда он ДОЛЖЕН использовать хранимые процедуры. Я не буду спорить о цитате. –

+0

Нет, абсолютно никакой необходимости в хранимой процедуре просто SELECT несколько строк, и нет ничего плохого в этом. Тем не менее, конкатенация строк никогда не является правильным решением. –