Редатирование периода времени больше суток
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
- ✯ Ветеран ✯
- Сообщения: 5190
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Редатирование периода времени больше суток
С10. Нужно дать возможность задавать период времени в часах и минутах. Хотел одним полем типа time. Проблемы, если период больше суток, нужно, например, 36ч 30м. Двумя полями? Некрасиво? Ещё варианты есть?
We are hard at work… for you. 

-
- ✯ Ветеран ✯
- Сообщения: 1044
- Зарегистрирован: 08 Июль 2005, 6:48
- Откуда: Россия
- Поблагодарили: 1 раз
Редатирование периода времени больше суток
kreator писал(а):С10. Нужно дать возможность задавать период времени в часах и минутах. Хотел одним полем типа time. Проблемы, если период больше суток, нужно, например, 36ч 30м. Двумя полями? Некрасиво? Ещё варианты есть?

все ответы - в вашем вопросе...
одним - можно, но видимо, не типа time...
-
- Полимат
- Сообщения: 1830
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 28 раз
- Поблагодарили: 10 раз
Редатирование периода времени больше суток
Не совсем понятно, что Вы хотите в результате получить.
И чем плохо несколько полей, посмотрите как в андроидах на смартфонах это реализовано.

“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
-
- ✯ Ветеран ✯
- Сообщения: 5190
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Редатирование периода времени больше суток
Андроид - это хорошо. Но сейчас речь о десктопе Винды. Хочу одно поле формата time (ориентируемся на spin, формат - ##:##), но, чтобы можно было бы ввести часы больше 24, минуты нельзя ввести больше 59.
We are hard at work… for you. 

-
- Полимат
- Сообщения: 1830
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 28 раз
- Поблагодарили: 10 раз
Редатирование периода времени больше суток
это самое простое что пришло в голову

Код: Выделить всё
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
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
- Губин Игорь
- Шубуршун
- Сообщения: 2601
- Зарегистрирован: 16 Сентябрь 2005, 16:35
- Откуда: Москва
- Благодарил (а): 3 раза
- Поблагодарили: 27 раз
Редатирование периода времени больше суток
Сегодня 56 декабря 2015г. 40 часов 240 минут... 

Это я только кажусь дураком! На самом деле я полный идиот!
-
- Полимат
- Сообщения: 1830
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 28 раз
- Поблагодарили: 10 раз
Редатирование периода времени больше суток
насчет 240 минут Вы не правы

“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
- Игорь Столяров
- Ветеран движения
- Сообщения: 8090
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 29 раз
- Поблагодарили: 98 раз
Редатирование периода времени больше суток
В общем-то правильно написали. Берем строку из 6 символов и форматируем ее в одно поле @p##:##:##p
После ввода поля по Accept пересчитываем часы, минуты, секунды в сотые и пишем в Time (а лучше в long).
Но в любом случае, стандартный шаблон поля @t работает только с временем внутри суток (23:59:59) и
для реализации такой возможности не уместен ...
Make Clarion Great Again ! 
-
- ✯ Ветеран ✯
- Сообщения: 5190
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Редатирование периода времени больше суток
Казалось бы простая задача, а решение не совсем тривиальное. Сделал так. В БД период храню в Long в минутах (часы будут пересчитаны в минуты). На экране делаю Spin c форматом ##:## (Переменную формирую по формуле часы*100+минуты). На событие NewSelection вешаю ещё код пересчёта (допустим, если "минуты" переваливают за 59, то прибавляется час, минуты сбрасываются). Как-то так. Если пользователь не пользуется кнопочками "верх/вниз" спина, то он может ввести, допустим "04:75", по Accepted будет пересчитано в "05:15".
We are hard at work… for you. 

-
- ✯ Ветеран ✯
- Сообщения: 1044
- Зарегистрирован: 08 Июль 2005, 6:48
- Откуда: Россия
- Поблагодарили: 1 раз
Редатирование периода времени больше суток
понятно что "внутри" так, но есть ещё "снаружи"..., я бы при превышении суток (более 24 часов) выводил в привычном формате пользователю - "... 1 день 3 часа 33 минуты ... 3 года 5 месяцев 15 дней ... 5 лет 1 месяц 2 дня 3 часа 1 минута..."
Редатирование периода времени больше суток
Должно быть не понял особого смысла такой заморочки. Предположу лишь, что максимально вы можете записать в поле 99:59.
Для этого можно было бы в БД отвести не Long, а Short. Какая-никакая, а всё же экономия. Ну это так...
Для этого можно было бы в БД отвести не Long, а Short. Какая-никакая, а всё же экономия. Ну это так...
-
- ✯ Ветеран ✯
- Сообщения: 5190
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Редатирование периода времени больше суток
По бизнес-процессу кажется, что больше быть не должно. Но формально может и 999:59, т.е. формат - <##:##. Это уже с запасом. Short'а может не хватить. Вообще не люблю Short, мина замедленного действия. Тысячу раз видел - программа неправильно работает, и не понятно почему. Потом оказывается, что значение не влезает в Short.Shur писал(а):Предположу лишь, что максимально вы можете записать в поле 99:59.
We are hard at work… for you. 

-
- ✯ Ветеран ✯
- Сообщения: 1044
- Зарегистрирован: 08 Июль 2005, 6:48
- Откуда: Россия
- Поблагодарили: 1 раз
Редатирование периода времени больше суток
что-то, когда-то...kreator писал(а):По бизнес-процессу кажется, что больше быть не должно. Но формально может и 999:59, т.е. формат - <##:##. Это уже с запасом. Short'а может не хватить. Вообще не люблю Short, мина замедленного действия. Тысячу раз видел - программа неправильно работает, и не понятно почему. Потом оказывается, что значение не влезает в Short.Shur писал(а):Предположу лишь, что максимально вы можете записать в поле 99:59.
Код: Выделить всё
...
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)
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))
Последний раз редактировалось Ал 06 Июль 2017, 11:16, всего редактировалось 6 раз.
Редатирование периода времени больше суток
Немного отклоняясь от темы в защиту short...
Впрочем, делает он это хреново: ошибка здесь возникает только в третьей строке на присваивании. А декларацию с инициализацией (1-я строка) он съедает запросто. Но хотя бы пытается...
Этот код тоже "проглатывается" на ура.
Так собственно к чему это я? К тому, что это накладывает на разработчика некоторую дисциплину. Ведь short (в Кларионе в отличие от long -- вспомним implicit переменные) самостоятельно в программе взяться не может. Его как минимум надо объявить. Значит была допущена ошибка проектирования или не в полной мере был отработан Change request (если ошибка стала возникать после внесения изменений в работающую программу).
Что сказать? Язык Кларион не строго типизированный, что подразумевает неявное преобразование типов. Однако в некоторых не строго типизированных языках неправильное присваивание влечёт за собой возникновение ошибки. Например, MS SQL:
Код: Выделить всё
declare @s smallint = 0xFFFF
declare @l int = 0x8000
set @s = @l
select @s
Код: Выделить всё
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 (если ошибка стала возникать после внесения изменений в работающую программу).
Последний раз редактировалось Shur 27 Январь 2016, 15:10, всего редактировалось 1 раз.
-
- ✯ Ветеран ✯
- Сообщения: 5190
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Редатирование периода времени больше суток
Конечно, ошибка проектирования!!! Но знать всё может только господь Бог, а мы маленькие винтикиShur писал(а):Значит была допущена ошибка проектирования или не в полной мере был отработан Change request (если ошибка стала возникать после внесения изменений в работающую программу).

We are hard at work… for you. 
