Имя: Пароль:
1C
1C 7.7
v7: Проблема с прямым запросом через доп. соединение
0 Franchiser
 
гуру
23.11.17
13:47
Нужно сделать запрос не через текущее соединение 1с, а через доп. соединение, но почему то при этом получается бесконечный цикл и не видно количество полей в выборке и сами поля. В чем может быть проблема?
    МД = СоздатьОбъект("MetaDataWork");
    бд = СоздатьОбъект("ODBCDatabase");
    рс = СоздатьОбъект("ODBCRecordset");
    
    сервер = "server";
    
    БазаДанных = "ggg";

    Пользователь = "d";
    Пароль = "d";
    
    СтрокаПодключения = "Provider=SQLOLEDB.1;User ID=" + Пользователь + ";Pwd=" + Пароль + ";Initial Catalog=" + БазаДанных + ";Data Source=" + сервер + ";";
    бд.Соединение(СтрокаПодключения);
    рс.Отладка(1);
    рс.УстБД(бд);
    
        
        ТекстЗапроса = "-- qryMaker:Отчет1.2017.11.22.15.03.43
        |SELECT TOP 2
        |    ТКОстатки.Комитент Комитент
        |    , ТКОстатки.ЮридическоеЛицо ЮридическоеЛицо
        |    , ТКОстатки.МестоХранения МестоХранения
        |    , ТКОстатки.МПЗМ МПЗ
        |    , ТКОстатки.КоличествоОстаток
        |    , МестаХранения.ID МХМПЗ
        |    , Контрагенты.ID ЮЛМПЗ
        |FROM $РегистрОстатки.ТК(,,
        |        (ВидОстатка = $Перечисление.ВидыОстатков.ОтклоненияБухУчета)
        |        AND (Комитент = :Комитент),(Комитент,ЮридическоеЛицо,МестоХранения,МПЗ),(Количество)) AS ТКОстатки
        |    JOIN $Справочник.МПЗ AS МПЗ With (NOLOCK) ON ТКОстатки.МПЗ = МПЗ.ID
        |    JOIN $Справочник.МестаХранения AS МестаХранения With (NOLOCK) ON $МПЗ.МестоХранения = МестаХранения.ID
        |    JOIN $Справочник.Контрагенты AS Контрагенты With (NOLOCK) ON $ПоследнееЗначение.МестаХранения.ЮридическоеЛицо(МестаХранения.ID, :ВыбДата) = Контрагенты.ID
        |Where ТКОстатки.МестоХранения <> МестаХранения.ID OR ТКОстатки.ЮридическоеЛицо <>  Контрагенты.ID
        |";

    МД.УстановитьТекстовыйПараметр("ВыбДата", ДатаОСт);
    МД.УстановитьТекстовыйПараметр("Комитент", Комитент);
    
    ТекстЗапроса = МД.ОбрМетаСКЛ(ТекстЗапроса);
    
    рс.Открыть(ТекстЗапроса);
    
    рс.ВНачало();
    Пока рс.конец()=0 Цикл
        //Сообщить("" +рс.ПолучитьЗначение("Комитент"));
        //Сообщить("" +рс.ПолучитьЗначение("ЮридическоеЛицо"));
        //Сообщить("" +рс.ПолучитьЗначение("МестоХранения"));
        //Сообщить("" +рс.ПолучитьЗначение("МПЗ"));
        //Сообщить("" +рс.ПолучитьЗначение("КоличествоОстаток"));
        //Сообщить("" +рс.ПолучитьЗначение("МХМПЗ"));
        //Сообщить("" +рс.ПолучитьЗначение("ЮЛМПЗ"));
        
        Сообщить("=======");
    
        
        рс.След();
    КонецЦикла;
1 Ёпрст
 
23.11.17
13:53
(0) пустая выборка
2 Ёпрст
 
23.11.17
13:53
твой запрос ничего не возвращает, ибо условие на Комитент...
3 Ёпрст
 
23.11.17
13:53
это объект Этой базы, где уверенность, что его id в сторонней базе точно такой же ?
4 Franchiser
 
гуру
23.11.17
14:00
(3) я подключаюсь к одной и той же базе, только через другое соединение
5 Franchiser
 
гуру
23.11.17
14:02
по первой строке подключение ЕстьСоединение() возвращает = 0
Если так написать
СтрокаПодключения = "DRIVER=SQL Server;UID=" + Пользователь + ";Pwd=" + Пароль + ";DataBase=" + БазаДанных + ";Server=" + сервер + ";";
То ЕстьСоединение() возвращает = 1.
Но все равно проблема с выборкой осталась.
6 Franchiser
 
гуру
23.11.17
14:19
Смысл всего этого обойти ошибку "State HY000, native 0, message [Microsoft][ODBC SQL Server Driver]Подключение занято до получения результатов для другого hstmt " при обходе выборке курсором при типизации полей.
7 Ёпрст
 
23.11.17
14:20
(6) (nolock)
8 Ёпрст
 
23.11.17
14:21
И нафига вообще курсор открывать ?
ВыгрузитьИнструкцию же есть
9 Ёпрст
 
23.11.17
14:22
ну и это, set nocount on воткни в начало запроса
10 Franchiser
 
гуру
23.11.17
14:25
(8) в выборке миллионы записей, по ним нужно сгенерировать документы, ТЗ загибается как обычно. no count втыкал не помогает. Как же все таки сделать чтобы запрос к этой же базе выполнялся в другом соединении?
11 Franchiser
 
гуру
23.11.17
14:26
(7) (nolock) везде стоит
12 Franchiser
 
гуру
24.11.17
00:59
Все заработало, спасибо
13 Ёпрст
 
24.11.17
10:26
(12) че было ? Как решил ?
14 Franchiser
 
гуру
24.11.17
11:31
1. Опечатка в запросе (когда убирал типизацию неправильно называлось поле мпз)
2. Добавил set nocount on в запрос
3. В методе открыть второй параметр 1 должен быть
4. Строка подключения должна быть как указал в прошлом сообщении, т.е. Driver = SQL Server
15 Franchiser
 
гуру
24.11.17
11:33
Все это обнаружилось при анализе метода recordset описаниеошибки(), как то так
16 Ёпрст
 
24.11.17
12:01
ясно, спсб.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.