Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.14;
Скачать: CL | DM;

Вниз

Как отловить исключение в ХП?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.041 c
1-1122042824
Mx
2005-07-22 18:33
2005.08.14
Как глобально отлавливать исключения?


1-1122406485
Michael5
2005-07-26 23:34
2005.08.14
Компонент TTreeView: как выровнять по левому краю некоторые узлы?


1-1122460119
Vsr
2005-07-27 14:28
2005.08.14
Вызов функции из dll


1-1122527434
Demidoff
2005-07-28 09:10
2005.08.14
Как сделать что бы курсор в memo был всегда в конце файла?


4-1118681911
Expl
2005-06-13 20:58
2005.08.14
Вопрос по активности окон