Страница 1 из 1

Дополнение нулями до нужного количества символов

Добавлено: 03 янв 2007, 16:12
Solo
Как можно дополнить, скажем, '11' до '000011' перед постингом? Или хотя бы как определить длину строки, вбитой в поле CHAR(6) до постинга?

Re: Дополнение нулями до нужного количества символов

Добавлено: 03 янв 2007, 17:55
Solo
Solo писал(а):Как можно дополнить, скажем, '11' до '000011' перед постингом? Или хотя бы как определить длину строки, вбитой в поле CHAR(6) до постинга?
Естественно, не считая пробелов

Добавлено: 03 янв 2007, 21:29
mdfv
Можно было бы и поконкретней спросить.
Если "перед постингом" имеется ввиду метод dataset.Post в клиентской программе, то проблем наверное нет.

Если в триггере на вставку/измение то длину можно узнать примерно так:
char_length(trim(charfield))
хотя может правильнее так: char_length(trim(cast(charfield as varchar(6))))

Re: Дополнение нулями до нужного количества символов

Добавлено: 04 янв 2007, 00:41
konstb
Solo писал(а):Как можно дополнить, скажем, '11' до '000011' перед постингом? Или хотя бы как определить длину строки, вбитой в поле CHAR(6) до постинга?
Ну, способ дурацкий, но уж точно сработает (FKEY_WIDTH = входной параметр, до какой длины дополнять):

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

      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;

Добавлено: 04 янв 2007, 11:35
Solo
mdfv писал(а):Можно было бы и поконкретней спросить.
Если "перед постингом" имеется ввиду метод dataset.Post в клиентской программе, то проблем наверное нет.

Если в триггере на вставку/измение то длину можно узнать примерно так:
char_length(trim(charfield))
хотя может правильнее так: char_length(trim(cast(charfield as varchar(6))))
Да, конечно в триггере, поэтому я и написал в эту ветку "Проектирование БД и запросов"... Кроме того, не CHAR, конечно, а VARCHAR. Это я переношу базу с MySQL
Спасибо за ответы, обяз. воспользуюсь.

Re: Дополнение нулями до нужного количества символов

Добавлено: 04 янв 2007, 13:26
mdfv
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;
   

Добавлено: 04 янв 2007, 13:38
mdfv
Вот еще можно как извратиться:

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

s1='000000000';
s2=trim(charfield);
flen=char_length(s2) ;
charfield=substring(s1 from 1 for (6-flen))||s2;

Добавлено: 04 янв 2007, 14:27
mdfv
Ну вот что в итоге получилось, проверялось на ФБ 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: Дополнение нулями до нужного количества символов

Добавлено: 04 янв 2007, 14:37
Solo
Ура, что-то вышло. На основании ваших примеров получился вот такой триггер:

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

AS
begin
  while ( char_length(trim(new.ncont)) < 4) do /*ну, или меньше 6-ти*/
  begin
    new.ncont = '0'||new.ncont;
  end
end
То-есть, количество предваряющих нулей верстается в цикле.
Кажется, чар_лейт действует только в FireBirde 2.0 :roll:

Добавлено: 09 янв 2007, 07:44
Dimitry Sibiryakov
Кажется, чар_лейт действует только в FireBirde 2.0
Зато в любой версии действует LIKE:

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

while (not new.ncont like '_______%') do

Добавлено: 09 янв 2007, 09:04
Solo
Dimitry Sibiryakov писал(а):
Кажется, чар_лейт действует только в FireBirde 2.0
Зато в любой версии действует LIKE:

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

while (not new.ncont like '_______%') do
Не понял... а что, в лайке можно маску задать, что ли? Имеется в виду, если количество знаков меньше 4-х...

Добавлено: 09 янв 2007, 09:51
Dimitry Sibiryakov
По-моему лайк только из-за масок и держат. Иначе на кой он нужен?.. :?

Добавлено: 21 фев 2007, 12:22
Solo
Dimitry Sibiryakov писал(а):По-моему лайк только из-за масок и держат. Иначе на кой он нужен?.. :?
Стыдно признаться, но я думал, что лайк - чтобы по части слова условие задать... Ну, типа "%ров"
...
Петров
Сидоров
...
И как же в нем маску можно задать?

Добавлено: 21 фев 2007, 12:56
Dimitry Sibiryakov
Solo писал(а):И как же в нем маску можно задать?
Двумя подставными символами: '_' и '%'. Первый подменяет один любой символ, второй - любое число любых символов.

Добавлено: 23 фев 2007, 10:49
EvilsInterrupt
2 Dimitry Sibiryakov:
Не мог ли бы ты показать самый хитрый трюк с этим оператором LIKE, который когда-либо видел или применял?

Добавлено: 23 фев 2007, 15:54
kdv
чти доку. Embedded SQL Guide, Using Like.

Добавлено: 24 фев 2007, 13:54
Solo
EvilsInterrupt писал(а):2 Dimitry Sibiryakov:
Не мог ли бы ты показать самый хитрый трюк с этим оператором LIKE, который когда-либо видел или применял?
Тока что попробовал. правда на МуSQL. Работает