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