Главная страница
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.026 c
14-1122212775
SoftX
2005-07-24 17:46
2005.08.14
Чего хочет программист от своей профессии?


1-1122463335
Dust
2005-07-27 15:22
2005.08.14
Глобальные системные флаги


4-1119418092
Progh
2005-06-22 09:28
2005.08.14
Как перевести вывести компьютер в спящий из спящего режим(а)


14-1122024136
asdqwer
2005-07-22 13:22
2005.08.14
SMS Email Gateway


9-1113736502
Yegorchic
2005-04-17 15:15
2005.08.14
Поворот камеры