Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Не вытаскивает данные из второй базы (число прочтений - 8214 )
jj
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 09. Октября 2009
Не вытаскивает данные из второй базы
09. Октября 2009 :: 10:39
Печать  
Добрый день!

SQL сервер 2005, 1С++ v.3.0.1.23

На одном сервере находятся две базы "База1" и "База2". Из Базы1 запускаю обработку с кодом

[code]BD = CreateObject("ODBCDatabase");
BD.ПрисоединитьИБ(<ПутьКБазе2>,,,"Driver={SQL Server};Server=<Сервер>;Database=<База2>;Uid=<Пользователь>;Pwd=<Пароль>");
RS = CreateObject("ODBCRecordset");
RS.УстБД(BD);
   
RS.УстановитьТекстовыйПараметр("НачДата", ВыбНачПериода);
RS.УстановитьТекстовыйПараметр("КонДата", ВыбКонПериода);
   
ТекстЗапроса = "SELECT
|    Жур.IDDOC as [Док $Документ],
|    Жур.IDDOCDEF as Док_вид,
|    CAST(LEFT(Жур.DATE_TIME_IDDOC, 8) as DateTime) as ДатаДок
|FROM
|    _1SJourn as Жур
|WHERE
|   Жур.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~ AND
|    Жур.Closed & 1 = 1
|";
   
RS.ВыполнитьИнструкцию(ТекстЗапроса,ТЗ,1);
[/code]

В ТЗ на форме вижу список документов "Базы1". Получается, что не срабатывает RS.УстБД(BD), а почему не понятно. Перерыл пол-инета - вроде везде обращение к данным "сторонней" БД выполняется именно таким образом, а вот работать не хочет.Подскажите, пожалуйста, что я сделал не так
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Не вытаскивает данные из второй базы
Ответ #1 - 09. Октября 2009 :: 10:53
Печать  
[quote author=jj link=1255084764/0#0 date=1255084764]Добрый день!

SQL сервер 2005, 1С++ v.3.0.1.23

На одном сервере находятся две базы "База1" и "База2". Из Базы1 запускаю обработку с кодом

[code]BD = CreateObject("ODBCDatabase");
BD.ПрисоединитьИБ(<ПутьКБазе2>,,,"Driver={SQL Server};Server=<Сервер>;Database=<База2>;Uid=<Пользователь>;Pwd=<Пароль>");
RS = CreateObject("ODBCRecordset");
RS.УстБД(BD);
   
RS.УстановитьТекстовыйПараметр("НачДата", ВыбНачПериода);
RS.УстановитьТекстовыйПараметр("КонДата", ВыбКонПериода);
   
ТекстЗапроса = "SELECT
|    Жур.IDDOC as [Док $Документ],
|    Жур.IDDOCDEF as Док_вид,
|    CAST(LEFT(Жур.DATE_TIME_IDDOC, 8) as DateTime) as ДатаДок
|FROM
|    _1SJourn as Жур
|WHERE
|   Жур.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~ AND
|    Жур.Closed & 1 = 1
|";
   
RS.ВыполнитьИнструкцию(ТекстЗапроса,ТЗ,1);
[/code]

В ТЗ на форме вижу список документов "Базы1". Получается, что не срабатывает RS.УстБД(BD), а почему не понятно. Перерыл пол-инета - вроде везде обращение к данным "сторонней" БД выполняется именно таким образом, а вот работать не хочет.Подскажите, пожалуйста, что я сделал не так[/quote]

В попытку исключение засунь процесс подключения и увидишь, что не так. Вообще, там где <путь к базе2> нужно пользователя и пароль указывать (для 1С).
  
Наверх
 
IP записан
 
jj
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 09. Октября 2009
Re: Не вытаскивает данные из второй базы
Ответ #2 - 09. Октября 2009 :: 10:58
Печать  
Пробовал через попытку-исключение. Все работает без вопросов.
Только что попробовал еще такой вариант текста запроса :

[code]ТекстЗапроса = "
|SELECT
|      Спр.Code as Код,
|      Спр.Descr as Наименование
|FROM
|      $Справочник.ТМЦ as Спр";[/code]

выводит список ТМЦ [b]ИЗ НУЖНОЙ БАЗЫ !!![/b]
Я уже вообще ничего не понимаю.... нельзя что-ли вытаскивать документы из сторонней иб ?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не вытаскивает данные из второй базы
Ответ #3 - 09. Октября 2009 :: 11:18
Печать  
[quote author=jj link=1255084764/0#2 date=1255085882]Пробовал через попытку-исключение. Все работает без вопросов.
Только что попробовал еще такой вариант текста запроса :

[code]ТекстЗапроса = "
|SELECT
|      Спр.Code as Код,
|      Спр.Descr as Наименование
|FROM
|      $Справочник.ТМЦ as Спр";[/code]

выводит список ТМЦ [b]ИЗ НУЖНОЙ БАЗЫ !!![/b]
Я уже вообще ничего не понимаю.... нельзя что-ли вытаскивать документы из сторонней иб ?[/quote]
а у тебя в базе 2 если какой нибудь вид документа какого нет
в базе1 ?
  
Наверх
 
IP записан
 
jj
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 09. Октября 2009
Re: Не вытаскивает данные из второй базы
Ответ #4 - 09. Октября 2009 :: 11:22
Печать  
Есть. В базе1 есть документ "ПеремещениеТМЦ", в базе2 - "Перемещение".
  
Наверх
 
IP записан
 
jj
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 09. Октября 2009
Re: Не вытаскивает данные из второй базы
Ответ #5 - 09. Октября 2009 :: 11:23
Печать  
Пробовал в условие вставлять "ПеремещениеТМЦ" - ругается.Значит смотрит на МД-шник той базы
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Не вытаскивает данные из второй базы
Ответ #6 - 09. Октября 2009 :: 11:25
Печать  
Цитата:
[Док $Документ]
типизация ссылок из присоединенной ИБ невозможна
  

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


1C++ rocks!

Сообщений: 27
Зарегистрирован: 09. Октября 2009
Re: Не вытаскивает данные из второй базы
Ответ #7 - 09. Октября 2009 :: 11:27
Печать  
а как тогда правильно прописать ?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Не вытаскивает данные из второй базы
Ответ #8 - 09. Октября 2009 :: 11:32
Печать  
jj писал(а) 09. Октября 2009 :: 11:27:
а как тогда правильно прописать ?
вытаскивай все что тебе нужно от этого документа в простых типах
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не вытаскивает данные из второй базы
Ответ #9 - 09. Октября 2009 :: 11:33
Печать  
jj писал(а) 09. Октября 2009 :: 11:27:
а как тогда правильно прописать ?

без типизации.
ну и желательно озвучить задачу что Вы хотите получить?
  
Наверх
 
IP записан
 
jj
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 09. Октября 2009
Re: Не вытаскивает данные из второй базы
Ответ #10 - 09. Октября 2009 :: 11:35
Печать  
озвучиваю : нужна обработка, которая выведет список документов "ПеремещениеТМЦ" из одной базы и "Перемещение" из другой
  
Наверх
 
IP записан
 
jj
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 09. Октября 2009
Re: Не вытаскивает данные из второй базы
Ответ #11 - 09. Октября 2009 :: 11:44
Печать  
Попытался прописать так :

[code]|SELECT
     |      Жур.IDDOC as [Док $Документ.Перемещение],[/code]

Получил сообщение "Ошибка типизации", а до этого никаких ошибок не выдавал
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не вытаскивает данные из второй базы
Ответ #12 - 09. Октября 2009 :: 11:56
Печать  
Код
Выбрать все
ТекстЗапроса = "SELECT
|    Жур.IDDOC ,
|    Жур.IDDOCDEF as Док_вид,
|    Жур.docno as НомерДок,
|    Жур.DATE_TIME_IDDOC  [ДатаДок $Дата]
|FROM
|    _1SJourn as Жур
|WHERE
|   Жур.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата~ AND
|    Жур.Closed  = 1
|";
    
RS.ВыполнитьИнструкцию(ТекстЗапроса,ТЗ,1);
 



Такой запрос работает ?
  
Наверх
 
IP записан
 
jj
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 09. Октября 2009
Re: Не вытаскивает данные из второй базы
Ответ #13 - 09. Октября 2009 :: 12:01
Печать  
Выдал в таблицу

IDDOC 8CVJ      Док_Вид 6431    ДатаДок   06.05.09
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не вытаскивает данные из второй базы
Ответ #14 - 09. Октября 2009 :: 12:12
Печать  
jj писал(а) 09. Октября 2009 :: 12:01:
Выдал в таблицу

IDDOC 8CVJ      Док_Вид 6431    ДатаДок   06.05.09

А теперь озвучь что ты хочешь.
Можешь например заменить 6431 на Док.Перемещение

Самого же документа Базы2 в твоей базе(базе1) нет
поэтому и типизацию сделать нельзя. Зато ссылка iddoc есть
  
Наверх
 
IP записан
 
jj
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 09. Октября 2009
Re: Не вытаскивает данные из второй базы
Ответ #15 - 09. Октября 2009 :: 12:17
Печать  
Спасибо !!! Я понял теперь, в чем ошибка.

А как вообще бороться с подобными вещами ?

Каждый раз проверять по ДД-шнику, что за документ по номеру как-то неудобно что ли.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Не вытаскивает данные из второй базы
Ответ #16 - 09. Октября 2009 :: 12:21
Печать  
jj писал(а) 09. Октября 2009 :: 12:17:
Спасибо !!! Я понял теперь, в чем ошибка.

А как вообще бороться с подобными вещами ?

Каждый раз проверять по ДД-шнику, что за документ по номеру как-то неудобно что ли.

Бороться элементарно.

создаешь в базе 2 таблицу
My_tip c полями  IDDOCDEF кластерный индекс
IDDOCDEF int
type char(30)
один раз заполняешь таблицу ( также меняешь ее когда добавляешь или удаляешь документ в конфигураторе базы2)
и делаешь к этой таблице inner join
  
Наверх
 
IP записан
 
jj
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 27
Зарегистрирован: 09. Октября 2009
Re: Не вытаскивает данные из второй базы
Ответ #17 - 09. Октября 2009 :: 12:28
Печать  
и за такую мысль СПАСИБО. Подумаем....
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Не вытаскивает данные из второй базы
Ответ #18 - 09. Октября 2009 :: 12:31
Печать  
Z1 писал(а) 09. Октября 2009 :: 12:21:
Бороться элементарно.

создаешь в базе 2 таблицу...

это лишнее.
будет отлично работать типизация $ВидДокумента
  

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


1C++ rocks!

Сообщений: 27
Зарегистрирован: 09. Октября 2009
Re: Не вытаскивает данные из второй базы
Ответ #19 - 09. Октября 2009 :: 12:35
Печать  
то Trad

а можно строчку кода (как это правильно написать) ?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Не вытаскивает данные из второй базы
Ответ #20 - 09. Октября 2009 :: 12:40
Печать  
select
...
Жур.IDDOCDEF as [Вид $ВидДокумента],
...
  

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


1C++ rocks!

Сообщений: 27
Зарегистрирован: 09. Октября 2009
Re: Не вытаскивает данные из второй базы
Ответ #21 - 09. Октября 2009 :: 12:56
Печать  
Да, так в поле "Вид" пишет вид документа как он задан в конфигураторе. Правда в IDDOC остаются внутренние идентификаторы документов, а не ссылки на документы. С этим тоже можно как-то бороться прямо в запросе ?
Вы уж простите меня за глупые вопросы. Раньше не приходилось таскать данные между базами при помощи 1с++
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Не вытаскивает данные из второй базы
Ответ #22 - 09. Октября 2009 :: 13:01
Печать  
jj писал(а) 09. Октября 2009 :: 12:56:
Да, так в поле "Вид" пишет вид документа как он задан в конфигураторе. Правда в IDDOC остаются внутренние идентификаторы документов, а не ссылки на документы. С этим тоже можно как-то бороться прямо в запросе ?
Вы уж простите меня за глупые вопросы. Раньше не приходилось таскать данные между базами при помощи 1с++

Повторю.
Типизация ссылок из присоединенной ИБ в агрегатные объекты невозможна
  

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


1C++ rocks!

Сообщений: 27
Зарегистрирован: 09. Октября 2009
Re: Не вытаскивает данные из второй базы
Ответ #23 - 09. Октября 2009 :: 13:05
Печать  
Еще раз большое спасибо
  
Наверх
 
IP записан
 
slawa
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 125
Зарегистрирован: 05. Октября 2006
Re: Не вытаскивает данные из второй базы
Ответ #24 - 10. Октября 2009 :: 08:50
Печать  
для trad

Регистрировал ошибку № 3560 в Bugzilla (2008-02-14)
Делаем так:
   БД = СоздатьОбъект("ODBCDataBase");
   БД.ПрисоединитьИБ(ПутьМД, "Администратор", _пароль);
   RS = СоздатьОбъект("ODBCRecordSet");
   RS.УстБД(БД);
после этого запросы парсятся правильно, по метаданным внешней базы, но свойство RS.МД указывает на объект MetaDataWork подключенный к текущей базе.
поэтому приходится делать еще одну строку:
   RS.МД.ПрисоединитьМД(ПутьМД+"1cv7.md");
что приводит к двойной закачке МДшника внешней базы.

думаю, что логичнее по команде RS.УстБД(БД), объект RS.МД устанавливать по присоединяемой базе.

Как думаете ?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Не вытаскивает данные из второй базы
Ответ #25 - 12. Октября 2009 :: 07:50
Печать  
slawa писал(а) 10. Октября 2009 :: 08:50:
думаю, что логичнее по команде RS.УстБД(БД), объект RS.МД устанавливать по присоединяемой базе.

Как думаете ?

Согласен. Но ничего не обещаю.
  

1&&2&&3
Наверх
 
IP записан
 
Fraizy
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 2
Зарегистрирован: 12. Октября 2009
Пол: Женский
Re: Не вытаскивает данные из второй базы
Ответ #26 - 12. Октября 2009 :: 17:59
Печать  
А можно вопрос для общего развития? Улыбка
В описании метода ПрисоединитьИБ сказано:"позволяет загрузить метаданные из указанного каталога ИБ". А как это происходит?   Круглые глаза  И где хранятся эти загруженные метаданные?  Смущённый
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Не вытаскивает данные из второй базы
Ответ #27 - 13. Октября 2009 :: 05:27
Печать  
фрагмент реализации метода AttachIB:
Код
Выбрать все
{
...
		strFileName.Format("%s%s", strPath, "1cv7.md");
		if (!CMetaDataWork::LoadMD(strFileName, m_pMetaDataCont))
		    RuntimeErrorRes(28771); //Ошибка загрузки метаданных.
} 


где CMetaDataCont* m_pMetaDataCont; - член СODBCDatabase.
В метод LoadMD этот указатель передается по ссылке, а там собственно ему присваивается new CMetaDataCont и производится десериализация в него "Main MetaData Stream" из md.
Это в двух словах. А детали и подробности нужно смотреть в исходниках.
  

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



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Не вытаскивает данные из второй базы
Ответ #28 - 13. Октября 2009 :: 05:34
Печать  
Метод RS.УстБД(БД)
1) "привязывает" рекордсет к указанной БД
2) "привязывает" матапарсер рекордсета к метаданным с которыми "связана" указанная БД
3) ничего не делает чтобы свойство RS.md "узнало" о других метаданных
  

1&&2&&3
Наверх
 
IP записан
 
Fraizy
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 2
Зарегистрирован: 12. Октября 2009
Пол: Женский
Re: Не вытаскивает данные из второй базы
Ответ #29 - 13. Октября 2009 :: 10:36
Печать  
trad писал(а) 13. Октября 2009 :: 05:27:
Это в двух словах. А детали и подробности нужно смотреть в исходниках.


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