Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Fb1.5 Как разрешить юзеру ввести в поле [FireBird 1.5]


Exciter ©   (2006-03-10 17:24:00) 

Как разрешить юзеру ввести в поле только цыфры и/или английские символы ? Незнаю как ограничить ввод всего остального на уровне триггера.

CREATE TRIGGER REPORTQUERYS_BIU0 FOR REPORTQUERYS
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS
declare variable I Integer;
declare variable J Integer;
declare variable L Integer;
declare variable Err Integer;
declare variable En VarChar(62);
declare variable n  VarChar(1);
declare variable c  VarChar(1);
begin
if (new.gridname is not null) then
i=1; L = strlen(new.gridname);
En = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
Err = 0;
while (i <= L) do
 begin
  j = 1;
  N = substring(new.gridname, i, 1);   --НЕ хочет!
  while (j <= 62) do
   begin
    C = substring(En, j, 1);    --НЕ хочет!
    if (N = C) then Err = 1;
    j = j + 1;
   end
  if (Err = 1) then execute procedure error('В имени сетки должны быть только английские символы и цифры');
  i = i + 1;
 end
end


Johnmen   (2006-03-13 22:19:00) [1]

Да, идея верная.
Кстати,  for 255 можно опустить...


unknown   (2006-03-13 22:00:00) [2]


> Johnmen ©   (13.03.06 20:43) [9]
> Предлагаю подумать.


Подумал :)


CREATE PROCEDURE COMPARE_EN (
   S VARCHAR(255))
RETURNS (
   R INTEGER)
AS
DECLARE VARIABLE X VARCHAR(37);
DECLARE VARIABLE Y CHAR(1);
begin
    R=0;
    X='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    Y=substring( S from 1 for 1 );
    while (Y>'') do
    begin
      if (not '%'||Y||'%' like X ) then
      begin
        R=1;
        suspend;
        exit;
      end
    S=substring( S from 2 for 255 );
    Y=substring( S from 1 for 1 );
    end
 suspend;
end

Вот ведь...


Johnmen   (2006-03-13 20:43:00) [3]

>unknown ©   (13.03.06 18:43) [8]

С использованием substring с "контантами", с циклом.
Предлагаю подумать. :) Решение несложно...


unknown   (2006-03-13 18:43:00) [4]


> Johnmen ©   (11.03.06 20:49) [5]
> Перебор символов в строке решается без UDF.

Каким это образом?
Если предполагается использование substring, то не выйдет, т.к.
Neither <pos> nor <length> can be query parameters: they must evaluate to constants.
(с)Firebird_v1.5.3.ReleaseNotes.pdf page 42.
А без цикла получится некрасиво и громоздко.


Виталий Панасенко   (2006-03-13 11:16:00) [5]

Малость можно проще. Вместо сравнить с 62 знаками на <=, проще сравнить с ОДНИМ СЛЕДУЮЩИМ по коду символом на <
((field>='0' and field<':')


Виталий Панасенко   (2006-03-13 10:35:00) [6]

Для поля сделать ограничение что-то типа(я так понял длинна поля 62 символа)
create table t1(
         ...
         Field varchra(62) check ((field>='0' and field<='тут 62 9') or (field>='A' and Field<='тут 62 Z') or (Field>='a' and field<='тут 62 z') or field is null)
...
)


Johnmen   (2006-03-11 20:49:00) [7]

Перебор символов в строке решается без UDF.


unknown   (2006-03-11 03:16:00) [8]


> Exciter ©

rfunc - http://rfunc.sourceforge.net/rus/index.html


Exciter   (2006-03-11 02:34:00) [9]

Да подойдёт. StrPos где взять ?


unknown   (2006-03-10 17:52:00) [10]

У меня тоже что-то подобное сделано - процедура, возращающая позицию
недопустимого символа.
CREATE PROCEDURE CHECK_RU (
   S VARCHAR(255))
RETURNS (
   E INTEGER)
AS
DECLARE VARIABLE I INTEGER;
begin
E=0;
if (S is null or S='' ) then
   Exit;
S=RUPPER(S);
I=1;
while (I<=StrLen(s)) do
   begin
       if (StrPos(SUBSTR(:S,I,1),'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ')<1) then
           begin
               E=I;
               suspend;
               Exit;
            end
    I=I+1;
   end
suspend;
end

Подойдет?


jack128   (2006-03-10 17:46:00) [11]

вообще то N = substring(gridname fromi for1);

Но у мя ругается на i , возможно, только эта функция только константы принемает...
Вообще с UDF проще было бы.. Учитывая, что есть стандартная.


Наверх

Титульная страница Поиск, карта сайта Написать письмо