Страница 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 минут... :idied:

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

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

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

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

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

Добавлено: 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 (если ошибка стала возникать после внесения изменений в работающую программу).
Конечно, ошибка проектирования!!! Но знать всё может только господь Бог, а мы маленькие винтики :mrgreen: . Я перестраховываюсь, на самом деле, попав несколько раз (может и не сам), дую на воду. Но опыт показывает, что Short'а частенько не хватает.