|
Алгоритм: перебор месяцев в периоде | ☑ | ||
---|---|---|---|---|
0
extrim-style
25.01.13
✎
14:49
|
Подскажите грамотный перебор месяцев в периоде. Начало перебора от начала периода, конец перебора - конец периода.
|
|||
1
salvator
25.01.13
✎
14:50
|
Для Сч=Месяц(ДатаНач) По Месяц(ДатаКон) Цикл
|
|||
2
Maxus43
25.01.13
✎
14:50
|
перебор где? зачем?
задачу огласи, там ясней будет |
|||
3
Maxus43
25.01.13
✎
14:51
|
(1) года разные могут быть
|
|||
4
salvator
25.01.13
✎
14:51
|
Но тут возникает загвоздка, если даты в разных годах. В любом случае, каков вопрос - таков ответ ))
|
|||
5
extrim-style
25.01.13
✎
14:51
|
(0) перебор помесячно
|
|||
6
pessok
25.01.13
✎
14:51
|
Месяцев = Месяц(КонецПериода) - Месяц(НачалоПериода)
Для А = 0 По Месяцев Цикл |
|||
7
Maxus43
25.01.13
✎
14:52
|
(6) тоже (3) :)
|
|||
8
фросия
25.01.13
✎
14:52
|
(6) если там больше 12 мес- не по получится
|
|||
9
extrim-style
25.01.13
✎
14:53
|
(6) не катит. см (3)
|
|||
10
c00Lo
25.01.13
✎
14:54
|
Год(Дата1)*12 + Месяц(Дата1) по Год(Дата2)*12 + Месяц(Дата2)
|
|||
11
Maxus43
25.01.13
✎
14:55
|
Номер = 1;
Пока ДобавитьМесяц(Начало, Номер) <> Конец Цикл Номер = Номер + 1; |
|||
12
Jstunner
25.01.13
✎
14:55
|
Засунуть в запрос, добавить условия, сделать итоги по НАЧАЛОПЕРИОДА
|
|||
13
Ayvengo
25.01.13
✎
14:55
|
Месяц = НачалоМесяца(ТекущаяДата());
Пока не надоест Цикл Месяц = ДобавитьМесяц(Месяц,1); КонецЦикла; |
|||
14
extrim-style
25.01.13
✎
14:56
|
(12) без запроса
|
|||
15
Jstunner
25.01.13
✎
14:57
|
(14) почему?
|
|||
16
extrim-style
25.01.13
✎
14:57
|
(15) потому
|
|||
17
Jstunner
25.01.13
✎
14:58
|
(16) успехов
|
|||
18
extrim-style
25.01.13
✎
14:59
|
(11)(13) ну я изначально накатал сходу нечто похожее, но что-то мне кажется, что это попахивает г-кодом:
Если НачалоМесяца(НачалоПериода) = НачалоМесяца(КонецПериода) Тогда //выбран 1 месяц НачальнаяДата = НачалоПериода; КонечнаяДата = КонецПериода; //действие Иначе НачальнаяДата = НачалоПериода; КонечнаяДата = КонецМесяца(НачалоПериода); Пока КонечнаяДата <> КонецМесяца(КонецПериода) Тогда //действие НачальнаяДата = НачалоМесяца(ДобавитьМесяц(НачальнаяДата)); КонечнаяДата = ДобавитьМесяц(КонечнаяДата); Цикл; //КонечнаяДата = КонецМесяца(КонецПериода) КонечнаяДата = КонецПериода; //действие КонецЕсли; |
|||
19
c00Lo
25.01.13
✎
14:59
|
(12) А в запрос что засовывать?))
|
|||
20
Maxus43
25.01.13
✎
15:00
|
(18) норм впринципе, если работает.
пока нет ответа на вопрос (2) - нечего думать дальше |
|||
21
extrim-style
25.01.13
✎
15:00
|
(17) сразу не веришь? обосновывать обязательно?
|
|||
22
c00Lo
25.01.13
✎
15:01
|
(18) А зачем перебор месяцев? колоночки чтоль сделать по месяцам?))
|
|||
23
GROOVY
25.01.13
✎
15:01
|
ТП = НачалоПериода;
Пока ТП < КонецПериода Цикл ТП = ДобавитьМесяц(ТП,1); КонецЦикла; |
|||
24
extrim-style
25.01.13
✎
15:02
|
(20) мне не интересно как повернуть задачу по-другому (этого и нельзя сделать). весь вопрос в (0)
|
|||
25
Ayvengo
25.01.13
✎
15:03
|
Мой фэншуй говорит, что условие лучше сделать так:
Пока КонечнаяДата > КонецМесяца(КонецПериода) Тогда
Хотя работать и так и так будет ;) КонечнаяДата = ДобавитьМесяц(КонечнаяДата); - тут цифры не хватает, смотри СП ДобавитьМесяц |
|||
26
Maxus43
25.01.13
✎
15:04
|
(24) значит норм всё у тебя, вон даже GROOVY одобряет
|
|||
27
extrim-style
25.01.13
✎
15:04
|
(23) а где выбор от начала периода по конец месяца, потом помесячно, и потом от начала последнего месяца до конца периода?
|
|||
28
Ayvengo
25.01.13
✎
15:05
|
(27) мужиГ, ты уж додумай, идею то подбросили ;)
|
|||
29
extrim-style
25.01.13
✎
15:05
|
вся соль вопроса в (27) и есть ощущение, что (18) можно переписать покороче
|
|||
30
GROOVY
25.01.13
✎
15:05
|
(27) Перебор месяцев в периоде это означает перебрать месяца в периоде: Январь, февраль, март и пр...
Что такое "от начала последнего месяца до конца периода"? |
|||
31
extrim-style
25.01.13
✎
15:07
|
(30) период: 10.11.12 - 05.02.13.
помесячно: 10.11.12 - 30.11.12, 01.12.12 - 31.12.12, 01.01.13-31.01.13, 01.02.13 - 05.02.13 |
|||
32
Ayvengo
25.01.13
✎
15:08
|
НачалоПериода = Дата(2013,1,1);
КонецПериода = Дата(2013,12,1); Пока НачалоПериода <= КонецПериода Цикл НачалоПериода = ДобавитьМесяц(НачалоПериода,1); КонецЦикла; |
|||
33
Ayvengo
25.01.13
✎
15:11
|
Ну, видимо тебе еще нужно будет СовсемКонецПериода = КонецМесяца(КонецПериода) :D
|
|||
34
extrim-style
25.01.13
✎
15:11
|
(32) мне нужно между НачалоПериода и КонецПериода, а не между НачалоМесяца(НачалоПериода) и КонецМесяца(КонецПериода)
|
|||
35
Ayvengo
25.01.13
✎
15:12
|
(34) видимо мозг у Вас совсем не хочет работать :P
|
|||
36
extrim-style
25.01.13
✎
15:13
|
(35) может и не хочет, сегодня же пятница. А что, я чёто не увидел в (32)?
|
|||
37
extrim-style
25.01.13
✎
15:14
|
неужели только у меня ощущение, что (18) - это г-код?
|
|||
38
Ayvengo
25.01.13
✎
15:17
|
(36) Добавь еще переменную КонецМесяцаНачалаПериода и условие на то, что КонецПериода > КонецМесяцаНачалаПериода. Думаю, что еще кучу вариантов придумать можно ;) Пятница - мозгоразжижайница О_О
|
|||
39
extrim-style
25.01.13
✎
15:18
|
(38) оно и заметно)
|
|||
40
hhhh
25.01.13
✎
15:19
|
(37) ну сделай как в (23) груви советует.
|
|||
41
acsent
25.01.13
✎
15:24
|
(37) человеку просто за количество строк платят
|
|||
42
extrim-style
25.01.13
✎
15:26
|
(41) было бы странно создавать сабж, если мне платят за количество строк...
|
|||
43
extrim-style
25.01.13
✎
15:27
|
(40) там нет ответа на (27) и (31)
|
|||
44
extrim-style
25.01.13
✎
15:35
|
Так пойдет?
НД = НачалоПериода; КД = НачалоПериода; Пока КД <> КонецМесяца(КонецПериода) Цикл Если НачалоМесяца(НД)=НачалоМесяца(НачалоПериода) Тогда НД = НачалоПериода; Иначе НД = НачалоМесяца(ДобавитьМесяц(НачалоПериода,1)); КонецЕсли; Если КонецМесяца(КД)=КонецМесяца(КонецПериода) Тогда КД = КонецПериода; Иначе КД = КонецМесяца(ДобавитьМесяц(КонецПериода,1)); КонецЕсли; //действие КонецЦикла; |
|||
45
Ayvengo
25.01.13
✎
15:36
|
НачалоПериода = Дата(2013,1,1);
|
|||
46
Ayvengo
25.01.13
✎
15:37
|
(45) тьфу, ток в цикле < НачалоМесяца(КонецПериода)
|
|||
47
extrim-style
25.01.13
✎
15:37
|
(45) неправильно, начальная дата должна в начало месяца становиться
|
|||
48
Ayvengo
25.01.13
✎
15:38
|
(47) даже, если выбрано 5 января, тебе всегда нужно 1 января? Ну это ты и сам доработаешь ;)
|
|||
49
extrim-style
25.01.13
✎
15:39
|
+(44) переписал условия
НД = НачалоПериода; КД = НачалоПериода; Пока КД <> КонецМесяца(КонецПериода) Цикл НД = ?(НачалоМесяца(НД)=НачалоМесяца(НачалоПериода), НачалоПериода, НачалоМесяца(ДобавитьМесяц(НачалоПериода,1))); КД = ?(КонецМесяца(КД)=КонецМесяца(КонецПериода), КонецПериода, КонецМесяца(ДобавитьМесяц(КонецПериода,1))); //действие КонецЦикла; |
|||
50
extrim-style
25.01.13
✎
15:40
|
(48) я имел ввиду начало следующего месяца
|
|||
51
Ayvengo
25.01.13
✎
15:42
|
В цикле условие лучше по началу месяца для обоих значений делай, иначе что-нибудь да накосячится ;)
|
|||
52
Ayvengo
25.01.13
✎
15:43
|
(49) кстати, КД = НачалоПериода - это верно?
|
|||
53
extrim-style
25.01.13
✎
15:44
|
(52) именно так и писал, сейчас проверю обработкой
|
|||
54
extrim-style
25.01.13
✎
15:49
|
чёт неправильно
|
|||
55
Ayvengo
25.01.13
✎
15:50
|
(54) отладчик в руки и тыц-тыц, танцы с бубном :)
|
|||
56
extrim-style
25.01.13
✎
15:53
|
(55) угу. я уже бубню)
|
|||
57
hhhh
25.01.13
✎
16:08
|
(43) ну вот если бы ты голову включил, то уже бы до (31) было
ТП = НачалоПериода; Пока ТП <= КонецПериода Цикл ТП = ДобавитьМесяц(ТП,1); НД = Макс(НачалоПериода, НачалоМесяца(ТП)); КД = Мин(КонецДня(КонецПериода), КонецМесяца(ТП)); КонецЦикла; |
|||
58
extrim-style
25.01.13
✎
16:16
|
(57) у тебя первый месяц неправильно
хочу, чтобы в (18) осталось одно //действие |
|||
59
extrim-style
25.01.13
✎
17:49
|
Апну. что-то не получается...
|
|||
60
extrim-style
25.01.13
✎
17:55
|
Переписал. Вроде работает. Но выглядит стрёмно.
НД = НачалоПериода; КД = КонецМесяца(НачалоПериода); Сч=1; Пока НачалоМесяца(КонецПериода)<>НачалоМесяца(КД) Цикл НД = ?(НачалоМесяца(НачалоПериода)=НачалоМесяца(НД) И Сч=1, НачалоПериода, НачалоМесяца(ДобавитьМесяц(НД,1))); КД = ?(НачалоМесяца(КонецПериода)=НачалоМесяца(НД), КонецПериода, КонецМесяца(НД)); Сч=2; Сообщить(""+НД+" --- "+КД); КонецЦикла; |
|||
61
extrim-style
25.01.13
✎
18:01
|
+(60) не работает, если период 1 месяц
|
|||
62
extrim-style
25.01.13
✎
18:05
|
Все сдались? лузеры)
|
|||
63
Рыцарь
25.01.13
✎
18:08
|
(62)Все домой ушли))
|
|||
64
extrim-style
25.01.13
✎
18:25
|
(63) просто нужно признать, что задачка оказалась не по зубам)...
|
|||
65
Goggy
25.01.13
✎
18:34
|
А какая ваще задача решалась таким способом?
|
|||
66
rphosts
25.01.13
✎
18:35
|
(64) задача скучная, ТС нормально не может сформулировать что ему нужно... да кому интересно при таком раскладе личное время тратить да ещё и в пятницу...
|
|||
67
Goggy
25.01.13
✎
18:36
|
+ (65) может ваще можно было бы всё просто методом
ВыборкаПериод = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Период", "ВСЕ"); Пока ВыборкаПериод.Следующий() Цикл //... КонецЦикла; решить и не париться? |
|||
68
extrim-style
25.01.13
✎
18:46
|
(66) Переформулирую. Есть период: 10.11.12 - 05.02.13.
Необходимо в цикле пройти его помесячно. Для первого месяца начальная дата (НД) - начало периода, для последнего месяца конечная дата (КД) - конец периода: 10.11.12 - 30.11.12, 01.12.12 - 31.12.12, 01.01.13-31.01.13, 01.02.13 - 05.02.13. "Сообщить(""+НД+" - "+КД)" должно быть только 1 раз в цикле. |
|||
69
GROOVY
25.01.13
✎
18:56
|
(68) Издеваешься? Тебе что не написать гомнокод на 7 строк? 4 часа обсуждать на форуме...
|
|||
70
extrim-style
25.01.13
✎
18:58
|
(69) не издеваюсь. чёт никак... буду признателен помощи
|
|||
71
ЗлобнийМальчик
25.01.13
✎
19:04
|
(70) скажите, а Вы школу закончили???
|
|||
72
extrim-style
25.01.13
✎
19:10
|
(71) возможно затупил. вот так случилось. школу закончил.
буду признателен помощи. |
|||
73
extrim-style
25.01.13
✎
19:17
|
вот. наваял еще г-код. зато с одним "Сообщить":
НД = НачалоПериода; КД = КонецМесяца(НачалоПериода); ТП = НачалоПериода; Пока ТП <= КонецДня(КонецПериода) Цикл ПредТП = ТП; ТП = НачалоМесяца(ДобавитьМесяц(ТП,1)); НД = Мин(НД, НачалоМесяца(ТП)); КД = Мин(КД, КонецМесяца(ТП)); Если НачалоМесяца(НачалоПериода) = НачалоМесяца(КонецПериода) Тогда КД = КонецДня(КонецПериода); КонецЕсли; Сообщить(""+НД+" --- "+КД); НД = НачалоМесяца(ДобавитьМесяц(НД,1)); КД = КонецМесяца(ДобавитьМесяц(КД,1)); Если НачалоМесяца(КД)=НачалоМесяца(КонецПериода) Тогда КД = КонецДня(КонецПериода); КонецЕсли; КонецЦикла; |
|||
74
extrim-style
25.01.13
✎
19:18
|
+(73) работает)
|
|||
75
extrim-style
25.01.13
✎
19:18
|
+(73) упс. ПредТП лишнее
НД = НачалоПериода; КД = КонецМесяца(НачалоПериода); ТП = НачалоПериода; Пока ТП <= КонецДня(КонецПериода) Цикл ТП = НачалоМесяца(ДобавитьМесяц(ТП,1)); НД = Мин(НД, НачалоМесяца(ТП)); КД = Мин(КД, КонецМесяца(ТП)); Если НачалоМесяца(НачалоПериода) = НачалоМесяца(КонецПериода) Тогда КД = КонецДня(КонецПериода); КонецЕсли; Сообщить(""+НД+" --- "+КД); НД = НачалоМесяца(ДобавитьМесяц(НД,1)); КД = КонецМесяца(ДобавитьМесяц(КД,1)); Если НачалоМесяца(КД)=НачалоМесяца(КонецПериода) Тогда КД = КонецДня(КонецПериода); КонецЕсли; КонецЦикла; |
|||
76
mistеr
26.01.13
✎
10:40
|
(75) Хочется, чтобы коротко и красиво? Ну вот:
ТекущийМесяц = Месяц(НачалоПериода); Пока КонецПериода > ТекущийМесяц Цикл НД = Макс(ТекущийМесяц, НачалоПериода); КД = Мин(КонецМесяца(ТекущийМесяц), КонецПериода); Сообщить(""+НД+" --- "+КД); ТекущийМесяц = ДобавитьМесяц(ТекущийМесяц, 1); КонецЦикла; P.S. Не проверял. P.P.S. Количество строк Павел определил мастерски :) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |