Страница 1 из 2
Редатирование периода времени больше суток
Добавлено: 26 Январь 2016, 15:17
kreator
С10. Нужно дать возможность задавать период времени в часах и минутах. Хотел одним полем типа time. Проблемы, если период больше суток, нужно, например, 36ч 30м. Двумя полями? Некрасиво? Ещё варианты есть?
Редатирование периода времени больше суток
Добавлено: 26 Январь 2016, 16:37
Ал
kreator писал(а):С10. Нужно дать возможность задавать период времени в часах и минутах. Хотел одним полем типа time. Проблемы, если период больше суток, нужно, например, 36ч 30м. Двумя полями? Некрасиво? Ещё варианты есть?
все ответы - в вашем вопросе...
одним - можно, но видимо, не типа time...
Редатирование периода времени больше суток
Добавлено: 26 Январь 2016, 16:39
gopstop2007
Не совсем понятно, что Вы хотите в результате получить.

И чем плохо несколько полей, посмотрите как в андроидах на смартфонах это реализовано.
Редатирование периода времени больше суток
Добавлено: 26 Январь 2016, 17:03
kreator
Андроид - это хорошо. Но сейчас речь о десктопе Винды. Хочу одно поле формата time (ориентируемся на spin, формат - ##:##), но, чтобы можно было бы ввести часы больше 24, минуты нельзя ввести больше 59.
Редатирование периода времени больше суток
Добавлено: 26 Январь 2016, 17:42
gopstop2007
это самое простое что пришло в голову
Код: Выделить всё
l_time string(10)
l_tempHour SHORT
l_tempMin BYTE
! toch up
CASE l_tempMin
OF 0; l_tempMin = 1
OF 60
l_tempMin = 1
l_tempHour += 1
ELSE
l_tempMin += 1
END
l_time[1:7] = l_tempHour
l_time[8] = ':'
l_time[9:10] = l_tempMin
Редатирование периода времени больше суток
Добавлено: 26 Январь 2016, 19:50
Губин Игорь
Сегодня 56 декабря 2015г. 40 часов 240 минут...

Редатирование периода времени больше суток
Добавлено: 26 Январь 2016, 20:04
gopstop2007
Губин Игорь писал(а): Сегодня 56 декабря 2015г. 40 часов 240 минут...

насчет 240 минут Вы не правы
kreator писал(а):минуты нельзя ввести больше 59.

Редатирование периода времени больше суток
Добавлено: 26 Январь 2016, 20:39
Игорь Столяров
kreator писал(а): Двумя полями? Некрасиво? Ещё варианты есть?
В общем-то правильно написали. Берем строку из 6 символов и форматируем ее в одно поле @p##:##:##p
После ввода поля по Accept пересчитываем часы, минуты, секунды в сотые и пишем в Time (а лучше в long).
Но в любом случае, стандартный шаблон поля @t работает только с временем внутри суток (23:59:59) и
для реализации такой возможности не уместен ...
Редатирование периода времени больше суток
Добавлено: 27 Январь 2016, 10:46
kreator
Казалось бы простая задача, а решение не совсем тривиальное. Сделал так. В БД период храню в Long в минутах (часы будут пересчитаны в минуты). На экране делаю Spin c форматом ##:## (Переменную формирую по формуле часы*100+минуты). На событие NewSelection вешаю ещё код пересчёта (допустим, если "минуты" переваливают за 59, то прибавляется час, минуты сбрасываются). Как-то так. Если пользователь не пользуется кнопочками "верх/вниз" спина, то он может ввести, допустим "04:75", по Accepted будет пересчитано в "05:15".
Редатирование периода времени больше суток
Добавлено: 27 Январь 2016, 11:28
Ал
понятно что "внутри" так, но есть ещё "снаружи"..., я бы при превышении суток (более 24 часов) выводил в привычном формате пользователю - "... 1 день 3 часа 33 минуты ... 3 года 5 месяцев 15 дней ... 5 лет 1 месяц 2 дня 3 часа 1 минута..."
Редатирование периода времени больше суток
Добавлено: 27 Январь 2016, 11:56
Shur
Должно быть не понял особого смысла такой заморочки. Предположу лишь, что максимально вы можете записать в поле 99:59.
Для этого можно было бы в БД отвести не Long, а Short. Какая-никакая, а всё же экономия. Ну это так...
Редатирование периода времени больше суток
Добавлено: 27 Январь 2016, 12:14
kreator
Shur писал(а):Предположу лишь, что максимально вы можете записать в поле 99:59.
По бизнес-процессу кажется, что больше быть не должно. Но формально может и 999:59, т.е. формат - <##:##. Это уже с запасом. Short'а может не хватить. Вообще не люблю Short, мина замедленного действия. Тысячу раз видел - программа неправильно работает, и не понятно почему. Потом оказывается, что значение не влезает в Short.
Редатирование периода времени больше суток
Добавлено: 27 Январь 2016, 12:18
Ал
kreator писал(а):Shur писал(а):Предположу лишь, что максимально вы можете записать в поле 99:59.
По бизнес-процессу кажется, что больше быть не должно. Но формально может и 999:59, т.е. формат - <##:##. Это уже с запасом. Short'а может не хватить. Вообще не люблю Short, мина замедленного действия. Тысячу раз видел - программа неправильно работает, и не понятно почему. Потом оказывается, что значение не влезает в Short.
что-то, когда-то...
Код: Выделить всё
...
loc:SCompletionTime = 'дано: '&left(clip(TextPeriod(TSK:StartDate,TSK:StartTime,TSK:CompletionDate,TSK:CompletionTime))) ! период на исполнение
display(loc:SCompletionTime)
if TSK:FactDate = 0 ! не завершена
if Tsk:CompletionDate > today() or (Tsk:CompletionDate = today() and TSK:CompletionTime >= clock()) ! не просрочено
loc:SFinishTime = 'осталось: ' & left(clip(TextPeriod(today(),clock(),TSK:CompletionDate,TSK:CompletionTime)))
else ! просрочено
loc:SFinishTime = 'просрочка: ' & left(clip(TextPeriod(TSK:CompletionDate,TSK:CompletionTime,today(),clock())))
.
else ! завершена
loc:SFinishTime = 'завершено: ' & left(clip(TextPeriod(TSK:StartDate,TSK:StartTime,TSK:FactDate,TSK:FactTime)))
.
display(loc:SFinishTime)
...
Код: Выделить всё
TextPeriod PROCEDURE (StartDate,StartTime,CompletionDate,CompletionTime)
!PROCEDURE(string,string,string,string),string
loc:SStr STRING(255) !
loc:period STRING(255) !
loc:LastByte BYTE !
loc:ReturnStr STRING(255) !
CODE
! формирование разницы между днями часами минутами в виде текстовой строки для вывода
! входные параметры
! StartDate даты начала
! StartTime время начала
! CompletionDate дата завершения
! CompletionTime время завершения
loc:ReturnStr = ''
Loc:Period = ''
loc:SStr = ''
loc:LastByte = 0
IF CompletionDate - StartDate > 0 ! дата завершения позже даты начала
Loc:Period = LEFT(CLIP(CompletionDate - StartDate))
IF Loc:Period > 365 ! РАСЧЕТ В ГОДАХ
Loc:LastByte = LEFT(INT(Loc:Period/365)) ! лет
Loc:Period = LEFT(Loc:Period - (Loc:LastByte * 365)) ! остаток
loc:SStr = LEFT(Loc:LastByte)
Loc:LastByte = LEFT(CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr)),1)))
CASE Loc:LastByte
OF 1
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 11
loc:SStr = CLIP(loc:SStr)& ' лет'
ELSE
loc:SStr = CLIP(loc:SStr)& ' год'
END
OF 2 TO 4
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 12 TO 14
loc:SStr = CLIP(loc:SStr)& ' лет'
ELSE
loc:SStr = CLIP(loc:SStr)& ' года'
END
ELSE ! 5 TO 9
loc:SStr = CLIP(loc:SStr)& ' лет'
END
END
loc:ReturnStr = LEFT(clip(loc:SStr)) ! для вывода
loc:SStr = ''
IF Loc:Period > 30 ! РАСЧЕТ В МЕСЯЦАХ
Loc:LastByte = LEFT(INT(Loc:Period/30)) ! месяцев
Loc:Period = LEFT(Loc:Period - (Loc:LastByte * 30)) ! остаток
loc:SStr = LEFT(Loc:LastByte)
Loc:LastByte = LEFT(CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr)),1)))
CASE Loc:LastByte
OF 1
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 11
loc:SStr = CLIP(loc:SStr)& ' месяцев'
ELSE
loc:SStr = CLIP(loc:SStr)& ' месяц'
END
OF 2 TO 4
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 12 TO 14
loc:SStr = CLIP(loc:SStr)& ' месяцев'
ELSE
loc:SStr = CLIP(loc:SStr)& ' месяца'
END
ELSE ! 5 TO 9
loc:SStr = CLIP(loc:SStr)& ' месяцев'
END
END
loc:ReturnStr = CLIP(CLIP(loc:ReturnStr) & ' ' & CLIP(loc:SStr)) ! для вывода
loc:SStr = ''
! РАСЧЕТ В ДНЯХ
Loc:LastByte = CLIP(SUB(LOC:Period,LEN(CLIP(LOC:Period)),1))
CASE Loc:LastByte
OF 1
CASE CLIP(SUB(LOC:Period,LEN(CLIP(LOC:Period))-1,2))
OF 11
LOC:Period = CLIP(LOC:Period)& ' дней'
ELSE
LOC:Period = CLIP(LOC:Period)& ' день'
END
OF 2 TO 4
CASE CLIP(SUB(LOC:Period,LEN(CLIP(LOC:Period))-1,2))
OF 12 TO 14
LOC:Period = CLIP(LOC:Period)& ' дней'
ELSE
LOC:Period = CLIP(LOC:Period)& ' дня'
END
ELSE ! 5 TO 9
LOC:Period = CLIP(LOC:Period)& ' дней'
END
Loc:Period = CLIP(loc:ReturnStr)&' '&CLIP(Loc:Period)
ELSE
Loc:Period = ''
.
! РАСЧЕТ В МИНУТАХ
loc:SStr = ''
IF CompletionTime - StartTime => 0 ! время завершения больше времени начала
loc:SStr = LEFT(INT((CompletionTime-StartTime)/360000))
Loc:LastByte = LEFT(CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr)),1)))
CASE Loc:LastByte
OF 1
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 11 !OROF 3
LOC:Period = CLIP(LOC:Period)&' '&CLIP(loc:SStr)& ' часов'
ELSE
LOC:Period = CLIP(LOC:Period)&' '&CLIP(loc:SStr)&' час'
END
OF 2 TO 4
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 12 TO 14 !OROF 3
LOC:Period = CLIP(LOC:Period)&' '&CLIP(loc:SStr)& ' часов'
ELSE
LOC:Period = CLIP(LOC:Period)&' '&CLIP(loc:SStr)&' часа'
END
ELSE ! =0 не выводим нулевые
IF CLIP(loc:SStr) > 0
LOC:Period = CLIP(LOC:Period)&' '&CLIP(loc:SStr)& ' часов'
END
END
loc:SStr = LEFT(INT(((CompletionTime-StartTime)-INT((CompletionTime-StartTime)/360000)*360000)/6000))
Loc:LastByte = LEFT(CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr)),1)))
CASE Loc:LastByte
OF 1
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 11
LOC:Period = CLIP(LOC:Period)&' '&CLIP(loc:SStr)& ' минут'
ELSE
LOC:Period = CLIP(LOC:Period)&' '&CLIP(loc:SStr)& ' минута'
END
OF 2 TO 4
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 12 TO 14
LOC:Period = CLIP(LOC:Period)&' '&CLIP(loc:SStr)& ' минут'
ELSE
LOC:Period = CLIP(LOC:Period)&' '&CLIP(loc:SStr)& ' минуты'
END
ELSE
IF CLIP(loc:SStr) > 0
LOC:Period = CLIP(LOC:Period)&' '&CLIP(loc:SStr)& ' минут'
END
END
ELSE
loc:SStr = LEFT(INT(StartTime/360000))
Loc:LastByte = CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr)),1))
CASE Loc:LastByte
OF 1
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 11
LOC:Period = CLIP(LOC:Period)&' '&CLIP(loc:SStr)& ' часов'
ELSE
LOC:Period = CLIP(LOC:Period)&' '&CLIP(loc:SStr)&' час'
END
OF 2 TO 4
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 12 TO 14
LOC:Period = CLIP(LOC:Period)&' '&CLIP(loc:SStr)& ' часов'
ELSE
LOC:Period = CLIP(LOC:Period)&' '&CLIP(loc:SStr)&' часа'
END
ELSE
IF CLIP(loc:SStr) > 0
LOC:Period = CLIP(LOC:Period)&' '&CLIP(loc:SStr)& ' часов'
END
END
loc:SStr = LEFT(INT((StartTime-INT(StartTime/360000)*360000)/6000))
Loc:LastByte = CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr)),1))
CASE Loc:LastByte
OF 1
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 11
LOC:Period = CLIP(LOC:Period)&' '&CLIP(loc:SStr)& ' минут'
ELSE
LOC:Period = CLIP(LOC:Period)&' '&CLIP(loc:SStr)& ' минута'
END
OF 2 TO 4
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 12 TO 14
LOC:Period = CLIP(LOC:Period)&' '&CLIP(loc:SStr)& ' минут'
ELSE
LOC:Period = CLIP(LOC:Period)&' '&CLIP(loc:SStr)& ' минуты'
END
ELSE
IF CLIP(loc:SStr) > 0
LOC:Period = CLIP(LOC:Period)&' '&CLIP(loc:SStr)& ' минут'
END
END
.
loc:SStr = ''
RETURN CLIP(loc:period)
PS поправил чуток
pss - внезапно потребовалось недавно похожее, не думая ("бац-бац и...")

, вариация на основе предыд.
Код: Выделить всё
...
loc:CompletionTime = (loc:SumL1 * 60 * 60 * 100) !на 1го в миллисекундах, loc:SumL1 - некая сумма в часах
loc:Time1Text = TextPeriod(loc:CompletionTime)
...
TextPeriod PROCEDURE (TimePeriod) ! Declare Procedure
loc:SStr STRING(255) !
loc:period STRING(255) !
loc:LastByte BYTE !
loc:ReturnStr STRING(255) !
CODE
! формирование периода в виде текстовой строки для вывода ... днями часами минутами
! входные параметры:
! TimePeriod - STRING, период времени в миллисек.
loc:ReturnStr = ''
Loc:Period = ''
loc:SStr = ''
loc:LastByte = 0
IF TimePeriod > 0 ! дата завершения позже даты начала
Loc:Period = LEFT(CLIP(TimePeriod))
IF Loc:Period > (12*30*24*60*6000) ! РАСЧЕТ В ГОДАХ
Loc:LastByte = LEFT(INT(Loc:Period/(12*30*24*360000))) ! лет
Loc:Period = LEFT(Loc:Period - (Loc:LastByte * (12*30*24*360000))) ! остаток
loc:SStr = LEFT(Loc:LastByte)
Loc:LastByte = LEFT(CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr)),1)))
CASE Loc:LastByte
OF 1
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 11
loc:SStr = CLIP(loc:SStr)& ' лет'
ELSE
loc:SStr = CLIP(loc:SStr)& ' год'
END
OF 2 TO 4
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 12 TO 14
loc:SStr = CLIP(loc:SStr)& ' лет'
ELSE
loc:SStr = CLIP(loc:SStr)& ' года'
END
OF 5 TO 9
loc:SStr = CLIP(loc:SStr)& ' лет'
ELSE
IF CLIP(loc:SStr) > 0
loc:SStr = CLIP(loc:SStr)& ' лет'
ELSE
loc:SStr = ''
END
END
END
loc:ReturnStr = LEFT(clip(loc:SStr)) ! для вывода
loc:SStr = ''
IF Loc:Period > (30*24*360000) ! РАСЧЕТ В МЕСЯЦАХ
Loc:LastByte = LEFT(INT(Loc:Period/(30*24*360000))) ! месяцев
Loc:Period = LEFT(Loc:Period - (Loc:LastByte * (30*24*360000))) ! остаток
loc:SStr = LEFT(Loc:LastByte)
Loc:LastByte = LEFT(CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr)),1)))
CASE Loc:LastByte
OF 1
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 11
loc:SStr = CLIP(loc:SStr)& ' месяцев'
ELSE
loc:SStr = CLIP(loc:SStr)& ' месяц'
END
OF 2 TO 4
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 12 TO 14
loc:SStr = CLIP(loc:SStr)& ' месяцев'
ELSE
loc:SStr = CLIP(loc:SStr)& ' месяца'
END
OF 5 TO 9
loc:SStr = CLIP(loc:SStr)& ' месяцев'
ELSE
IF CLIP(loc:SStr) > 0
loc:SStr = CLIP(loc:SStr)& ' месяцев'
ELSE
loc:SStr = ''
END
END
END
loc:ReturnStr = CLIP(CLIP(loc:ReturnStr) & ' ' & CLIP(loc:SStr)) ! для вывода
loc:SStr = ''
! РАСЧЕТ В ДНЯХ
IF Loc:Period > (24*360000) ! РАСЧЕТ В днях
Loc:LastByte = LEFT(INT(Loc:Period/(24*360000))) ! дней
Loc:Period = LEFT(Loc:Period - (Loc:LastByte * (24*360000))) ! остаток
loc:SStr = LEFT(Loc:LastByte)
Loc:LastByte = LEFT(CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr)),1)))
CASE Loc:LastByte
OF 1
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 11
loc:SStr = CLIP(loc:SStr)& ' дней'
ELSE
loc:SStr = CLIP(loc:SStr)& ' день'
END
OF 2 TO 4
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 12 TO 14
loc:SStr = CLIP(loc:SStr)& ' дней'
ELSE
loc:SStr = CLIP(loc:SStr)& ' дня'
END
OF 5 TO 9
loc:SStr = CLIP(loc:SStr)& ' дней'
ELSE
!loc:SStr = ''
IF CLIP(loc:SStr) > 0
loc:SStr = CLIP(loc:SStr)& ' дней'
ELSE
loc:SStr = ''
END
END
END
loc:ReturnStr = CLIP(loc:ReturnStr)&' '&CLIP(loc:SStr)
loc:SStr = ''
! РАСЧЕТ В часах
IF Loc:Period > (360000) ! РАСЧЕТ В часах
Loc:LastByte = LEFT(INT(Loc:Period/(360000))) ! часов
Loc:Period = LEFT(Loc:Period - (Loc:LastByte * (360000))) ! остаток
loc:SStr = LEFT(Loc:LastByte)
Loc:LastByte = LEFT(CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr)),1)))
CASE Loc:LastByte
OF 1
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 11 !OROF 3
loc:SStr = CLIP(loc:SStr)& ' часов'
ELSE
loc:SStr = CLIP(loc:SStr)&' час'
END
OF 2 TO 4
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 12 TO 14 !OROF 3
loc:SStr = CLIP(loc:SStr)& ' часов'
ELSE
loc:SStr = CLIP(loc:SStr)&' часа'
END
ELSE ! =0 не выводим нулевые
IF CLIP(loc:SStr) > 0
loc:SStr = CLIP(loc:SStr)& ' часов'
ELSE
loc:SStr = ''
END
END
END
loc:ReturnStr = CLIP(loc:ReturnStr)&' '&CLIP(loc:SStr)
loc:SStr = ''
!РАСЧЕТ В минутах
Loc:LastByte = LEFT(INT(Loc:Period/(6000))) !
Loc:Period = LEFT(Loc:Period - (Loc:LastByte * (6000))) ! остаток
loc:SStr = LEFT(Loc:LastByte)
Loc:LastByte = LEFT(CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr)),1)))
CASE Loc:LastByte
OF 1
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 11
loc:SStr = CLIP(loc:SStr)& ' минут'
ELSE
loc:SStr = CLIP(loc:SStr)& ' минута'
END
OF 2 TO 4
CASE CLIP(SUB(loc:SStr,LEN(CLIP(loc:SStr))-1,2))
OF 12 TO 14
loc:SStr = CLIP(loc:SStr)& ' минут'
ELSE
loc:SStr = CLIP(loc:SStr)& ' минуты'
END
ELSE
IF CLIP(loc:SStr) > 0
loc:SStr = CLIP(loc:SStr)& ' минут'
ELSE
loc:SStr = ''
END
END
loc:ReturnStr = CLIP(loc:ReturnStr)&' '&CLIP(loc:SStr)
.
loc:SStr = ''
RETURN(CLIP(loc:ReturnStr))
Редатирование периода времени больше суток
Добавлено: 27 Январь 2016, 14:50
Shur
Немного отклоняясь от темы в защиту short...
kreator писал(а): Тысячу раз видел - программа неправильно работает, и не понятно почему. Потом оказывается, что значение не влезает в Short
Что сказать? Язык Кларион не строго типизированный, что подразумевает неявное преобразование типов. Однако в некоторых не строго типизированных языках неправильное присваивание влечёт за собой возникновение ошибки. Например, MS SQL:
Код: Выделить всё
declare @s smallint = 0xFFFF
declare @l int = 0x8000
set @s = @l
select @s
Впрочем, делает он это хреново: ошибка здесь возникает только в третьей строке на присваивании. А декларацию с инициализацией (1-я строка) он съедает запросто. Но хотя бы пытается...
Код: Выделить всё
create procedure _short_test (@i smallint)
as
print @i -- вывести @i
go
exec _short_test 0xffff -- при вызове выводится -1
go
drop procedure _short_test
go
Этот код тоже "проглатывается" на ура.
Так собственно к чему это я? К тому, что это накладывает на разработчика некоторую дисциплину. Ведь short (в Кларионе в отличие от long -- вспомним implicit переменные) самостоятельно в программе взяться не может. Его как минимум надо объявить. Значит была допущена ошибка проектирования или не в полной мере был отработан Change request (если ошибка стала возникать после внесения изменений в работающую программу).
Редатирование периода времени больше суток
Добавлено: 27 Январь 2016, 15:04
kreator
Shur писал(а):Значит была допущена ошибка проектирования или не в полной мере был отработан Change request (если ошибка стала возникать после внесения изменений в работающую программу).
Конечно, ошибка проектирования!!! Но знать всё может только господь Бог, а мы маленькие винтики

. Я перестраховываюсь, на самом деле, попав несколько раз (может и не сам), дую на воду. Но опыт показывает, что Short'а частенько не хватает.