|
v8: 1с 8.2, функция возвращает не то что нужно | ☑ | ||
---|---|---|---|---|
0
Dimochka
09.04.13
✎
22:34
|
Есть функция которая в зависимости от условия выводит А или Б или С, а нужно чтобы она выводила А_1,А_2,А_3 и т.д., потом Б_1,Б_2,Б_3 и т.д. и с С аналогично вот функция:
// Рассчитать ABC классификацию. Функция ABCКлассификация(Данные) Экспорт Перем ТаблицаЗначений; Если Данные = Null Тогда Возврат Null; КонецЕсли; Если ТипЗнч(Данные) <> Тип("ДанныеГрупповойОбработкиКомпоновкиДанных") Тогда Сообщить(ТипЗнч(Данные)); ВызватьИсключение "В функцию ABCКлассификация() можно передавать только объект типа ДанныеГрупповойОбработкиКомпоновкиДанных"; КонецЕсли; Если Не Данные.ВременныеДанныеОбработки.Свойство("ABCКлассификацияТаблицаЗначений", ТаблицаЗначений) Тогда // выполним расчет классификации один раз при первом вызове // а потом запомним выполненный расчет и дальше будем этот // расчет использовать ТаблицаЗначений = Данные.Данные.Скопировать(); ТаблицаЗначений.Колонки.Добавить("Номер", Новый ОписаниеТипов("Число")); Номер = 0; ОбщаяСумма = 0; Для Каждого СтрокаТаблицыЗначений Из ТаблицаЗначений Цикл СтрокаТаблицыЗначений.Номер = Номер; Номер = Номер + 1; Если СтрокаТаблицыЗначений[0] <> NULL Тогда ОбщаяСумма = ОбщаяСумма + СтрокаТаблицыЗначений[0]; КонецЕсли; КонецЦикла; ТаблицаЗначений.Сортировать(ТаблицаЗначений.Колонки[0].Имя + " Убыв"); ТаблицаЗначений.Индексы.Добавить("Номер"); НакопленнаяСумма = 0; ИндексКлассаA = Неопределено; ИндексКлассаB = Неопределено; Для Каждого СтрокаТаблицыЗначений Из ТаблицаЗначений Цикл Если СтрокаТаблицыЗначений[0] <> NULL Тогда НакопленнаяСумма = НакопленнаяСумма + СтрокаТаблицыЗначений[0]; КонецЕсли; Если ОбщаяСумма = 0 Тогда Процент = 1; Иначе Процент = НакопленнаяСумма / ОбщаяСумма; КонецЕсли; Если Процент > 0.75 Тогда Если ИндексКлассаA = Неопределено Тогда ИндексКлассаA = ТаблицаЗначений.Индекс(СтрокаТаблицыЗначений); ИначеЕсли Процент > 0.90 Тогда Если ИндексКлассаB = Неопределено Тогда ИндексКлассаB = ТаблицаЗначений.Индекс(СтрокаТаблицыЗначений); КонецЕсли; Прервать; КонецЕсли; КонецЕсли; КонецЦикла; Данные.ВременныеДанныеОбработки.Вставить("ABCКлассификацияТаблицаЗначений", ТаблицаЗначений); Данные.ВременныеДанныеОбработки.Вставить("ABCКлассификацияИндексКлассаA", ИндексКлассаA); Данные.ВременныеДанныеОбработки.Вставить("ABCКлассификацияИндексКлассаB", ИндексКлассаB); КонецЕсли; Если Данные.ТекущийЭлемент = Неопределено Тогда // Итог по группировке. Возврат Null; Иначе Строка = ТаблицаЗначений.Найти(Данные.Данные.Индекс(Данные.ТекущийЭлемент), "Номер"); Если Строка = Неопределено Тогда Возврат Null; Иначе Индекс = ТаблицаЗначений.Индекс(Строка); Если Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаA Тогда Возврат "А"; ИначеЕсли Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаB Тогда Возврат "B"; Иначе Возврат "C"; КонецЕсли; КонецЕсли; КонецЕсли; КонецФункции |
|||
1
Dimochka
09.04.13
✎
22:35
|
Сделал вот так вот:
Если Данные.ТекущийЭлемент = Неопределено Тогда Возврат Null; Иначе Строка = ТаблицаЗначений.Найти(Данные.Данные.Индекс(Данные.ТекущийЭлемент), "Номер"); Если Строка = Неопределено Тогда Возврат Null; Иначе Индекс = ТаблицаЗначений.Индекс(Строка); СчетчикА=0; СчетчикБ=0; ФлагА=0; ФлагБ=0; Массив = Новый Массив; Для а=0 по Данные.ВременныеДанныеОбработки.ABCКлассификацияТаблицаЗначений.Количество()-1 Цикл Если ФлагА=0 Тогда Если Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаA Тогда Массив="А_"+СокрЛП(а+1); Иначе ФлагА=1 ; а=а-1; Счетичик=а; КонецЕсли; ИначеЕсли ФлагБ=0 Тогда Если Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаB Тогда Массив="Б_"+ СокрЛП(а+1); Иначе ФлагБ=1; а=а-1; Счетчик=а; КонецЕсли; Иначе Массив= "C_"+ СокрЛП(а+1); КонецЕсли; КонецЦикла; а=1; Возврат Массив; КонецЕсли; КонецЕсли; Все равно теперь выводит А_(чилсло элементов массива), а можно как -нибудь посчитать сколько раз выполняется условие? |
|||
2
EvgeniuXP
09.04.13
✎
22:40
|
(1) внутри условия складывай переменную и считай сколько раз она выполняется.
|
|||
3
Dimochka
09.04.13
✎
22:42
|
(2) Если Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаA Тогда
Массив="А_"+СокрЛП(а+1); например как вот тут? |
|||
4
Dimochka
09.04.13
✎
22:43
|
1с душу падла выматала )))
|
|||
5
Живой Ископаемый
09.04.13
✎
22:44
|
чем выматала? тем что делает то, что ты просишь, а на самом деле имеешь в виду другое?
|
|||
6
EvgeniuXP
09.04.13
✎
22:45
|
(3) к "А" не прибавляй, просто
А = 0; Цикл Если Тогда А = А + 1; КонецЕсли; КонецЦикла; |
|||
7
Dimochka
09.04.13
✎
22:47
|
(5) ну я стараюсь просить лучше)) поэтому и спрашиваю тут)))!
|
|||
8
EvgeniuXP
09.04.13
✎
22:48
|
потом можешь обойти А:
Для сч = 1 По А Цикл Массив.Добавить("А_"+сч); КонецЦикла; |
|||
9
Dimochka
09.04.13
✎
22:49
|
(6) А можно как-то сделать следующим образом,
А = 0 Если Если Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаA выполнилось первы раз тогда Возврат А+1 Если второй А+2 и т.Д ? |
|||
10
Живой Ископаемый
09.04.13
✎
22:50
|
2(9) можно, но выполняться будет один раз - первый.
|
|||
11
EvgeniuXP
09.04.13
✎
22:50
|
можно
Процедура Результат(А) Если Тогда А = А + 1; Возврат; КонецЕсли; КонецПроцедуры |
|||
12
Dimochka
09.04.13
✎
23:09
|
(11)
т.е. так должно работать ? Если Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаA Тогда А = 0; А = А + 1; Возврат "А_"+ А; ИначеЕсли Индекс <= Данные.ВременныеДанныеОбработки.ABCКлассификацияИндексКлассаB Тогда Б = 0; Б = Б + 1; Возврат "Б_"+ Б; Иначе Ц = 0; Ц = Ц + 1; Возврат "Ц_"+ Ц; КонецЕсли; |
|||
13
Dimochka
09.04.13
✎
23:11
|
(10) а как сделать чтобы много раз выполнялось ?
|
|||
14
Dimochka
09.04.13
✎
23:12
|
это функция потом вставляется в скд в ресурсы АБЦ.ABCКлассификация(ГрупповаяОбработка("ГруппаРаспределения")) и по сути возвращает либо А либо Б либо Ц
|
|||
15
EvgeniuXP
09.04.13
✎
23:13
|
(11) выполняет много раз, а возвращает 1, потом 2, потом 3 и т.д. т.к. передал ссылку.
|
|||
16
EvgeniuXP
09.04.13
✎
23:14
|
для а, б, ц тогда и передавай три значения, если отдельно надо считать - независимо.
|
|||
17
EvgeniuXP
09.04.13
✎
23:15
|
четвертый тип строка: "А" или "Б" или "Ц", чтоб знать кому сложить к первому значению, ко второму или третьему.
|
|||
18
EvgeniuXP
09.04.13
✎
23:17
|
А = 0; Б = 0; Ц = 0;
Результат("А", А, Б, Ц); Результат("А", А, Б, Ц); Результат("Б", А, Б, Ц); Результат("Ц", А, Б, Ц); Процедура Результат(Знач Тип, А, Б, Ц) Если Тип = "А" Тогда А = А + 1; Возврат; ИначеЕсли Тип = "Б" Тогда Б = Б + 1; Возврат; ИначеЕсли Тип = "Ц" Тогда Ц = Ц + 1; Возврат; КонецЕсли; КонецПроцедуры |
|||
19
EvgeniuXP
09.04.13
✎
23:18
|
получишь А = 2, Б = 1, Ц = 1
|
|||
20
Dimochka
09.04.13
✎
23:25
|
а как связать эти 2 функции в скд?
|
|||
21
Dimochka
09.04.13
✎
23:28
|
т.е. процедуру и функцию
|
|||
22
Dimochka
10.04.13
✎
11:52
|
(18) Как связать эту процедуру и функцию в скд ?
|
|||
23
Godofsin
10.04.13
✎
11:57
|
(22) чего?
|
|||
24
GANR
10.04.13
✎
11:58
|
(0) отладчик в помощь - форум не видит, что за фактический параметр передается в функцию
|
|||
25
Dimochka
10.04.13
✎
12:25
|
(24) Передается Сумма(Сумма), т.е сумма продажи кааждого товара за определенный период времени
|
|||
26
Dimochka
10.04.13
✎
12:27
|
(23) как сделать так чтобы работало все)))? ну серьезно, может там колонку добавить в ТЗ АБЦ, и ее возвращать? есть хоть какие-нибудь идеи.
|
|||
27
Dimochka
10.04.13
✎
12:40
|
(24) а потом каждому товару в зависимости от объема продаж возвращается параметр, если первые н-число товаров формируют объем продаж 75% то тогда присваевается А, если от 75 до 95 то Б иначе С, но так ложно проследить динамику товара по периодам , допустим если в первом месяце товар был А_1 то во втором он мог стать А_2 ил А_3 , поэтому есть необходимость возвращать ен просто А или Б или Ц, а так же номер этих А Б или Ц, если А вернулось 5 штук то первое А будет А_1 второе А_2 и т.д., аналогично с группами Б и Ц
|
|||
28
Dimochka
10.04.13
✎
19:41
|
ну неужели нету никаких советов (((
|
|||
29
Dimochka
10.04.13
✎
22:56
|
Тема еще актуальна!
|
|||
30
Живой Ископаемый
10.04.13
✎
22:59
|
всем плевать.
|
|||
31
mikecool
10.04.13
✎
23:11
|
(5) автор понял дзен пользователя...
|
|||
32
Dimochka
10.04.13
✎
23:16
|
ну и ладно, сам что ли не решу))))
|
|||
33
Jonny_Khomich
11.04.13
✎
06:09
|
(0) Тема вообще улётная))) Я написал функцию, но она возвращает не то что надо)))
(32) Самое верное решение!!! |
|||
34
Dimochka
11.04.13
✎
12:27
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |