Страницы: 1 2 След.
RSS
Выбрать данные за дату макросом - SQL, макрос с запросом из MS SQL
 
Добрый день. Написал запрос, который выдает определенные данные
Запрос:
Код
declare @date1 varchar(64) = '2015-11-25 00:00:00'
 
 declare @date2 varchar(64) = '2016-01-01 00:00:00'
 
 select aa.[Код отгрузки],aa.[Код путевого],rr.shv_Value as [Номер маршрута],
 
 
 case 
 when aa.Объем <1.2 then '1'
 when aa.Объем>1.2 then round(aa.Объем/1.2,0)
 --else  'null'
 end 'Кол-во паллет'
 ,aa.Объем,aa.[Дата погрузки в ТС]
 from 
 ( select  
 c.shp_Code [Код путевого],a.ost_Code [Код отгрузки], a.ost_Volume  [Объем],    d.shv_Value [Дата погрузки в  ТС],shv_AttributeID,d.shv_Value,
 c.shp_ID
 from lv_ordershipment a with (nolock) 
 join LV_Order b with (nolock) on b.ord_ID =a.ost_OrderID
 join LV_Shipment c with (nolock) on c.shp_ID=a.ost_ShipmentID
 join LV_ShipmentAttributesValues d with (nolock) on d.shv_ShipmentID=c.shp_ID
 join LV_ShipmentAttributes e with (nolock) on e.spa_ID = d.shv_AttributeID
 where    
 --a.ost_ShipmentID = 111810 and 
 e.spa_Code = 'SH6' 
 --and 
 --d.shv_Value>'2015-11-01 00:00:00'
 ) aa
 join LV_ShipmentAttributesValues rr on rr.shv_ShipmentID=aa.shp_ID
 join LV_ShipmentAttributes dd on dd.spa_ID=rr.shv_AttributeID
 where dd.spa_Code= 'SH2' 
 and aa.shv_Value > @date1 
 and aa.shv_Value<@date2
 order by aa.shv_Value desc

Создал подключение в эксель. Имеет вид в экселе следующий

Вопрос:можно ли как-то сделать кнопку Дата в экселе,чтобы пользователи задавали дату не чере фильтр,а посредством этой кнопки?
Изменено: Mansso - 27.11.2015 11:26:52
 
Файл?
Неизлечимых болезней нет, есть неизлечимые люди.
 
Прпиложить файл?Имеет ли смысл без подключения?
 
Вот ссылка на обменник с файлом  
https://dropmefiles.com/6v1EZ
 
Но  если нужна другая тема, то напишите, будьте добры.
"Создание кнопки в Эксель, данные которой, тянуться из запроса в подключении к БД MS SQL 2008 R2. Запрос находится под темой,файл приложен. Файл выполнен в виде сводной таблицы. Если кто-то знает, как создать кнопку с использованием VBA,то прошу поделиться опытом."
Изменено: Mansso - 27.11.2015 10:49:32
 
Параметры запроса можно задавать в ячейке excel  без vba
Поищите по форуму.
 
Да вот я не знаю даже где искать,что искать,т.к. столкнулся с этой проблемой 1-й раз..
 
Поиск.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Так а что искать-то?Моежете указать параметры поиска?
 
Mansso, уже указал. Преодолевайте свою лень. Поднапрягитесь и поищите. Я нашёл ответ на Ваш вопрос, хотя он мне и не интересен. Интерес был чисто спортивный найду или нет после того как написали:
Цитата
B.Key написал: Параметры запроса можно задавать в ячейке excel  без vba

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
Mansso написал: Так а что искать-то?
можно так и искать "параметрический запрос" или, как в #10
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JayBhagavan написал: Преодолевайте свою лень
Хочу пояяснить,что дело не в лени,а в том,что я просто не знаю,что искать..
 
Цитата
Mansso написал: ...дело не в лени,а в том,что я просто не знаю,что искать..
Пойти туда, не зная, куда.... ©
There is no knowledge that is not power
 
Цитата
Johny написал: Пойти туда, не зная, куда.... ©
Именно. Одно дело SQL,другое дело Эксель. Для меня эксель просто темный лес. Пользователи попросили сделать кнопку,думаю,что неплохая идея..Но вот как..
 
Попробуйте этот код
Код
where dd.spa_Code= 'SH2' 
 and aa.shv_Value > @date1 
 and aa.shv_Value<@date2
заменить на этот
Код
where dd.spa_Code= 'SH2' 
 and aa.shv_Value>? 
 and aa.shv_Value<?
Неизлечимых болезней нет, есть неизлечимые люди.
 
Хм.Заменил. Вот что выдало)

Сообщение 102, уровень 15, состояние 1, строка 27
Incorrect syntax near '?'.
 
Тогда только формирование sql-строки макросом считывая даты из ячеек и подставляя их вместо @date1 и @date2, затем подстановка этой sql-строки в подключение
Неизлечимых болезней нет, есть неизлечимые люди.
 
Сделайте хранимую процедуру и передавайте туда параметры. Пример:
Код
-- Создаём Stored Procedure
create procedure dbo.GetSomeData
@date1 datetime
as
begin
   select * from sys.objects
   where create_date = @date1;
end;

-- Вызываем её
execute dbo.GetSomeData '2015-11-27';
@date1 - параметр даты.
В VBA можно вызвать её так:
Код
Dim rs As ADODB.Recordset
Dim conn As ADODB.Connection
....
conn.GetSomeData "'2015-11-27'", rs '//Последний параметр всегда рекордсет, который будет заполнен результатом.
There is no knowledge that is not power
 
дата в mssql однозначно интерпретируется в формате 'yyyymmdd'
 
Цитата
B.Key написал: дата в mssql однозначно интерпретируется в формате 'yyyymmdd'
Это МНЕ написано? Если да, то учите матчасть.
There is no knowledge that is not power
 
Цитата
Johny написал: Сделайте хранимую процедуру и передавайте туда параметры.
Сделал процедуру.
Создал кнопку в ЭКселе
Нажимаю на нее,ошибка.
Изменено: Mansso - 27.11.2015 23:59:35
 
Я вам пример написал - не надо было его полностью копировать. :)
There is no knowledge that is not power
 
Цитата
Johny написал: Это МНЕ написано? Если да, то учите матчасть.
Во первых не Вам, а во вторых учите сами.
Скрытый текст
Изменено: B.Key - 28.11.2015 00:00:04
 
Цитата
Johny написал: ...не надо было его полностью копировать.
Так а как это пример вызова применить к моей проблеме?
 
Доброе время суток
Пример, пусть есть таблица Sales.Orders (orderid,custid,empid,orderdate)
Создадим на sql server для учебной базы TSQL хранимую процедуру, возвращающую таблицу, с параметрами по дате от до
Код
CREATE FUNCTION dbo.GetBetweenDate
   (@fromDate datetime, @toDate datetime)
RETURNS TABLE 
AS
RETURN 
(Select orderid,custid,empid From Sales.Orders Where orderdate between @fromDate and @toDate)
GO

Отредактируйте файл в архиве вложения на правильную строку подключения, включая имя базы данных в которой находится хранимая процедура.
Вкладка Данные/Существующие подключения. Указываете этот файл подключения. Настраиваете параметры.

Как вы понимаете - файл текстовый, так что на его базе можете создавать и другие подключения.

Успехов.

P. S. Коллеги, а может не будем на этом форуме делать филиал sql.ru/forum? Человек что-то сделал, только адаптировать не может. Тогда зачем этот трёп?
 
Цитата
B.Key написал: Во первых не Вам, а во вторых учите сами.
Ну просветите же!
А пока я вас просвещу - тынц.

ISO 8601Descripton
YYYY-MM-DD
YYYYMMDD  
Same as the SQL standard. This is the only format that is defined as an international standard.
There is no knowledge that is not power
 
Хорош пись умами мериться :) Оба вариант являются универсальными. Никто ни кого не пытался научить или уличить в чем-то. Было просто написано про один из универсальных форматов даты для запросов, который никак не опровергает наличие и другого. Поэтому просвещать не о чем - оба знаете о чем пишете и никакой ошибки ни в одном из вариантов нет. На этом прошу закончить свои обсуждения форматов дат. Или перебегайте в курилку мериться.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Конкретно по вашему запросу. Создаём stored procedure:
Код
create procedure dbo.GetData
@date1 varchar(64),
@date2 varchar(64)
as
begin

set nocount on;
select aa.[Код отгрузки],aa.[Код путевого],rr.shv_Value as [Номер маршрута],
case 
when aa.Объем <1.2 then '1'
when aa.Объем>1.2 then round(aa.Объем/1.2,0)
--else  'null'
end 'Кол-во паллет'
, aa.Объем,aa.[Дата погрузки в ТС]
from 
(
select  
c.shp_Code [Код путевого],
a.ost_Code [Код отгрузки],
a.ost_Volume  [Объем],
d.shv_Value [Дата погрузки в  ТС],
shv_AttributeID,d.shv_Value,
c.shp_ID
from lv_ordershipment a with (nolock) 
join LV_Order b with (nolock) on b.ord_ID =a.ost_OrderID
join LV_Shipment c with (nolock) on c.shp_ID=a.ost_ShipmentID
join LV_ShipmentAttributesValues d with (nolock) on d.shv_ShipmentID=c.shp_ID
join LV_ShipmentAttributes e with (nolock) on e.spa_ID = d.shv_AttributeID
where    
 e.spa_Code = 'SH6' 
) aa
join LV_ShipmentAttributesValues rr on rr.shv_ShipmentID=aa.shp_ID
join LV_ShipmentAttributes dd on dd.spa_ID=rr.shv_AttributeID
where dd.spa_Code= 'SH2' 
and aa.shv_Value > @date1 
and aa.shv_Value<@date2
order by aa.shv_Value desc;
end;


Далее вызываем эту хранимку:
Код
Sub F()

    Dim rs As Object 'ADODB.Recordset
    Dim conn As Object 'ADODB.Connection
    
    Set conn = CreateObject("ADODB.Connection")
    conn.ConnectionString = "Provider=SQLNCLI11.1;Server=MY_MACHINE_NAME\MY_SQL_SERVER_INSTANCE;Database=MY_DB_NAME;Trusted_Connection=Yes;"
    conn.CursorLocation = 3 'adUseClient, чтобы работал RecordCount
    
    conn.GetData "'2015-11-25 00:00:00'", "'2016-01-01 00:00:00'", rs
    
    If rs.RecordCount > 0 Then '//Проверяем, есть ли у нас записи
        '// Копируем данные на лист
        Sheets(1).Range("A1").CopyFromRecordset rs
    Else
        MsgBox "Записи не найдены"
    End If

End Sub


В ConnectionString прописываете свои данные (примеры можно взять с ConnectionString.com).
There is no knowledge that is not power
 
В данном случае, без разницы - хранимая процедура или функция. Вариант в файле вложения. Отличается от варианта уважаемого Johny тем, что без макросов и граничные значения дат задаются непосредственно в ячейках на листе. После изменения достаточно нажать обновить. Код хранимой процедуры
Код
CREATE PROCEDURE dbo.GetDateBetweenProc 
@fromDate datetime, @toDate datetime
AS
BEGIN
   SET NOCOUNT ON;
   Select orderid,custid,empid From Sales.Orders Where orderdate between @fromDate and @toDate
END
GO

Успехов.
 
_
Изменено: Mansso - 30.11.2015 07:44:12
Страницы: 1 2 След.
Наверх