Trim записей в БД

Модераторы: kdv, CyberMax

Ответить
qvd
Сообщения: 27
Зарегистрирован: 10 янв 2007, 11:52

Trim записей в БД

Сообщение qvd » 10 май 2007, 15:27

Добрый день!
Подскажите пожалуйста,
Существует ХП которая вызывает хранимую udf и передает ей данные для обработки, после чего записывает результат в одно из полей БД полученные данные (тип поля - varchar), соответственно пробелы отбрасываются. Но при чтении из этого поля и вывода в DbGridEh результат запроса возвращает строку дополненную пробелами до длины поля в таблице, как с этим бороться?

qvd
Сообщения: 27
Зарегистрирован: 10 янв 2007, 11:52

Сообщение qvd » 10 май 2007, 17:05

Совсем забыл ...
FB 1.5

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 10 май 2007, 19:02

1. udf должна возвращать cstring
2. процедура должна возвращать varchar
3. исходные данные тоже должны быть varchar, если они преобразуются.

на любом из этих этапов char "добъет" строку пробелами.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Re: Trim записей в БД

Сообщение stix-s » 11 май 2007, 09:22

qvd писал(а):Добрый день!
Но при чтении из этого поля и вывода в DbGridEh результат запроса возвращает строку дополненную пробелами до длины поля в таблице, как с этим бороться?
в IB Expert результат этого запроса тоже с пробелами?
в используемых в программе компонентах никая опция по добавлению пробелов не выставлена?

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 11 май 2007, 09:27

У меня на FB 1.5 запрос вида

Код: Выделить всё

SELECT
    VARCHAR_10_FIELD || '1"
FROM
    SOMETABLE
возвращал 'DATA[шесть пробелов]1'. Приходилось RTRIM юзать. Возвращать 'DATA1' стал только на FB 2.0...

qvd
Сообщения: 27
Зарегистрирован: 10 янв 2007, 11:52

Сообщение qvd » 11 май 2007, 09:34

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?

qvd
Сообщения: 27
Зарегистрирован: 10 янв 2007, 11:52

Сообщение qvd » 11 май 2007, 09:37

IbExpert возвращает без пробелов... хм...
Попробовал заменить DbGridEh обычным DbGrid - теже пробелы...
Непойму ...

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 11 май 2007, 09:56

qvd писал(а):IbExpert возвращает без пробелов... хм...
IB Expert - Регистрационная информация базы - Дополнительные - "Обрезать концевые пробелы полей типа CHAR". Оно вроде как и на VARCHAR влияет. Попробуй сбросить, должно тоже с пробелами быть.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 11 май 2007, 09:58

CyberMax писал(а):возвращал 'DATA[шесть пробелов]1'. Приходилось RTRIM юзать. Возвращать 'DATA1' стал только на FB 2.0...
не надо. никогда такого не было. Любая версия IB/FB вернет
varchar||'1' как 'значениестолбца1'.
если varchar когда то был char, или там действительно при записи значения были помещены пробелы - тогда да. В общем, если у варчара нет в конце пробелов, то при конкатенации их и не будет. и не должно быть на клиентской стороне. Если только в клиенте у столбца не установлено добивать строку пробелами.
qvd писал(а):Все поля не проходящие функцию DeCrypt не имеют лишних пробелов, а прошедшие - дополнены пробелами до 50 знаков.
это ты сам и делаешь. или где-то преобразуешь в char.

qvd
Сообщения: 27
Зарегистрирован: 10 янв 2007, 11:52

Сообщение qvd » 11 май 2007, 10:01

IB Expert - Регистрационная информация базы - Дополнительные - "Обрезать концевые пробелы полей типа CHAR". Оно вроде как и на VARCHAR влияет. Попробуй сбросить, должно тоже с пробелами быть.
Появились пробелы ...

qvd
Сообщения: 27
Зарегистрирован: 10 янв 2007, 11:52

Сообщение qvd » 11 май 2007, 10:18

Да действительно ...
Функция шифрования из udf получала на вход cstring(50), после шифровала, преобразовывая пробелы в другие символы и сохраняла в БД.
Спасибо всем за участие!

qvd
Сообщения: 27
Зарегистрирован: 10 янв 2007, 11:52

Сообщение qvd » 11 май 2007, 11:31

Нет, оказалось что функции тут ни при чем, переделал запрос с

Код: Выделить всё

Select 
      ID, 
      DeCrypt(CD) as CD, 
      PRIMECHANIYE, 
      WORKDATE, 
      ....... 
    from MAIN
на

Код: Выделить всё

Select 
      ID, 
      cast(DeCrypt(CD) as varchar(50)) as CD, 
      PRIMECHANIYE, 
      WORKDATE, 
      ....... 
    from MAIN
заработало ...

Ответить