Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-1122018175
Fin
2005-07-22 11:42
2005.08.14
Что делать или как поступить?


14-1122284720
Труп Васи Доброго
2005-07-25 13:45
2005.08.14
Цифрочитающее устройство


14-1122285961
wnew_
2005-07-25 14:06
2005.08.14
Отпуск!!!


14-1122017786
Жук
2005-07-22 11:36
2005.08.14
Разбиение винта


14-1122001061
NewWonder
2005-07-22 06:57
2005.08.14
Пишу экзамен!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский