|
V82.COMConnector Как получить данные запроса? | ☑ | ||
---|---|---|---|---|
0
dva1c
10.07.12
✎
16:27
|
Пишу обработку, которая вытягивает данные из другой базы.
Получилось следующее: Попытка Открыта = cntr.Connect(СтрокаПодключения); Сообщить(" Подключена!", СтатусСообщения.Информация); Исключение Предупреждение(ОписаниеОшибки()); //"Ошибка открытия информационной базы" Открыта = Ложь; Возврат; КонецПопытки; //Запрос = Новый База.Запрос; Запрос = Открыта.NewObject("Запрос"); Запрос.Текст = " |ВЫБРАТЬ | СУММА(РеализацияТоваровУслуг.СуммаДокумента) КАК СуммаДокумента, | РеализацияТоваровУслуг.Контрагент КАК СпрКонтрагент |ИЗ | Справочник.Контрагенты КАК СпрКонтрагенты | ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг | ПО СпрКонтрагенты.Ссылка = РеализацияТоваровУслуг.Контрагент |ГДЕ | РеализацияТоваровУслуг.ПометкаУдаления = ЛОЖЬ | И РеализацияТоваровУслуг.Дата <= &ДатаКонца | И РеализацияТоваровУслуг.Дата >= &ДатаНачала | И СпрКонтрагенты.Ссылка В ИЕРАРХИИ(&Группа) | |СГРУППИРОВАТЬ ПО | РеализацияТоваровУслуг.Контрагент |"; КлиентСтоловой = Открыта.Справочники.СотрудникиОрганизаций.НайтиПоНаименованию("Сотрудники"); Запрос.УстановитьПараметр("Группа",КлиентСтоловой);//ПредставлениеПолучателя); Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(НачПериода)); Запрос.УстановитьПараметр("ДатаКонца", КонецДня(КонПериода)); //Запрос.УстановитьПараметр("РеализацияГП", Ложь); //Результат = Запрос.Выполнить().Выгрузить(); Selected = Запрос.Execute().Choose(); //СтаршийИндекс = Результат.Количество() - 1; Selected.Next(); Нашел ссылку v8: 8.1 COM Соединение Вопрос: как обойти результат запроса, полученной через OLE? В отладчике пишет: COMОбъект и все... Попытки Get и т.п. не проходят. ЧЯНТД? |
|||
1
Eugene_life
10.07.12
✎
16:30
|
(1) не получай в результате ссылки. Получай Наименование, Код, порядок... все что угодно, но не ссылки.
|
|||
2
Александр Б
10.07.12
✎
16:31
|
(0) так ты получаешь ссылки на объекты в другой базе. Любой объект ссылочного типа в отладчике у тебя будет выглядеть как COMОбъект. А реквизиты примитивного типа (число, строка и проч) будут выглядеть обычным образом.
|
|||
3
Eugene_life
10.07.12
✎
16:31
|
+ (1) В данном случае:
| РеализацияТоваровУслуг.Контрагент.Наименование КАК СпрКонтрагент |
|||
4
acsent
10.07.12
✎
16:32
|
(1) через точку можно потом все остальные реквизиты получить
|
|||
5
dva1c
10.07.12
✎
16:34
|
Спасибо, коллеги!
Кидайте больше, все пригодится! |
|||
6
dva1c
10.07.12
✎
16:34
|
(1) Про ссылки понял.
|
|||
7
Coldboy
10.07.12
✎
16:36
|
Результат запроса, полученный твоим запросом можно обойти примерно так:
Попытка Selected.MoveFirst(); Исключение Selected.Close(); КонецПопытки; // установили указатель типа на первую строчку и далее циклом Пока Selected.EOF()=0 Цикл СуммаДокумента = Selected.Fields("СуммаДокумента").Value; // далее все поля что нужно получаем в обычную ТЗ Selected.MoveNext(); КонецЦикла; |
|||
8
Coldboy
10.07.12
✎
16:36
|
ну как то так
|
|||
9
acsent
10.07.12
✎
16:37
|
(7) зачем ты по английски пишешь7
|
|||
10
andrewks
10.07.12
✎
16:38
|
(6) скажу по-другому: через com-соединение считывай только данные примитивных типов (строка, число, дата).
агрегатный объект ты получить сможешь, но сделать с ним особо ничего не сможешь, окромя как только передавать опять в исходную базу через com |
|||
11
Coldboy
10.07.12
✎
16:39
|
(9) ну с com-соединение я помню работал именно такими командами.
|
|||
12
Defender aka LINN
10.07.12
✎
16:39
|
(7) *молча протягивает пустой коробок*
|
|||
13
Coldboy
10.07.12
✎
16:40
|
а что это значит?
|
|||
14
andrewks
10.07.12
✎
16:42
|
перечитал ещё раз сабж. не понял, в чём проблема
|
|||
15
dva1c
10.07.12
✎
18:19
|
Завтра проверю все, что написали. )
|
|||
16
Йохохо
10.07.12
✎
19:07
|
(13) отсыпь ))))))))))
|
|||
17
dva1c
11.07.12
✎
09:48
|
Продолжаю "ваять" обработку.
Переписал запрос, чтобы не было ссылок. Попытка Connection = cntr.Connect(СтрокаПодключения); Сообщить(" Подключена!", СтатусСообщения.Информация); Исключение Предупреждение(ОписаниеОшибки()); //"Ошибка открытия информационной базы" Открыта = Ложь; Возврат; КонецПопытки; Query = Connection.NewObject("Query"); Query.Text = " |ВЫБРАТЬ | РеализацияТоваровУслуг.Контрагент.Наименование, | СУММА(РеализацияТоваровУслуг.СуммаДокумента) КАК СуммаДокумента |ИЗ | Справочник.Контрагенты КАК СпрКонтрагенты | ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг | ПО СпрКонтрагенты.Наименование = РеализацияТоваровУслуг.Контрагент.Наименование |ГДЕ | СпрКонтрагенты.Ссылка В ИЕРАРХИИ(&Группа) | И РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаКонца | И РеализацияТоваровУслуг.ПометкаУдаления = ЛОЖЬ | |СГРУППИРОВАТЬ ПО | РеализацияТоваровУслуг.Контрагент.Наименование |"; КлиентСтоловой = Connection.Справочники.Контрагенты.НайтиПоНаименованию("Сотрудники"); Query.УстановитьПараметр("Группа",КлиентСтоловой);//ПредставлениеПолучателя); Query.УстановитьПараметр("ДатаНачала", НачалоДня(НачПериода)); Query.УстановитьПараметр("ДатаКонца", КонецДня(КонПериода)); Selected = Query.Execute().Choose(); Чтобы не работать с реальной базой - сделал копию на скуле. Пробую подключить копию (меняю имя базы в строке подключения) и у меня не выходит. Вопрос: что нужно сделать, чтобы подключалась копия базы? Какие параметры установить при подключении? |
|||
18
dva1c
11.07.12
✎
09:54
|
Обход из (7) не работает. Ругается на "EOF()"
Решение по обходу запроса, так и нет. ( |
|||
19
dva1c
11.07.12
✎
09:57
|
andrewks вопрос простой: как обойти результат выполненного запроса?
|
|||
20
Coldboy
11.07.12
✎
09:58
|
(18) вот мой код обработки смотри
рабочей. |
|||
21
Coldboy
11.07.12
✎
09:59
|
Соединение = Новый COMОбъект("ADODB.Connection");
//заполнение текущих настроек подключения ТекСервер = "MY-PK\SQLEXPRESS"; ТекБаза = "store_temp"; //заполнение строки запроса к серверу СтрокаКоннекта ="driver={SQL Server};server="+ТекСервер+";Database="+ТекБаза; Соединение.ConnectionTimeOut = 6000; //попытка соединения Попытка Соединение.Open(СтрокаКоннекта); Исключение Сообщить("Невозможно установить соединение с базой данных MS SQL! " + ОписаниеОшибки()+"!!!"); ЗаписатьВФ("Невозможно установить соединение с базой данных MS SQL! "+ ОписаниеОшибки()); Возврат; КонецПопытки; // запрос к объекту ADO //ЗапросАДО = Новый COMОбъект("ADODB.Command"); //Попытка // ЗапросАДО.ActiveConnection = Соединение; //Исключение // Сообщить("Ошибка при инициализации соединения! " + ОписаниеОшибки()); // ЗаписатьВФ("Ошибка при инициализации соединения! " + ОписаниеОшибки()); // Возврат; //КонецПопытки; //запрос на вывод необходимых данных из таблицы //т.к. АДО не понимает тип данных decimal то на стороне сервера преобразуем данные //с помощью CAST(имя_поля AS новый_тип_данных) AS новое_имя_поля СтрокаЗапроса= "select |GUID, |To1C, |filial, |data, |CAST(Pr_Kom_Sr AS varchar(20)) AS Pr_Kom_Sr, |N_Pr_Kom_Sr, |CAST(Pr_Real AS varchar(20)) AS Pr_Real, |N_Pr_Real, |CAST(Pr_Real_Lombard AS varchar(20)) AS Pr_Real_Lombard, |N_Pr_Real_Lombard, |CAST(Pr_Real_Lombard_Percent AS varchar(20)) AS Pr_Real_Lombard_Percent, |N_Pr_Real_Lombard_Percent, |CAST(Pr_hr_kom AS varchar(20)) AS Pr_hr_kom, |CAST(Pr_Cash AS varchar(20)) AS Pr_Cash, |N_Pr_Cash, |CAST(Pr_Credit AS varchar(20)) AS Pr_Credit, |N_Pr_Credit, |CAST(R_Zad_Kom AS varchar(20)) AS R_Zad_Kom, |CAST(R_Skupka AS varchar(20)) AS R_Skupka, |N_R_Skupka, |CAST(R_Cash AS varchar(20)) AS R_Cash, |N_R_Cash, |CAST(R_Credit AS varchar(20)) AS R_Credit, |N_R_Credit, |CAST(R_Credit_Percent AS varchar(20)) AS R_Credit_Percent, |N_R_Credit_Percent, |CAST(R_Lombard AS varchar(20)) AS R_Lombard, |N_R_Lombard, |CAST(BeginCashRegister AS varchar(20)) AS BeginCashRegister, |CAST(EndCashRegister AS varchar(20)) AS EndCashRegister, |CAST(Pr_Total AS varchar(20)) AS Pr_Total |from dbo.CASH_REPORT |where To1C = 1 |order by data asc"; Попытка Выборка=Соединение.Execute(СтрокаЗапроса); Исключение Сообщить ("Ошибка выполнения запроса к БД: "+ОписаниеОшибки()+"!!!"); ЗаписатьВФ("Ошибка выполнения запроса к БД: "+ОписаниеОшибки()); Возврат; КонецПопытки; СчетчикКол = 0; //выборка из результата запроса Если Выборка.EOF()=-1 Тогда Иначе //установка указателя на первую строку Попытка Выборка.MoveFirst(); Исключение Выборка.Close(); Сообщить ("Ошибка установки указателя на первую строку или записей в базе данных до сегодняшнего дня нет или выгружены "+ОписаниеОшибки()); ЗаписатьВФ("Ошибка установки указателя на первую строку или записей в базе данных до сегодняшнего дня нет или выгружены "+ОписаниеОшибки()); Возврат; КонецПопытки; // Заполненяем данными нашу ТЗ из Выборки с SQL Сервера Пока Выборка.EOF()=0 Цикл Поле = Выборка.Fields; Если НайтиТорговуюТочку(Выборка.Fields("filial").Value) = -1 Тогда //установка указателя на следующую строку Попытка Выборка.MoveNext(); Исключение Выборка.Close(); Сообщить ("Ошибка установки указателя на следующее поле: "+ОписаниеОшибки(),"!!!"); ЗаписатьВФ("Ошибка установки указателя на следующее поле: "+ОписаниеОшибки()); Возврат; КонецПопытки; Продолжить; КонецЕсли; стрТЗ = ТЗ.Добавить(); стрТЗ.НомерИзВне = Выборка.Fields("GUID").Value; стрТЗ.КодФилиала = Выборка.Fields("filial").Value; стрТЗ.НазваниеФилиала = НайтиТорговуюТочку(стрТЗ.КодФилиала).Наименование; стрТЗ.ДатаДанных = Выборка.Fields("data").Value; стрТЗ.РеализацияКомиссия = Число(Выборка.Fields("Pr_Kom_Sr").Value); стрТЗ.РеализацияКомиссияНомер = Число(Выборка.Fields("N_Pr_Kom_Sr").Value); стрТЗ.РеализацияСкупка = Число(Выборка.Fields("Pr_Real").Value); стрТЗ.РеализацияСкупкаНомер = Число(Выборка.Fields("N_Pr_Real").Value); стрТЗ.ВозвратСсудыЛомбарду = Число(Выборка.Fields("Pr_Real_Lombard").Value); стрТЗ.ВозвратСсудыЛомбардуНомер = Число(Выборка.Fields("N_Pr_Real_Lombard").Value); стрТЗ.ПроцентыПоЛомбарду = Число(Выборка.Fields("Pr_Real_Lombard_Percent").Value); стрТЗ.ПроцентыПоЛомбардуНомер = Число(Выборка.Fields("N_Pr_Real_Lombard_Percent").Value); стрТЗ.ХранениеКомиссионногоТовара = Число(Выборка.Fields("Pr_hr_kom").Value); стрТЗ.ХранениеКомиссионногоТовараНомер = 0; стрТЗ.ПолученоИзКассыСобственник = Число(Выборка.Fields("Pr_Cash").Value); стрТЗ.ПолученоИзКассыСобственникНомер = Число(Выборка.Fields("N_Pr_Cash").Value);; стрТЗ.ПринятоЗаймов = Число(Выборка.Fields("Pr_Credit").Value); стрТЗ.ПринятоЗаймовНомер = Число(Выборка.Fields("N_Pr_Credit").Value); стрТЗ.ВыплатаЗадолженностиКомитентам = Число(Выборка.Fields("R_Zad_Kom").Value); стрТЗ.ВыплатаЗадолженностиКомитентамНомер = 0; стрТЗ.Скупка = Число(Выборка.Fields("R_Skupka").Value); стрТЗ.СкупкаНомер = Число(Выборка.Fields("N_R_Skupka").Value); стрТЗ.ПереданоВкассуСобственник = Число(Выборка.Fields("R_Cash").Value); стрТЗ.ПереданоВкассуСобственникНомер = Число(Выборка.Fields("N_R_Cash").Value); стрТЗ.ВыданоЗаймов = Число(Выборка.Fields("R_Credit").Value); стрТЗ.ВыданоЗаймовНомер = Число(Выборка.Fields("N_R_Credit").Value); стрТЗ.ВыданоПроцентовПоЗаймам = Число(Выборка.Fields("R_Credit_Percent").Value); стрТЗ.ВыданоПроцентовПоЗаймамНомер = Число(Выборка.Fields("N_R_Credit_Percent").Value); стрТЗ.ВыданоСсуд = Число(Выборка.Fields("R_Lombard").Value); стрТЗ.ВыданоСсудНомер = Число(Выборка.Fields("N_R_Lombard").Value); стрТЗ.ОстатокН = Число(Выборка.Fields("BeginCashRegister").Value); стрТЗ.ОстатокК = Число(Выборка.Fields("EndCashRegister").Value); стрТЗ.Возврат = стрТЗ.ОстатокК - стрТЗ.ОстатокН - Число(Выборка.Fields("Pr_Total").Value); //запрос изменения в таблице cash_report параметра To1C на 1 СтрокаЗапроса1="update dbo.CASH_REPORT set To1C = 0 where GUID = '" + стрТЗ.НомерИзВне+ "'"; //выполнение запроса Попытка Выборка1 = Соединение.Execute(СтрокаЗапроса1); Исключение Сообщить ("Ошибка обновления данных на сервере БД: "+ОписаниеОшибки(),"!!!"); ЗаписатьВФ("Ошибка обновления данных на сервере БД: "+ОписаниеОшибки()); Возврат; КонецПопытки; //установка указателя на следующую строку Попытка Выборка.MoveNext(); Исключение Выборка.Close(); Сообщить ("Ошибка установки указателя на следующее поле: "+ОписаниеОшибки()+"!!!"); ЗаписатьВФ("Ошибка установки указателя на следующее поле: "+ОписаниеОшибки()); Возврат; КонецПопытки; КонецЦикла; КонецЕсли; |
|||
22
dva1c
11.07.12
✎
09:59
|
(20) Дак, я и смотрю. Почему ругается на Пока Selected.EOF()=0 Цикл
|
|||
23
dva1c
11.07.12
✎
10:00
|
(21) Спасибо! Пробую.
|
|||
24
dva1c
11.07.12
✎
10:53
|
Работающий обход результата запроса, выглядит так:
Selected = Query.Execute().Choose(); //.Choose() Пока Selected.Next() Цикл СуммаДокумента = Selected.СуммаДокумента; Контрагент = Selected.КонтрагентDescription; Сообщить(Контрагент + " =" + СуммаДокумента); // далее все поля что нужно получаем в обычную ТЗ КонецЦикла; Coldboy твоя помощь пригодилась, но пригодилась в плане обдумывания. Смотри какой короткий обход получился. Почему-то пришлось писать на английском? На русском на методы идет "ругань" ) Для меня, пока, осталось это загадкой. ) |
|||
25
Галахад
гуру
11.07.12
✎
10:58
|
(24) Наверное 8-ка старая.
|
|||
26
Coldboy
11.07.12
✎
11:03
|
(24) все очень просто com-соедениние, тока англ команды воспринимает, как HTML и тд. код короткий не спорю, тот я писал по статье. незачто.
|
|||
27
Defender aka LINN
11.07.12
✎
11:10
|
(26) "com-соедениние, тока англ команды воспринимает" - выкинь свою 1С на свалку. И больше не кури.
|
|||
28
Галахад
гуру
11.07.12
✎
11:10
|
(26) Неа. По COM и русскоязычные команды нормально работают.
|
|||
29
dva1c
11.07.12
✎
11:21
|
(25) Если 8.2.15.318 - старая, то я граф Калиостро ))
|
|||
30
dva1c
11.07.12
✎
11:22
|
(28) Я не вру. Пишу по русски - ошибка. Пишу на английском - все гуд!
|
|||
31
Галахад
гуру
11.07.12
✎
11:23
|
(30) Показывай код.
|
|||
32
dva1c
11.07.12
✎
11:24
|
(26) Спасибо, еще раз! Ты дал шанс все продумать, более основательно.
|
|||
33
dva1c
11.07.12
✎
11:25
|
(31) Да код переписан. Спорить не будем. Я мог ошибаться. )
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |