Добрый день, пытаюсь получить таблицу из базы Oracle
Соединение проходит успешно, таблицу видит, но но возвращает только одно строку этой таблицы, в чем ошибка, текст запроса вроде правильный отборов нету????
&НаСервере
Функция ПодключитьсяИПолучитьЗначенияНаСервере()
ЗначенияРекв = Новый Структура;
Соединение = Новый ComObject("ADODB.Connection"); //2020-02-14 -
Соединение.ConnectionString ="Provider=OraOLEDB.Oracle.1;Data Source=123;User Id=ASU_BUH;Password=321;";
Попытка //2020-02-14 -
Соединение.Open(); //2020-02-14 -
Исключение //2020-02-14 -
Сообщить(ОписаниеОшибки()); //2020-02-14 -
Возврат ЗначенияРекв; //2020-02-14 -
КонецПопытки; //2020-02-14 -
ТекстЗапроса = "SEL ECT * fr om ASU2000_COMERC.DOGOVOR_LOG_1C";
Попытка
Записи = Новый ComObject("ADODB.RecordSet"); //2020-02-14 -
Записи.Open(ТекстЗапроса, Соединение); //2020-02-14 -
Сообщить("Данные получены.");
СтрокаXML = Записи.Fields(); -
возврат СтрокаXML;
Исключение
Сообщить(ОписаниеОшибки());
Возврат СтрокаXML;
КонецПопытки;
возврат ЗначенияРекв;
КонецФункции
ПоказатьСоединение проходит успешно, таблицу видит, но но возвращает только одно строку этой таблицы, в чем ошибка, текст запроса вроде правильный отборов нету????
Прикрепленные файлы:

По теме из базы знаний
Найденные решения
(7)Я не знаю структуры, в общем случае будет что-то вроде:
ТаблицаЗначений = Новый ТаблицаЗначений;
ТаблицаЗначений.Колонки.Добавить("FieldName1");
ТаблицаЗначений.Колонки.Добавить("FieldName2");
.............
ТекстЗапроса = "SEL ECT * fr om ASU2000_COMERC.DOGOVOR_LOG_1C WHERE UPD_DATE BETWEEN <НачалоТекущегоДня> AND <КонецТекущегоДня>";
Попытка
Записи = Новый ComObject("ADODB.RecordSet"); //2020-02-14 -
Записи.Open(ТекстЗапроса, Соединение); //2020-02-14 -
Сообщить("Данные получены.");
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Пока НЕ Записи.EOF() Цикл
НСтр = ТаблицаЗначений.Добавить();
Для Каждого Колонка ИЗ Записи.Fields() Цикл
НСтр[Колонка.Name] = Записи.Fields(Колонка.Name).Value;
КонецЦикла;
Записи.MoveNext();
КонецЦикла;
Показать
(11)Вы вставляете в текст значение даты. Дата должна быть преобразована к формату, который понимает ORACLE.
У ORACLE есть внутренняя функция преобразования текста в дату TO_DATE()
С " и ' мог напутать, отладить по месту.
В общем строка должна иметь вид:
, например
Более подробно в документации к ORACLE.
У ORACLE есть внутренняя функция преобразования текста в дату TO_DATE()
"SEL ECT * fr om ASU2000_COMERC.DOGOVOR_LOG_1C WHERE DATE_OP BETWEEN TO_DATE('" + Формат(ДатаНачала, "ДФ=dd-MM-yyyy") + , "'DD-MMM-RRRR') AND TO_DATE('" + Формат(ДатаОкончания, "ДФ=dd-MM-yyyy") + "'DD-MMM-RRRR')";
С " и ' мог напутать, отладить по месту.
В общем строка должна иметь вид:
TO_DATE('ЗначениеДатыВФормате', 'ФорматДаты')
TO_DATE('31-01-2020', 'DD-MM-RRRR')
Более подробно в документации к ORACLE.
(14)Я бы сделал массив, в него запихивал бы ID записей, для которых нужно обновить состояние:
После окончания цикла по Записи, выполнил бы следующее:
Это для случая когда ИД - числовые значения. Если там строка, Формат() не нужен.
МассивОбработанныхИД = Новый Массив;
Пока НЕ Записи.EOF Цикл
............
Если Колонка.Name = "PROCESSED" Тогда
Если Записи.Fields(Колонка.Name).Value = 0 Тогда
МассивОбработанныхИД.Добавить(Записи.Fields("ID").Value);
КонецЕсли;
КонецЕсли;
............
КонецЦикла;
ПоказатьПосле окончания цикла по Записи, выполнил бы следующее:
Команда = Новый ComObject("ADODB.Command");
Команда.ActiveConnection = Соединение;
Для Каждого ИД Из МассивОбработанныхИД Цикл
Комманда.CommandText = "UPD ATE ASU2000_COMERC.DOGOVOR_LOG_1C SE T PROCESSED = 1 WHERE ID = " + Формат(ИД, "ЧГ=");
Команда.Execute();
КонецЦикла;
Это для случая когда ИД - числовые значения. Если там строка, Формат() не нужен.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(3)Я не знаю, что вы собираетесь делать с каждой записью, но в Записи.Fields("FieldName").Value хранится значение поля, в общем виде <ОбработкаСтрокиНаборазаписей> имеет вид:
ЗначениеПоля1 = Записи.Fields("Field1").Value;
ЗначениеПоля2 = Записи.Fields("Field2").Value;
........
(5)В таком случае будет что-то вроде такого:
Пока НЕ Записи.EOF() Цикл
УИДоговора = Записи.Fields("ID").Value;
ДоговорСсылка = Справочник.Договоры.ПолучитьСсылку(Новый УникальныйИдентификатор(УИДоговора));
ДоговорОбъект = ДоговорСсылка.ПолучитьОбъект();
ДоговорОбъект.Номер = Записи.Fields("Number").Value;
ДоговорОбъект.ДатаНачала = Записи.Fields("StartDate").Value;
.....
ДоговорОбъект.Записать();
Записи.MoveNext();
КонецЦикла;
Показать
(7)Я не знаю структуры, в общем случае будет что-то вроде:
ТаблицаЗначений = Новый ТаблицаЗначений;
ТаблицаЗначений.Колонки.Добавить("FieldName1");
ТаблицаЗначений.Колонки.Добавить("FieldName2");
.............
ТекстЗапроса = "SEL ECT * fr om ASU2000_COMERC.DOGOVOR_LOG_1C WHERE UPD_DATE BETWEEN <НачалоТекущегоДня> AND <КонецТекущегоДня>";
Попытка
Записи = Новый ComObject("ADODB.RecordSet"); //2020-02-14 -
Записи.Open(ТекстЗапроса, Соединение); //2020-02-14 -
Сообщить("Данные получены.");
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Пока НЕ Записи.EOF() Цикл
НСтр = ТаблицаЗначений.Добавить();
Для Каждого Колонка ИЗ Записи.Fields() Цикл
НСтр[Колонка.Name] = Записи.Fields(Колонка.Name).Value;
КонецЦикла;
Записи.MoveNext();
КонецЦикла;
Показать
(10)DATA_OP value с типом дата, прописал вот так, при открытии перепрыгивает на исключение,
ДатаНАчала = НачалоДня(ТекущаяДата());
ДатаОкончания = КонецДня(ТекущаяДАта());
ТекстЗапроса = "SEL ECT * fr om ASU2000_COMERC.DOGOVOR_LOG_1C WHERE DATE_OP BETWEEN ('"+ДатаНАчала+"') AND ('"+ДатаОкончания+"')";
Прикрепленные файлы:

(11)Вы вставляете в текст значение даты. Дата должна быть преобразована к формату, который понимает ORACLE.
У ORACLE есть внутренняя функция преобразования текста в дату TO_DATE()
С " и ' мог напутать, отладить по месту.
В общем строка должна иметь вид:
, например
Более подробно в документации к ORACLE.
У ORACLE есть внутренняя функция преобразования текста в дату TO_DATE()
"SEL ECT * fr om ASU2000_COMERC.DOGOVOR_LOG_1C WHERE DATE_OP BETWEEN TO_DATE('" + Формат(ДатаНачала, "ДФ=dd-MM-yyyy") + , "'DD-MMM-RRRR') AND TO_DATE('" + Формат(ДатаОкончания, "ДФ=dd-MM-yyyy") + "'DD-MMM-RRRR')";
С " и ' мог напутать, отладить по месту.
В общем строка должна иметь вид:
TO_DATE('ЗначениеДатыВФормате', 'ФорматДаты')
TO_DATE('31-01-2020', 'DD-MM-RRRR')
Более подробно в документации к ORACLE.
(12)можете еще подсказать, вот я получаю все эти записи из этой базы, мне еще нужно обновить данные в той базе "Оракл"
нужно сделать примерно так
как правильно реализовать
вот весь код целиком
нужно сделать примерно так
Пока НЕ Записи.EOF() Цикл
НСтр = ТаблицаЗначений.Добавить();
Для Каждого Колонка ИЗ Записи.Fields() Цикл
НСтр[Колонка.Name] = Записи.Fields(Колонка.Name).Value;
Если Колонка.Name = "PROCESSED" Тогда
Если Записи.Fields(Колонка.Name).Value = 0 Тогда
ТекстЗапросаЗаписиВИАС = "UPDATA ASU2000_COMERC.DOGOVOR_LOG_1C SET PROCESSED = '1' ')";
КонецЕсли;
КонецЕсли;
КонецЦикла;
Записи.MoveNext();
КонецЦикла;
Показать
Если Записи.Fields(Колонка.Name).Value = 0 Тогда
ТекстЗапросаЗаписиВИАС = "UPDATA ASU2000_COMERC.DOGOVOR_LOG_1C SET PROCESSED = '1' ')";
КонецЕсли;
как правильно реализовать
вот весь код целиком
&НаСервере
Функция ПолучитьТаблицуИзмененийНаСервереИАС()
ЗначенияРекв = Новый Структура;
Соединение = Новый ComObject("ADODB.Connection"); //2020-02-14 -
Соединение.ConnectionString ="Provider=OraOLEDB.Oracle.1;Data Source=123;User Id=123;Password=123;";
Попытка //2020-02-14 -
Соединение.Open(); //2020-02-14 -
Исключение //2020-02-14 -
Сообщить(ОписаниеОшибки()); //2020-02-14 -
Возврат ЗначенияРекв; //2020-02-14 -
КонецПопытки;
ДатаНачала = Формат(НачалоДня(ТекущаяДата()),"ДФ=dd.MM.yyyy");
ДатаОкончания = Формат(КонецДня(ТекущаяДата()),"ДФ=dd.MM.yyyy");
//ТекстЗапроса = "SEL ECT * FR OM ASU2000_COMERC.DOGOVOR_LOG_1C WHERE DATE_OP BETWEEN TO_DATE ('"+ДатаНачала+"', 'DD.MM.YYYY') AND TO_DATE ('"+ДатаОкончания+"', 'DD.MM.YYYY')";
ТекстЗапроса = "SELECT * FR OM ASU2000_COMERC.DOGOVOR_LOG_1C WH ERE DATE_OP BETWEEN TO_DATE ('17.07.2020 00:00:00', 'DD.MM.YYYY HH24:MI:SS') AND TO_DATE ('17.07.2020 23:59:59', 'DD.MM.YYYY HH24:MI:SS')";
Попытка
Записи = Новый ComObject("ADODB.RecordSet");
Записи.Open(ТекстЗапроса, Соединение);
Сообщить("Данные получены.");
Исключение
Сообщить(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
ТаблицаЗначений = Новый ТаблицаЗначений;
ТаблицаЗначений.Колонки.Добавить("ID"); //Идентификатор записи
ТаблицаЗначений.Колонки.Добавить("ID_DOGOVOR"); //Идентификатор договора в базе данных ИАС ОГУ (8 цифр)
ТаблицаЗначений.Колонки.Добавить("ID_TYPE_DOGOVOR"); //Идентификатор вида договора. 1 - договоры на обучение по ООП
ТаблицаЗначений.Колонки.Добавить("OPERATON"); //Вид произведенной операции (I - создание договора, U - изменение договора, D - удаление договора)
ТаблицаЗначений.Колонки.Добавить("DATE_OP"); //Дата и время операции
ТаблицаЗначений.Колонки.Добавить("ID_1C"); //Идентификатор договора в информационной системе УБУиО. Должен быть заполнен бухгалтерией после обработки записи
ТаблицаЗначений.Колонки.Добавить("PROCESSED"); //Признак обработки записи УБУиО (0 - запись не обработана, 1 - запись обработана)
Пока НЕ Записи.EOF() Цикл
НСтр = ТаблицаЗначений.Добавить();
Для Каждого Колонка ИЗ Записи.Fields() Цикл
НСтр[Колонка.Name] = Записи.Fields(Колонка.Name).Value;
Если Колонка.Name = "PROCESSED" Тогда
Если Записи.Fields(Колонка.Name).Value = 0 Тогда
ТекстЗапросаЗаписиВИАС = "UPDATA ASU2000_COMERC.DOGOVOR_LOG_1C SET PROCESSED = '1' ')";
КонецЕсли;
КонецЕсли;
КонецЦикла;
Записи.MoveNext();
КонецЦикла;
ТаблицаСОтбором = Новый ТаблицаЗначений;
ТаблицаСОтбором.Колонки.Добавить("ID");
ТаблицаСОтбором.Колонки.Добавить("ID_DOGOVOR");
ТаблицаСОтбором.Колонки.Добавить("ID_TYPE_DOGOVOR");
ТаблицаСОтбором.Колонки.Добавить("OPERATON");
ТаблицаСОтбором.Колонки.Добавить("DATE_OP");
ТаблицаСОтбором.Колонки.Добавить("ID_1C");
ТаблицаСОтбором.Колонки.Добавить("PROCESSED");
ТаблицаЗначений.Сортировать("DATE_OP");
Для каждого СтрокаИсходнойТаблицы из ТаблицаЗначений Цикл
Строки = ТаблицаЗначений.НайтиСтроки(Новый Структура("ID_Dogovor", СтрокаИсходнойТаблицы.id_dogovor));
СтрокаПоследнегоДействияПоДоговору = Строки[Строки.ВГраница()];
НоваяСтрока = ТаблицаСОтбором.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаПоследнегоДействияПоДоговору);
КонецЦикла;
ТаблицаСОтбором.Свернуть("ID, ID_DOGOVOR,ID_TYPE_DOGOVOR, OPERATON, DATE_OP, ID_1C, PROCESSED");
ТаблицаСОтбором.Сортировать("ID_DOGOVOR, OPERATON");
возврат ТаблицаСОтбором;
КонецФункции
Показать
(14)Я бы сделал массив, в него запихивал бы ID записей, для которых нужно обновить состояние:
После окончания цикла по Записи, выполнил бы следующее:
Это для случая когда ИД - числовые значения. Если там строка, Формат() не нужен.
МассивОбработанныхИД = Новый Массив;
Пока НЕ Записи.EOF Цикл
............
Если Колонка.Name = "PROCESSED" Тогда
Если Записи.Fields(Колонка.Name).Value = 0 Тогда
МассивОбработанныхИД.Добавить(Записи.Fields("ID").Value);
КонецЕсли;
КонецЕсли;
............
КонецЦикла;
ПоказатьПосле окончания цикла по Записи, выполнил бы следующее:
Команда = Новый ComObject("ADODB.Command");
Команда.ActiveConnection = Соединение;
Для Каждого ИД Из МассивОбработанныхИД Цикл
Комманда.CommandText = "UPD ATE ASU2000_COMERC.DOGOVOR_LOG_1C SE T PROCESSED = 1 WHERE ID = " + Формат(ИД, "ЧГ=");
Команда.Execute();
КонецЦикла;
Это для случая когда ИД - числовые значения. Если там строка, Формат() не нужен.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот