Форум: "Базы";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];
ВнизFb1.5 Как разрешить юзеру ввести в поле Найти похожие ветки
← →
Exciter © (2006-03-10 17:24) [0]Как разрешить юзеру ввести в поле только цыфры и/или английские символы ? Незнаю как ограничить ввод всего остального на уровне триггера.
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
← →
jack128 © (2006-03-10 17:46) [1]вообще то N = substring(gridname from i for 1);
Но у мя ругается на i , возможно, только эта функция только константы принемает...
Вообще с UDF проще было бы.. Учитывая, что есть стандартная.
← →
unknown © (2006-03-10 17:52) [2]У меня тоже что-то подобное сделано - процедура, возращающая позицию
недопустимого символа.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
Подойдет?
← →
Exciter © (2006-03-11 02:34) [3]Да подойдёт. StrPos где взять ?
← →
unknown © (2006-03-11 03:16) [4]
> Exciter ©
rfunc - http://rfunc.sourceforge.net/rus/index.html
← →
Johnmen © (2006-03-11 20:49) [5]Перебор символов в строке решается без UDF.
← →
Виталий Панасенко (2006-03-13 10:35) [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)
...
)
← →
Виталий Панасенко (2006-03-13 11:16) [7]Малость можно проще. Вместо сравнить с 62 знаками на <=, проще сравнить с ОДНИМ СЛЕДУЮЩИМ по коду символом на <
((field>="0" and field<":")
← →
unknown © (2006-03-13 18:43) [8]
> 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.
А без цикла получится некрасиво и громоздко.
← →
Johnmen © (2006-03-13 20:43) [9]>unknown © (13.03.06 18:43) [8]
С использованием substring с "контантами", с циклом.
Предлагаю подумать. :) Решение несложно...
← →
unknown © (2006-03-13 22:00) [10]
> 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 22:19) [11]Да, идея верная.
Кстати, for 255 можно опустить...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c