Подключение к базе Oracle

1. CD_SVEN 08.07.20 08:49 Сейчас в теме
Добрый день, пытаюсь получить таблицу из базы 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;
	КонецПопытки;	
	
	
	возврат ЗначенияРекв;
КонецФункции
Показать


Соединение проходит успешно, таблицу видит, но но возвращает только одно строку этой таблицы, в чем ошибка, текст запроса вроде правильный отборов нету????
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
8. nomad_irk 81 08.07.20 16:09 Сейчас в теме
(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();
КонецЦикла;
Показать
12. nomad_irk 81 09.07.20 09:17 Сейчас в теме
(11)Вы вставляете в текст значение даты. Дата должна быть преобразована к формату, который понимает 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.
15. nomad_irk 81 17.07.20 13:49 Сейчас в теме
(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();
КонецЦикла;


Это для случая когда ИД - числовые значения. Если там строка, Формат() не нужен.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 81 08.07.20 09:17 Сейчас в теме
(1)Почему вы решили, что СтрокаXML = Записи.Fields() вам будет достаточно?

Вам необходимо обойти циклом набор записей Записи. Цикл вида

Пока НЕ Записи.EOF() Цикл
<ОбработкаСтрокиНабораЗаписей>
Записи.MoveNext();
КонецЦикла;
3. CD_SVEN 08.07.20 09:46 Сейчас в теме
(2)
ОбработкаСтрокиНабораЗаписей

подскажите пожалуйста что нужно указать в
<ОбработкаСтрокиНабораЗаписей>
?
4. nomad_irk 81 08.07.20 10:15 Сейчас в теме
(3)Я не знаю, что вы собираетесь делать с каждой записью, но в Записи.Fields("FieldName").Value хранится значение поля, в общем виде <ОбработкаСтрокиНаборазаписей> имеет вид:

ЗначениеПоля1 = Записи.Fields("Field1").Value;
ЗначениеПоля2 = Записи.Fields("Field2").Value;
........
5. CD_SVEN 08.07.20 10:19 Сейчас в теме
(4)в этой таблице логи договором (создание, изменение, удаление итд...), хочу создать регламентированное задание которое будет смотреть эту таблицу и (создавать или изменять) договора уже в базе 1с.
6. nomad_irk 81 08.07.20 10:26 Сейчас в теме
(5)В таком случае будет что-то вроде такого:

Пока НЕ Записи.EOF() Цикл
УИДоговора = Записи.Fields("ID").Value;
ДоговорСсылка = Справочник.Договоры.ПолучитьСсылку(Новый УникальныйИдентификатор(УИДоговора));

ДоговорОбъект = ДоговорСсылка.ПолучитьОбъект();
ДоговорОбъект.Номер = Записи.Fields("Number").Value;
ДоговорОбъект.ДатаНачала = Записи.Fields("StartDate").Value;
.....
ДоговорОбъект.Записать();
Записи.MoveNext();
КонецЦикла;
Показать
7. CD_SVEN 08.07.20 16:00 Сейчас в теме
(6)Подскажи пожалуйста как можно просто выташить из этой таблицы строки скажем за текущий день, и просто поместить их в таблицу значений?
8. nomad_irk 81 08.07.20 16:09 Сейчас в теме
(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();
КонецЦикла;
Показать
9. CD_SVEN 08.07.20 20:40 Сейчас в теме
(8)спасибо огромное завтра протестирую, не знаете какую нибудь статью про подключение к Oracle?
10. nomad_irk 81 08.07.20 20:56 Сейчас в теме
(9)Да тут не в Oracle дело, а в ADO. Почитайте по этой технологии.
Fox-trot; +1 Ответить
11. CD_SVEN 09.07.20 07:41 Сейчас в теме
(10)DATA_OP value с типом дата, прописал вот так, при открытии перепрыгивает на исключение,
ДатаНАчала = НачалоДня(ТекущаяДата());
		ДатаОкончания = КонецДня(ТекущаяДАта());
		ТекстЗапроса = "SEL ECT * fr om ASU2000_COMERC.DOGOVOR_LOG_1C WHERE DATE_OP BETWEEN ('"+ДатаНАчала+"')  AND ('"+ДатаОкончания+"')";
Прикрепленные файлы:
12. nomad_irk 81 09.07.20 09:17 Сейчас в теме
(11)Вы вставляете в текст значение даты. Дата должна быть преобразована к формату, который понимает 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.
13. CD_SVEN 13.07.20 08:19 Сейчас в теме
(12)
 ТекстЗапроса = "SEL ECT * FR OM ASU2000_COMERC.DOGOVOR_LOG_1C WHERE DATE_OP BETWEEN TO_DATE ('01.07.2020', 'DD.MM.YYYY') AND TO_DATE ('09.07.2020', 'DD.MM.YYYY')";

спасибо огромное
14. CD_SVEN 17.07.20 11:03 Сейчас в теме
(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");
	возврат ТаблицаСОтбором;                               
КонецФункции
Показать
15. nomad_irk 81 17.07.20 13:49 Сейчас в теме
(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();
КонецЦикла;


Это для случая когда ИД - числовые значения. Если там строка, Формат() не нужен.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот