Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2009, 11:28   #1
eda
Пользователь
 
Регистрация: 14.08.2008
Сообщений: 78
По умолчанию автоматическое обновление таблице через запрос sql

Здравствуйте! Подскажите, пожалуйста, как выполнить следующую задачу:
с помощью кнопки в панели excel нужно создать таблицу с данными из бд, которая должна обновляться каждые 5 секунд за счет большого sql-запроса. Заранее спасибо! Буду очень благодарна за любые советы и помощь!
eda вне форума Ответить с цитированием
Старый 15.04.2009, 12:22   #2
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
По умолчанию

Цитата:
Сообщение от eda Посмотреть сообщение
Здравствуйте! Подскажите, пожалуйста, как выполнить следующую задачу:
с помощью кнопки в панели excel нужно создать таблицу с данными из бд, которая должна обновляться каждые 5 секунд за счет большого sql-запроса. Заранее спасибо! Буду очень благодарна за любые советы и помощь!
Все зависит от того что вы подразумеваете под БД. Если это MS SQL, Access, DBF. PARADOX то все достаточно просто
необходиом сделать примерно так
Код:
Dim UserName As String
Dim UserPswd As String
Dim sqlserver As String
dim s at string
dim s1 as string
...
Set oConn = CreateObject("ADODB.Connection")
Set oRes = CreateObject("ADODB.Recordset")
Set oCmd = CreateObject("ADODB.Command")
 s = "Provider=SQLOLEDB.1;Password=" & UserPswd & ";Persist Security 
Info=True;User ID=" & UserName & ";Initial Catalog=e6work;Data Source=" + 
sqlserver + ";Connect Timeout=" + CStr(timeout)
oConn.Open s
s = "exec ***" (с какой внутренней базы)
oCmd.ActiveConnection = oConn
oCmd.CommandText = s
oCmd.Execute
    
s1 = "select *** as *** from *** order ***" (вместо звездочек запрос)
oRes.Open s, oConn
If Not oRes.EOF Then
  Do While Not oRes.EOF
      x= возвращенная переменная после запроса
      oRes.MoveNext
  Loop
endif
oRes.Nothing
private SUB ras()
...
Application.Wait (Now + TimeValue("00:00:05"))
oRes.Open s, oConn
If Not oRes.EOF Then
  Do While Not oRes.EOF
      x= возвращенная переменная после запроса
      oRes.MoveNext
  Loop
End If

...
END Function
Если БД - Excel, незнаю ка кдолжен выглядеть прога.

ЧТо же касается кнопки. то для этого нужно в модуле написать следующую программу
Код:
Set cbar1 = CommandBars.Add(Name:="Custom1", Position:=msoBarTop)
      cbar1.Visible = True
  
  Set myControl = Application.CommandBars("Custom1").Controls.Add(Type:=msoControlButton)
  With myControl
      .Style = msoButtonCaption
      .Caption = "<КНОПКА1>"
      .OnAction = "msoControlButton_onClick"
  End With


Sub msoControlButton_onClick4()
  ClearHourEng
  ThisWorkbook(1).ras
End Sub
Юнлинг вне форума Ответить с цитированием
Старый 15.04.2009, 12:26   #3
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

sub Each5Sek
QueryTables(...).Refresh
Application.OnTime Now + TimeValue("00:00:05"), "Each5Sek"
end sub

запрос сформируйте вручную, 1 раз. вместо троеточия напишите номер или имя (в кавычках "") вашего запроса
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 15.04.2009 в 12:29.
IgorGO вне форума Ответить с цитированием
Старый 15.04.2009, 12:28   #4
eda
Пользователь
 
Регистрация: 14.08.2008
Сообщений: 78
По умолчанию

Цитата:
Сообщение от Юнлинг Посмотреть сообщение
Все зависит от того что вы подразумеваете под БД. Если это MS SQL, Access, DBF. PARADOX то все достаточно просто
необходиом сделать примерно так
БД - таблица в MySQL
eda вне форума Ответить с цитированием
Старый 15.04.2009, 13:33   #5
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
По умолчанию

Цитата:
Сообщение от eda Посмотреть сообщение
БД - таблица в MySQL
Чтобы получить строчки для запроса необходимо запустить макрорекодер и вручную прочитать один раз нужную таблицу из MySQL. После останова макрорекодера вы получите в макросе все необходимое для своей проги.
Юнлинг вне форума Ответить с цитированием
Старый 15.04.2009, 13:52   #6
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
sub Each5Sek
QueryTables(...).Refresh
Application.OnTime Now + TimeValue("00:00:05"), "Each5Sek"
end sub

запрос сформируйте вручную, 1 раз. вместо троеточия напишите номер или имя (в кавычках "") вашего запроса
IgorGO.
Вы правы у Вас короче. и выполняет все что нужно, но есть одно маленькое но. В связи с эти м я хотел бы задать Вам вопрос.
Действительно один раз сформировать запрос и с помощью QueryTables получить данные лучше, но если в самом запросе есть переменные величины (типа промежуток времени, признак предмета и т.д.) то КАК изменять эти величины в ODC запросе? Читать файл и изменять и записывать - при коротких интервалах изменения ???

В свое время я пытался использовать такой подход. И когда нужно было обновлять данные каждые три минуты, проблем не было, но когда мне возникла необходимость было обновлять каждые 15 секунд массив из 3(дня)х24(час)х60(мин)х4(кол-во 15секундных интервалов в мин) = 17280. То мне это неудалось, даже при использовании макросов чтения из БД. Пришлось немного изгольнуться удалять первую строчку и читать последние данные из SQL сервера.

А у человека задавшего вопрос еще более короткий интервал. и если нужно будет читать большой массив данных, то я не знаю. будет ли это рабоать.

Последний раз редактировалось Юнлинг; 15.04.2009 в 14:02.
Юнлинг вне форума Ответить с цитированием
Старый 15.04.2009, 14:00   #7
eda
Пользователь
 
Регистрация: 14.08.2008
Сообщений: 78
По умолчанию

Спасибо за помощь!
И если воможно, дайте, пожалуйста, какие-нибудь ссылки на описание sql-запросов с использованием crosstab
eda вне форума Ответить с цитированием
Старый 16.04.2009, 12:45   #8
eda
Пользователь
 
Регистрация: 14.08.2008
Сообщений: 78
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
sub Each5Sek
QueryTables(...).Refresh
Application.OnTime Now + TimeValue("00:00:05"), "Each5Sek"
end sub

запрос сформируйте вручную, 1 раз. вместо троеточия напишите номер или имя (в кавычках "") вашего запроса
Скажите, пожалуйста, а как выйти из этой рекурсии?
eda вне форума Ответить с цитированием
Старый 19.04.2011, 12:47   #9
civic
 
Регистрация: 18.04.2011
Сообщений: 8
По умолчанию

А как сделать чтобы по нажатию кнопки происходило обновление данных в таблице? Спасибо, сори за нубство.
civic вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматическое обновление программы Paul Hindenburg Работа с сетью в Delphi 23 06.09.2011 15:51
Автоматическое изменение количества строк в таблице THE_ENGINEER Microsoft Office Excel 7 19.10.2008 21:28
SQL запрос Uomo БД в Delphi 17 23.04.2008 14:12
Поиск через запрос Таня84 БД в Delphi 1 17.02.2007 02:52
SQL запрос на основе другого SQL запрса... Timoxa БД в Delphi 1 07.01.2007 18:15