Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) Запрос в чужой базе + синхронизация (число прочтений - 13262 )
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Запрос в чужой базе + синхронизация
22. Июня 2007 :: 07:37
Печать  
Как лучше сделать такое?
Запрос к чужой базе - получаю таблицу с кодами элементов справочников
В базе из которой происходит запрос эти коды синхронизированы с имеющимися элементами
Т.е. как бы сделать лучше чтобы не искать каждый элемент по коду?
Думал временную таблицу создавать, но она же будет у меня опять же в чужой базе...
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос в чужой базе + синхронизация
Ответ #1 - 22. Июня 2007 :: 08:08
Печать  
В одном запросе можно получать данные из разных баз и из разных серверов. В чём проблема то?
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Запрос в чужой базе + синхронизация
Ответ #2 - 22. Июня 2007 :: 08:42
Печать  
угу  Подмигивание
но я ж туплю
моно примерчик

Вот типо как сейчас:

     ИБ = СоздатьОбъект("ODBCDataBase");
     ИБ.ПрисоединитьИБ(ПутьКИсточнику, "Вадим", "");
     
     Запрос = СоздатьОбъект("ODBCRecordSet");
    Запрос.УстБД(ИБ);
     
     ТекстЗапроса = "
     |CREATE TABLE #tablrozn (DateDoc datetime, Tov char(9), Par char(9), Skl char(9), Kol numeric(15,3), Sum numeric(15,0), KO char(9))
     |INSERT INTO #tablrozn      
     |SELECT CAST(LEFT((Жур.Date_Time_IDDoc),8) as DateTime)
     |      , $Партии.Товар
     |      , $Партии.Партия
     |      , $Партии.Склад
     |      , $Партии.Количество
     |      , $Партии.СуммаРозн
     |      , $Партии.КодОперации
     |FROM $Регистр.Партии AS Партии WITH (NOLOCK)
     |INNER JOIN _1SJOURN AS Жур ON Жур.IDDOC = Партии.IDDOC
     |WHERE Партии.IDDOC IN (
     |SELECT DISTINCT OBJID from _1SUPDTS WITH (NOLOCK))
     |";
  

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


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Запрос в чужой базе + синхронизация
Ответ #3 - 22. Июня 2007 :: 08:44
Печать  
Как временную таблицу поместить не в присоединенную базу а в родную?
Оно с 1cpp уживется? Потом надо уже в родной типизировать
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос в чужой базе + синхронизация
Ответ #4 - 22. Июня 2007 :: 08:54
Печать  
А. Ты хочешь и рыбку съесть, и метапарсер заюзать.  Смех
global temporary tables - не вариант? Или view вместо временной таблицы..
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос в чужой базе + синхронизация
Ответ #5 - 22. Июня 2007 :: 09:02
Печать  
Хотя, если это УРИБ, можно и без ПрисоединитьИБ. Что-то вроде
Код
Выбрать все
select *
from [linkedservername.]dbname.dbo.$Регистр.Партии AS Партии 

  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Запрос в чужой базе + синхронизация
Ответ #6 - 22. Июня 2007 :: 09:05
Печать  
Спасибки
Физически это на одном сервере (центр. УРБД база и мега-база-приемник)
Попозже буду пробовать
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Запрос в чужой базе + синхронизация
Ответ #7 - 22. Июня 2007 :: 10:52
Печать  
berezdetsky писал(а) 22. Июня 2007 :: 08:08:
В одном запросе можно получать данные из разных баз и из разных серверов. В чём проблема то?


А нельзя ли простой пример -
соединение таблиц "Номенклатура" по полю "Код" в одном запросе из  База1 и База2 ?
Вторую таблицу - можно ли через $ как то указать, если ДБФ и не УРБД  ?
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Запрос в чужой базе + синхронизация
Ответ #8 - 22. Июня 2007 :: 11:34
Печать  
К сожалению метапарсер не работает
Там где каменты - не работает  Озадачен

|      , Партии.SP9732 Товар
//|      , $Партии.Партия
....
//|FROM TestBaseRozn.dbo.$Регистр.Партии AS Партии WITH (NOLOCK)
|FROM TestBaseRozn.dbo.RA9731 AS Партии WITH (NOLOCK)
  

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


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Запрос в чужой базе + синхронизация
Ответ #9 - 22. Июня 2007 :: 11:39
Печать  
Блин я ведь уже выложил пример на Т1С
вот:
Текст="
 |select
 |$Товары.IDD as IDD,
 |sum(Tab.Остаток) as Остаток,
 |sum(Tab.РасходКво) as Кво,
 |sum(Tab.РасходСумма) as Сумма
 |from
 |(select
 |r.товар as Товар,
 |r.ОстатокТовараОстаток as Остаток,
 |0 РасходКво,
 |0 РасходСумма
 |from $РегистрОстатки.ОстаткиТоваров(:ВыбДата,
 | inner join $Справочник.МестаХранения СКЛ on СКЛ.id=Склад,
 | Фирма "+?(ВыбФирма.Выбран()=0,"=","<>")+" $ПустойИД and $СКЛ.IDD = :ВыбСклад,
 | (Склад,Товар,Фирма),
 | ОстатокТовара
 |) as r
 |
 |union all
 |
 |select
 |o.товар as Товар,
 |0 Остаток,
 |o.РасходКвоОборот as РасходКво,
 |o.РасходСумОборот as РасходСумма
 |from $РегистрОбороты.Обороты(:НачДата,:ВыбДата~,,
 | inner join $Справочник.МестаХранения СКЛ on СКЛ.id=right(ДопИзмерение1,9),
 | Фирма "+?(ВыбФирма.Выбран()=0,"=","<>")+"$ПустойИД and $СКЛ.IDD = :ВыбСто,
 | (ДопИзмерение1,Товар,Фирма),
 | (РасходКво,РасходСум)) as o
 |) as Tab
 |inner join $Справочник.ТМЦ as Товары on Товары.id=Tab.Товар
 |group by
 |$Товары.IDD
 |having (sum(Tab.Остаток))<0
 |";
     Запрос.УстановитьТекстовыйПараметр("ВыбДата",ВыбДата);
     Запрос.УстановитьТекстовыйПараметр("НачДата",НачДата);
     Запрос.УстановитьТекстовыйПараметр("ВыбФирма",ВыбФирма.IDD);
     Запрос.УстановитьТекстовыйПараметр("ВыбСклад",ВыбСклад.IDD);
     Запрос.УстановитьТекстовыйПараметр("ВыбСто",ВыбСто.IDD);
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Запрос в чужой базе + синхронизация
Ответ #10 - 22. Июня 2007 :: 11:43
Печать  
В принципе вот так тоже получаетсо
CREATE TABLE TestBaseTorg.dbo.tablrozn

Валера, ну туплю я что-то где обращение ко ВТОРОЙ базе у тебя?  Смущённый
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос в чужой базе + синхронизация
Ответ #11 - 22. Июня 2007 :: 11:54
Печать  
Цитата:
К сожалению метапарсер не работает
Там где каменты - не работает  Озадачен

Хм.. У меня работает (один сервер, базы в УРИБ, 1С++ 1.8.1.6).
Покажи весь запрос и сообщение об ошибке.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Запрос в чужой базе + синхронизация
Ответ #12 - 22. Июня 2007 :: 12:30
Печать  
Ну вот упростим
Есть база TestBaseRozn, запрос выполняется из базы TestBaseTorg
Никаких ИБ не присоединяю, используется родное соединение
Упрощенный текст:
|SELECT $Партии.Партия
|FROM TestBaseRozn.dbo.$Регистр.Партии AS Партии WITH (NOLOCK)
Ошибка:
Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
{D:\DB77\IFMTESTTORGSQL\EXTFORMS\ОТЧЕТ1.ERT(56)}: Meta name parser error: объект не найден "$Регистр.Партии"
  

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


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Запрос в чужой базе + синхронизация
Ответ #13 - 22. Июня 2007 :: 12:32
Печать  
Версия 2.0.3.4 (ночная сборка, вчера днем взял т.к. забыл дома)
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос в чужой базе + синхронизация
Ответ #14 - 22. Июня 2007 :: 13:29
Печать  
Цитата:
Ну вот упростим
Есть база TestBaseRozn, запрос выполняется из базы TestBaseTorg
Никаких ИБ не присоединяю, используется родное соединение
Упрощенный текст:
|SELECT $Партии.Партия
|FROM TestBaseRozn.dbo.$Регистр.Партии AS Партии WITH (NOLOCK)
Ошибка:
Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
{D:\DB77\IFMTESTTORGSQL\EXTFORMS\ОТЧЕТ1.ERT(56)}: Meta name parser error: объект не найден "$Регистр.Партии"

т.е. в конфигурации, привязанной к базе TestBaseRozn, не определён Регистр.Партии. Они точно в одной РИБ? .md одинаковые? Запрос
|SELECT $Партии.Партия
|FROM $Регистр.Партии AS Партии WITH (NOLOCK)
в той же базе работает?

P.S. На скриншоте базы - даже не в одной РИБ. Просто потомки одной типовой. Здесь - 2.0.3.3.
  

1cqa.PNG ( 6 KB | Загрузки )
1cqa.PNG

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Запрос в чужой базе + синхронизация
Ответ #15 - 22. Июня 2007 :: 13:30
Печать  
kiruha, оть:

     |SELECT CAST(LEFT((ЖурРозн.Date_Time_IDDoc),8) as DateTime)
     |      , Номенклатура.ID [Номенклатура $Справочник.Номенклатура]
     |FROM TestBaseRozn.dbo.RA9731 AS ПартииРозн WITH (NOLOCK)
     |INNER JOIN TestBaseRozn.dbo._1SJOURN AS ЖурРозн ON ЖурРозн.IDDOC = ПартииРозн.IDDOC
     |LEFT OUTER JOIN TestBaseRozn.dbo.SC656 AS НоменклатураРозн ON ПартииРозн.SP9732 = НоменклатураРозн.ID
     |LEFT OUTER JOIN $Справочник.Номенклатура AS Номенклатура ON RIGHT(НоменклатураРозн.CODE, 5) = Номенклатура.CODE
     |WHERE ПартииРозн.IDDOC IN (
     |SELECT DISTINCT OBJID from TestBaseRozn.dbo._1SUPDTS WITH (NOLOCK))
     |";

Райт использован т.к. длина кода не совпадает ешкин кот, ну остальное по аналогии  Подмигивание
berezdetsky, спасибо за наводки, ступил!
  

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


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Запрос в чужой базе + синхронизация
Ответ #16 - 22. Июня 2007 :: 13:32
Печать  
berezdetsky писал(а) 22. Июня 2007 :: 13:29:
не определён Регистр.Партии. Они точно в одной РИБ? .md одинаковые? Запрос


МД разные. И они не в одной УРБД! База-получатель вообще не имеет отношения к УРБД
В общем так как выше написал поборол
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Запрос в чужой базе + синхронизация
Ответ #17 - 10. Июля 2007 :: 08:32
Печать  
Цитата:
kiruha, оть:

     |SELECT CAST(LEFT((ЖурРозн.Date_Time_IDDoc),8) as DateTime)
     |      , Номенклатура.ID [Номенклатура $Справочник.Номенклатура]
     |FROM TestBaseRozn.dbo.RA9731 AS ПартииРозн WITH (NOLOCK)
     |INNER JOIN TestBaseRozn.dbo._1SJOURN AS ЖурРозн ON ЖурРозн.IDDOC = ПартииРозн.IDDOC
     |LEFT OUTER JOIN TestBaseRozn.dbo.SC656 AS НоменклатураРозн ON ПартииРозн.SP9732 = НоменклатураРозн.ID
     |LEFT OUTER JOIN $Справочник.Номенклатура AS Номенклатура ON RIGHT(НоменклатураРозн.CODE, 5) = Номенклатура.CODE
     |WHERE ПартииРозн.IDDOC IN (
     |SELECT DISTINCT OBJID from TestBaseRozn.dbo._1SUPDTS WITH (NOLOCK))
     |";

Райт использован т.к. длина кода не совпадает ешкин кот, ну остальное по аналогии  Подмигивание
berezdetsky, спасибо за наводки, ступил!



Так и не понял. Как использовать МЕТАПАРСЕР.
Явно указывать таблицы типа SP9732 можно было и так.
Для этого 1С++ не нужен.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Запрос в чужой базе + синхронизация
Ответ #18 - 10. Июля 2007 :: 12:06
Печать  
Вообщем пока интересней - строковая замена в запросе (для ДБФ, не УРБД) :
Код
Выбрать все
Функция глПарсерВторойБазы(ТекстЗапроса,ПутьКБазе2,ИмяБазы2="База2")
//1. Для идентичных
   ТекстЗапроса=СтрЗаменить(ТекстЗапроса,ИмяБазы2+".",ПутьКБазе2) ;
 //2. Для уникальных реквизитов и спр. второй базы
 //........
КонецФункции

Процедура Сформировать()
    ОлеДБКоманда = глОлеДБ.СоздатьКоманду();
	ПутьКБазе2= "C:\МояВтораяБаза\";// Указываем путь, в конце слэш не забываем
	ТекстЗапроса = "
	|SELECT
	|	$Спр.Артикул as Артикул,
	|	$Спр2.Артикул as Артикул2,
	|	Спр.Descr as Наименование,
	|	Спр2.Descr as Наименование2
	|FROM
	|	$Справочник.Номенклатура as Спр
	|
	|LEFT JOIN	База2.$Справочник.Номенклатура as Спр2  ON Спр2.Code=Спр.Code
	|";
    глПарсерВторойБазы(ТекстЗапроса,ПутьКБазе2,"База2");
    ТЗ = ОлеДБКоманда.ВыполнитьИнструкцию(ТекстЗапроса);
КонецПроцедуры
 



Не нужно дополнительных подключений,временных таблиц и можно использовать стандартные имена таблиц и реквизитов  .
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Запрос в чужой базе + синхронизация
Ответ #19 - 10. Июля 2007 :: 15:23
Печать  
Последний вариант (для ДБФ) .
Можно использовать неидентичные базы,
возможно несовпадение название полей и наличие новых реквизитов в разных базах.

Правило применения - Запрос составляется стандартно,
но при обращении ко второй базе вместо "$" используется "@"
Код
Выбрать все
Функция глПарсерВторойБазы(ТекстЗапроса,ИмяБазы2,ПутьКБазе2)
	  глМД = СоздатьОбъект("MetaDataWork");
	ТекстЗапроса=глМД.ОбрМетаСКЛ(ТекстЗапроса);

	глМД2 = СоздатьОбъект("MetaDataWork");
	глМД2.ПрисоединитьМД(ПутьКБазе2+"1Cv7.md");

	ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"@","$");
	ТекстЗапроса=СтрЗаменить(ТекстЗапроса,ИмяБазы2+".",ПутьКБазе2) ;
	ТекстЗапроса=глМД2.ОбрМетаСКЛ(ТекстЗапроса);

	  Возврат 0
КонецФункции

Процедура Сформировать()
	  ОлеДБКоманда = глОлеДБ.СоздатьКоманду();
	ПутьКБазе2= "C:\МояВтораяБаза\";// Указываем путь, в конце слэш не забываем
	ТекстЗапроса = "
	|SELECT
	|	$Спр.Артикул as Артикул,
	|	@Спр2.Артикул_no as Артикул2,
	|	@Спр2.новыйВБазе as новыйВБазе, /* комментарий : это уникальный реквизит второй базы */
	|	Спр.Descr as Наименование,
	|	Спр2.Descr as Наименование2
	|FROM
	|	$Справочник.Номенклатура as Спр
	|
	|LEFT JOIN	База2.@Справочник.Номенклатура as Спр2  ON Спр2.Code=Спр.Code
	|";

	  глПарсерВторойБазы(ТекстЗапроса,"База2",ПутьКБазе2);

	ТЗ = ОлеДБКоманда.ВыполнитьИнструкцию(ТекстЗапроса);

КонецПроцедуры 


Протестировано.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Запрос в чужой базе + синхронизация
Ответ #20 - 11. Июля 2007 :: 21:12
Печать  
Молодец! Осталось теперь обдумать типизацию Улыбка
У меня другая задача была - соотнести разные перечисления (возможно и один ко многим)
В общем я отлучался в отпуск, но сделал с помощью временной таблицы
  

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


I Love YaBB 2!

Сообщений: 150
Зарегистрирован: 26. Апреля 2007
Пол: Мужской
Re: Запрос в чужой базе + синхронизация
Ответ #21 - 12. Июля 2007 :: 11:29
Печать  
Помогите разобраться с запросами. Есть две базы данных. Мне надо из одной базы данных по нажатию кнопки чтобы открылся справочник другой базы данных. это вообще реально или мне придеться создавать свой справочник и каждый записи туда "вбивать" значения... И вообще как получить все наименование другого справочника?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать