Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как отловить исключение в ХП? [IB6.x]


yk ©   (2005-07-08 16:05:00) 

Уважаемые мастера!
Есть задача:
для разных типов документов генерировать возможный следующий номер.
Номер документа храниться как varchar(10),
т.к. это может быть просто число или строка с . или -

При генерации номера мы должны выбрать максимальный из простых (только цифры) номеров и прибавть к нему 1

Проблема в том, что если применять select max(), то возникает
ошибка приведения типов.

Можно ли организовать выбор максимального значения так,
чтобы "сложные" номера пропускались?
(что-нибудь вроде try-except-end но на стороне сервера)


Андрей Жук   (2005-07-08 18:26:00) [1]

2Digitman
StrToIntDef больше подходит


Digitman   (2005-07-08 16:55:00) [2]

function IsNumeric(Value: PChar): Integer; cdecl;
begin
 Result := 1;
 try
   StrToInt(Value);
 except
  Result := 0;
 end;
end;


Digitman   (2005-07-08 16:42:00) [3]

примерно так :

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));


HSolo   (2005-07-08 16:30:00) [4]

А почему
>максимальный из простых (только цифры) номеров
?
Не может оказаться так, что последний "чисто цифровой" номер - 99, а кроме него есть 100.1, 101.11, 102-а... ? Как тогда быть?

В любом случае WHEN...DO, боюсь, не спасет :(
Сделайте UDF, которая вырезает из номера цифры по нужному Вам правилу и делает из них число; с ней и работайте.
А если есть возможность изменить структуру базы, то разбейте номер документа на части: основная (число) и дополнительная (число, строка, разделитель, что там требуется). На клиенте это можно показать как один целый номер, а перед записью в базу разобрать на составляющие.


isasa   (2005-07-08 16:22:00) [5]

Использовать в запросе вычисляемое поле, в котором использовать функцию
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.


DSKalugin   (2005-07-08 16:21:00) [6]

WHEN EXCEPTION <имя исключения> DO
BEGIN
...
END

или

WHEN GDSCODE|SQLCODE <код ошибки> DO
BEGIN
 ...
END


Наверх

Титульная страница Поиск, карта сайта Написать письмо