Редатирование периода времени больше суток

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
kreator
✯ Ветеран ✯
Сообщения: 5190
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Редатирование периода времени больше суток

Сообщение kreator »

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

Редатирование периода времени больше суток

Сообщение Ал »

kreator писал(а):С10. Нужно дать возможность задавать период времени в часах и минутах. Хотел одним полем типа time. Проблемы, если период больше суток, нужно, например, 36ч 30м. Двумя полями? Некрасиво? Ещё варианты есть?
:)
все ответы - в вашем вопросе...
одним - можно, но видимо, не типа time...
gopstop2007
Полимат
Сообщения: 1830
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 28 раз
Поблагодарили: 10 раз

Редатирование периода времени больше суток

Сообщение gopstop2007 »

Не совсем понятно, что Вы хотите в результате получить. :) И чем плохо несколько полей, посмотрите как в андроидах на смартфонах это реализовано.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
kreator
✯ Ветеран ✯
Сообщения: 5190
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Редатирование периода времени больше суток

Сообщение kreator »

Андроид - это хорошо. Но сейчас речь о десктопе Винды. Хочу одно поле формата time (ориентируемся на spin, формат - ##:##), но, чтобы можно было бы ввести часы больше 24, минуты нельзя ввести больше 59.
We are hard at work… for you. :)
gopstop2007
Полимат
Сообщения: 1830
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 28 раз
Поблагодарили: 10 раз

Редатирование периода времени больше суток

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

Редатирование периода времени больше суток

Сообщение Губин Игорь »

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

Редатирование периода времени больше суток

Сообщение gopstop2007 »

Губин Игорь писал(а): Сегодня 56 декабря 2015г. 40 часов 240 минут... :idied:
насчет 240 минут Вы не правы
kreator писал(а):минуты нельзя ввести больше 59.
:D
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8090
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 29 раз
Поблагодарили: 98 раз

Редатирование периода времени больше суток

Сообщение Игорь Столяров »

kreator писал(а): Двумя полями? Некрасиво? Ещё варианты есть?
В общем-то правильно написали. Берем строку из 6 символов и форматируем ее в одно поле @p##:##:##p
После ввода поля по Accept пересчитываем часы, минуты, секунды в сотые и пишем в Time (а лучше в long).
Но в любом случае, стандартный шаблон поля @t работает только с временем внутри суток (23:59:59) и
для реализации такой возможности не уместен ...
Make Clarion Great Again ! 😎
kreator
✯ Ветеран ✯
Сообщения: 5190
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Редатирование периода времени больше суток

Сообщение kreator »

Казалось бы простая задача, а решение не совсем тривиальное. Сделал так. В БД период храню в 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 минута..."
Shur
Ветеран
Сообщения: 384
Зарегистрирован: 02 Июль 2011, 18:49

Редатирование периода времени больше суток

Сообщение Shur »

Должно быть не понял особого смысла такой заморочки. Предположу лишь, что максимально вы можете записать в поле 99:59.
Для этого можно было бы в БД отвести не Long, а Short. Какая-никакая, а всё же экономия. Ну это так...
kreator
✯ Ветеран ✯
Сообщения: 5190
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Редатирование периода времени больше суток

Сообщение kreator »

Shur писал(а):Предположу лишь, что максимально вы можете записать в поле 99:59.
По бизнес-процессу кажется, что больше быть не должно. Но формально может и 999:59, т.е. формат - <##:##. Это уже с запасом. Short'а может не хватить. Вообще не люблю Short, мина замедленного действия. Тысячу раз видел - программа неправильно работает, и не понятно почему. Потом оказывается, что значение не влезает в Short.
We are hard at work… for you. :)
Ал
✯ Ветеран ✯
Сообщения: 1044
Зарегистрирован: 08 Июль 2005, 6:48
Откуда: Россия
Поблагодарили: 1 раз

Редатирование периода времени больше суток

Сообщение Ал »

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 - внезапно потребовалось недавно похожее, не думая ("бац-бац и...") :facepalm: , вариация на основе предыд.
Открыть, ногами не бить
:mrgreen:

Код: Выделить всё

...
 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 раз.
Shur
Ветеран
Сообщения: 384
Зарегистрирован: 02 Июль 2011, 18:49

Редатирование периода времени больше суток

Сообщение 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 (если ошибка стала возникать после внесения изменений в работающую программу).
Последний раз редактировалось Shur 27 Январь 2016, 15:10, всего редактировалось 1 раз.
kreator
✯ Ветеран ✯
Сообщения: 5190
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Редатирование периода времени больше суток

Сообщение kreator »

Shur писал(а):Значит была допущена ошибка проектирования или не в полной мере был отработан Change request (если ошибка стала возникать после внесения изменений в работающую программу).
Конечно, ошибка проектирования!!! Но знать всё может только господь Бог, а мы маленькие винтики :mrgreen: . Я перестраховываюсь, на самом деле, попав несколько раз (может и не сам), дую на воду. Но опыт показывает, что Short'а частенько не хватает.
We are hard at work… for you. :)
Ответить