Страница 1 из 1
Trim записей в БД
Добавлено: 10 май 2007, 15:27
qvd
Добрый день!
Подскажите пожалуйста,
Существует ХП которая вызывает хранимую udf и передает ей данные для обработки, после чего записывает результат в одно из полей БД полученные данные (тип поля - varchar), соответственно пробелы отбрасываются. Но при чтении из этого поля и вывода в DbGridEh результат запроса возвращает строку дополненную пробелами до длины поля в таблице, как с этим бороться?
Добавлено: 10 май 2007, 17:05
qvd
Совсем забыл ...
FB 1.5
Добавлено: 10 май 2007, 19:02
kdv
1. udf должна возвращать cstring
2. процедура должна возвращать varchar
3. исходные данные тоже должны быть varchar, если они преобразуются.
на любом из этих этапов char "добъет" строку пробелами.
Re: Trim записей в БД
Добавлено: 11 май 2007, 09:22
stix-s
qvd писал(а):Добрый день!
Но при чтении из этого поля и вывода в DbGridEh результат запроса возвращает строку дополненную пробелами до длины поля в таблице, как с этим бороться?
в IB Expert результат этого запроса тоже с пробелами?
в используемых в программе компонентах никая опция по добавлению пробелов не выставлена?
Добавлено: 11 май 2007, 09:27
CyberMax
У меня на FB 1.5 запрос вида
Код: Выделить всё
SELECT
VARCHAR_10_FIELD || '1"
FROM
SOMETABLE
возвращал 'DATA[шесть пробелов]1'. Приходилось RTRIM юзать. Возвращать 'DATA1' стал только на FB 2.0...
Добавлено: 11 май 2007, 09:34
qvd
Udf возвращает CString, все промежуточные значения - varchar.
Немного уточню вопрос:
записи в таблице - зашифрованы
для доступа к данным использую TIbDataSet
в нем запросы вида:
Код: Выделить всё
Select
ID,
DeCrypt(CD) as CD,
PRIMECHANIYE,
WORKDATE,
.......
from MAIN
DeCrypt это:
Код: Выделить всё
DECLARE EXTERNAL FUNCTION DECRYPT
CSTRING(250)
RETURNS CSTRING(50) FREE_IT
ENTRY_POINT 'DeCrypt_' MODULE_NAME 'crypt.dll'
Все поля не проходящие функцию DeCrypt не имеют лишних пробелов, а прошедшие - дополнены пробелами до 50 знаков.
В самой БД - лишних пробелов нет, их добавление происходит во время запроса. Как этого избежать? Или прийдется обрабатывать момент вставки данных в грид и делать trim?
Добавлено: 11 май 2007, 09:37
qvd
IbExpert возвращает без пробелов... хм...
Попробовал заменить DbGridEh обычным DbGrid - теже пробелы...
Непойму ...
Добавлено: 11 май 2007, 09:56
CyberMax
qvd писал(а):IbExpert возвращает без пробелов... хм...
IB Expert - Регистрационная информация базы - Дополнительные - "Обрезать концевые пробелы полей типа CHAR". Оно вроде как и на VARCHAR влияет. Попробуй сбросить, должно тоже с пробелами быть.
Добавлено: 11 май 2007, 09:58
kdv
CyberMax писал(а):возвращал 'DATA[шесть пробелов]1'. Приходилось RTRIM юзать. Возвращать 'DATA1' стал только на FB 2.0...
не надо. никогда такого не было. Любая версия IB/FB вернет
varchar||'1' как 'значениестолбца1'.
если varchar когда то был char, или там действительно при записи значения были помещены пробелы - тогда да. В общем, если у варчара нет в конце пробелов, то при конкатенации их и не будет. и не должно быть на клиентской стороне. Если только в клиенте у столбца не установлено добивать строку пробелами.
qvd писал(а):Все поля не проходящие функцию DeCrypt не имеют лишних пробелов, а прошедшие - дополнены пробелами до 50 знаков.
это ты сам и делаешь. или где-то преобразуешь в char.
Добавлено: 11 май 2007, 10:01
qvd
IB Expert - Регистрационная информация базы - Дополнительные - "Обрезать концевые пробелы полей типа CHAR". Оно вроде как и на VARCHAR влияет. Попробуй сбросить, должно тоже с пробелами быть.
Появились пробелы ...
Добавлено: 11 май 2007, 10:18
qvd
Да действительно ...
Функция шифрования из udf получала на вход cstring(50), после шифровала, преобразовывая пробелы в другие символы и сохраняла в БД.
Спасибо всем за участие!
Добавлено: 11 май 2007, 11:31
qvd
Нет, оказалось что функции тут ни при чем, переделал запрос с
Код: Выделить всё
Select
ID,
DeCrypt(CD) as CD,
PRIMECHANIYE,
WORKDATE,
.......
from MAIN
на
Код: Выделить всё
Select
ID,
cast(DeCrypt(CD) as varchar(50)) as CD,
PRIMECHANIYE,
WORKDATE,
.......
from MAIN
заработало ...