[РЕШЕНО] Выполнение скрипта, записанного в поле таблицы

Автор adi_den2013, 14 октября 2013, 10:01

0 Пользователи и 1 гость просматривают эту тему.

adi_den2013

Создана таблица SQL, в которой в поле ZAPROS находятся скрипты для обновления другой таблицы. Как вызвать их все на выполнение. Я предполагаю через массив  :roll:?

Макрос:
Sub SPR_CHETA
Dim script As String
Dim oStatement As Object
Dim oDBSource As Object
Dim oConnection As Object
Dim oDatabaseContext As Object
Dim stroka_Array() As string           'массив
Dim I As Integer                                    'счетчик
'
oDatabaseContext = createUnoService( "com.sun.star.sdb.DatabaseContext" )
oDBSource = oDatabaseContext.GetByName("balans")
oConnection = oDBSource.GetConnection("", "")  
oStatement = oConnection.createStatement()
oStatement.ResultSetConcurrency = com.sun.star.sdbc.ResultSetConcurrency.UPDATABLE
script="SELECT ""SQL"".""ZAPROS"" FROM ""SQL"""
oStatement.executeQuery(script)

FOR I=1 TO ........
stroka_Array(I)=........
oStatement.executeQuery(stroka_Array(I))
NEXT I

End Sub


Подскажите, как реализовать запись в массив? Спасибо.

[вложение удалено Администратором]
Яна (in real)

adi_den2013

#1
В продолжение темы...


FOR I=1 TO 12
     script="SELECT ""SQL"".""ZAPROS"" FROM ""SQL"" WHERE ""ID"" ="&STR(I)
     oResult2=oStatement.executeQuery(script)
     MsgBox oResult2.getString(1)
     header=""
     header=oResult2.Columns.ElementNames(0)
     MsgBox "Выполняется скрипт: "&str(I)
'      oStatement.executeQuery("")                         <---------------|
NEXT I                                                                                    
End Sub        



oResult2.GetString(1) выдает ошибку  

[вложение удалено Администратором]
Яна (in real)

JohnSUN

#2
А ты не хочешь сразу после .executeQuery(script) но до попытки что-нибудь получить с помощью .getString(1) выполнить еще и метод .next() для oResult2?

(Кстати, этот самый .next() возвращает TRUE, если ты еще не вывалился за последнюю запись. Здесь предлагают перебор записей вообще делать по условию "Result вернул хоть что-то и удалось сдвинуться на следующую запись")
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

adi_den2013

#3
Цитата: JohnSUN от 15 октября 2013, 16:24
А ты не хочешь сразу после .executeQuery(script) но до попытки что-нибудь получить с помощью .getString(1) выполнить еще и метод .next() для oResult2?
Даже если результат выполнения скрипта - 1 запись?


П.С.
СПАСИБО!!!!!!!!  ЗАРАБОТАЛО!!!!!!! :beer:

Я видела в примере, но почему-то решила, что при уникальности результата запроса он мне не понадобится  :-[. Ан нет - нужон  ;)

Яна (in real)

JohnSUN

Внимательно прочитай образец кода по ссылке. Видишь? Можно не выполнять предварительный COUNT и не крутить цикл по нему. Можно сразу выдрать из таблицы все нужные строки и, если получили хоть одну, крутить цикл пока .next() будет TRUE... И макрос получится короче, и обращений к данным меньше...

(Сразу после .executeQuery указатель будет стоять beforeFirst - ДО первой записи)
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

adi_den2013

Ага.

Так вроде у меня тоже условие есть : WHERE ID=STR(I)  ;)
Яна (in real)

JohnSUN

Да, я видел  ;D

Этот Where сидит в Select'е, чтобы выдрать из таблицы одну-единственную запись... двенадцать раз подряд...
Я имел в виду, что можно заменить FOR на WHILE: одним "SELECT ""ZAPROS"" FROM ""SQL"" ORDER BY ""ID""" получить все записи, отсортированными по возрастанию ID, и перебрать их в цикле...
Но, если честно, я так и не понял общей задумки всех этих UPDATE'ов...
"Я понял – это намек, я все ловлю на лету. Но непонятно, что конкретно ты имела в виду..."  ;D
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

adi_den2013

Цитата: JohnSUN от 15 октября 2013, 17:23
Но, если честно, я так и не понял общей задумки всех этих UPDATE'ов...

О-о-о-о это .... далее следует непередаваемая игра слов(с)

В общем смысл таков: существует Государственный план счетов и существует справочник счетов, используемых бухгалтерами только моего предприятия. Т.е. он плавающий. В этом месяце они счетом пользуются, а в следующем - нет. Или могут создавать промежуточные счета для учета и тогда привязка по первичному ключу в таблице "СПРАВОЧНИК СЧЕТОВ" летит к чертовой матери (извините за мой фр.). Потому, что в распечатке баланса почти все разбито по группам (причем конкретным группам!). Подбивка итогов, я имею ввиду. Но некоторые счета не суммируются, а выводятся "как есть".

Поэтому - я вначале определяю переменную VALUE в таблице в таком виде, чтобы новый счет при появлении попадал именно в ту группу, куда нужно и главное в распечатке именно в то место. Другого решения я пока не нашла. Единственное - придется мне научить пользователя  :roll: правильно работать с формой для занесения нового счета.

Не совсем четко и красиво, но зато работает. Вот  :)
Яна (in real)

JohnSUN

Просто обратил внимание, что каждая из двенадцати строк в поле ZAPROS начинается со слов
UPDATE ""СПРАВОЧНИК СЧЕТОВ"" SET ""VALUE""=
Их можно, наверное, не в таблице хранить, а прямо в макросе:
oStatement.executeQuery("UPDATE ""СПРАВОЧНИК СЧЕТОВ"" SET ""VALUE""="+oResult2.getString(1))
Как, впрочем, и все 12 текстов запросов полностью...
Да, пока они в таблице, можно не меняя код изменять поведение программы...
Но, чтобы изменить тексты запросов в таблице, знаний нужно ничуть не меньше, чем для их изменения в теле макроса?..
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

adi_den2013

Знания нужны те же.
Синтаксис в макросе мне не очень нравится: двойные кавычки в именах полей и названиях таблиц сильно загружают визуально  >:(. А в строках таблицы скрипт я переделала, т.к. как выглядит в SQL (потому, что это переменная и передается целиком в макрос). Мне просто легче воспринимать его "на глаз"  ;)
Яна (in real)