Главная страница
    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.011 c
1-1122047608
jeon1
2005-07-22 19:53
2005.08.14
Как сделать цикл зависимым от времени?


1-1122327617
Интер
2005-07-26 01:40
2005.08.14
Как получить адрес папки "Temporary Internet Files" ?


1-1122216014
Alex77777
2005-07-24 18:40
2005.08.14
Как получить список файлов в директории?


1-1122457835
Verder
2005-07-27 13:50
2005.08.14
Длина тела функции


4-1118495711
Juk
2005-06-11 17:15
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский