Имя: Пароль:
1C
1С v8
Запрос к внешнему источнику
0 AnisaL
 
23.12.13
08:37
ДОброе утро!
Пытаюсь сделать запрос к внешнему источнику -базе данных биллинга.
    Запрос.Текст =
        "ВЫБРАТЬ ПЕРВЫЕ 20
        |    payment.pid,
        |    payment.db,
        |    payment.prid,
        |    payment.lm
        |ИЗ
        |    ВнешнийИсточникДанных.Freedom.Таблица.payment КАК payment
        |ГДЕ
        |    payment.pid В(&pid)";
1 AnisaL
 
23.12.13
08:38
(0) +    Запрос.УстановитьПараметр("pid", pid);
2 MKZM
 
23.12.13
08:38
И?
3 AnisaL
 
23.12.13
08:38
(1) pid - массив чисел
4 MKZM
 
23.12.13
08:39
А дальше?
5 AnisaL
 
23.12.13
08:39
(2) Выдает ошибку
{Обработка.ЗагрузкаДанныхИзБиллинга.Форма.Форма.Форма(4006)}: Ошибка при вызове метода контекста (Выполнить)
    РезультатЗапроса = Запрос.Выполнить();
по причине:
Ошибка выполнения запроса
по причине:
Ошибка внешней базы данных:
ошибка при выполнении запроса
по причине:
Ошибка ODBC. SQLSTATE: HY000
Номер ошибки: 1044
Описание: [MySQL][ODBC 5.2(a) Driver][mysqld-5.5.31-55-log]Access denied for user '1c'@'ляляля' to database 'freedom'
6 MKZM
 
23.12.13
08:39
Понедельник, однако.
7 MKZM
 
23.12.13
08:40
В MySQL есть "ВЫБРАТЬ ПЕРВЫЕ 20? Прости давно с ним работал, забыл.
8 х86
 
23.12.13
08:40
(5)>>Access denied for user

а от нас то что ?
9 AnisaL
 
23.12.13
08:41
(6) самое интересное, что когда ставлю в запрос одно число, то он срабатывает :
    Запрос.УстановитьПараметр("pid", pid[0]);
10 MKZM
 
23.12.13
08:41
Access denied for user '1c'@'ляляля' to database 'freedom'
11 AnisaL
 
23.12.13
08:41
(8) дело не в этом, тут ошибка в запросе
12 AnisaL
 
23.12.13
08:42
(11) + или же вообще условие убираю, то запрос срабатывает.. А про доступ, я уже проверяла - доступ открыт
13 AnisaL
 
23.12.13
08:43
(7) да есть - там пишется LIMIT 20
14 Defender aka LINN
 
23.12.13
08:44
(5) рукалицо...
15 MKZM
 
23.12.13
08:47
Ошибка: 1044 SQLSTATE: 42000 (ER_DBACCESS_DENIED_ERROR)

Сообщение: Для пользователя '%s'@'%s' доступ к базе данных '%s' закрыт
16 AnisaL
 
23.12.13
08:49
(15) я подходила к сисадмину - он проверил - доступ открыт на селект
17 Defender aka LINN
 
23.12.13
08:51
(16) Ну пусть он это громко и четко скажет в монитор тогда, а то СУБД с ним не согласна
18 х86
 
23.12.13
08:52
(16)значит криво настроил
19 MKZM
 
23.12.13
08:52
(17)    ))
20 AnisaL
 
23.12.13
09:01
(18) подошла еще раз - сказал что еще раз посмотрит
21 AnisaL
 
23.12.13
09:10
(20) вообщем он мне дал полные права и запрос сработал!
22 AnisaL
 
23.12.13
09:21
(21) + а теперь он переживает.что дал полные права, боится что я там с базой что-ниб наделаю.. так если через внешний источник подключаться, то я никак не смогу ведь там с данными ничего сделать кроме как прочесть их через select, ведь так?
23 х86
 
23.12.13
09:31
(22)через адо коннект сможешь всё грохнуть
24 MKZM
 
23.12.13
09:37
(22) Если боится, пусть настроит как надо.
25 AnisaL
 
23.12.13
10:21
(23) понятно, значит через внешний источник безопасно
26 Wobland
 
23.12.13
10:29
(25) читай про адо, delete и update. докажи админу, что он был прав
27 Kerk
 
23.12.13
10:47
(26) Надо круче! Вот справка:
Формат запроса:
DROP {DATABASE | SCHEMA} [IF NOT EXISTS] database_name

В запросе используются обязательные параметры:

DATABASE - указывает на то что будет удалена база данных.

SCHEMA - синоним параметра DATABASE

database_name - название удаляемой базы данных

В запросе используются необязательные параметры:

IF NOT EXISTS - указывает что удаление базы данных следует производить только в том случае если база существует. Если попытаться удалить несуществующую базу данных без параметра IF NOT EXISTS, то результатом выполнения запроса будет ошибка (подробнее в разделе коды ошибок в MySQL).

Пример:
DROP DATABASE hosting_provider

