Имя: Пароль:
1C
1C 7.7
v7: Поиск в таблице значений?
0 ildarius
 
14.02.14
14:38
Здравствуйте! Есть 2 таблицы значений (ТЗ)
Пример:
ТЗ1
Фабрика1
Фабрика2
Фабрика3

ТЗ2
Фабрика2  Товар1
Фабрика1  Товар2
Фабрика3  Товар3
Фабрика2  Товар4

Как получить итоговую таблицу
Фабрика1  Товар2
Фабрика2  Товар1, Товар4
Фабрика3  Товар3
1 bbnn
 
14.02.14
14:41
Фабрика2  Товар1, Товар4
Сколько таких совпадений  - столько колонок должно добавиться?
2 1Сергей
 
14.02.14
14:42

Фабрика1  Товар2
Фабрика2  Товар1, Товар4
Фабрика3  Товар3


Вторая колонка должна быть списком значений?
3 Voronve
 
14.02.14
14:43
(0) Ручками перебирать
4 1Сергей
 
14.02.14
14:50
(3) не ручками, а циклом
5 Chum
 
14.02.14
14:51
(0) что сложного?

Сортировка, цикл с уловием и третья ТЗ тебя спасут.
6 МихаилМ
 
14.02.14
15:05
это как раз задача на проф пригодность.


сделайте её  не построчно, а по колонкам.
7 Ёпрст
 
гуру
14.02.14
15:05
(0) загнать ТЗ в запрос на 1sqlite и сделать group_concat
8 ildarius
 
14.02.14
15:17
спасибо за активность. Сортировка, цикл с уловием и третья ТЗ тебя спасут. Не могу вкурить. Еси не трудно можно код?
9 Voronve
 
14.02.14
15:32
(4) Дааа ... Учитель.
10 Mikeware
 
14.02.14
15:43
ИндексированнаяТаблица, Группировать() и перебор тзПотомки
11 Ёпрст
 
гуру
14.02.14
15:44
(10) как в (7) красившее..
:)
12 ildarius
 
14.02.14
15:48
понил...СПС. ща попробую.
13 Mikeware
 
14.02.14
15:50
(7) sqlite работает с ТЗ? не знал...
14 Ёпрст
 
гуру
14.02.14
15:53
(13) конечно, уложитьТЗ и привет.. а там примитивный запрос с concat .. и усё. Странно, что в t-sql нет такой функции, там только рученьками писать
15 МихаилМ
 
14.02.14
15:56
(14)
есть pivot
16 Mikeware
 
14.02.14
15:58
(14) в 2005 и выше есть pivot
17 Ёпрст
 
гуру
14.02.14
16:03
(15) ага , и другие ранжирующие функции.. токма, не у всех скуль>=2005
^)
18 Ёпрст
 
гуру
14.02.14
16:03
(0) на вот, пример

Процедура Сформировать()
    Попытка
        база = СоздатьОбъект("SQLiteBase");
    Исключение
        ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
        база = СоздатьОбъект("SQLiteBase");
    КонецПопытки;
    база.Открыть(":memory:");
    запрос = база.НовыйЗапрос();    
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    ТЗ.НоваяКолонка("ид","Число");
    ТЗ.НоваяКолонка("Имя","Строка");
    Для к = 1 По 5 Цикл
        ТЗ.НоваяСтрока();
        ТЗ.ид = 1;
        ТЗ.Имя = "Вася"+к;
    КонецЦикла;
    Для к = 1 По 5 Цикл
        ТЗ.НоваяСтрока();
        ТЗ.ид = 2;
        ТЗ.Имя = "Федя"+к;
    КонецЦикла;
    база.УложитьТЗ(ТЗ,"Вася",0);
    ТекстЗапроса = "
    |select ид,group_concat(Имя) from Вася group by ид";
    запрос.ВыполнитьЗапрос(ТекстЗапроса).ВыбратьСтроку();
КонецПроцедуры
19 Chum
 
14.02.14
16:03
(13) как бы создать временную таблицу и загрузить в нее тз

(8)

тз3 = СоздатьОбъект("таблицазначений")
тз3.новаяколонка("фабрика");
тз3.новаяколонка("товар" );

тз2.сортировать("фабрика");

тз1.ВыбратьСтроки();
пока тз1.ПолучитьСтроку()=1 Цикл
нс = 0;
если тз2.найтизначение(тз1.фабрика, нс, "фабрика")=0 тогда
продолжить;
Конецесли;

тз3.новаястрока();
тз3.фабрика = тз1.фабрика;
тз3.товар = создатьобъект("списокзначений");

пока 1=1 цикл
тз2.получитьстрокупономеру(нс);
если тз2.фабрика <> тз1.фабрика тогда
прервать;
иначе
тз3.товар.добавитьзначение(тз2.товар);
конеццикла;
конеццикла;

конецесли;
КонецЦикла;
20 Chum
 
14.02.14
16:05
если точнее, то как-то так:

тз1.ВыбратьСтроки();
пока тз1.ПолучитьСтроку()=1 Цикл

нс = 0;

если тз2.найтизначение(тз1.фабрика, нс, "фабрика")=0 тогда
продолжить;
Конецесли;

тз3.новаястрока();
тз3.фабрика = тз1.фабрика;
тз3.товар = создатьобъект("списокзначений");

пока 1=1 цикл
тз2.получитьстрокупономеру(нс);
если тз2.фабрика <> тз1.фабрика тогда
прервать;
иначе
тз3.товар.добавитьзначение(тз2.товар);

конеццикла;

нс = нс + 1;
КонецЦикла;
21 Chum
 
14.02.14
16:06
блин, в блокноте сложно писать код.

нс = нс + 1; - надо затолкать внутрь второго цикла
22 Mikeware
 
14.02.14
16:28
(20) можно и одним циклом.
только пейсать лениво
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn