Страницы: 1
RSS
Выборка по дате из SQL базы данных макросом
 
Здравствуйте, имеем базу данный MS sql 2005, содержащую данные типа  datatime и числовые данные. Необходимо выполнить запрос и фильтрацию по любому дню вбивая его в поле excel
 
т.е Суточная ведомость за определенный день. Прикрепленный файл не работает ((
 
ТОесть Вам нужно отобрать значения из базы данных через SQL запрос?  
 
ЕЕсли да, то следующая процедура:  
1. У вашего пользователя должны быть прова на доступ к базе.  
2. С помощью макрорекодыра можно записать процедуру подключения к базе данных.  
3. Далее написать SQL запрос и вставить его в соответствующее место в коде.  
4. И будет вам счастье.  
 
для своих нужд я использую такой код, так же записаный с помощью макро рекодера и отредактированный под мои требования.  
Sub SQLforDB(iPathSQL As String, iPathCon As String, NameSQL As String)  
Dim SQLtxt As String  
Dim StrConDB As String  
Dim WB As Object  
Dim BoolContr As Boolean  
BoolContr = WorkBooksList(NameSQL)  
If BoolContr = False Then  
Set WB = Workbooks.Add(1): Workbooks.Add: ActiveSheet.Name = NameSQL: Sheets(2).Name = "Вспомогательный лист"  
   'Получение SQL запроса в текстовую переменную  
   SQLtxt = FilterchangeTXT(OpenTXTFile(iPathSQL))  
   'Получение строки подключения в текстовую переменную  
   StrConDB = OpenTXTFile(iPathCon)  
   'Добавление объекта на лист(таблицы) с настроинным подключением к базе и запросом  
   WB.Close  
   With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=StrConDB, Destination:=Range("$A$1")).QueryTable  
       .CommandType = xlCmdSql  
       .CommandText = SQLtxt  
       .RowNumbers = False  
       .FillAdjacentFormulas = False  
       .PreserveFormatting = True  
       .RefreshOnFileOpen = False  
       .BackgroundQuery = True  
       .RefreshStyle = xlInsertDeleteCells  
       .SavePassword = False  
       .SaveData = True  
       .AdjustColumnWidth = True  
       .RefreshPeriod = 0  
       .PreserveColumnInfo = True  
       .ListObject.DisplayName = "Таблица_db_0_0_ITSPR"  
       .Refresh BackgroundQuery:=False  
   End With  
Else  
   ActiveWorkbook.RefreshAll  
End If  
End Sub
 
1. Доступ есть    
2. Сделать подключение не проблема, тут все понятно  
3. Дело как раз в SQL запросе, необходимо иметь поле где вбивается дата для SQL запроса, и не ясен сам SQL запрос с выборкой времени.  
 
Sub Ìàêðîñ1()  
'  
' Ìàêðîñ1 Ìàêðîñ  
'  
 
'  
   With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _  
       "ODBC;DSN=PowerLink;APP=Microsoft Office 2010;WSID=EKRA-E47C31D417;DATABASE=Powerlink;Trusted_Connection=Yes" _  
       , Destination:=Range("$A$1")).QueryTable  
       .CommandText = Array( _  
       "SELECT PL_TREND_REPORT.timestamp, PL_TREND_REPORT.D400ARO_03_VAL0" & Chr(13) & "" & Chr(10) & "FROM Powerlink.dbo.PL_TREND_REPORT PL_TREND_REPORT" _  
       )  
       .RowNumbers = False  
       .FillAdjacentFormulas = False  
       .PreserveFormatting = True  
       .RefreshOnFileOpen = False  
       .BackgroundQuery = True  
       .RefreshStyle = xlInsertDeleteCells  
       .SavePassword = False  
       .SaveData = True  
       .AdjustColumnWidth = True  
       .RefreshPeriod = 0  
       .PreserveColumnInfo = True  
       .ListObject.DisplayName = "Òàáëèöà_Çàïðîñ_èç_PowerLink"  
       .Refresh BackgroundQuery:=False  
   End With  
     
End Sub  
Во так я подключаюсь к базе в вывожу ее в excel, но мне нужно вывести информацию с определенной произвольной датой.
 
Дело в том что тот фильтр что я прекрепил выше не работает:( и реализован он на фильтрации произведенного запроса SQL
 
Допустим у вас есть SQL запрос вида  
Select *  
Form MySQLDB  
Where MySQLDB>GetDate-7  
Его вы сохраняете в переменню в коде таким образом  
SQLstr="Select * Form MySQLDB Where MySQLDB>GetDate-7"  
Допустим у васт есть форма на которой будет два текстовых поля, где вы и будете вводить параметры.  
 
if iTextBox1<>"" then SQLstr=Replace(SQLtxt,"MySQLDB>GetDate-7","MySQLDB>" & iTextBox1.text)  
if iTextBox2<>"" then SQLstr=SQLstr & " and MySQLDB<" & iTextBox2.text  
а далее уже совершать запрос. только нужно следить за правельностью ввода даты
 
Допустим у вас есть SQL запрос вида  
Select *  
Form MySQLDB  
Where MySQLDB.datetime>GetDate-7  
Его вы сохраняете в переменню в коде таким образом  
SQLstr="Select * Form MySQLDB Where MySQLDB.datetime>GetDate-7"  
Допустим у васт есть форма на которой будет два текстовых поля, где вы и будете вводить параметры.  
 
if iTextBox1<>"" then SQLstr=Replace(SQLtxt,"MySQLDB.datetime>GetDate-7","MySQLDB.datetime>" & iTextBox1.text)  
if iTextBox2<>"" then SQLstr=SQLstr & " and MySQLDB.datetime<" & iTextBox2.text  
а далее уже совершать запрос. только нужно следить за правельностью ввода даты
 
в базе данных datatime  представлена в виде  2011-10-20 10:25:00.017  
а выборку нудно сделать только по 2011-10-20.  
Извиняюсь за то что ни черта не понимаю в программировании.
 
Не важно как оно представлени в базе. Это дата, соответственно если вы напишете в условии SQL запроса Where datetime>'18.10.2011' то он все сам поймет и отберет все данные с датой больше заданной
 
{quote}{login=ORG}{date=21.10.2011 02:25}{thema=}{post}в базе данных datatime  представлена в виде  2011-10-20 10:25:00.017  
а выборку нудно сделать только по 2011-10-20.  
Извиняюсь за то что ни черта не понимаю в программировании.{/post}{/quote}  
 
Sql понимает дату в таком формате mm/dd/yyyy hh:nn:ss и ни в каком иначе,  
поэтому всегда использую такую функцию для VBA  
 
Function DataSql(dt_sql As String)  
DataSql = "#" & Format(dt_sql, "mm\/dd\/yy hh\:mm\:ss") & "#"  
End Function  
 
Пример:  
Dim q As Date  
q = Now  
strSQL = "SELECT * FROM Table as t" _  
& " WHERE t.TimeOpen=" & DataSql(q)
Спасибо
 
{quote}{login=R Dmitry}{date=21.10.2011 03:08}{thema=Re: }{post}{quote}{login=ORG}{date=21.10.2011 02:25}{thema=}{post}в базе данных datatime  представлена в виде  2011-10-20 10:25:00.017  
а выборку нудно сделать только по 2011-10-20.  
Извиняюсь за то что ни черта не понимаю в программировании.{/post}{/quote}  
 
Sql понимает дату в таком формате mm/dd/yyyy hh:nn:ss и ни в каком иначе,  
поэтому всегда использую такую функцию для VBA  
 
Function DataSql(dt_sql As String)  
DataSql = "#" & Format(dt_sql, "mm\/dd\/yy hh\:mm\:ss") & "#"  
End Function  
 
Пример:  
Dim q As Date  
q = Now  
strSQL = "SELECT * FROM Table as t" _  
& " WHERE t.TimeOpen=" & DataSql(q){/post}{/quote}  
 
Ммм... спорить не буду. говорю лишь то, что на самом деле у меня работает и дату я могу поставить в условие в виде '20.10.2011' и это я использую в своих карыстных целях)
 
{quote}{login=Николай}{date=21.10.2011 02:11}{thema=}{post}Допустим у вас есть SQL запрос вида  
Select *  
Form MySQLDB  
Where MySQLDB.datetime>GetDate-7  
Его вы сохраняете в переменню в коде таким образом  
SQLstr="Select * Form MySQLDB Where MySQLDB.datetime>GetDate-7"  
Допустим у васт есть форма на которой будет два текстовых поля, где вы и будете вводить параметры.  
 
if iTextBox1<>"" then SQLstr=Replace(SQLtxt,"MySQLDB.datetime>GetDate-7","MySQLDB.datetime>" & iTextBox1.text)  
if iTextBox2<>"" then SQLstr=SQLstr & " and MySQLDB.datetime<" & iTextBox2.text  
а далее уже совершать запрос. только нужно следить за правельностью ввода даты{/post}{/quote}  
 
А зачем использовать два текстовых поля достаточно одно же для числа?
 
{quote}{login=}{date=21.10.2011 03:22}{thema=Re: }{post}{quote}{login=Николай}{date=21.10.2011 02:11}{thema=}{post}Допустим у вас есть SQL запрос вида  
Select *  
Form MySQLDB  
Where MySQLDB.datetime>GetDate-7  
Его вы сохраняете в переменню в коде таким образом  
SQLstr="Select * Form MySQLDB Where MySQLDB.datetime>GetDate-7"  
Допустим у васт есть форма на которой будет два текстовых поля, где вы и будете вводить параметры.  
 
if iTextBox1<>"" then SQLstr=Replace(SQLtxt,"MySQLDB.datetime>GetDate-7","MySQLDB.datetime>" & iTextBox1.text)  
if iTextBox2<>"" then SQLstr=SQLstr & " and MySQLDB.datetime<" & iTextBox2.text  
а далее уже совершать запрос. только нужно следить за правельностью ввода даты{/post}{/quote}  
 
А зачем использовать два текстовых поля достаточно одно же для числа?{/post}{/quote}  
 
Допустим сегодня вам достаточно одного, а завтра вы захотите, что бы можно было выбирать период, а нетолько последнии дни
 
Николай, вот так вот реализовал. Но почему то не работает ( Думаю дело в форме на текстовых полях.  
Invalid Column name GетDате.
 
Up
Страницы: 1
Читают тему
Наверх