|
v7: Подключение через ОЛЕ | ☑ | ||
---|---|---|---|---|
0
MixanM
16.12.11
✎
05:58
|
Сделал проверку справочника, где то была ветка, н стал ее реанимировать, т.к. все сделал, только вопрос, почему при работе, доходя до первой записи, и обрабатывая ее корректно - дальше выпадает надпись : "Не выбран Элемент" ?
код не большой : Процедура Сформировать() Спр = СоздатьОбъект("Справочник.Номенклатура"); СпрЕдиницы = СоздатьОбъект("Справочник.Единицы"); Файл = СоздатьОбъект("Текст"); ИмяФайла = "c:\rash.txt"; Файл.Открыть(ИмяФайла); БазаОле=СоздатьОбъект("V77.Application"); ПользовательОле = "Admin"; ПарольОле = ""; ЗапускБезЗаставки = 1; Если Лидер = 1 Тогда РезультатПодключения = БазаОле.Initialize(БазаОле.RMTrade, "/DH:\Config\Trade_torg\","NO_SPLASH_SHOW"); КонецЕсли; Если ТЦ = 1 Тогда РезультатПодключения = БазаОле.Initialize(БазаОле.RMTrade, "/DH:\Config\Trade_lider\","NO_SPLASH_SHOW"); КонецЕсли; Если РезультатПодключения = 0 Тогда Сообщить("Не удалось подключится к указанной базе - проверьте вводные!"); Возврат; Иначе Сообщить("Коннект был устновлен"); КонецЕсли; СпрЕдиницыОЛЕ = БазаОле.CreateObject("Справочник.Единицы"); СпрОЛЕ = БазаОле.CreateObject("Справочник.Номенклатура"); СпрОЛЕ.ВыбратьЭлементы() ; Спр.ВыбратьЭлементы(); Счетчик = 0; Попытка Пока СпрОЛЕ.ПолучитьЭлемент() = 1 Цикл КодСравнения = СпрОЛЕ.Код; Если Спр.НайтиПоКоду(КодСравнения, 0) = 1 Тогда НайденныйЭлемент = Спр.ТекущийЭлемент(); ИмяВБазе = НайденныйЭлемент.Наименование; ИмяВОле = СпрОЛЕ.Наименование; КодВПереферийн = СпрОЛЕ.Код; КодВБазе = НайденныйЭлемент.Код; //ПометкаудаленияБаза = НайденныйЭлемент.пометкаУдаления; Если (Спр.пометкаУдаления() = 1) и (СпрОле.ПометкаУдаления() = 1) Тогда Сообщить(КодВБазе+""+КодВПереферийн+" Помеченны на удаление"); Иначе Если (КодВБазе = КодВПереферийн) Тогда Если (ИмяВОле = ИмяВБазе)Тогда Сообщить(КодВБазе+" и "+КодВПереферийн+" "+ИмяВБазе+" и "+ИмяВОле); Иначе Спр.НайтиПоКоду(КодВБазе); Если Спр.Выбран() = 1 Тогда СпрЕдиницы.ИспользоватьВладельца(спр.ТекущийЭлемент()); СпрЕдиницы.ВыбратьЭлементы(); Пока СпрЕдиницы.ПолучитьЭлемент() = 1 Цикл НайденныйКод = СпрЕдиницы.ШтрихКод; КонецЦикла; КонецЕсли; Сообщить("Найденный код "+НайденныйКод); СпрОЛЕ.НайтиПоКоду(КодВПереферийн); Если СпрОЛЕ.Выбран()=1 Тогда СпрЕдиницыОЛЕ.ИспользоватьВладельца(СпрОЛЕ.ТекущийЭлемент()); СпрЕдиницыОЛЕ.ВыбратьЭлементы(); Пока СпрЕдиницыОЛЕ.ПолучитьЭлемент()=1 Цикл Если (СпрЕдиницыОЛЕ <> СпрЕдиницы) Тогда Сообщить("Штрих код ОЛЕ "+СпрЕдиницыОЛЕ.ШтрихКод+" Текущий элемент ОЛЕ : " +ИмяВОле+" Штрихкод в Базе : "+НайденныйКод+" Имя в Базе : "+ИмяВБазе); Счетчик = Счетчик + 1; Сообщить(""+Счетчик+" : Расхождение"); Файл.ДобавитьСтроку(КодВБазе+";"+ КодВПереферийн); Сообщить("Найдены элементы : "+КодВПереферийн+", и : "+КодВБазе); Файл.Записать(ИмяФайла); КонецЕсли; КонецЦикла; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; Сообщить("Всего общих кодов :" +Счетчик); КонецЦикла; Исключение Предупреждение( ОписаниеОшибки()); Возврат; КонецПопытки; КонецПроцедуры может нужнно указывать точку выхода из подчиненного справочник, или закрывать его каждый раз? кто сталкивался? |
|||
1
MixanM
16.12.11
✎
06:02
|
картинку вот еще залил, там на скрине видно что код работает нормально, пока не входит в подчиненный справочник : http://zalil.ru/32289790
|
|||
2
Rie
16.12.11
✎
06:12
|
(0) спрОЛЕ.НайтиПоКоду() при возне с единицами сбивает изначальную выборку спрОЛЕ.ВыбратьЭлементы()
|
|||
3
Морозов Александр
16.12.11
✎
06:15
|
(2) да,да.да... если не вникать в код, то проблему можно решить простым созданием второго объекта: СпрОЛЕДляПоискаПоКоду = БазаОле.CreateObject("Справочник.Номенклатура");
|
|||
4
MixanM
16.12.11
✎
06:18
|
(3) т.е повторно создать объект, внутри поиска по подчиненному справочнику, и шарить дальше ?
|
|||
5
MixanM
16.12.11
✎
06:20
|
или перед тем как шарить по подчиненному, и создавать второй объект?
|
|||
6
Морозов Александр
16.12.11
✎
06:22
|
Ну в самом начале процедуры создай объект
СпрОЛЕДляПоискаПоКоду = БазаОле.CreateObject("Справочник.Номенклатура"); и потом в цикле для поиска по коду используй этот объект СпрОЛЕДляПоискаПоКоду.НайтиПоКоду(КодВПереферийн); |
|||
7
Морозов Александр
16.12.11
✎
06:23
|
да и вообще если всю эту байду вынести в отдельную процедурку - будет красивее... наверно
|
|||
8
MixanM
16.12.11
✎
06:29
|
(7) Согласен..наврное, но т.к. надо всего на 1 раз, и так сойдет,
(6) так и сделал, вроде заработал, немного не точно, но это уже мой косяк, уже допилил. |
|||
9
MixanM
16.12.11
✎
11:56
|
вообщем если кому то надо, вот рабочий код: еще раз, это обработка для поиска дублей товара в разных базах + проверка по подчиненным:
Процедура Сформировать() Спр = СоздатьОбъект("Справочник.Номенклатура"); СпрЕдиницы = СоздатьОбъект("Справочник.Единицы"); Файл = СоздатьОбъект("Текст"); ИмяФайла = "c:\rash.txt"; Файл.Открыть(ИмяФайла); БазаОле=СоздатьОбъект("V77.Application"); ПользовательОле = "Admin"; ПарольОле = ""; ЗапускБезЗаставки = 1; Если СЧемЛидер = 1 Тогда РезультатПодключения = БазаОле.Initialize(БазаОле.RMTrade, "/DH:\trade_lider\","NO_SPLASH_SHOW"); КонецЕсли; Если ЛидерОПТ = 1 Тогда РезультатПодключения = БазаОле.Initialize(БазаОле.RMTrade, "/DH:\trade_mag_opt\","NO_SPLASH_SHOW"); КонецЕсли; Если РезультатПодключения = 0 Тогда Сообщить("Не удалось подключится к указанной базе - проверьте вводные!"); Возврат; Иначе Сообщить("Коннект был устновлен"); КонецЕсли; СпрЕдиницыОЛЕ = БазаОле.CreateObject("Справочник.Единицы"); СпрОЛЕ = БазаОле.CreateObject("Справочник.Номенклатура"); СпрОЛЕДляПоискаПоКоду = БазаОле.CreateObject("Справочник.Номенклатура");//создал второй , ибо слетает курсор с первой rulf шарит по единицам СпрОЛЕ.ВыбратьЭлементы() ; Спр.ВыбратьЭлементы(); Счетчик = 0; Попытка Пока СпрОЛЕ.ПолучитьЭлемент() = 1 Цикл КодСравнения = СпрОЛЕ.Код; Если Спр.НайтиПоКоду(КодСравнения, 0) = 1 Тогда НайденныйЭлемент = Спр.ТекущийЭлемент(); ИмяВБазе = НайденныйЭлемент.Наименование; ИмяВОле = СпрОЛЕ.Наименование; КодВПереферийн = СпрОЛЕ.Код; КодВБазе = НайденныйЭлемент.Код; //ПометкаудаленияБаза = НайденныйЭлемент.пометкаУдаления; Если (Спр.пометкаУдаления() = 1) и (СпрОле.ПометкаУдаления() = 1) Тогда //проверяем пометку на удаление Сообщить(КодВБазе+""+КодВПереферийн+" Помеченны на удаление, пропускаем"); Иначе Если (КодВБазе = КодВПереферийн) Тогда //проверяем по коду, если да, тогда... Если (ИмяВОле = ИмяВБазе)Тогда //проверяем по имени, если да тогда ... Сообщить(КодВБазе+" и "+КодВПереферийн+" "+ИмяВБазе+" и "+ИмяВОле); Иначе Спр.НайтиПоКоду(КодВБазе); Если Спр.Выбран() = 1 Тогда СпрЕдиницы.ИспользоватьВладельца(спр.ТекущийЭлемент()); СпрЕдиницы.ВыбратьЭлементы(); Пока СпрЕдиницы.ПолучитьЭлемент() = 1 Цикл НайденныйКод = СпрЕдиницы.ШтрихКод; КонецЦикла;//нашли шттрих код текущей базы КонецЕсли; Сообщить("Найденный код "+НайденныйКод); СпрОЛЕДляПоискаПоКоду.НайтиПоКоду(КодВПереферийн); Если СпрОЛЕДляПоискаПоКоду.Выбран()=1 Тогда СпрЕдиницыОЛЕ.ИспользоватьВладельца(СпрОЛЕ.ТекущийЭлемент()); СпрЕдиницыОЛЕ.ВыбратьЭлементы(); Пока СпрЕдиницыОЛЕ.ПолучитьЭлемент()=1 Цикл //нашли штрихкод в преферийной Если (СпрЕдиницыОЛЕ.ШтрихКод <> НайденныйКод) Тогда //проверяем по штриху коду Счетчик = Счетчик + 1; Сообщить(""+Счетчик+" : Расхождение"); Файл.ДобавитьСтроку("Расхождение по коду : "+КодВБазе+";"+ КодВПереферийн); Сообщить("Найдены элементы : "+КодВПереферийн+", и : "+КодВБазе); Файл.Записать(ИмяФайла); Иначе Счетчик = Счетчик + 1; Файл.ДобавитьСтроку("Расхождение по наименованию, код в Базе :"+КодВБазе+" " +ИмяВБазе+" Код в перефериной :"+ КодВПереферийн+" "+ИмяВОле); Файл.Записать(ИмяФайла); КонецЕсли; КонецЦикла; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; Сообщить("Всего общих кодов :" +Счетчик); КонецЦикла; Исключение Предупреждение( ОписаниеОшибки()); Возврат; КонецПопытки; КонецПроцедуры |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |