|
v7: Нужно сжать таблицу значений | ☑ | ||
---|---|---|---|---|
0
oslokot
19.09.12
✎
09:52
|
Пока Запрос.Группировка(1) = 1 Цикл
ТаблЗнач.НоваяСтрока(); ТаблЗнач.Идентификатор = Запрос.Идентификатор; // Текст ТаблЗнач.Номенклатура = Запрос.Номенклатура; // Справочник ТаблЗнач.Примечание = Запрос.Примечание; // Текст ТаблЗнач.Количество = Запрос.КоличествоСумма; // Число КонецЦикла; Нужно сжать ТаблЗнач по количеству, если совпадают "Номенклатура" и "Примечание" но при этом сложить в строку "Идентификатор", например через разделитель ";" |
|||
1
Нуф-Нуф
19.09.12
✎
09:52
|
цикл ептыть
|
|||
2
Нуф-Нуф
19.09.12
✎
09:53
|
или ком соединение к 8ке и в ней выполнить скд, которое вернет новую тз
|
|||
3
Ненавижу 1С
гуру
19.09.12
✎
09:53
|
(1) ну ты сказал, этож код писать САМОМУ!
|
|||
4
oslokot
19.09.12
✎
10:20
|
Покрасивее бы сделать... :)
|
|||
5
Voronve
19.09.12
✎
10:21
|
(4) " ... но при этом сложить в строку "Идентификатор" ... " - цикл
|
|||
6
Морозов Александр
19.09.12
✎
10:22
|
я чет ниче не понял...
|
|||
7
Азат
19.09.12
✎
10:23
|
ну пздц школоло пошло
|
|||
8
Прохожий
19.09.12
✎
10:24
|
Примечание - строка. Один символ влево-вправо и таблица не сложится. "Ваша программа не работает...За что мы платим вам аж 700 рублей в час?!"
|
|||
9
Азат
19.09.12
✎
10:26
|
НовТЗ = СОздатьОбъект("ТаблицаЗначений");
НовТЗ.НоваяКолонка("ПримариКей"); НовТЗ.НоваяКолонка("СтрокаИден"); Пока Запрос.Группировка(1) = 1 Цикл ТаблЗнач.НоваяСтрока(); ТаблЗнач.Номенклатура = Запрос.Номенклатура; // Справочник ТаблЗнач.Примечание = Запрос.Примечание; // Текст ТаблЗнач.Количество = Запрос.КоличествоСумма; // Число Кей = ЗначениеВСтрокуВнутр(Запрос.Номенклатура) + "@" + ЗначениеВСтрокуВнутр(Запрос.Примечание); Стр = 0; Если НовТЗ.НайтиЗначение(Кей, Стр, "ПримариКей") = 0 Тогда НовТЗ.НоваяСтрока(); НовТЗ.ПримариКей = Кей; НовТЗ.СтрокаИден = Запрос.Идентификатор; Иначе НовТЗ.УстановитьЗначение(Стр, "Идентификатор", НовТЗ.ПолучитьЗначение(Стр, "Идентификатор") + "," + Запрос.Идентификатор); КонецЕсли; КонецЦикла; Ну и потом ТЗ.Свернуть("Номенклатура, Примечание", "Количество"); а при выводе - получаешь строку иденов из НовТЗ |
|||
10
Азат
19.09.12
✎
10:27
|
+ (9) давай косарик на киви
|
|||
11
oslokot
19.09.12
✎
10:27
|
(8) Согласен. Но разговор сейчас не об этом.
Вот так я сделал: Для НомерСтрокиЦикла = 1 По ТаблЗнач.КоличествоСтрок() Цикл Попытка ПоискНоменклатура = ТаблЗнач.ПолучитьЗначение(НомерСтрокиЦикла,"Номенклатура"); Исключение Продолжить; КонецПопытки; ПоискПримечание = ТаблЗнач.ПолучитьЗначение(НомерСтрокиЦикла,"Примечание"); ИтогоКоличество = ТаблЗнач.ПолучитьЗначение(НомерСтрокиЦикла,"Количество"); СтрокаИдентификаторов = СокрЛП(ТаблЗнач.ПолучитьЗначение(НомерСтрокиЦикла,"Идентификатор")); ТаблЗнач.ВыбратьСтроки(); Пока ТаблЗнач.ПолучитьСтроку() = 1 Цикл Если (ПоискНоменклатура = ТаблЗнач.Номенклатура) и (ПоискПримечание = ТаблЗнач.Примечание) и (ТаблЗнач.НомерСтроки <> НомерСтрокиЦикла) Тогда ИтогоКоличество = ИтогоКоличество + ТаблЗнач.Количество; СтрокаИдентификаторов = СтрокаИдентификаторов + " " + ТаблЗнач.Идентификатор; ТаблЗнач.УдалитьСтроку(); ТаблЗнач.ВыбратьСтроки(); КонецЕсли; КонецЦикла; СтрокаИдентификаторов = СтрЗаменить(СокрЛП(СтрокаИдентификаторов)," ",";"); ТаблЗнач.УстановитьЗначение(НомерСтрокиЦикла,"Идентификатор",СтрокаИдентификаторов); ТаблЗнач.УстановитьЗначение(НомерСтрокиЦикла,"Количество",ИтогоКоличество); КонецЦикла; Кто хочет, может посмеяцца:) Работает конечно... но как красивее сделать? |
|||
12
oslokot
19.09.12
✎
10:28
|
(9) опередил :)
|
|||
13
Азат
19.09.12
✎
10:29
|
(12) я еще и красивее сделал такто
|
|||
14
oslokot
19.09.12
✎
10:30
|
(13) да-да!
эх, я точно, школота :( |
|||
15
Азат
19.09.12
✎
10:34
|
(14) за цикл в цикле ссаной тряпочкой по ипальничку
|
|||
16
oslokot
19.09.12
✎
10:37
|
(15) а че, низя?
|
|||
17
Нуф-Нуф
19.09.12
✎
10:39
|
(15) пацааан
|
|||
18
ЧеловекДуши
19.09.12
✎
10:41
|
(16)Медленно и считается гоуно кодом.
ПК, конечно стали сильными, но это не значит, что не нужно оптимизировать код. |
|||
19
Mikeware
19.09.12
✎
10:42
|
взять ИндексированнуюТаблицу, Ггруппировать(), добавить колонку и заполнить из тзПотомки циклом. 9 строк.
|
|||
20
Alexor
19.09.12
✎
10:45
|
Я бы сделал:
В запросе группировки по Идентификатор,Номенклатура,Примечание Потом Пока Запрос.Группировка(1) = 1 Цикл Пока Запрос.Группировка(2) = 1 Цикл ТаблЗнач.НоваяСтрока(); ТаблЗнач.Идентификатор = Запрос.Идентификатор; // Текст ТаблЗнач.Номенклатура = Запрос.Номенклатура; // Справочник Примечание=""; Колво=0; Пока Запрос.Группировка(3) = 1 Цикл Примечание = Примечание+","+СокрЛП(Запрос.Примечание); // Текст Колво=Колво+ Запрос.КоличествоСумма; // Число КонецЦикла; ТаблЗнач.Примечание = Примечание; ТаблЗнач.Количество = Колво; КонецЦикла; КонецЦикла; |
|||
21
alex74
19.09.12
✎
10:47
|
(0) интересный у тебя запрос...
|
|||
22
Нуф-Нуф
19.09.12
✎
10:48
|
юзайте скд и неипите мозги честным людям
|
|||
23
Alexor
19.09.12
✎
10:49
|
+20 Ошибся с реквизитом
Групипровать Номенклатура,Примечание,Идентификатор Потом Пока Запрос.Группировка(1) = 1 Цикл Пока Запрос.Группировка(2) = 1 Цикл ТаблЗнач.НоваяСтрока(); ТаблЗнач.Примечание = Запрос.Примечание; // Текст ТаблЗнач.Номенклатура = Запрос.Номенклатура; // Справочник Идентификатор=""; Колво=0; Пока Запрос.Группировка(3) = 1 Цикл Идентификатор = Идентификатор+?(ПустоеЗначение(Идентификатор)=1,"",",")+СокрЛП(Запрос.Идентификатор); // Текст Колво=Колво+ Запрос.КоличествоСумма; // Число КонецЦикла; ТаблЗнач.Идентификатор = Идентификатор; ТаблЗнач.Количество = Колво; КонецЦикла; КонецЦикла; |
|||
24
oslokot
19.09.12
✎
11:21
|
(23) так не получится, пробовал уже. Не любит она группировки по текстовым переменным
Err: "Длина индекса превышает максимальную длину и не может быть уменьшена." |
|||
25
antoneus
19.09.12
✎
11:53
|
как уже говорили, взять индексированную таблицу. Или даже две.
ИТ1 = СоздатьОбъект("ИндексированнаяТаблица"); ИТ1.Загрузить(ТаблЗнач); ИТ1.Свернуть("Идентификатор, Номенклатура, Примечание", "КоличествоСумма"); ИТ1.ДобавитьИндекс("НомПрим", "Номенклатура, Примечание"); ИТ2 = СоздатьОбъект("ИндексированнаяТаблица"); ИТ1.Выгрузить(ИТ2, "НомПрим", "Номенклатура, Примечание", 1); ИТ2.НоваяКолонка("Идентификаторы"); ИТ2.НоваяКолонка("Сумма"); Ключ = СоздатьОбъект("СписокЗначений"); спИдентификаторы = СоздатьОбъект("СписокЗначений"); ИТ2.ВыбратьСтроки(); Пока ИТ2.ПолучитьСтроку() = 1 Цикл Ключ.УдалитьВсе(); ИТ2.ВыгрузитьСтроку(Ключ, ИТ2.НомерСтроки(), "Номенклатура, Примечание"); ИТ1.УстановитьФильтр(Ключ, Ключ, "НомПрим"); ИТ2.Сумма = ИТ1.Итог("КоличествоСумма", "НомПрим"); ИТ1.Выгрузить(спИдентификаторы, "НомПрим", "Идентификатор"); ИТ2.Идентификаторы = СтрЗаменить(спИдентификаторы.ВСтрокуСРазделителями(), """", ""); КонецЦикла; |
|||
26
oslokot
19.09.12
✎
12:02
|
Спасибо всем! сделал как (9)
|
|||
27
Азат
19.09.12
✎
12:12
|
(26) давай косарик в благодарность
|
|||
28
orefkov
19.09.12
✎
12:35
|
Примерно так:
база = СоздатьОбъект("SQLIteBase"); база.Открыть(":memory:"); база.УложитьТЗ(тз, "tab"); тз = база.НовыйЗапрос().ВыполнитьЗапрос("select Номенклатура [Номенклатура :Справочник.Номенклатура], |Примечание, group_concat(Идентификатор, ',') from tab group by Номенклатура, Примечание"); |
|||
29
Ёпрст
19.09.12
✎
12:38
|
(28) жалко, что group_concat нет в фоксе, к примеру :(
|
|||
30
orefkov
19.09.12
✎
12:38
|
(29)
Да, group_concat рулит, много раз уже помогал. |
|||
31
oslokot
19.09.12
✎
13:04
|
(27) Держи косарь )
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |