Цикл по датам

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Цикл по датам

Сообщение kuhtiov » 17.06.2011 (Пт) 21:08

Подскажите как лучше реализовать. Пишу программу для регистратора рабочего времени. Функция формирования отчетов. Есть две даты, с какого по какое число формировать отчет. Как правильно сделать цикл между двумя датами (например с 01.01.2011 по 01.02.2011) чтобы мне в цикле возвращалось значение от 01.01.2011 до 01.02.2011?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16477
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Цикл по датам

Сообщение Хакер » 17.06.2011 (Пт) 21:14

Код: Выделить всё
' Вход: date_start, date_end, date_step_value, date_step_unit

d = date_start
Do
    ' Тело цикла
    d = DateAdd(date_step_unit, date_step_value, d)
Loop Until d > date_end
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Re: Цикл по датам

Сообщение kuhtiov » 18.06.2011 (Сб) 19:08

Спасибо, мысль понял. Но почему-то не происходит выход из цикла

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

date_step_unit = "d"
date_step_value = 1
date_start = "15.06.2011"
date_end = "19.06.2011"

d = date_start
Do
    ' Òåëî öèêëà
    d = DateAdd("d", date_step_value, d)
    MsgBox d & "\" & date_end
Loop Until d > date_end



При отлове видно, что даже если d > date_end, цикл продолжается

И еще заметил. Если в цикл вставить такой код, при достижении нужной даты возвращается True
Код: Выделить всё
MsgBox d & "\" & date_end & d > date_end


а если делать так, всегда будет фальш
Код: Выделить всё
MsgBox d > date_end


Прикольно получается
Код: Выделить всё
Do
    ' Òåëî öèêëà
    d = DateAdd("d", date_step_value, d)
    MsgBox d
    'MsgBox d & "\" & date_end & d > date_end
Loop Until d & "\" & date_end & d > date_end


Бред

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Цикл по датам

Сообщение ger_kar » 18.06.2011 (Сб) 21:18

Так происходит, потому, что образно выражаясь ты сравниваешь "Мягкое" с "Круглым". В твоем примере ты сравниваешь дату со строкой. Переменная d у тебя имеет тип дата, так как ф-ция DateAdd возвращает тип дата, а date_end имеет тип string.
Приведи к одному типу и сравнивай например так: date_end = CDate("19.06.2011")
И выход из цикла лучше оформить так: Loop While d < date_end
Бороться и искать, найти и перепрятать

Samovar
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 111
Зарегистрирован: 23.05.2004 (Вс) 8:13

Re: Цикл по датам

Сообщение Samovar » 23.06.2011 (Чт) 6:07

Если прокручивать только дни, нельзя ли изпользовать напрямую:
Код: Выделить всё
d = d + date_step_value
Ученье - свет, неученых - тьма.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 4

    TopList