Я использую Firebird 2.1, DBExpress Driver от DevArt и Delphi 2010. Некоторые из моих отчетов, которые использовались для работы с Delphi 2006, перестали работать и выдало сообщение об ошибке, указывающее, что «арифметическое исключение, переполнение числа или усечение строки» имели произошло. В этот момент в моем коде произошла ошибка:
cds.Data := dsProvider.Data;
Я нашел место в своем операторе SQL, которое вызвало ошибку:
iif(ytd.hPayType <> -1,t.sCode, 'NET') sPayType
T.sCode - это поле Varchar (10). Мой вывод заключается в том, что запрос возвращает данные в dsProvider и что когда dsProvider.Data передается в cds.Data, компонент cds устанавливает ширину поля на основе первого полученного значения. Я получаю то же сообщение об ошибке, если я изменяю «iif» на оператор CASE. Мне удалось обойти проблему, выполнив это:
CAST(iif(ytd.hPayType <> -1,t.sCode, 'NET') AS varchar(10)) sPayType
Поскольку раньше это работало в Delphi 2006 без CAST, я предполагаю, что новое поведение связано с обновлением TClientDataset. Было бы хорошо иметь старое, более прощающее поведение. Есть ли способ настроить ClientDataset так, чтобы он принимал это без жалоб, или мне нужно просто сообщить моим пользователям CAST о строковых результатах на основе операторов iif и CASE?