Данный запрос удалит базу данных hosting_provider. Если база данных hosting_provider не существует то результатом выполнения будет ошибка Can't drop database 'hosting_provider'; database doesn't exist.
28 Wobland
 
23.12.13
10:51
отлично! по ветке "постоянно удаляется база" узнаем, кто у ней админ
29 х86
 
23.12.13
10:52
(18)+ скорее всего нет доступа к к.л. служебным таблицам (темп диби или еще что-то), хз как оно там устроено в майскуле

поэтому просто запрос выполняется, а топ 20 в отказ уходит
30 AnisaL
 
23.12.13
10:59
(29) немного не так: запрос выполняется и без топ 20, а вот не выполняется когда условие стоит что pid в массиве значений, причем запрос- то у меня сработал, но он оказался пустой..массив значений не потянул - он слишком большой  - 242  
значения.. потом я сделала запрос в цикле - сначала в массив pid попадают числа от 1 до 50 (их получается порядка 40), потом от 51 до 100 и т.д.
31 МихаилМ
 
23.12.13
11:03
пусть админ даст право на создание ВТ
либо на доступ к tempdb, если в mysql есть аналог
32 Trotter
 
23.12.13
11:06
А так будет работать ?)
Запрос.УстановитьПараметр("pid", pid[]);
33 AnisaL
 
23.12.13
11:07
(31) вряд ли он знает как такое можно настроить
34 х86
 
23.12.13
11:09
(33)тогда ждем (28)  )
35 AnisaL
 
23.12.13
11:12
(34) ну вообще-то я кроме селекта к внешнему источнику никаких операций не делаю..никаких там alter, drop
36 Wobland
 
23.12.13
11:19
(35) а платформа тебе не даст, тут более другая магия потребна
37 Kerk
 
23.12.13
11:23
(35) Интересно, у тебя MySQL понимает запросы с "ИЗ" и "ГДЕ"?
Если не секрет, можно код процедуры с запросом к MySQL...
38 МихаилМ
 
23.12.13
11:30
(37)
это 1с объект "внешний источник данных"
39 Wobland
 
23.12.13
11:39
(37) там платформа толмачит
40 AnisaL
 
23.12.13
12:02
(32) так ругается
{Обработка.ЗагрузкаДанныхИзБиллинга.Форма.Форма.Форма(4013,39)}: Ожидается выражение
    Запрос.УстановитьПараметр("pid", pid[<<?>>]);     (Проверка: Тонкий клиент)
41 Wobland
 
23.12.13
12:06
(40) всё правильно. я бы тоже ожидал
42 Kerk
 
23.12.13
12:13
(41) :) "Ожидайте..., прог думает".
А массив в строку не кошерно?
43 AnisaL
 
23.12.13
12:15
(42) какая функция?
44 AnisaL
 
23.12.13
12:26
(43) + и что это даст?
45 Kerk
 
23.12.13
12:29
(44) Сами же писали (9), может проблема в массиве? Может он не передается во "ВнешнийИсточникДанных"...
46 AnisaL
 
23.12.13
12:40
(45) по моим данным проблема не в массиве как таковом, а в количестве в нем элементов, если их количество превышает какое-то значение, то запрос выдает пустоту
47 AnisaL
 
23.12.13
12:44
(45) ну и если поместить массив в строку, то получится 1,3,5,17,19,20,21,...221 Потом как ты в нем будешь искать подобие?
48 Kerk
 
23.12.13
12:49
(47) "payment.pid В(&pid)"
Пардон, где тут "Подобно"?


Да и ещё вопросик... Зачем "ВЫБРАТЬ ПЕРВЫЕ 20", если в запросе нет сортировки?
49 AnisaL
 
23.12.13
12:52
(48) ну потому что ищется значение в массиве, а если ты предлагаешь массив преобразовать в строку, то как ты будешь в ней искать это значение? первые 20 - это можно смело убрать, я загружала платежи для отладки, чтобы все не грузить
50 Серго62
 
23.12.13
12:58
(49) ну фиг знает как это в my sql работает, в ms sql вот такое условие Field in ('1,2,3,4,5,6') замечательно работает, даже если Field имеет числовой тип...
51 Trotter
 
23.12.13
12:58
А если зациклить переменную и забабахивать её вот Запрос.УстановитьПараметр("pid", pid[сюды]);
будет получатся
Запрос.УстановитьПараметр("pid", pid[0]);
Запрос.УстановитьПараметр("pid", pid[1]);
Запрос.УстановитьПараметр("pid", pid[2]);
потом в эту переменную записывать полученное числи и это число складировать куда нито ?) Потом обнулять переменную и потом записывать в неё число(номер) прохода цикла и останавливать пока переменная попадаемая в [] не станет равна null?)
52 Kerk
 
23.12.13
12:59
(49)
Из справки:

<Выражение> [НЕ] В [ИЕРАРХИИ] ( <Список значений> | <Массив значений> ) |

P.S. от меня...
Список значений может выглядеть так "1,3,5" и так найдутся элементы справочника с кодами равными "1" и "3" и "5".
53 Kerk
 
26.12.13
11:10
ТС после корпоратива в интернет не пускают :)
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn