Дополнение нулями до нужного количества символов
Дополнение нулями до нужного количества символов
Как можно дополнить, скажем, '11' до '000011' перед постингом? Или хотя бы как определить длину строки, вбитой в поле CHAR(6) до постинга?
Re: Дополнение нулями до нужного количества символов
Естественно, не считая пробеловSolo писал(а):Как можно дополнить, скажем, '11' до '000011' перед постингом? Или хотя бы как определить длину строки, вбитой в поле CHAR(6) до постинга?
Можно было бы и поконкретней спросить.
Если "перед постингом" имеется ввиду метод dataset.Post в клиентской программе, то проблем наверное нет.
Если в триггере на вставку/измение то длину можно узнать примерно так:
char_length(trim(charfield))
хотя может правильнее так: char_length(trim(cast(charfield as varchar(6))))
Если "перед постингом" имеется ввиду метод dataset.Post в клиентской программе, то проблем наверное нет.
Если в триггере на вставку/измение то длину можно узнать примерно так:
char_length(trim(charfield))
хотя может правильнее так: char_length(trim(cast(charfield as varchar(6))))
Re: Дополнение нулями до нужного количества символов
Ну, способ дурацкий, но уж точно сработает (FKEY_WIDTH = входной параметр, до какой длины дополнять):Solo писал(а):Как можно дополнить, скажем, '11' до '000011' перед постингом? Или хотя бы как определить длину строки, вбитой в поле CHAR(6) до постинга?
Код: Выделить всё
if (:FKEY_WIDTH>=10 and :NEXT_NUM<1000000000) then NEXT_NUM = '0'|| NEXT_NUM;
if (:FKEY_WIDTH>= 9 and :NEXT_NUM<100000000 ) then NEXT_NUM = '0'|| NEXT_NUM;
if (:FKEY_WIDTH>= 8 and :NEXT_NUM<10000000 ) then NEXT_NUM = '0'|| NEXT_NUM;
if (:FKEY_WIDTH>= 7 and :NEXT_NUM<1000000 ) then NEXT_NUM = '0'|| NEXT_NUM;
if (:FKEY_WIDTH>= 6 and :NEXT_NUM<100000 ) then NEXT_NUM = '0'|| NEXT_NUM;
if (:FKEY_WIDTH>= 5 and :NEXT_NUM<10000 ) then NEXT_NUM = '0'|| NEXT_NUM;
if (:FKEY_WIDTH>= 4 and :NEXT_NUM<1000 ) then NEXT_NUM = '0'|| NEXT_NUM;
if (:FKEY_WIDTH>= 3 and :NEXT_NUM<100 ) then NEXT_NUM = '0'|| NEXT_NUM;
if (:FKEY_WIDTH>= 2 and :NEXT_NUM<10 ) then NEXT_NUM = '0'|| NEXT_NUM;
Да, конечно в триггере, поэтому я и написал в эту ветку "Проектирование БД и запросов"... Кроме того, не CHAR, конечно, а VARCHAR. Это я переношу базу с MySQLmdfv писал(а):Можно было бы и поконкретней спросить.
Если "перед постингом" имеется ввиду метод dataset.Post в клиентской программе, то проблем наверное нет.
Если в триггере на вставку/измение то длину можно узнать примерно так:
char_length(trim(charfield))
хотя может правильнее так: char_length(trim(cast(charfield as varchar(6))))
Спасибо за ответы, обяз. воспользуюсь.
Re: Дополнение нулями до нужного количества символов
Правильнее наверное так:konstb писал(а):Код: Выделить всё
if (:FKEY_WIDTH>=10 and :NEXT_NUM<1000000000) then NEXT_NUM = '0'|| NEXT_NUM;
Код: Выделить всё
if (:FKEY_WIDTH>=10 and Cast(:NEXT_NUM as integer)<1000000000) then NEXT_NUM = '0'|| NEXT_NUM;
Вот еще можно как извратиться:
Код: Выделить всё
s1='000000000';
s2=trim(charfield);
flen=char_length(s2) ;
charfield=substring(s1 from 1 for (6-flen))||s2;
Ну вот что в итоге получилось, проверялось на ФБ 2.0.
триггер
Код: Выделить всё
CREATE PROCEDURE addzero (
inchar varchar(6))
returns (
outchar varchar(6))
as
declare variable flen integer;
declare variable s1 varchar(6);
declare variable s2 varchar(6);
begin
s1='000000';
s2=trim(inchar);
flen=char_length(s2) ;
outchar=substring(s1 from 1 for (6-flen))||s2;
suspend;
end
Код: Выделить всё
select OUTCHAR from ADDZERO(new.charfield)
into
new.charfield;
Re: Дополнение нулями до нужного количества символов
Ура, что-то вышло. На основании ваших примеров получился вот такой триггер:
То-есть, количество предваряющих нулей верстается в цикле.
Кажется, чар_лейт действует только в FireBirde 2.0
Код: Выделить всё
AS
begin
while ( char_length(trim(new.ncont)) < 4) do /*ну, или меньше 6-ти*/
begin
new.ncont = '0'||new.ncont;
end
end
Кажется, чар_лейт действует только в FireBirde 2.0
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Зато в любой версии действует LIKE:Кажется, чар_лейт действует только в FireBirde 2.0
Код: Выделить всё
while (not new.ncont like '_______%') do
Не понял... а что, в лайке можно маску задать, что ли? Имеется в виду, если количество знаков меньше 4-х...Dimitry Sibiryakov писал(а):Зато в любой версии действует LIKE:Кажется, чар_лейт действует только в FireBirde 2.0Код: Выделить всё
while (not new.ncont like '_______%') do
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
-
- Сообщения: 66
- Зарегистрирован: 29 авг 2006, 10:00