|
v7: Даты в таблице значений | ☑ | ||
---|---|---|---|---|
0
Марфа Васильевна
30.12.14
✎
16:35
|
Туплю целый день... помогите. есть таблица значений, содержащая две даты каких-то событий: дата начала и дата окончания.
например 05.01.14 - 08.01.14 14.04.14 - 18.04.14 10.10.14 - 15.10.14 нужно из неё сделать другую таблицу, где были бы расписаны все временные промежутки 2014 года. а именно 01.01.14 - 04.01.14 05.01.14 - 08.01.14 09.01.14 - 13.04.14 14.04.14 - 18.04.14 19.04.14 - 09.10.14 10.10.14 - 15.10.14 16.10.14 - 31.12.14 как? вопрос тупой, но к концу дня торможу. спасибо!!! |
|||
1
polosov
30.12.14
✎
16:37
|
(0) Тестовое задание на позицию прогера?
|
|||
2
Злопчинский
30.12.14
✎
16:39
|
(0) в общем случае - проблема.
т.к. недостаточно исходных данных. например, неясно - в исходной таблице временные интервалы могут быть перекрывающимися или нет? |
|||
3
Марфа Васильевна
30.12.14
✎
16:40
|
нет, это персонифицированный учёт в Беларуси (ЗиК).
перекрываться НЕ могут даты (пусть уж хоть здесь будет облегчение) |
|||
4
Злопчинский
30.12.14
✎
16:45
|
Пусть будет ТЗ
в Колонками ДатаН и ДатаК пусть временные промежутки - неперекрывающиеся пусть временные интервалы принадлежат одному году . ща, попробую налабать |
|||
5
Марфа Васильевна
30.12.14
✎
16:46
|
Злопчинский, а налабайте, буду прям сильно благодарна!!! :)
|
|||
6
Euguln
30.12.14
✎
16:48
|
(0)Загнать в одну колонку и отсортрировать
|
|||
7
polosov
30.12.14
✎
16:48
|
(3) Берем начало года, и потом в цикле по количеству строк бегаем по датам и формируем в конец ТЗ новые периоды. В конце упорядочить по первой колонке.
|
|||
8
Euguln
30.12.14
✎
16:48
|
*отсортировать
|
|||
9
Марфа Васильевна
30.12.14
✎
16:49
|
о, спасибо! проведу клинические испытания :)
|
|||
10
Злопчинский
30.12.14
✎
17:51
|
На тебе!
|
|||
11
Злопчинский
30.12.14
✎
17:52
|
Собственно код с набором (избыточных?) тестов
. //====================================================================== Процедура ПечатьТЗ(ТЗ,Заголовок) ТЗ.ВыбратьСтроку(,Заголовок); КонецПроцедуры // ПечатьТЗ //******************************************* Функция ПосчитатьДляБульбаша(ТЗ) Если ТЗ.КоличествоСтрок()=0 Тогда Возврат "нет данных" КонецЕсли; ТЗ.Сортировать("ДатаН"); ТЗ.ПолучитьСтрокуПоНомеру(1); НачалоИнтервала = НачГода(ТЗ.ДатаН); КонецИнервала = КонГода(ТЗ.ДатаН); КС = ТЗ.КоличествоСтрок(); Для ы=1 По КС Цикл ТЗ.ПолучитьСтрокуПоНомеру(ы); ДатаК = ТЗ.ДатаН - 1; ДатаН = ТЗ.ДатаК + 1; Если ТЗ.ДатаН <> НачалоИнтервала Тогда ТЗ.НоваяСтрока(); ТЗ.ДатаН = НачалоИнтервала; ТЗ.ДатаК = ДатаК; КонецЕсли; НачалоИнтервала = ДатаН; Если ТЗ.НомерСтроки = КС Тогда Прервать; КонецЕсли; КонецЦикла; Если НачалоИнтервала < КонецИнервала Тогда ТЗ.НоваяСтрока(); ТЗ.ДатаН = НачалоИнтервала; ТЗ.ДатаК = КонГода(НачалоИнтервала); КонецЕсли; ТЗ.Сортировать("ДатаН"); Возврат ""; КонецФункции //ПосчитатьДляБульбаша() //====================================================================== Процедура Сформировать() ТЗ = СоздатьОбъект("ТаблицаЗначений"); ТЗ.НоваяКолонка("ДатаН","Дата",,,,12); ТЗ.НоваяКолонка("ДатаК","Дата",,,,12); ТЗ.НоваяКолонка("Флаг","Строка",,,""); //символ = это данные заданные, //тест1 ТЗ.УдалитьСтроки(); ТЗ.НоваяСтрока(); ТЗ.ДатаН = '05.01.14'; ТЗ.ДатаК = '08.01.14'; ТЗ.Флаг = "*"; ТЗ.НоваяСтрока(); ТЗ.ДатаН = '14.04.14'; ТЗ.ДатаК = '18.04.14'; ТЗ.Флаг = "*"; ТЗ.НоваяСтрока(); ТЗ.ДатаН = '10.10.14'; ТЗ.ДатаК = '15.10.14'; ТЗ.Флаг = "*"; Результат = ПосчитатьДляБульбаша(ТЗ); ПечатьТЗ(ТЗ,"тест1 набор неперекрывающихся интервалов"); //тест2 ТЗ.УдалитьСтроки(); Результат = ПосчитатьДляБульбаша(ТЗ); ПечатьТЗ(ТЗ,"тест2 пустая таблица"); //тест3 ТЗ.УдалитьСтроки(); ТЗ.НоваяСтрока(); ТЗ.ДатаН = '01.01.14'; ТЗ.ДатаК = '31.12.14'; ТЗ.Флаг = "*"; Результат = ПосчитатьДляБульбаша(ТЗ); ПечатьТЗ(ТЗ,"тест3 один интервал = весь год"); //тест4 ТЗ.УдалитьСтроки(); ТЗ.НоваяСтрока(); ТЗ.ДатаН = '01.01.14'; ТЗ.ДатаК = '01.01.14'; ТЗ.Флаг = "*"; Результат = ПосчитатьДляБульбаша(ТЗ); ПечатьТЗ(ТЗ,"тест4 один интервал = первый день года"); //тест5 ТЗ.УдалитьСтроки(); ТЗ.НоваяСтрока(); ТЗ.ДатаН = '31.12.14'; ТЗ.ДатаК = '31.12.14'; ТЗ.Флаг = "*"; Результат = ПосчитатьДляБульбаша(ТЗ); ПечатьТЗ(ТЗ,"тест5 один интервал = последний день года"); //тест6 ТЗ.УдалитьСтроки(); ТЗ.НоваяСтрока(); ТЗ.ДатаН = '18.07.14'; ТЗ.ДатаК = '25.08.14'; ТЗ.Флаг = "*"; Результат = ПосчитатьДляБульбаша(ТЗ); ПечатьТЗ(ТЗ,"тест6 один интервал в середине года"); //тест6 ТЗ.УдалитьСтроки(); ТЗ.НоваяСтрока(); ТЗ.ДатаН = '18.07.14'; ТЗ.ДатаК = '25.08.14'; ТЗ.Флаг = "*"; Результат = ПосчитатьДляБульбаша(ТЗ); ПечатьТЗ(ТЗ,"тест6 один интервал в середине года"); //тест7 ТЗ.УдалитьСтроки(); ТЗ.НоваяСтрока(); ТЗ.ДатаН = '18.09.14'; ТЗ.ДатаК = '18.09.14'; ТЗ.Флаг = "*"; Результат = ПосчитатьДляБульбаша(ТЗ); ПечатьТЗ(ТЗ,"тест7 один интервал = 1 день в середине года"); //тест8 ТЗ.УдалитьСтроки(); ТЗ.НоваяСтрока(); ТЗ.ДатаН = '18.09.14'; ТЗ.ДатаК = '18.09.14'; ТЗ.Флаг = "*"; ТЗ.НоваяСтрока(); ТЗ.ДатаН = '19.09.14'; ТЗ.ДатаК = '19.09.14'; ТЗ.Флаг = "*"; Результат = ПосчитатьДляБульбаша(ТЗ); ПечатьТЗ(ТЗ,"тест8 один интервал = 2 дня подряд в середине года"); //тест9 ТЗ.УдалитьСтроки(); ТЗ.НоваяСтрока(); ТЗ.ДатаН = '01.01.14'; ТЗ.ДатаК = '01.01.14'; ТЗ.Флаг = "*"; ТЗ.НоваяСтрока(); ТЗ.ДатаН = '02.01.14'; ТЗ.ДатаК = '02.01.14'; ТЗ.Флаг = "*"; Результат = ПосчитатьДляБульбаша(ТЗ); ПечатьТЗ(ТЗ,"тест9 два интервала, в начале года"); //тест10 ТЗ.УдалитьСтроки(); ТЗ.НоваяСтрока(); ТЗ.ДатаН = '30.12.14'; ТЗ.ДатаК = '30.12.14'; ТЗ.Флаг = "*"; ТЗ.НоваяСтрока(); ТЗ.ДатаН = '31.12.14'; ТЗ.ДатаК = '31.12.14'; ТЗ.Флаг = "*"; Результат = ПосчитатьДляБульбаша(ТЗ); ПечатьТЗ(ТЗ,"тест10 два интервала, в конце года"); //тест11 ТЗ.УдалитьСтроки(); ТЗ.НоваяСтрока(); ТЗ.ДатаН = '01.01.14'; ТЗ.ДатаК = '01.01.14'; ТЗ.Флаг = "*"; ТЗ.НоваяСтрока(); ТЗ.ДатаН = '15.01.14'; ТЗ.ДатаК = '18.01.14'; ТЗ.Флаг = "*"; Результат = ПосчитатьДляБульбаша(ТЗ); ПечатьТЗ(ТЗ,"тест11 два интервала, в начале года c разрывом"); //тест12 ТЗ.УдалитьСтроки(); ТЗ.НоваяСтрока(); ТЗ.ДатаН = '20.12.14'; ТЗ.ДатаК = '25.12.14'; ТЗ.Флаг = "*"; ТЗ.НоваяСтрока(); ТЗ.ДатаН = '31.12.14'; ТЗ.ДатаК = '31.12.14'; ТЗ.Флаг = "*"; Результат = ПосчитатьДляБульбаша(ТЗ); ПечатьТЗ(ТЗ,"тест12 два интервала, в конце года с разрывом"); КонецПроцедуры // Сформировать |
|||
12
Злопчинский
30.12.14
✎
18:12
|
Ну и где эта Марфа Васильевна?
В постели с мужиком кувыркается, оттягивается по самое нехочу, а я тут потею за рабочим столом...? |
|||
13
Garykom
гуру
30.12.14
✎
19:13
|
(12) ну кто с кем\чем предпочитает кувыркаться и оттягиваться ))
|
|||
14
Злопчинский
30.12.14
✎
19:21
|
(13) Обидно!
;-) |
|||
15
Марфа Васильевна
30.12.14
✎
19:59
|
Злопчинский! спасибо Вам огромное!!! (сделаю вид, что про постель и мужика Вы не писали...)
плюсики Вам в карму и хорошего настроения Вашей жене, чтоб и Вы тоже... того... |
|||
16
unregistered
31.12.14
✎
09:51
|
(0) Если я правильно понял задачу, то речь идёт о стандартном фукнционале регистра расчета.
Требуемая таблица - есть не что иное как таблица фактический периодов действия по всем видам расчета. Если я прав, то нафига тут вообще велосипед? |
|||
17
SleepyHead
гуру
31.12.14
✎
10:53
|
(16) Затем, что это 1с 7.7.
Можно поработать с журналом расчетов, но знает ли об этом автор темы, нам неизвестно. |
|||
18
Марфа Васильевна
02.01.15
✎
07:00
|
и вас с Новым годом.
(16) нет, речь не идёт о регистрах. это Зарплата и Кадры. там не регистры и оперативный учёт, а расчет. катайтесь на велосипеде. (17) таблица значений была получена путём работы с журналом расчетов. да, автор близко знаком с журналами расчетов. и Вы блесной блеснули, поздравляю. вам заняться, похоже, нечем. спасибо Злопчинскому - всё работает. |
|||
19
Vladal
13.01.15
✎
20:13
|
(6) Я бы сортировал обе колонки - наало и конец периода.
|
|||
20
GreyK
13.01.15
✎
22:12
|
(11) Ты это хотел сделать?
Функция ДополнитьПериоды(ТЗ1,ДатаНачала,ДатаОкончания) Перем ТекНачало; ТЗ2 =СоздатьОбъект("ТаблицаЗначений"); ТЗ1.Выгрузить(ТЗ2,,,); ТЗ2.УдалитьСтроки(); ТекНачало = ДатаНачала; ТЗ1.Сортировать("ДатаНачала"); ТЗ1.ВыбратьСтроки(); Пока ТЗ1.ПолучитьСтроку() = 1 Цикл Если ТЗ1.ДатаНачала > ТекНачало Тогда ТЗ2.НоваяСтрока(); ТЗ2.ДатаНачала = ТекНачало; ТЗ2.ДатаОкончания = ТекНачало - 1; КонецЕсли; ТЗ2.НоваяСтрока(); ТЗ2.ДатаНачала = ТЗ1.ДатаНачала; ТЗ2.ДатаОкончания = ТЗ1.ДатаОкончания; // Здесь какое-то бла-бла по передаче дополнительных реквизитов из ТЗ1 в ТЗ2 ТекНачало = ТЗ1.ДатаОкончания + 1; КонецЦикла; Если ТекНачало < ДатаОкончания Тогда ТЗ2.НоваяСтрока(); ТЗ2.ДатаНачала = ТекНачало; ТЗ2.ДатаОкончания = ДатаОкончания; КонецЕсли; Возврат ТЗ2; КонецФункции // ДополнитьПериоды() |
|||
21
Злопчинский
13.01.15
✎
22:20
|
(20) хз что эта функция делает
Я написал то что тс попросил Смайл |
|||
22
GreyK
13.01.15
✎
22:24
|
(21) Со Старым Новым Годом! :)
|
|||
23
Злопчинский
13.01.15
✎
22:28
|
(22) будь здоров не чихай
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |