|   |   | 
| 
 | Алгоритм: перебор месяцев в периоде | ☑ | ||
|---|---|---|---|---|
| 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. Количество строк Павел определил мастерски :) | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |