Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
24.04.2024, 21:37:20

Войти
На форуме добавлена возможность подписки на RSS-ленты любого раздела форума. Подписаться можно, нажав на иконку RSS , расположенную левее наименования раздела.
33 242 Сообщений в 5 457 Тем от 6 761 Пользователей
Последний пользователь: Halfdoor
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Excel и VBA
| | |-+  Вызов хранимой процедуры PostgreSQL, возвращающей множество
Страниц: [1]   Вниз
Печать
Автор Тема: Вызов хранимой процедуры PostgreSQL, возвращающей множество  (Прочитано 3593 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Samyrro054
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 6


Просмотр профиля E-mail
« : 20.02.2020, 17:43:56 »

Здравствуйте, подскажите, как в VBA вызвать функцию PostgreSQL, возвращающую множество. Стандартным способ через запись в Recordest не получается, выдаёт ошибку: "Функция, возвращающая множество, вызвана в контексте, где ему нет места".

Код: (vb)
Private Sub CommandButton1_Click()
Dim MyConnect As String
Set ConnPGSQL = New ADODB.Connection
DoEvents
UPSQL = Trim(Auth.TextBox3.Text)
PPSQL = Trim(Auth.TextBox4.Text)
PGServer = Trim(Auth.TextBox1.Text)
pgDB = Trim(Auth.TextBox2.Text)
MyConnect = "Provider=MSDASQL.1;Password=" & PPSQL & ";Persist Security Info=True;User ID=" & UPSQL & ";Extended Properties='DRIVER={PostgreSQL ANSI};DATABASE=" & pgDB & ";SERVER=" & PGServer & ";PORT=5432;UID=" & UPSQL & ";PWD=" & PPSQL & ";SSLmode=disable;ReadOnly=1;Protocol=7.4;FakeOidIndex=0;ShowOidColumn=0;RowVersioning=0;ShowSystemTables=0;ConnSettings=;Fetch=100;Socket=4096;UnknownSizes=0;MaxVarcharSize=255;MaxLongVarcharSize=8190;Debug=0;CommLog=0;Optimizer=1;Ksqo=1;UseDeclareFetch=0;TextAsLongVarchar=1;UnknownsAsLongVarchar=0;BoolsAsChar=1;Parse=0;CancelAsFreeStmt=0;ExtraSysTablePrefixes=dd_;LFConversion=1;UpdatableCursors=1;DisallowPremature=0;TrueIsMinus1=0;BI=0;ByteaAsLongVarBinary=0;UseServerSidePrepare=0;LowerCaseIdentifier=0;XaOpt=1;AB=10;';Initial Catalog=" & pgDB

If ConnPGSQL.State <> adStateOpen Then
   With ConnPGSQL
    .Mode = adModeRead
    .CursorLocation = adUseClient
    .Open MyConnect
    End With
End If

Dim RCSTemp As New ADODB.Recordset
Dim sQ As String
sQ = "SELECT find_all('380999999999')"
RCSTemp.Open sQ, ConnPGSQL, adOpenDynamic, adLockBatchOptimistic, adCmdText
TextBox1.Text = Trim(RCSTemp.Fields(0).Value)

End Sub

Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #1 : 20.02.2020, 17:56:40 »

Ищите ошибку в функции. Возможно, там внутри неправильно применен агрегатор или вывод сделан изначально неправильно.
В любом случае проблема в самой функции и нужен её текст тоже.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Samyrro054
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 6


Просмотр профиля E-mail
« Ответ #2 : 20.02.2020, 18:12:25 »

Ошибка не в функции это точно. Есть программа которая успешно её использует, но у меня нет исходников этой проги, чтобы узнать, как она получает данные из запроса
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #3 : 20.02.2020, 18:39:05 »

Ошибка не в функции это точно
откуда такая уверенность? Может эта функция просто не предназначена для использования так, как Вы хотите? Для начала надо хотя бы понимать что вообще функция возвращает и в каком виде, а уже потом пробовать применять.
программа которая успешно её использует
Видимо, она правильно её использует, передает правильные параметры и возможно, вообще не через Recordset это делает.
Вы кроме этого текста "Функция, возвращающая множество, вызвана в контексте, где ему нет места" никаких дополнительных данных об ошибке не получаете? И на какой строке? Сразу на Open?

Я бы вообще посоветовал на более профильный форум обратиться(по SQL). Хотя без текста функции вероятность получения ответа стремится к нулю.
« Последнее редактирование: 20.02.2020, 18:40:36 от Дмитрий Щербаков(The_Prist) » Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
Samyrro054
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 6


Просмотр профиля E-mail
« Ответ #4 : 20.02.2020, 19:10:03 »

Ошибка сразу на Open, функция ОЧЕЕЕНЬ большая и сложная, это БД какой-то корпорации, она связана с большим кол-вом других больших функций. Но её суть одна - она собирает кучу данных из разных таблиц и в теле функции много раз написано select собранная инфа INTO _result; RETURN NEXT _result;
Записан
Страниц: [1]   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru