Вход | Регистрация

  1  2  3   
1С:Предприятие ::

Метки:коллекции значений

НайтиЗначение() в ТЗ по двум колонкам. Возможно ли?

Я
   User63
03.08.04 - 12:18
Допустим, у меня есть таблица значений с колонками номенклатура и партия. Можно ли методом НайтиЗначение() получить строку по этим двум параметрам, например,предварительно создав дополнительную колонку и какаим нибудь образом скопировав туда значения этих двух вышеуказанных колонок?
Спасибо.
 
  Рекламное место пустует
   SnarkHunter
 
1 - 03.08.04 - 12:19
Можно
   Warlock
 
2 - 03.08.04 - 12:19
(0)Перебором строк...
   Warlock
 
3 - 03.08.04 - 12:19
+2 Не устраивает?
   Рупор абсурда
4 - 03.08.04 - 12:21
Можно и без доп. колонки ...
   IAm
 
5 - 03.08.04 - 12:24
(0) Долго, быстрее
ТЗ.Сортировать("Номенклатура");
Поз = 0;
ТЗ.НайтиЗначение(НужнНоменклатура, Поз, "Номенклатура");
Для А = Поз По ТЗ.КоличествоСтрок() Цикл
Если ТЗ.ПолучитьЗначение(А, "Партия") = НужнПартия Тогда
Сообщить("Вот оно"); Прервать;
ИначеЕсли ТЗ.ПолучитьЗначение(А, "Номенклатура") <> НужнНоменклатура Тогда
Сообщить("А нэту");Прервать;
КонецЕсли;
КонецЦикла;
   User63
6 - 03.08.04 - 12:25
Перебор строк не устраивает...
Хотелось бы через НайтиЗначение(). Вот только не знаю как в одну колонку два реквита вставить.
ТЗ.ДопКолонка =Стр(Номенклатура.Код)+Стр(Партия.Код)
Такой вариант у меня пройдет? Или есть более наработанные способы?
   Рупор абсурда
7 - 03.08.04 - 12:27
(5) А что будет быстрее в случае, если в ТЗ в колонке Номенклатура всего пара различных значений, а строк всего сотня тысяч? ...
   Композитор
 
8 - 03.08.04 - 12:28
(7) Быстрее будет повеситься.
   IAm
 
9 - 03.08.04 - 12:28
7 Перестановка местами колонок партия и Номенклатура в алгоритме 5.
   Матрейя
10 - 03.08.04 - 12:29
Можно поиском по двум колонкам. Ищещь в одно, затем во второй - если номера строк не совпадают - удаляешь в транзакции строку где найдено значение по второй колонке. Транзакцию в конце отменяешь.
 
 
   User63
11 - 03.08.04 - 12:30
(7) Именно так. Не хочется в модуле перебор строк делать...
Специалисты, подскажите, пожалуйста!
   IAm
 
12 - 03.08.04 - 12:32
10 Не где найдено второе, а которая имеет наименьший номер.
   Рупор абсурда
13 - 03.08.04 - 12:33
Функция ПоискПоДвумКолонкам(ТЗ,Значение1,Значение2,Колонка1,Колонка2) 
  Перем ТЗ_;  
    Если ПустоеЗначение(Значение1)=1 Тогда Возврат("Глюк :)") КонецЕсли;
  ТЗ.Выгрузить(ТЗ_);
    Пока 1=1 Цикл
    Ном=0;
      ТЗ_.НайтиЗначение(Значение1,Ном,Колонка1);
    Если Ном=0 Тогда Возврат(0) КонецЕсли;
      Если ТЗ_.ПолучитьЗначение(Ном,Колонка2)=Значение2 Тогда Возврат(Ном) КонецЕсли;
      ТЗ_.УстановитьЗначение(Ном,Колонка1,ПолучитьПустоеЗначение());
    КонецЦикла;
    Возврат 0;
КонецФункции
   Матрейя
14 - 03.08.04 - 12:34
12. Да. Я просто написал машинально.
   IAm
 
15 - 03.08.04 - 12:34
Только непонятно, ято она вернет если транзакцию отменишь, ведь все запомненные во время этого значения тоже отменятся.
   SnarkHunter
 
16 - 03.08.04 - 12:35
(12)Энурез?
   Рупор абсурда
17 - 03.08.04 - 12:35
(10) Фигню ты сказал ... :))
   SnarkHunter
 
18 - 03.08.04 - 12:36
Тьху...
   IAm
 
19 - 03.08.04 - 12:36
13 быстрее по другому
   IAm
 
20 - 03.08.04 - 12:41
Функция ПоискПоДвумКолонкам(ТЗ,Значение1,Значение2,Колонка1,Колонка2) 
 Перем ТЗ_;   
   Если ПустоеЗначение(Значение1)=1 Тогда Возврат("Глюк :)") КонецЕсли; 
 ТЗ.Выгрузить(ТЗ_); 
   Пока 1=1 Цикл 
   Поз1=0; Поз2 =0;
   ТЗ_.НайтиЗначение(Значение1,Поз1,Колонка1);
   ТЗ_.НайтиЗначение(Значение2,Поз2,Колонка2);  
   Если (Поз1=0) ИЛИ (Поз2=0) Тогда 
       Возврат(0) 
   ИначеЕсли Поз1 = Поз2 Тогда
       Возврат Поз1;
   ИначеЕсли Поз1 > Поз2 Тогда
       ТЗ.Заполнить("", 1, Поз1 - 1, Колонка2);
   Иначе
       ТЗ.Заполнить("", 1, Поз2 - 1, Колонка1);
   КонецЕсли; 
   КонецЦикла;  
КонецФункции
   GrayT
 
21 - 03.08.04 - 12:43
(13) Что то я не въехал в красоту решения. Вроде такой же перебор, да же еще медленней 5, наверное.
   IAm
 
22 - 03.08.04 - 12:43
Пля, к клиенту надо... А хочется тесты провести.
   IAm
 
23 - 03.08.04 - 12:45
Можно в 20 ещё коррективы внести чтобы быстрее
   IAm
 
24 - 03.08.04 - 12:48
Функция ПоискПоДвумКолонкам(ТЗ,Значение1,Значение2,Колонка1,Колонка2) 
Перем ТЗ_;   
ТЗ.Выгрузить(ТЗ_); 
  ИндексПоиска = 0;
  Пока 1=1 Цикл  
  Если ИндексПоиска <> 1 Тогда
  Поз1=0;
  ТЗ_.НайтиЗначение(Значение1,Поз1,Колонка1); 
  КонецЕсли;
  Если ИндексПоиска <> 2 Тогда
  Поз2 =0;
  ТЗ_.НайтиЗначение(Значение2,Поз2,Колонка2);  
  КонецЕсли; 
  Если (Поз1=0) ИЛИ (Поз2=0) Тогда 
      Возврат(0) 
  ИначеЕсли Поз1 = Поз2 Тогда 
      Возврат Поз1; 
  ИначеЕсли Поз1 > Поз2 Тогда 
      ТЗ.Заполнить("", 1, Поз1 - 1, Колонка2); 
      ИндексПоиска = 1;
  Иначе 
      ТЗ.Заполнить("", 1, Поз2 - 1, Колонка1); 
      ИндексПоиска = 2;
  КонецЕсли; 
  КонецЦикла;   
КонецФункции
   Рупор абсурда
25 - 03.08.04 - 12:49
(21) Вся разница только в том, что ТЗ не сортируется ...
Т.е. если по окончании, нужно ТЗ оставить с той же сортировкой, придётся предварительно пронумеровать строки, чтоб использовать (5) ...
   Рупор абсурда
26 - 03.08.04 - 12:51
(20,24) Ты ничего не забыл?
   IAm
 
27 - 03.08.04 - 12:51
26 Времени 5 минут, давай правильный ответ. Вроде ничего не забыл.
   Рупор абсурда
28 - 03.08.04 - 12:57
(27) Сори ..., продолжим, когда вернёшься ...
   Олег_1978
 
29 - 03.08.04 - 13:03
Проще ввести ключ но 2-м полям - работать будет всегда быстрее, чем любой из описанных вариантов...
   Рупор абсурда
30 - 03.08.04 - 13:05
(29) С учётом времени введения ключа?
   Warlock
 
31 - 03.08.04 - 13:07
(29)Идея хороша, ведь получается что-то типа ускоренного перебора. Немножко модифицировав, можно получить(быстро) все вхождения комбинаций. При создании ключевого поля(на что, кстати, тоже время уходит) перебор тяжелее сделать...
   User63
32 - 03.08.04 - 13:07
(29) Ключ по двум полям - как в (6) пройдет или есть более оптимальный вариант?
   Олег_1978
 
33 - 03.08.04 - 13:10
Как в 6 - пойдет вполне, можно и другой подобрать, все от искомых колонок зависит, их типа. Я всегда так делаю, если поиск нужен.
 
  Рекламное место пустует
   GrayT
 
34 - 03.08.04 - 13:11
Мдя уж
   Рупор абсурда
35 - 03.08.04 - 13:13
(32) Пойдет если коды у номенклатуры и партии железно уникальны ...
А ващще, лучше внутренние ид сравнивать ...
   Олег_1978
 
36 - 03.08.04 - 13:14
(35) Так я и говорю - нужно смотреть, что за данные в колонках.
Можно и лучше сделать...
   Tick
37 - 03.08.04 - 15:05
Можно попробовать так:
Перем ЗнСтроки1, ЗнСтроки2;
Табл.ВыбратьСтроки();
Пока (Табл.НайтиЗначение("Значение1", ЗнСтроки1, 1) = 1) или 
     (Табл.НайтиЗначение("Значение2", ЗнСтроки2, 2) = 1) Цикл
     Если ЗнСтроки1 = ЗнСтроки2 Тогда
         //Делай что надо

     КонецЕсли;
КонецЦикла;

Попробуй может получится.
   Рупор абсурда
38 - 03.08.04 - 15:15
(37) Мдя ...
Давненько к нам такие мастера не заходили ...
   SiMazx
 
39 - 03.08.04 - 15:22
(37) Гениально... Либо ничего либо бесконечность... Глобально...
   Тор
40 - 03.08.04 - 16:08
(Warlock) А ты значит до этого перебором пользовался??? Сильно...
Непонятен ответ в (2) и последующая похвала ключевого поля. В вопросе же уже почти содержался ответ про ключевую колонку "например,предварительно создав дополнительную колонку и какаим нибудь образом скопировав туда значения этих двух вышеуказанных колонок". IAm пошел по более верному пути: зачастую бывает нужно получить не только строго одну строку с данным значением а набор строк, когда искомые параметры совпадают, а остальные нет.
   Рупор абсурда
41 - 03.08.04 - 16:15
(40) Какая длинная речь ...
Наверно, к тому же ещё и умная очень ...
Я правда не заметил ..., но что взять с тупого одинэсника ... :((
   andersen
 
42 - 03.08.04 - 16:16
если
>нужно получить не только строго одну строку с данным значением а набор строк, когда искомые параметры совпадают, а остальные нет.
тады можно поступить так...
вызвать два раза функцию
Функция УстановитьЗначениеФильтра(Знач ТЗ,Колонка,значение)
    НачСтрока=0;
    КонСтрока=0;
    ТЗ.Сортировать(колонка + "+");
    ТЗ.НайтиЗначение(Значение,НачСтрока,колонка);
    бт=СоздатьОбъект("ТаблицаЗначений"); 
    Если НачСтрока>0 Тогда
        ТЗ.Выгрузить(бт,начСтрока);        
        бт.Сортировать(колонка + "-");
        БТ.НайтиЗначение(Значение,КонСтрока,колонка);
        бт.Выгрузить(бт,констрока);
    КонецЕсли;
    Возврат бт;
КонецФункции 
тз1 = УстановитьЗначениеФильтра(ТЗ0,Колонка1,значение1)
тз2 = УстановитьЗначениеФильтра(ТЗ1,Колонка2,значение2)
Сама функция где-то отковырена в инете...
в принципе работает прекрасно :)))
   Рупор абсурда
43 - 03.08.04 - 16:18
(42) Автор функции ROM ...
Но работает она не совсем прекрасно ...
   Тор
44 - 03.08.04 - 16:19
(41) Какое предложение ты не понял???
   Рупор абсурда
45 - 03.08.04 - 16:20
(43)+ http://rom1c.narod.ru/function.html
(44) Я что сильно похож на дебила?
   Тор
46 - 03.08.04 - 16:24
(45)Хочешь поговорить об этом? Зачем тогда (41) написал?
   andersen
 
47 - 03.08.04 - 16:24
(45) да, если нет вхождений то вернет ПустоеЗначение и второй выхов неотработает :)
   Tick
48 - 03.08.04 - 16:25
Прошу прощеня, уже гуси летят
Перем знСтроки; 
ВремТабл = СоздатьОбъект("ТаблицаЗначений");
ВремТабл.Загрузить(Табл);
~M1:
Если ВремТабл.НайтиЗначение("Значение1", знСтроки, 1) = 1 Тогда
    Если ВремТабл.ПолучитьЗначение(знСтроки, 2) = "Значение2" Тогда
       //Делай что надо

    Иначе
        ВремТабл.УстановитьЗначение(знСтроки, 1, "");
        ВремТабл.УстановитьЗначение(знСтроки, 2, "");
        Перейти ~M1;
    КонецЕсли;
Иначе
   //Не найдено

КонецЕсли;
   Рупор абсурда
49 - 03.08.04 - 16:29
(46) Сори, конечно ..., но написал (41) я потому, что не нашёл в (40) ничего умного ...
 
  Рекламное место пустует
   Тор
50 - 03.08.04 - 16:32
Ну а я написал потому что не нашел в (2) и (29) ничего умного :)
   Тор
51 - 03.08.04 - 16:33
(50)-->(49)
   Рупор абсурда
52 - 03.08.04 - 16:34
(50) ... и решил добавить немножко тупизма от себя?
   Тор
53 - 03.08.04 - 16:40
(52) Ну ОК, ты меня уел, ох уел... :) Просто звезда автора смутила, точнее спровоцировала...
ЗЫ. (Волшебнику) Вообще-то считаю эти звезды не нужны. Позерство какое-то. Вот у IAm их нет а по его знаниям ему можно штук 5 повесить... Звезды - не показатель ума и крутости.
   Рупор абсурда
54 - 03.08.04 - 16:42
(53) Потому его (IAm'а) и выгоняют отсюда периодически ...
   Матрейя
55 - 03.08.04 - 16:42
Уже придумали элитный код или мне предложить совершенное решение?
   DimG
 
56 - 03.08.04 - 16:45
Матрейя давай, а то из вышеприведенных без корректировок работает только от рупора. А он мне как раз щас нужон. Только лень думать.
   Матрейя
57 - 03.08.04 - 16:45
+55. Нужно вернуть массив подходящих условиям строк или одну строку?
   Рупор абсурда
58 - 03.08.04 - 16:47
(55) Если то, с транзакциями, то валяй, конечно ...
   Тор
59 - 03.08.04 - 16:47
(55) Давай. Условие: вернуть номер строки (либо строк), удовлетворяющей условию равенства НЕОГРАНИЧЕННОГО количества параметров.
   User63
60 - 03.08.04 - 16:49
Вообще-то, мне нужна только одна строка удовлетворяющая заданным условиям.. ;)
   Матрейя
61 - 03.08.04 - 16:49
Сейчас, минут через 10, подумаю немного.
   Тор
62 - 03.08.04 - 16:50
(61) А то что в (59) сделаешь? Полезная вещь будет.
   DimG
 
63 - 03.08.04 - 17:05
прошло 16 минут...
   Матрейя
64 - 03.08.04 - 17:08
Я не могу запостить текст кода
   Матрейя
