Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) Подключение из DBF-базы к SQL-базе (число прочтений - 7147 )
vivm
Full Member
***
Отсутствует



Сообщений: 159
Местоположение: Новосибирск
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Подключение из DBF-базы к SQL-базе
12. Февраля 2007 :: 10:20
Печать  
имеется запрос:

[code]База = СоздатьОбъект("ODBCDatabase");
СтрокаПодкл = "driver={SQL Server};server=Wizard;uid=sa;pwd=***;database=Fland1";
Если База.Соединение(СтрокаПодкл)=1 Тогда
     
     рс = СоздатьОбъект("ODBCRecordset");
     //Сообщить("соединение - "+База.ЕстьСоединение());
     рс.УстБД(База);
     //рс.Отладка(1);
     ТекстЗапроса = "
     |SELECT
     |  Заказ.IDDOC ИДЗаказ
     | , $ОстаткиПродукцииИтоги.ТМЦ ИдПродукция
     | , $Заказ.НаименованиеПродукции НаименованиеПродукции
     | , Sum($ОстаткиПродукцииИтоги.Сумма) СуммаСумма
     | , Sum($ОстаткиПродукцииИтоги.Количество) СуммаКоличество
     |FROM $РегистрИтоги.ОстаткиПродукции AS ОстаткиПродукцииИтоги With (NOLOCK)
     |INNER JOIN $Справочник.МестаХранения AS Склад With (NOLOCK) ON $ОстаткиПродукцииИтоги.Склад = Склад.ID
     |INNER JOIN $Документ.Заказ AS Заказ With (NOLOCK) ON $ОстаткиПродукцииИтоги.Заказ = Заказ.IDDOC
     |WHERE
     | (ОстаткиПродукцииИтоги.PERIOD = (Select max(period) from $РегистрИтоги.ОстаткиПродукции))
     | AND ($ОстаткиПродукцииИтоги.Количество > 0)
     | AND (Склад.CODE = :КодСклада)
     |GROUP BY
     | $ОстаткиПродукцииИтоги.ТМЦ
     | , Заказ.IDDOC
     | , $Заказ.НаименованиеПродукции
     |";
     рс.УстановитьТекстовыйПараметр("КодСклада", "c0079");
     тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
     тз.ВыбратьСтроку();
КонецЕсли;[/code]

Подключаюсь к SQL-базе. Если выполнить запрос из SQL-ой базы, работает, если из DBF-ой базы, выдает ошибку: Meta name parser error: объект не найден "$РегистрИтоги.ОстаткиПродукции"

Где рыть?
  
Наверх
ICQ  
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Подключение из DBF-базы к SQL-базе
Ответ #1 - 12. Февраля 2007 :: 10:36
Печать  
в базе, в которой создан объект База = СоздатьОбъект("ODBCDatabase"); есть регистр ОстаткиПродукции?
  
Наверх
 
IP записан
 
vivm
Full Member
***
Отсутствует



Сообщений: 159
Местоположение: Новосибирск
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Подключение из DBF-базы к SQL-базе
Ответ #2 - 12. Февраля 2007 :: 10:39
Печать  
DrACe писал(а) 12. Февраля 2007 :: 10:36:
в базе, в которой создан объект База = СоздатьОбъект("ODBCDatabase"); есть регистр ОстаткиПродукции?


обращение идет к одной и той же базе, но из баз разного типа
  
Наверх
ICQ  
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Подключение из DBF-базы к SQL-базе
Ответ #3 - 12. Февраля 2007 :: 10:40
Печать  
[quote author=vivm link=1171275653/0#0 date=1171275653]Подключаюсь к SQL-базе. Если выполнить запрос из SQL-ой базы, работает, если из DBF-ой базы, выдает ошибку: Meta name parser error: объект не найден "$РегистрИтоги.ОстаткиПродукции"

Где рыть?
[/quote]
нужно еще как бы к тому SQL-ному МД-шнику подключиться, а то как бы ты к базе подключился, а метаимена парсер берет из текущей DBF-базы, а это не есть хорошо...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
val
Full Member
***
Отсутствует


Дорогу осиливает идущий

Сообщений: 137
Зарегистрирован: 07. Июля 2006
Re: Подключение из DBF-базы к SQL-базе
Ответ #4 - 12. Февраля 2007 :: 11:00
Печать  
(0)
     мДата=СоздатьОбъект("MetaDataWork");
     мДата.ПрисоединитьМД(Путь+"1Cv7.MD");
     Database=СоздатьОбъект("ODBCDatabase");
     Database.ПрисоединитьИБ(Путь);
     глRecordSet=СоздатьОбъект("ODBCRecordSet");
     глRecordSet.УстБД(Database);
  
Наверх
 
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Подключение из DBF-базы к SQL-базе
Ответ #5 - 12. Февраля 2007 :: 11:09
Печать  
val писал(а) 12. Февраля 2007 :: 11:00:
(0)
     мДата=СоздатьОбъект("MetaDataWork");
     мДата.ПрисоединитьМД(Путь+"1Cv7.MD");
     Database=СоздатьОбъект("ODBCDatabase");
     Database.ПрисоединитьИБ(Путь);
     глRecordSet=СоздатьОбъект("ODBCRecordSet");
     глRecordSet.УстБД(Database);

у тебя объект мДата=СоздатьОбъект("MetaDataWork"); присоединен к внешней базе, а вот глRecordSet=СоздатьОбъект("ODBCRecordSet"); (точнее его парсер) подключен к текущей базе

используй в запросе пропарсенный текст запроса, полчив его методом

мДата.ОбрМетаСКЛ()
  
Наверх
 
IP записан
 
vivm
Full Member
***
Отсутствует



Сообщений: 159
Местоположение: Новосибирск
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Подключение из DBF-базы к SQL-базе
Ответ #6 - 12. Февраля 2007 :: 11:33
Печать  
Спасибо за участие  Улыбка . Смысл понял. Буду пробовать.

  
Наверх
ICQ  
IP записан
 
val
Full Member
***
Отсутствует


Дорогу осиливает идущий

Сообщений: 137
Зарегистрирован: 07. Июля 2006
Re: Подключение из DBF-базы к SQL-базе
Ответ #7 - 12. Февраля 2007 :: 11:39
Печать  
(5) "а вот глRecordSet=СоздатьОбъект("ODBCRecordSet"); (точнее его парсер) подключен к текущей базе "

Не совсем правильно. Точнее, совсем неправильно. Улыбка
Кусок кода, который я привел - как раз подключение к SQL базе из DBF базы. Базы с совершенно разными конфигурациями. Все работает уже несколько месяцев.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Подключение из DBF-базы к SQL-базе
Ответ #8 - 12. Февраля 2007 :: 11:44
Печать  
DrACe писал(а) 12. Февраля 2007 :: 11:09:
val писал(а) 12. Февраля 2007 :: 11:00:
(0)
     мДата=СоздатьОбъект("MetaDataWork");
     мДата.ПрисоединитьМД(Путь+"1Cv7.MD");
     Database=СоздатьОбъект("ODBCDatabase");
     Database.ПрисоединитьИБ(Путь);
     глRecordSet=СоздатьОбъект("ODBCRecordSet");
     глRecordSet.УстБД(Database);

у тебя объект мДата=СоздатьОбъект("MetaDataWork"); присоединен к внешней базе, а вот глRecordSet=СоздатьОбъект("ODBCRecordSet"); (точнее его парсер) подключен к текущей базе

используй в запросе пропарсенный текст запроса, полчив его методом

мДата.ОбрМетаСКЛ()
никаких ОбрМетаСКЛ в данном случае не нужно. При установке базы присоединенной к другой ИБ (Database.ПрисоединитьИБ(Путь)) в глRecordSet.УстБД(Database), парсер рекордсета автоматически подключается к "другому" МД-шнику.

ps а вот ПрисоединитьМД в этом примере - лишнее
  

1&&2&&3
Наверх
 
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Подключение из DBF-базы к SQL-базе
Ответ #9 - 12. Февраля 2007 :: 11:45
Печать  
val писал(а) 12. Февраля 2007 :: 11:39:
(5) "а вот глRecordSet=СоздатьОбъект("ODBCRecordSet"); (точнее его парсер) подключен к текущей базе "

Не совсем правильно. Точнее, совсем неправильно. Улыбка
Кусок кода, который я привел - как раз подключение к SQL базе из DBF базы. Базы с совершенно разными конфигурациями. Все работает уже несколько месяцев.

минус два мне...  Со сжатыми губами
  
Наверх
 
IP записан
 
vivm
Full Member
***
Отсутствует



Сообщений: 159
Местоположение: Новосибирск
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Подключение из DBF-базы к SQL-базе
Ответ #10 - 12. Февраля 2007 :: 11:50
Печать  
trad писал(а) 12. Февраля 2007 :: 11:44:
никаких ОбрМетаСКЛ в данном случае не нужно. При установке базы присоединенной к другой ИБ (Database.ПрисоединитьИБ(Путь)) в глRecordSet.УстБД(Database), парсер рекордсета автоматически подключается к "другому" МД-шнику.

ps а вот ПрисоединитьМД в этом примере - лишнее


Ну а почему запрос из (0) не работает из DBF-ной базы? МД-шник SQL-ой аналогичен МД-шнику из подключаемой базы, а DBF-ой как раз отличается сильно.
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Подключение из DBF-базы к SQL-базе
Ответ #11 - 12. Февраля 2007 :: 11:58
Печать  
vivm писал(а) 12. Февраля 2007 :: 11:50:
Ну а почему запрос из (0) не работает из DBF-ной базы? МД-шник SQL-ой аналогичен МД-шнику из подключаемой базы, а DBF-ой как раз отличается сильно.

Потому, что объект ODBCDatabase никто не присоединял к ИБ
  

1&&2&&3
Наверх
 
IP записан
 
vivm
Full Member
***
Отсутствует



Сообщений: 159
Местоположение: Новосибирск
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Подключение из DBF-базы к SQL-базе
Ответ #12 - 12. Февраля 2007 :: 12:27
Печать  
trad писал(а) 12. Февраля 2007 :: 11:58:
vivm писал(а) 12. Февраля 2007 :: 11:50:
Ну а почему запрос из (0) не работает из DBF-ной базы? МД-шник SQL-ой аналогичен МД-шнику из подключаемой базы, а DBF-ой как раз отличается сильно.

Потому, что объект ODBCDatabase никто не присоединял к ИБ


Понятно. Присоединил, начались тормоза. Открывает результат через секунд 15. Запрос из (0) из SQL-ой базы отрабатывал мгновенно.
  
Наверх
ICQ  
IP записан
 
vivm
Full Member
***
Отсутствует



Сообщений: 159
Местоположение: Новосибирск
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Подключение из DBF-базы к SQL-базе
Ответ #13 - 12. Февраля 2007 :: 12:42
Печать  
Попробовал подключиться с того же сервера через локальный путь, а не сетевой. Стало терпимо - пару секунд. Пожалуй можно на этом остановиться.
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Подключение из DBF-базы к SQL-базе
Ответ #14 - 12. Февраля 2007 :: 12:44
Печать  
vivm писал(а) 12. Февраля 2007 :: 12:27:
Понятно. Присоединил, начались тормоза. Открывает результат через секунд 15. Запрос из (0) из SQL-ой базы отрабатывал мгновенно.

Время выполнение запроса измениться не должно. Некоторое время должно потратиться на загрузку метаданных.
  

1&&2&&3
Наверх
 
IP записан
 
vivm
Full Member
***
Отсутствует



Сообщений: 159
Местоположение: Новосибирск
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Подключение из DBF-базы к SQL-базе
Ответ #15 - 12. Февраля 2007 :: 13:07
Печать  
Получился такой запрос:

Код
Выбрать все
База = СоздатьОбъект("ODBCDatabase");
СтрокаПодкл = "driver={SQL Server};server=Wizard;uid=sa;pwd=*;database=Fland1";
База.ПрисоединитьИБ("D:Database\Fland1\","Админ","***",СтрокаПодкл);
//База.ПрисоединитьИБ("\\Dragon\Fland1\","Админ","***",СтрокаПодкл);

рс = СоздатьОбъект("ODBCRecordset");
рс.УстБД(База);
ТекстЗапроса = "-- qryMaker:Отчет1.2007.02.10.17.19.40
|SELECT
| Заказ.IDDOC ИДЗаказ
| , $ОстаткиПродукцииИтоги.ТМЦ ИдПродукция
| , $Заказ.НаименованиеПродукции НаименованиеПродукции
| , Sum($ОстаткиПродукцииИтоги.Сумма) СуммаСумма
| , Sum($ОстаткиПродукцииИтоги.Количество) СуммаКоличество
|FROM $РегистрИтоги.ОстаткиПродукции AS ОстаткиПродукцииИтоги With (NOLOCK)
| INNER JOIN $Справочник.МестаХранения AS Склад With (NOLOCK) ON $ОстаткиПродукцииИтоги.Склад = Склад.ID
| INNER JOIN $Документ.Заказ AS Заказ With (NOLOCK) ON $ОстаткиПродукцииИтоги.Заказ = Заказ.IDDOC
|WHERE
| (ОстаткиПродукцииИтоги.PERIOD = (Select max(period) from $РегистрИтоги.ОстаткиПродукции))
| AND ($ОстаткиПродукцииИтоги.Количество > 0)
| AND (Склад.CODE = :КодСклада)
|GROUP BY
| $ОстаткиПродукцииИтоги.ТМЦ
| , Заказ.IDDOC
| , $Заказ.НаименованиеПродукции
|";
рс.УстановитьТекстовыйПараметр("КодСклада", "c0079");
тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
тз.ВыбратьСтроку(); 



При подключении через сетевой путь время запроса увеличивается в 10 раз за счет База.ПрисоединитьИБ();

Есть смысл пробовать другие варианты (через ОбрМетаСКЛ())?
  
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Подключение из DBF-базы к SQL-базе
Ответ #16 - 12. Февраля 2007 :: 13:17
Печать  
Ниасилел
В общем тестируй запрос в родной его базе
Когда он будет рабочим - добавь пару строк: 
Код
Выбрать все
ИБОЛЕ = СоздатьОбъект("ODBCDataBase");
ИБОЛЕ.ПрисоединитьИБ(ПутьКИсточнику, "Робот_ОЛЕ", "*****");

RecordSetOLE = СоздатьОбъект("ODBCRecordSet");
RecordSetOLE.УстБД(ИБОЛЕ);
 


Не замечал что время вырастает значительно, даже если каждый раз конннект делать
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
vivm
Full Member
***
Отсутствует



Сообщений: 159
Местоположение: Новосибирск
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Подключение из DBF-базы к SQL-базе
Ответ #17 - 13. Февраля 2007 :: 03:19
Печать  
В общем сделал для себя следующие практические выводы:
Если критично быстродействие, делаем так:

Если требуется подключиться с локальной базе, можно при открытии отчета подключиться База.ПрисоединитьИБ() (задержка секунда не критична).

Если подключаемся через сетевой путь, отлаживаем запрос в исходной базе, получаем SQL-ый текст запроса через рс.Отладка(1), исходный текст запроса комментируем и вместо него вставляем SQL-ый и наслаждаемся быстродействием.

Всвязи с этим хорошо бы добавить режим рс.Отладка(2) для рекордсета, что бы текст запроса выдавал сразу с символами "|".

  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать