Имя: Пароль:
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) Точно, Сработало!
Спасибо.
А сам когда так пытался что то ошибку выдавала, видать сам где то запятую пропустил)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший