Как перебрать диапазон дат, в котором даты хранятся как целые числа?

Мне нужно разработать систему, в которой пользователь будет указывать начальный диапазон и конечный диапазон (Под диапазоном я подразумеваю конкретный период, где ПЕРИОД задается как объединение ГОДА И МЕСЯЦА). Например, PERIOD = 201304, где 2013 - это введенный пользователем год, а 04 - МЕСЯЦ. Пользователь может указать максимальный диапазон до 2 лет.

Данные должны быть выбраны на основе введенного пользователем диапазона. Проблема в том, что всякий раз, когда я пытаюсь циклически пройти период, PERIOD меняется после 201312 на 201313. У меня есть отдельные переменные для выбранного пользователем года и месяца (start_year, start_month, end_year, end_month)

Я сделал цикл IF, в котором я пытался сделать следующее

  FOR p_tmpyear = p_tempfrom TO p_tempto

        IF (p_monthfrm < 12) THEN
        LET p_yearfrm = p_yearfrm + 1
        LET p_monthfrm = 01
        LET p_fromperiod = p_yearfrm + 1,p_monthfrm >p_fromperiod is an integer storing concatenated Month and Year, to achieve the desired PERIOD format as mentioned above.
        LET p_tempfrom  = p_fromperiod
    END IF
    DISPLAY p_tmpyear
END FOR

Я даже попробовал это:

IF (p_fromperiod MOD p_yearfrm = 13) ТО

    LET p_yearfrm = p_yearfrm + 1

    LET p_monthfrm = 01

    LET p_fromperiod = p_yearfrm + 1,p_monthfrm

Тем не менее, период меняется с 2012 по 2012 год. Я хочу, чтобы это был 201301 год. Пожалуйста, помогите.

1 ответ

Как вы, наверное, догадались, у вас есть некоторые недостатки в вашей логике. Первый пример слишком сложен для расшифровки, а второй показывает, что вы не понимаете, что делает оператор MOD. При правильном использовании в этом контексте она будет иметь вид переменной IF MOD 12 = 0, т. Е. Каждое 12-е значение что-то делает.

Я думаю, где вы идете не так, пытаясь сделать все это в одном цикле. Я бы упростил задачу и разбил задачу на две вложенные циклы: одну за год, одну за месяц

DEFINE start_year, end_year, start_month, end_month INTEGER -- sample values 2012, 2013,7,6

DEFINE loop_year, loop_month INTEGER -- values used to loop through year and month respectively
DEFINE loop_first_month, loop_last_month INTEGER -- for each year, calc first month and last month

DEFINE period CHAR(6)

-- First loop over year
FOR loop_year = start_year TO end_year
    -- Calculate first and last month for the given year

    -- If first year, use passed in start month else use 1
    IF loop_year  = start_year THEN
        LET loop_first_month = start_month
    ELSE
        LET loop_first_month = 1
    END IF

    -- If last year, use passed in end month else use 12
    IF loop_year = end_year THEN
        LET loop_last_month = end_month
    ELSE
        LET loop_last_month = 12
    END IF

    -- Second loop over month
    FOR loop_month = loop_first_month TO loop_last_month
        LET period = loop_year USING "&&&&",loop_month USING "&&"
        DISPLAY period
    END FOR
END FOR

Я также призываю вас также публиковать подобные вопросы на специальном форуме разработчиков 4Js Genero на сайте 4Js http://www.4js.com/fjs_forum/ а также здесь. Большинство разработчиков Genero должны знать об этом форуме и иметь доступ.

Другие вопросы по тегам