![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 проще было бы.. Учитывая, что есть стандартная.