Как перебрать диапазон дат, в котором даты хранятся как целые числа?
Мне нужно разработать систему, в которой пользователь будет указывать начальный диапазон и конечный диапазон (Под диапазоном я подразумеваю конкретный период, где ПЕРИОД задается как объединение ГОДА И МЕСЯЦА). Например, 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 должны знать об этом форуме и иметь доступ.