65 - 03.08.04 - 17:08
Функция Поиск(Зн,Н1)
    Стр="";
    Если Тз.НайтиЗначение(зн,Стр,1)=1 Тогда   
        сч=1;
        Для Н=2 По Н1 Цикл 
            Если  Тз.НайтиЗначение(зн,Стр,Н)=0 Тогда 
                Прервать;  
                Тз.УдалитьСтроку(Стр); 
            Иначе
                сч=Сч+1;
            КонецЕсли;    
        КонецЦикла;     
        Если Сч=Н1 тогда
            Сообщить(Стр); 
            Тз.УдалитьСтроку(Стр); 
            Возврат("");
        КонецЕсли;     
    Иначе
        Возврат(1);
    КонецЕсли;    
КонецФункции
   Матрейя
66 - 03.08.04 - 17:09
Процедура Выполнить(Зн) 
    П1=Тз.КоличествоСтрок();  
    Н1=Тз.КоличествоКолонок();
    НачатьТранзакцию();       
    Пока  Поиск(Зн,Н1)<>1 Цикл
    КонецЦикла;    
    ОтменитьТранзакцию();
КонецПроцедуры
   Матрейя
67 - 03.08.04 - 17:10
Наконец-то. 63 - я сделал ровно за десять мин, но что-то видно с моим провайдером.
   andersen
 
68 - 03.08.04 - 17:10
(65)кажисть я устал....
это что?
Если  Тз.НайтиЗначение(зн,Стр,Н)=0 Тогда 
               Прервать;   
           >>>>Тз.УдалитьСтроку(Стр);
   Матрейя
69 - 03.08.04 - 17:11
68. Я проверил - работает.
   Матрейя
70 - 03.08.04 - 17:13
Хотя да, у меня удаляются строчки... Но можно выгрузить в Тз и там произвести поиск.
   Матрейя
71 - 03.08.04 - 17:21
Но согласитесь - алгоритм неплохой. Транзакции надо закомментировать. Я не знал, что для ТЗ они не имеют никакого значения.
   Матрейя
72 - 03.08.04 - 17:27
И строку можно не удалять, а сдвигать в конец. Немного изменить функцию Поиск()-> вызывать Возврат(1), если позиционирование на сдвинутых строках.
   Рупор абсурда
73 - 03.08.04 - 18:12
Молодец! Я смеялся больше 10 минут ...
   Рупор абсурда
74 - 03.08.04 - 18:15
(73)+ Молодец, конечно, Матрёня ...

Работать оно, конечно, будет ..., но дело в том, что метод удалитьСтроку() очень медленный ...

ЗЫ: С транзакциями тоже смешно получилось ... :))
   Зам Матрейи
75 - 03.08.04 - 18:20
Перем П;

Функция Поиск(Зн,Н1,П) 
    Стр="";
    Если Тз.НайтиЗначение(зн,Стр,1)=1 Тогда   
        сч=1;
        Для Н=2 По Н1 Цикл 
            Если  Тз.НайтиЗначение(зн,Стр,Н)=0 Тогда 
                Прервать;  
                Тз.СдвинутьСтроку(П-Стр,Стр);
                П=П-1;
            Иначе 
                Если Стр<П тогда 
                    сч=Сч+1;    
                Иначе
                    Возврат(0);
                КонецЕсли;    
            КонецЕсли;    
        КонецЦикла;     
        Если Сч=Н1 тогда
            Тз.СдвинутьСтроку(П-Стр,Стр);
            Сообщить(Стр+(П-Стр)); 
            П=П-1;
        КонецЕсли;     
    Иначе
        Возврат(0);
    КонецЕсли;
КонецФункции    


Процедура Выполнить(Зн) 
    П=Тз.КоличествоСтрок();  
    Н1=Тз.КоличествоКолонок();
    Пока  Поиск(Зн,Н1,П)<>0 Цикл
    КонецЦикла;    
КонецПроцедуры
   Громобой
 
76 - 03.08.04 - 18:22
Можно добавить в ТЗ колонку "Индекс", склеивать в нее значение тех колонок по которым нужен поиск к примеру методом ЗначениеВСтроку(...)+ЗначениеВСтроку(...)+...  А потом найти строку элементарно методом НайтиЗначение(Зн,Нстр,"Индекс"), где Зн сформировано похожим образом
   Рупор абсурда
