Имя: Пароль:
1C
1С v8
8.2 Работа с Огненной птицей
0 Aswed
 
15.10.12
10:08
Пишу такой код

Процедура ПодключениеКБазе()
   
   Если ПустаяСтрока(АдресБазы) Тогда
       ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не указано имя файла базы данных.");
       Возврат;
   КонецЕсли;
   
   ПутьКСерверу = "";
   ПутьКБазе = АдресБазы;
   ИмяПользователя = "SYSDBA";
   ПарольПользователя = "masterkey";
   ПараметрыПодключения = "auto_commit=True;ctype=win1251";
   
   стрПодключения = "data source=" + ПутьКСерверу + ":" + ПутьКБазе + ";" + ПараметрыПодключения + ";user ID="+ ИмяПользователя + ";password=" + ПарольПользователя;
   
   Соединение = Новый COMОбъект("ADODB.Connection");
   
   Соединение.Provider = "LCPI.IBProvider.3.Free";
   Соединение.ConnectionString = стрПодключения;
   
   Соединение.ConnectionTimeOut =60;
   Соединение.CommandTimeout = 60;
   Соединение.CursorLocation = 3;
   
   Попытка
       Соединение.Open();
       Сообщить("Соединение успешно уставнолено !!!");
   Исключение
       Сообщить("Невозможно установить соединение - "+ОписаниеОшибки());
   КонецПопытки;
   
   RS = Новый COMОбъект("ADODB.Recordset");

   Стр = "select cars.id, cars.nomer from cars";
   Попытка
       RS.Open(Стр,Соединение);
   Исключение
       Сообщить ("Не сработал...");
       Возврат;
   КонецПопытки;
   
   Пока RS.EOF() = 0 Цикл    
       ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Значение:"+Rs.Fields["nomer"].Value);
       RS.MoveNext();
   КонецЦикла;
   
КонецПроцедуры

Подключается, выполняет запрос, выбирает данные, но по строчке

Rs.Fields["nomer"].Value

Ругается. Что такого поля нет.
Подскажите, что не правильно делаю.
1 Aswed
 
15.10.12
10:18
АП
2 ZanderZ
 
15.10.12
10:20
ну значит нет такого поля
3 1Страх
 
15.10.12
10:20
а так?

Стр = "select cars.id as id, cars.nomer as nomer from cars";
4 DexterMorgan
 
15.10.12
10:21
откуда знаешь, что данные выбирает?
5 Aswed
 
15.10.12
10:21
(3) Поле объекта не обнаружено (nomer)
6 Aswed
 
15.10.12
10:21
(4) Цикл идёт
7 GANR
 
15.10.12
10:22
(5) А отладчик что говорит ???
8 Godofsin
 
15.10.12
10:23
а по индексу?
9 Aswed
 
15.10.12
10:23
(7) Rs.Fields["nomer"].Value    {(1)}: Поле объекта не обнаружено (nomer)
10 Aswed
 
15.10.12
10:24
(8)
Rs.Fields[1].Value    {(1)}: Получение элемента по индексу для значения не определено
11 Aswed
 
15.10.12
10:24
Я вот думаю может для ФаирБёрда как то по другому запрос писать надо?
12 Sj
 
15.10.12
10:25
а Rs.ID.Value  срабатывает?
13 Sj
 
15.10.12
10:27
Стр =  "select 1 as nomer" - вот так посмотри работает?
14 1Страх
 
15.10.12
10:28
(13) так в Firebird писать запрос нельзя
15 Aswed
 
15.10.12
10:28
(12) И id тоже самое
16 1Страх
 
15.10.12
10:29
Rs.Fields.Count()
17 Aswed
 
15.10.12
10:31
(16) Возвращает 2
18 Sj
 
15.10.12
10:31
(17) а 13 ?
19 Aswed
 
15.10.12
10:31
Фишка в том что с фаербёрдом работал ещё на клюшках, и тогда таких проблем не возникало.
А тут на ровном месте, на простейшем запросе такие непонятные рога вылезли блин.
20 1Страх
 
15.10.12
10:32
(17) Rs.Fields[1].Name
21 Aswed
 
15.10.12
10:32
(18) не сработал
22 1Страх
 
15.10.12
10:32
(19) может с кодировкой? на клюшках уникода не было
23 Aswed
 
15.10.12
10:33
(20) Тоже самое, нельзя получать по индексу
24 Aswed
 
15.10.12
10:34
(22) Дык если бы с кодировкой то запрос бы не срабатывал,
а тут срабатывает и выбирает.
Видать как то по другому формировать его надо что ли.
Или выборку делать по иному.
25 1Страх
 
15.10.12
10:42
Rs.Fields("nomer").Value
Rs.Fields(1).Value
26 GANR
 
15.10.12
10:52
(9) Я имею ввиду, что из себя представляют переменные Rs и Fields? Как они выглядят в табло и какие поля включают в себя? Эта информация существенно помогла-бы следствию :).
27 hhhh
 
15.10.12
10:53
(23) надо в круглых скобках и не 1, а 0

Rs.Fields(0).Value
29 Aswed
 
15.10.12
11:13
Переделал вот так, всё стало работать

   ТекстЗапроса = "select cars.id as id, cars.nomer as nomer from cars";
   
   Команда = Новый COMОбъект("ADODB.Command");
   Команда.ActiveConnection = Соединение;
   Команда.CommandText = ТекстЗапроса;
   
   НаборЗаписей = Новый COMОбъект("ADODB.Recordset");
   НаборЗаписей = Команда.Execute();
       
   Пока НаборЗаписей.EOF() = 0 Цикл
       Запись=НаборЗаписей.Fields("nomer").Value;
       НаборЗаписей.MoveNext();
   КонецЦикла;
30 Aswed
 
15.10.12
11:58
А как транслировать такой запрос, построенный в IBExpert, под 1С

select
   "DBVersion"."Major",
   "DBVersion"."Minor",
   "DBVersion"."Build",
   "DBVersion"."Revision",
   "DBVersion"."Description"
from "DBVersion"
31 GANR
 
15.10.12
12:05
(30) Начиная с 8.2.14 имеется механизм ВнешниеНаборыДанных (см. справку). В более старых версиях - ТаблицаЗначений поможет. Только колонки ТЗ не забудь протипизировать перед помещением в запрос - иначе ошибка.
32 Aswed
 
15.10.12
12:09
(31) Может ВнешниеИсточникиДанных?
33 Aswed
 
15.10.12
12:10
(31) А как через ТЗ? Что то я ни разу такого не делал.
Примерчик где глянуть не подскажешь?
34 GANR
 
15.10.12
12:11
(32) да-да опечатался
35 Aswed
 
15.10.12
12:14
(34) Типовую конфу править не хочу. Потому и шаманю с внешней обработкой)
36 GANR
 
15.10.12
12:21
(33) вот

ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("ТвояКолонка1", Новый ОписаниеТипов("Строка"));
ТЗ.Колонки.Добавить("ТвояКолонка2", Новый ОписаниеТипов("Число"));

// <... заполняешь ТЗ как тебе надо из твоего ADODB.Recordset... >

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Параметры.Вставить("ТЗ", ТЗ);

Запрос.Текст =
"ВЫБРАТЬ
|    ТЗ.ТвояКолонка1,
|    ТЗ.ТвояКолонка2
|ПОМЕСТИТЬ ТЗ
|ИЗ
|    &ТЗ КАК ТЗ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    ТЗ.ТвояКолонка1,
|    ТЗ.ТвояКолонка2
|ИЗ
|    ТЗ КАК ТЗ";

// ну а дальше в рамках запроса можно играться с ТЗ как угодно :-)

Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
37 GANR
 
15.10.12
12:23
(33) Но если речь пойдет про внешний отчет на СКД, куда нужно гнать данные из ТЗ, то тут придется внешние НАБОРЫ данных уже делать.
38 Aswed
 
15.10.12
12:24
(36) С фаирбёрдом разве можно туда пихать ТЗ?
39 GANR
 
15.10.12
12:30
(38) Работа ведется в 3 приема:
1. ТЗ заполняешь из ADODB.Recordset
2. пихаешь ТЗ в запрос
3. работаешь с ТЗ в запросе

В (36) строка
// <... заполняешь ТЗ как тебе надо из твоего ADODB.Recordset... >

означает примерно следующее

Пока НаборЗаписей.EOF() = 0 Цикл
   СтрокаТЗ=ТЗ.Добавить();
   СтрокаТЗ.nomer = НаборЗаписей.Fields("nomer").Value;
   НаборЗаписей.MoveNext();
КонецЦикла;
40 Aswed
 
15.10.12
12:34
(39) Мы видать не поняли друг друга))))

У меня вопрос в том как запрос к базе файирбёрд вида

select
   "DBVersion"."Major",
   "DBVersion"."Minor",
   "DBVersion"."Build",
   "DBVersion"."Revision",
   "DBVersion"."Description"
from "DBVersion"

Выполнить из под 1С
)))))

Просто на такую строку запроса

ТекстЗапроса = "select
   |"DBVersion"."Major",
   |"DBVersion"."Minor",
   |"DBVersion"."Build",
   |"DBVersion"."Revision",
   |"DBVersion"."Description"
|from "DBVersion";

Закономерно ругается.
41 Aswed
 
15.10.12
12:35
+40 ругается из-за ковычек само собой, а без ковычек запрос не выполняется)
42 Джон Тирби
 
15.10.12
12:41
Гдето валалась обработка ADO Demo ..тут ее не раз упоминали..юзай ее для проверки..мне помогала
43 GANR
 
15.10.12
12:42
(41) Ага. А так???

ТекстЗапроса = "select
   |""DBVersion"".""Major"",
   |""DBVersion"".""Minor"",
   |""DBVersion""."Build"",
   |""DBVersion"".""Revision"",
   |""DBVersion""."""Description"
|from ""DBVersion"";

Чтобы в 1С в текст добавить кавычку надо "" использовать.
44 GANR
 
15.10.12
12:43
(43) Пардон, кое-где кавычки пропустил, но, думаю (41), понятно о чем речь?
45 GANR
 
15.10.12
12:53
Вот так (41) будет без ошибок
ТекстЗапроса = "select
   |""DBVersion"".""Major"",
   |""DBVersion"".""Minor"",
   |""DBVersion"".""Build"",
   |""DBVersion"".""Revision"",
   |""DBVersion"".""Description""
   |from ""DBVersion""";
46 Aswed
 
15.10.12
14:04
(45) Точно, Сработало!
Спасибо.
А сам когда так пытался что то ошибку выдавала, видать сам где то запятую пропустил)