Форум: "Базы";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
ВнизКак отловить исключение в ХП? Найти похожие ветки
← →
yk © (2005-07-08 16:05) [0]Уважаемые мастера!
Есть задача:
для разных типов документов генерировать возможный следующий номер.
Номер документа храниться как varchar(10),
т.к. это может быть просто число или строка с . или -
При генерации номера мы должны выбрать максимальный из простых (только цифры) номеров и прибавть к нему 1
Проблема в том, что если применять select max(), то возникает
ошибка приведения типов.
Можно ли организовать выбор максимального значения так,
чтобы "сложные" номера пропускались?
(что-нибудь вроде try-except-end но на стороне сервера)
← →
DSKalugin © (2005-07-08 16:21) [1]WHEN EXCEPTION <имя исключения> DO
BEGIN
...
END
или
WHEN GDSCODE|SQLCODE <код ошибки> DO
BEGIN
...
END
← →
isasa © (2005-07-08 16:22) [2]Использовать в запросе вычисляемое поле, в котором использовать функцию
function StrToIntDef(const S: string; const Default: Integer): Integer; //- Converts a string that represents an integer (decimal or hex notation) to a number with error default.
← →
HSolo © (2005-07-08 16:30) [3]А почему
>максимальный из простых (только цифры) номеров
?
Не может оказаться так, что последний "чисто цифровой" номер - 99, а кроме него есть 100.1, 101.11, 102-а... ? Как тогда быть?
В любом случае WHEN...DO, боюсь, не спасет :(
Сделайте UDF, которая вырезает из номера цифры по нужному Вам правилу и делает из них число; с ней и работайте.
А если есть возможность изменить структуру базы, то разбейте номер документа на части: основная (число) и дополнительная (число, строка, разделитель, что там требуется). На клиенте это можно показать как один целый номер, а перед записью в базу разобрать на составляющие.
← →
Digitman © (2005-07-08 16:42) [4]примерно так :
declare variable k integer;
declare variable ndoc varchar(10);
i = 0;
for
select ndoc from docs /* order by doc (?) */ into :ndoc
do
begin
k := cast(ndoc as integer);
if (k > i) then i = k;
when sqlcode -413 do;
end;
i = i + 1;
result = cast(i as varchar(10));
но это - извращение, особенно если записей, вызывающих исключение преобразования, оч много.
лучшим вариантом будет создание (использование готовой) UDF IsNumeric, которая будет отфильтровывать записи с такими полями (примерно так):
select max(cast(ndoc as integer)) from docs where IsNumeric(ndoc)=1 into :i
if (i is null) then
result = "1";
else
result = cast(i+1 as varchar(10));
← →
Digitman © (2005-07-08 16:55) [5]function IsNumeric(Value: PChar): Integer; cdecl;
begin
Result := 1;
try
StrToInt(Value);
except
Result := 0;
end;
end;
← →
Андрей Жук © (2005-07-08 18:26) [6]2Digitman
StrToIntDef больше подходит
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.149 c