77 - 03.08.04 - 18:30
(76) Как ты считаешь, это ты счас умную мысль высказал?
   Рупор абсурда
78 - 03.08.04 - 18:31
(77)+ Прежде, чем ответить, прочитай, пожалуйста, (0) ещё раз ...
   IAm
 
79 - 03.08.04 - 20:01
Весело у вас тут
   Рупор абсурда
80 - 03.08.04 - 20:05
(79) Угу ...
Тор сказал, что тебе нужно присвоить 5 звёзд ..., Волшебник испугался и звёзды отменил совсем ...
О как ...
   IAm
 
81 - 03.08.04 - 20:13
В (54) очень смешно
   Матрейя
82 - 03.08.04 - 22:30
Руппи, ну а как модуль в 75? Быстрее чем удалить строку?
   NS
 
83 - 04.08.04 - 00:10
»
   Мэт
84 - 04.08.04 - 00:13
83. По себе о других не тактично судить.
   NS
 
85 - 04.08.04 - 00:47
Avb, ну указывал же я метод...
Поиск скорей всего многократный...
Методов нормальных два  - хранить остсортированными по первому параметру в двух направлениях, и бинарный поиск, и сводный реквизит...
Остальное - порезанное (83)
   NS
 
86 - 04.08.04 - 00:48
(84) Tot kj[b vyt ,elen erfpsdfnm!
   Мэт
87 - 04.08.04 - 00:57
NS, новичок, ты ламер.
   Рупор абсурда
88 - 04.08.04 - 00:57
(85) Один хрен, большая часть времени у тебя уйдёт на подготовку к поиску ...
А если тз предварительно никак не подготовлена для поиска ...
Изменять порядок строк в ней нельзя ...
И, допустим, найти нужно всего один раз ...

Ты пойми, я ж не навязываю никакого решения ..., просто предложил, как один из вариантов ...
   NS
 
89 - 04.08.04 - 00:58
(87) Прикольно... Еще пошути...
(с) не мой.
   IAm
 
90 - 04.08.04 - 00:59
88 Да
   IAm
 
91 - 04.08.04 - 00:59
1) Сортировка. Не катит если нужно вернуть номер строки.
2) Бинарный поиск. Что это?
3) Отдельный реквизит. Ёжику понятно, только если поиск выполняется один раз для таблицы, то создавать его в несколько раз дольше.
   Мэт
92 - 04.08.04 - 01:02
89. Конечно прикольно, когда ламер уверен что он спец:). И шашки - шахматы твои муйня. Какой кретин тебя 1с-су учил?
   NS
 
93 - 04.08.04 - 01:02
(88) Колонка - номер строки.
Сортировка? Долго? Сколько секунд сортируется ТЗ на миллион?
По индексу? Меньше десяти секунд...
А поиск явно неоднократный.
   NS
 
94 - 04.08.04 - 01:05
(92) Крылов про моську что-то базарил...
   Рупор абсурда
95 - 04.08.04 - 01:05
(91) А бинарный поиск тоже предполагает предварительную сортировку ...
   NS
 
96 - 04.08.04 - 01:06
(95) Я и говорб - сортировка в обе стороны и бинар.
   IAm
 
97 - 04.08.04 - 01:07
потестировать надо будет завтра на предмет одиночного поиска.
Если искаться будет неоднократно, то ясно, что лучше колонку Индекс вводить и реквизиты в неё суммировать
   Рупор абсурда
98 - 04.08.04 - 01:07
(93) Отсортировал, нашёл ..., зашибись! ..., пусть даже отсортировал обратно ..., как получить номер строки? ...
   Мэт
99 - 04.08.04 - 01:08
93. Млин, кто этого юнца выпустил в инет? Откровенная лажа.
94. Да, ты похож.
   NS
 
100 - 04.08.04 - 01:09
(98) (93)

  1  2  3   

Список тем форума
Рекламное место пустует   Рекламное место пустует
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует