|
v7: сравнение значений в строках после отбора | ☑ | ||
---|---|---|---|---|
0
EvgenyRus31
16.04.19
✎
16:12
|
Добрый день! Подскажите, можно ли после того как заполнил ТЗ и сделал свертку и отбор, сравнить полученные строки между собой по значению(определенному столбцу) и записать цифру в переменную по количеству равную одинаковым значениям в этих строках?
Код отбора после свертки: Таб.ВыбратьСтроки(); Пока Таб.ПолучитьСтроку()=1 Цикл Если ПустоеЗначение(Водитель)=0 Тогда Если Таб.ФИО<>Водитель Тогда Продолжить; КонецЕсли; КонецЕсли; Если ПустоеЗначение(Марка)=0 Тогда Если Таб.Марка<>Марка Тогда Продолжить; КонецЕсли; КонецЕсли; //сравнить как то строки Если Таб.ДатаРаботы=Таб.ДатаРаботы тогда //сравнивать по этому значению строки Коллл=Коллл+1; КонецЕсли; КонецЦикла; //Но у меня не работает этот код, подскажите правильное решение. |
|||
1
Builder
16.04.19
✎
16:15
|
Правильно сформулированный вопрос - половина ответа.
Что надо то? |
|||
2
Сияющий в темноте
16.04.19
✎
16:15
|
таб.датаработы=таб.датаработы - это чего такое?
|
|||
3
Builder
16.04.19
✎
16:16
|
(2) Как что - обычное условие. Всегда выполняется.
|
|||
4
Builder
16.04.19
✎
16:20
|
Таб.НоваяКолонка("КолвоФИО");
заполняем все строки Таб.КолвоФИО = 1 сворачиваем Таб.Свернуть("ФИО","КолвоФИО"); Таб.КолвоФИО - количество уникальных фамилий Это надо? |
|||
5
MadDAD
16.04.19
✎
16:21
|
По ходу нужно подсчитать разные ДатаРаботы.
выгрузить в соседнюю ТЗ, добавить поле Количество, заполнить его единицами и свернуть по "ДатаРаботы" и суммировать по "Количество". |
|||
6
Builder
16.04.19
✎
16:41
|
Можно еще через список значений.
СписФИО.Установить(Таб.ФИО,Таб.ФИО); Потом СписФИО.РазмерСписка() |
|||
7
Sserj
16.04.19
✎
17:13
|
Подозреваю что Таб.ФИО это таки строка а Водитель элемент справочника.
|
|||
8
EvgenyRus31
16.04.19
✎
17:14
|
Нет мне нужно не количество ФИО, а посчитать дни работы сотрудника. В документе могут забивать строки с одинаковой датой. Например работал сотрудник 3.04.19 Вывозил мусор и еще ниже строка 3.04.19 гладил белье. Вот мне чтоб посчитать это за 1 день, нужно эти строки соединить вместе и посчитать сколько строк получится - это и будет отработанные дни. У меня в программе заложено заполнение ТЗ по диапазону дат потом свертка по определенным значением а потом только отбор из этих полученных строк. Вот мне нужно эти полученные строки правильно посчитать.
|
|||
9
EvgenyRus31
16.04.19
✎
17:15
|
Таб.ФИО это заполненное в ТЗ и оно же выводится на печатную форму отчета, а Водитель это отбор который выбираем в отчете из справочника
|
|||
10
Sserj
16.04.19
✎
17:19
|
(9) Еще раз. Тип поля Там.ФИО кокой?
|
|||
11
Builder
16.04.19
✎
17:31
|
(8) Да какая разница, поменяй условия да и все.
Сделай сначала Таб.Свернуть("ФИО,ДатаРаботы") Потом как в (4) И получишь сколько дней он работал |
|||
12
HawkEye
16.04.19
✎
19:11
|
(8) Сверни по сотруднику и дате, получишь все даты когда сотрудник работал.. дальше добавь новую колонку и заполни её 1-кой, сверни по сотруднику суммируя новую колонку - получишь таблицу:
"Сотрудник"; "Кол-во дней работы" |
|||
13
EvgenyRus31
17.04.19
✎
08:11
|
Дело в том, что как мне сворачивать данные после отбора? С документа заполнять ТЗ и сворачивать не получается, так как там данные до отбора. Мне нужно как то сворачивать после отбора, как это сделать?
Код отбора после свертки: Таб.ВыбратьСтроки(); Пока Таб.ПолучитьСтроку()=1 Цикл Если ПустоеЗначение(Водитель)=0 Тогда Если Таб.ФИО<>Водитель Тогда Продолжить; КонецЕсли; КонецЕсли; Если ПустоеЗначение(Марка)=0 Тогда Если Таб.Марка<>Марка Тогда Продолжить; КонецЕсли; КонецЕсли; //сравнить как то строки Если Таб.ДатаРаботы=Таб.ДатаРаботы тогда //сравнивать по этому значению строки Коллл=Коллл+1; КонецЕсли; КонецЦикла; //Но у меня не работает этот код, подскажите правильное решение. |
|||
14
MadDAD
17.04.19
✎
08:39
|
(13) ТабДни = СоздатьОбъект("ТаблицаЗначений");
Таб.Выгрузить(ТабДни,,,"ФИО, Марка, ДатаРаботы"); ТабДни.НоваяКолонка("КоличествоДней"); ТабДни.ВыбратьСтроки(); Пока ТабДни.ПолучитьСтроку() = 1 Цикл ТабДни.КоличествоДней = 1; КонецЦикла; ТабДни.Свернуть("ФИО, Марка, ДатаРаботы", "КоличествоДней"); ТабДни.ВыбратьСтроки(); Пока ТабДни.ПолучитьСтроку()=1 Цикл Если ПустоеЗначение(Водитель)=0 Тогда Если ТабДни.ФИО<>Водитель Тогда Продолжить; КонецЕсли; КонецЕсли; Если ПустоеЗначение(Марка)=0 Тогда Если ТабДни.Марка<>Марка Тогда Продолжить; КонецЕсли; КонецЕсли; Коллл = ТабДни.КоличествоДней Прервать; КонецЦикла; |
|||
15
MadDAD
17.04.19
✎
08:41
|
Только я не понял зачем там марка.
В таблице ТабДни получим сколько дней водитель отработал на какой марке. |
|||
16
Злопчинский
17.04.19
✎
09:26
|
автор стучись в скайп Zlopun
пока я толком не проснулся и не готов к большой работе - могу помочь |
|||
17
EvgenyRus31
17.04.19
✎
10:02
|
Это один параметр из отборов. Отбирать там можно по Водителю, Марке, Основное средство и т.п. я скинул просто фрагмент этого отбора, так как мне нужно после этих всех отборов свернуть как то по ДатаРаботы и посчитать полученные строки.
|
|||
18
Builder
17.04.19
✎
10:12
|
(17) Ну напиши уже что нибудь со своими отборами и сверни как тебе надо. Примеров скинули достаточно.
|
|||
19
EvgenyRus31
17.04.19
✎
10:13
|
MadDAD В вашем коде у вас сначала возьмутся все данные со всех документов и посчитаются все дни, а мне нужно посчитать эти дни уже после отбора. Выбрали в отчете по определенному водителю за определенный период, соответственно должны дни посчитаться только за этот период, только по этому водителю. У меня сейчас считает не правильно, потому что данные берутся с документов с указанного периода игнорируя отбор пользователя, поэтому и получается больше дней показывает, чем отобрано по водителю (
|
|||
20
EvgenyRus31
17.04.19
✎
10:16
|
Builder Я просто не пойму откуда брать данные для того, чтоб свернуть их? Если возьму сразу с документа, то они будут игнорировать отбор пользователя и тупо посчитает все дни с документов. Мне нужно сворачивать уже после отбора, такое вообще возможно делать или нет? или может пойти нужно другим путем, может выводимые данные в печатную форму отчета можно как то построчно сравнить и все одинаковые посчитать и со всех строк отнять одинаковые и получим правильное количество дней? Но наверное так нельзя (
|
|||
21
HawkEye
17.04.19
✎
10:19
|
(13) сделай еще одну таблицу в которую занеси результаты отбора.... дальше в ней как написано выше..
|
|||
22
HawkEye
17.04.19
✎
10:20
|
(19) "берутся с документов с указанного периода "...
берутся ИЗ документов ЗА указанный период.... |
|||
23
MadDAD
17.04.19
✎
10:31
|
(19) В чем смысл отбора? В приведенном в (0) коде попытка подсчета дат. Но там странное условие, которое всегда истинно - "Если Таб.ДатаРаботы = Таб.ДатаРаботы"
Если в Таб - уже строки с датами за нужный период, тогда мой код посчитает все дни, в разрезе водителя и марки. Попробуйте его запустить, потом смотрите что не правильно считается. Можете в отборе вместо сравнения дат складывать значения в другую таблицу, которая будет содержать результаты отбора, результат будет аналогичен тому что я написал. Обычно если не понятно как что считать - для начала нужно нарисовать себе таблицу в том виде в котором она формируется, и попробовать из этих данных вручную на листочке произвести расчет. А потом уже алгоритмизировать. |
|||
24
Mikeware
17.04.19
✎
10:35
|
программиста звать не пробовали?
|
|||
25
EvgenyRus31
17.04.19
✎
10:36
|
MadDAD запустил ваш код, выдает постоянно цифру 1
|
|||
26
EvgenyRus31
17.04.19
✎
10:37
|
Mikeware, если я позову программиста, то форумы опустеют. Так что я поддержую контент форумов. Хотите приходите конечно ко мне поможете я не против.
|
|||
27
MadDAD
17.04.19
✎
10:39
|
(25) Да, извиняюсь. Спросонья ошибся.
Попробуйте вот так: ТабДни = СоздатьОбъект("ТаблицаЗначений"); Таб.Выгрузить(ТабДни,,,"ФИО, Марка, ДатаРаботы"); ТабДни.Свернуть("ФИО, Марка, ДатаРаботы", ""); ТабДни.НоваяКолонка("КоличествоДней"); ТабДни.ВыбратьСтроки(); Пока ТабДни.ПолучитьСтроку() = 1 Цикл ТабДни.КоличествоДней = 1; КонецЦикла; ТабДни.Свернуть("ФИО, Марка", "КоличествоДней"); ТабДни.ВыбратьСтроки(); Пока ТабДни.ПолучитьСтроку()=1 Цикл Если ПустоеЗначение(Водитель)=0 Тогда Если ТабДни.ФИО<>Водитель Тогда Продолжить; КонецЕсли; КонецЕсли; Если ПустоеЗначение(Марка)=0 Тогда Если ТабДни.Марка<>Марка Тогда Продолжить; КонецЕсли; КонецЕсли; Коллл = ТабДни.КоличествоДней; Прервать; КонецЦикла; |
|||
28
1Сергей
17.04.19
✎
10:40
|
(27) опять будет 1
|
|||
29
MadDAD
17.04.19
✎
10:46
|
(28) Почему? Вот с то же самое тестовыми данными.
ТАб.НоваяСтрока(); ТАб.ФИО = "Иванов Иван Иванович"; ТАб.Марка = "Краун"; ТАб.ДатаРаботы = '02.01.2019'; ТАб.НоваяСтрока(); ТАб.ФИО = "Иванов Иван Иванович"; ТАб.Марка = "Краун"; ТАб.ДатаРаботы = '03.01.2019'; ТАб.НоваяСтрока(); ТАб.ФИО = "Петров Иван Иванович"; ТАб.Марка = "Краун"; ТАб.ДатаРаботы = '03.01.2019'; ТАб.НоваяСтрока(); ТАб.ФИО = "Петров Иван Иванович"; ТАб.Марка = "Краун"; ТАб.ДатаРаботы = '02.01.2019'; ТабДни = СоздатьОбъект("ТаблицаЗначений"); Таб.Выгрузить(ТабДни,,,"ФИО, Марка, ДатаРаботы"); ТабДни.Свернуть("ФИО, Марка, ДатаРаботы", ""); ТабДни.НоваяКолонка("КоличествоДней"); ТабДни.ВыбратьСтроки(); Пока ТабДни.ПолучитьСтроку() = 1 Цикл ТабДни.КоличествоДней = 1; КонецЦикла; ТабДни.Свернуть("ФИО, Марка", "КоличествоДней"); ТабДни.ВыбратьСтроки(); Пока ТабДни.ПолучитьСтроку()=1 Цикл Сообщить(ТабДни.ФИО + " | " + ТабДни.Марка + " | " + ТабДни.КоличествоДней); КонецЦикла; |
|||
30
EvgenyRus31
17.04.19
✎
10:50
|
MadDAD Вы волшебник!!! Вам огромнейшее спасибо, все четенько и красиво работает. Анализ вашего кода мне поможет теперь разобраться, как все у меня тут устроено. Вы настоящий специалист!!!!!
P.S. Mikeware можете ко мне не приезжать, настоящий специалист и на форуме поможет ;) |
|||
31
Sserj
17.04.19
✎
11:00
|
(30) Тестовые данные из (29) показывают то что было сказано вчера в (7).
ФИО - строка она не может быть равна ссылке на объект ни при каких условиях. И код из (29) сломается сразу же как появятся однофамильцы, а манагеры долго будут думать почему это столько начисляется. |
|||
32
EvgenyRus31
17.04.19
✎
11:11
|
Sserj "ФИО","Справочник.Сотрудники"
|
|||
33
Злопчинский
17.04.19
✎
11:15
|
а мне вот в душу плюнули
|
|||
34
EvgenyRus31
17.04.19
✎
11:16
|
Злопчинский Кто плюнул и как?
|
|||
35
EvgenyRus31
17.04.19
✎
11:21
|
MadDAD
Подскажите для подсчета дней нужно отдельно отбор делать или можно будет его встроить в уже существующий? |
|||
36
MadDAD
17.04.19
✎
11:58
|
(35) Без исходных данных вообще сложно сказать. Я дал пример как из того что представлено в (0) получить количество уникальных дней. Не понятно отбор чего и из чего, какой набор данных. Пока что у нас получается "дай мне то не знаю что".
|
|||
37
MadDAD
17.04.19
✎
11:58
|
(31) Не, тут чисто моя догадка про строку. В ФИО может быть все что угодно :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |