|
Запуск скрипта SQL | ☑ | ||
---|---|---|---|---|
0
ВежливаяТварь
27.08.12
✎
15:47
|
Добрый день. Столкнулся с весьма интересной проблемой. Есть сторонняя программа (SalesWork) данные она тянет из Microsoft SQL 2005 Express.
В этой программе есть один отчет. Причем сам текст запроса с помощью которого формируется отчет хранится в таблице в этой же Sql-базе. Вопрос: я же могу точно так же использовать этот запрос, но из 1с? И если могу то, пожалуйста, опишите основные шаги. |
|||
1
Rie
27.08.12
✎
15:47
|
ADODB.Recordset - не подойдёт?
|
|||
2
shuhard
27.08.12
✎
15:48
|
(0)[опишите основные шаги]
- извлечь текст запроса - выполнить на стороне сервера - убедиться в абсурдности данных - перейти к пункту 1 |
|||
3
ВежливаяТварь
27.08.12
✎
15:49
|
(1) Я не знаю что это, но спасибо за подсказку, сейчас поищу в гугле.
|
|||
4
ВежливаяТварь
27.08.12
✎
15:49
|
(2) А почему данные будут абсурдны?
|
|||
5
shuhard
27.08.12
✎
15:50
|
(4) получишь - узнаешь
|
|||
6
ВежливаяТварь
27.08.12
✎
15:51
|
(5) то есть я не смогу вытянуть адекватные данные из Sql?
|
|||
7
Rie
27.08.12
✎
15:52
|
(6) Можешь. Но надо будет преобразовать их в достойный 1С вид.
|
|||
8
shuhard
27.08.12
✎
15:55
|
(6) бессодержательный вопрос
мы не видели ни текста запроса, ни структуры данных, ни передаваемых параметров в общем случае - да, не сможешь |
|||
9
ВежливаяТварь
27.08.12
✎
16:25
|
(8)
CREATE PROCEDURE swra_Sales_Desktop @ProdCategory_id INT = NULL, @ProdGroup_id INT = NULL, @ProductType_id INT = NULL, @Product_id INT = NULL, @WType_id UNIQUEIDENTIFIER = NULL, @W_id UNIQUEIDENTIFIER = NULL, @Date_From DATETIME = NULL, @Date_To DATETIME = NULL AS SET @ProdCategory_id = ISNULL(@ProdCategory_id, 0) SET @ProdGroup_id = ISNULL(@ProdGroup_id, 0) SET @ProductType_id = ISNULL(@ProductType_id, 0) SET @Product_id = ISNULL(@Product_id, 0) SET @WType_id = ISNULL(@WType_id, '00000000-0000-0000-0000-000000000000') SET @W_id = ISNULL(@W_id, '00000000-0000-0000-0000-000000000000') SET @Date_From = ISNULL(@Date_From, '2008-01-01') SET @Date_To = ISNULL(@Date_To, '2011-01-01') DECLARE @l INT SET @l = (SELECT CONVERT(INT, PrefValue) FROM tblGlobalSettings WHERE Pref_id = 52) DECLARE @Products TABLE (Product_id INT) INSERT INTO @Products SELECT Product_id FROM tblProducts JOIN tblProductTypes ON tblProductTypes.ProductType_Id = tblProducts.ProductType_Id JOIN tblProductGroups ON tblProductGroups.ProdGroup_ID = tblProductTypes.ProdGroup_Id JOIN tblProductCategory ON tblProductCategory.ProdCategory_ID = tblProductGroups.ProdCategory_ID WHERE (tblProductCategory.ProdCategory_ID = @ProdCategory_id OR @ProdCategory_id = 0) AND (tblProductGroups.ProdGroup_id = @ProdGroup_id OR @ProdGroup_id = 0) AND (tblProductTypes.ProductType_Id = @ProductType_Id OR @ProductType_Id = 0) AND (tblProducts.Product_Id = @Product_Id OR @Product_Id = 0) SET DATEFORMAT DMY SET QUOTED_IDENTIFIER OFF SELECT tblCustomers.Cust_Name [Дистрибьютор], ISNULL(tblSupervisors.Supervisor_Name, '-') [СВ], ISNULL(tblMerchandisers.MerchName, '-') [ТП], ISNULL(tblOutlets.Ol_Code, '-') [ТТ, код], ISNULL(CONVERT(NVARCHAR(MAX),tblOutlets.OL_id), '-') [ТТ, id], ISNULL(tblOutlets.OLname, '-') [ТТ, юр.назв], ISNULL(tblOutlets.OLTradingName, '-') [ТТ, факт.назв], ISNULL(tblOutlets.OlAddress, '-') [ТТ, юр.адрес], ISNULL(tblOutlets.OlDeliveryAddress, '-') [ТТ, факт.адрес], ISNULL(CONVERT(NVARCHAR(MAX),tblOutlets.Status), '-') [ТТ, статус], ISNULL(tblNetworks.Network_Name, '-') [ТТ, Сеть], ISNULL(tblOutletSubTypes.OLSubTypeName, '-') [ТТ, подтип], ISNULL(tblOutletTypes.OLtype_name, '-') [ТТ, тип], ISNULL(tblOutLetGroups.OLGroup_name, '-') [ТТ, группа], ISNULL(tblAreas.Area_name, '-') [Территория, район города], ISNULL(tblCities.City_name, '-') [Территория, город], ISNULL(tblDistricts.District_name, '-') [Территория, область], ISNULL(tblRegions.Region_name, '-') [Территория, регион], ISNULL(tblCountry.Country_name, '-') [Территория, страна], ISNULL(tblWarehouses.W_ExternalCode, '-') [Склад, код], ISNULL(CONVERT(NVARCHAR(36), tblWarehouses.W_id), '-') [Склад, id], ISNULL(tblWarehouses.W_ShortName, '-') [Склад, кор.назв.], ISNULL(tblWarehouses.W_LongName, '-') [Склад, назв.], ISNULL(tblProducts.ProductCode, '-') [Продукт, код], ISNULL(tblProducts.EANCode, '-') [Продукт, штрих-код], ISNULL(tblProducts.ProductName, '-') [Продукт, назв.], ISNULL(tblProducts.ProductShortName, '-') [Продукт, кор.назв.], ISNULL(tblProductTypes.ProdTypeName, '-') [Продукт, тип], ISNULL(tblProductGroups.ProdGroupName, '-') [Продукт, группа], ISNULL(tblProductCategory.ProdCategoryName, '-') [Продукт, категория], ISNULL(tblLocalProducts.LocalProductCode, '-') [Продукт, лок. код], ISNULL(tblLocalProducts.LocalProductName, '-') [Продукт, лок. назв.], ISNULL(tblLocalProducts.LocalProductShortName, '-') [Продукт, лок. кор. назв.], Sales.Date [Накл, дата], Sales.Invoice_No [Накл, код], ISNULL(tblGlobalLookup.LValue, CONVERT(NVARCHAR, Sales.status) + ' Неизвестно') [Накл, статус], ISNULL(tblDocTypes.DocTypeName, '(без типа)') [Накл, тип документа], Sales.DLM [Накл, дата модиф.], CONVERT(NVARCHAR(MAX), Sales.OrderNo) [Накл, номер зак.], Sales.Product_qty [Накл, кол-во продукции], Sales.Product_qty * ProductVolume [Накл, объем], Sales.Product_qty * ProductVolume/10 [Накл, объем,дал], Sales.Price [Накл, прод. цена без НДС], Sales.Price + Sales.Price/100*Sales.VAT [Накл, прод. цена с НДС], Sales.Price * Sales.Product_Qty [Накл, сумма без НДС], (Sales.Price + Sales.Price/100*Sales.VAT)*Sales.Product_Qty [Накл, сумма с НДС] FROM ( SELECT W_id, Ol_id, Status, Doc_Type, Merch_id, Date, DLM, Invoice_No, OrderNo, Product_id, LocalProductCode, ISNULL(tblSaloutD.Product_Qty, 0) + ISNULL(tblSaloutLocalD.Product_Qty, 0) Product_Qty, ISNULL(tblSaloutD.Price, 0) + ISNULL(tblSaloutLocalD.Price, 0) Price, ISNULL(tblSaloutD.VAT, 0) + ISNULL(tblSaloutLocalD.VAT, 0) VAT FROM tblSaloutH LEFT JOIN tblSalOutD ON tblSaloutH.Invoice_id = tblSaloutD.Invoice_id AND @l = 0 LEFT JOIN tblSalOutLocalD ON tblSaloutH.Invoice_id = tblSalOutLocalD.Invoice_id AND @l = 1 WHERE (tblSalOutD.Invoice_id IS NOT NULL AND @l = 0) OR (tblSalOutLocalD.Invoice_id IS NOT NULL AND @l = 1) ) Sales CROSS JOIN tblCustomers LEFT JOIN tblDistributors ON tblDistributors.Distr_id = tblCustomers.Cust_id LEFT JOIN tblWarehouses ON tblWarehouses.w_id = Sales.W_id LEFT JOIN tblDocTypes ON tblDocTypes.Doc_Type = Sales.Doc_Type LEFT JOIN tblGlobalLookup ON TableName='tblSaloutH' AND FieldName='Status' AND tblGlobalLookup.Status=2 AND tblGlobalLookup.LKey = Sales.status LEFT JOIN tblOutlets ON tblOutlets.Ol_id = Sales.Ol_id LEFT JOIN tblMerchandisers ON Sales.Merch_id = tblMerchandisers.Merch_id LEFT JOIN tblSupervisors ON tblSupervisors.Supervisor_id = tblMerchandisers.Supervisor_id LEFT JOIN tblCustomerSupervisors ON tblCustomerSupervisors.Supervisor_id = tblSupervisors.Supervisor_id LEFT JOIN tblOutletSubTypes ON tblOutletSubTypes.OLSubType_id = tblOutlets.OlSubType_id LEFT JOIN tblOutLetTypes ON tblOutLetTypes.OLtype_id = tblOutletSubTypes.OLType_ID LEFT JOIN tblOutLetGroups ON tblOutletGroups.OLGroup_id = tblOutLetTypes.OLGroup_id LEFT JOIN tblNetworks ON tblNetworks.Network_id = tblOutlets.Network_ID LEFT JOIN tblAreas ON tblAreas.Area_id = tblOutlets.Area_ID LEFT JOIN tblCities ON tblCities.City_id = tblAreas.City_id LEFT JOIN tblDistricts ON tblDistricts.District_id = tblCities.District_id LEFT JOIN tblRegions ON tblRegions.Region_id = tblDistricts.Region_id LEFT JOIN tblCountry ON tblCountry.Country_id = tblRegions.Country_id LEFT JOIN tblLocalProducts ON tblLocalProducts.LocalProductCode = Sales.LocalProductCode LEFT JOIN tblProducts ON tblProducts.Product_id = COALESCE(Sales.Product_id, tblLocalProducts.Product_id) LEFT JOIN tblProductTypes ON tblProductTypes.ProductType_id = tblProducts.ProductType_id LEFT JOIN tblProductGroups ON tblProductGroups.ProdGroup_ID = tblProductTypes.ProdGroup_ID LEFT JOIN tblProductCategory ON tblProductCategory.ProdCategory_ID = tblProductGroups.ProdCategory_ID WHERE (tblWarehouses.wtype_id = @wtype_id OR @wtype_id = '00000000-0000-0000-0000-000000000000') AND (Sales.W_id = @w_id OR @w_id = '00000000-0000-0000-0000-000000000000') AND Sales.Date BETWEEN @Date_From AND @Date_To AND Sales.status<>9 |
|||
10
shuhard
27.08.12
✎
16:31
|
(9) ставки:
95% - взлетит/ 5% упадёт |
|||
11
ВежливаяТварь
27.08.12
✎
16:33
|
(10) мне баланс нравится. Такой вопрос: я так понимаю мне нужно установить связь с sql, передать этот запрос, считать результат. А я смогу сделать как эта программа делает- передать не сам текст запроса а место в таблице где он хранится?
|
|||
12
shuhard
27.08.12
✎
16:35
|
(11) х.з.
ступай на sql.ru вопрос далеко за пределами 1С |
|||
13
ВежливаяТварь
27.08.12
✎
16:36
|
Я понял. Всем огромное спасибо.
|
|||
14
Fedot200
27.08.12
✎
16:38
|
ServerName=СокрЛП(ИмяСервера); //имя или IP-адрес сервера
DSN=СокрЛП(ИмяБазыДанных); //имя базы данных UID=СокрЛП(ИмяПользователя_); //логин пользователя PWD=СокрЛП(Пароль); //пароль ConnectString="Provider=SQLOLEDB;Data Source="+ServerName+";DatabaseName="+DSN+";Initial Catalog="+DSN+";UID="+UID+";PWD="+PWD; Соединение=Новый COMОбъект("ADODB.Connection"); Соединение.ConnectionTimeOut=600; Попытка Соединение.Open(ConnectString); Исключение Предупреждение("Не удалось соединиться с базой данных!"); Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; Cmd=Новый COMОбъект("ADODB.Command"); Rs=Новый COMОбъект("ADODB.RecordSet"); Cmd.ActiveConnection=Соединение; Cmd.CommandTimeOut=600; Cmd.CommandType=1; //запрос на языке SQL Cmd.Commandtext=СокрЛП(ТекстЗапроса); Попытка Rs.ActiveConnection=Соединение; Rs=Cmd.Execute(); Исключение Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; |
|||
15
Rie
27.08.12
✎
16:38
|
(11) Передаёшь текст запроса. Получаешь результат запроса (recordset). И делаешь с ним, что хочешь. Не забывай только, что в SQL элементы справочников, документы и т.п. представлены своими UIDами.
|
|||
16
774816
27.08.12
✎
16:39
|
(11)это хранимая процедура которая возвращает набор данных, сам запрос хп не надо писать, нужно вызвать эту хп с параметрами, для этого тебе нужно ADODB.Command + ADODB.Recordset юзать
|
|||
17
Fedot200
27.08.12
✎
16:41
|
+14 этот код обзови, например Процедура УстановитьSQL_соединение(ТекстЗапроса)
|
|||
18
Fedot200
27.08.12
✎
16:42
|
Вот пример как вызывать:
ТекстЗапросаКонтрагенты="SELECT |_Reference63_Q_000_T_001._Description AS f_1, |_Reference63_Q_000_T_001._Fld1041 AS f_2, |'' AS f_3, |_InfoReg11245_Q_000_T_002._Fld11249 AS f_4, |_InfoReg11245_Q_000_T_003._Fld11249 AS f_5, |_Reference63_Q_000_T_001._Fld1038 AS f_6, |_Reference6._Code AS f_7, |_Reference7._Fld773 AS f_8, |_Reference6._Description AS f_9, |_Reference6._Fld768 AS f_10, |_Reference6._Fld770 AS f_11, |'' AS f_12, |_Reference63_Q_000_T_001._Fld1039 AS f_13, |_Reference9._Description AS f_14, |_Reference63_Q_000_T_001._Fld1040 AS f_15, |_Reference63._Description AS f_16, |'' AS f_17, |'' AS f_18, |'' AS f_19, |'' AS f_20, |'' AS f_21 |FROM |_Reference63 _Reference63_Q_000_T_001 WITH(NOLOCK) |LEFT OUTER JOIN _Reference36 WITH(NOLOCK) |ON _Reference63_Q_000_T_001._Fld1032RRef = _Reference36._IDRRef |LEFT OUTER JOIN _Reference7 WITH(NOLOCK) |ON _Reference63_Q_000_T_001._Fld1042RRef = _Reference7._IDRRef |LEFT OUTER JOIN _InfoReg11245 _InfoReg11245_Q_000_T_002 WITH(NOLOCK) |ON _InfoReg11245_Q_000_T_002._Fld11246_TYPE = 0x08 AND _InfoReg11245_Q_000_T_002._Fld11246_RTRef = 0x0000003F AND _Reference63_Q_000_T_001._IDRRef = _InfoReg11245_Q_000_T_002._Fld11246_RRRef AND _InfoReg11245_Q_000_T_002._Fld11247RRef = 0x9c49b3cc99a0381f473f31dd972971a9 AND _InfoReg11245_Q_000_T_002._Fld11248_TYPE = 0x08 AND _InfoReg11245_Q_000_T_002._Fld11248_RRRef = 0xbc597d7deec26cde42de22114e115265 |LEFT OUTER JOIN _InfoReg11245 _InfoReg11245_Q_000_T_003 WITH(NOLOCK) |ON _InfoReg11245_Q_000_T_003._Fld11246_TYPE = 0x08 AND _InfoReg11245_Q_000_T_003._Fld11246_RTRef = 0x0000003F AND _Reference63_Q_000_T_001._IDRRef = _InfoReg11245_Q_000_T_003._Fld11246_RRRef AND _InfoReg11245_Q_000_T_003._Fld11247RRef = 0x94a0fd27bdad5c8041f122244cd904b6 AND _InfoReg11245_Q_000_T_003._Fld11248_TYPE = 0x08 AND _InfoReg11245_Q_000_T_003._Fld11248_RRRef = 0x8a12a42cbf99a84548bac3b0c5bb357f |LEFT OUTER JOIN _Reference63 WITH(NOLOCK) |ON _Reference63_Q_000_T_001._ParentIDRRef = _Reference63._IDRRef |LEFT OUTER JOIN _Reference9 WITH(NOLOCK) |ON _Reference36._Fld872RRef = _Reference9._IDRRef |LEFT OUTER JOIN _Reference6 WITH(NOLOCK) |ON _Reference7._Fld774RRef = _Reference6._IDRRef |WHERE |_Reference63_Q_000_T_001._Folder = 0x01"; УстановитьSQL_соединение(ТекстЗапросаКонтрагенты); КоличествоПолей=Rs.Fields.Count(); Попытка Пока Rs.EOF()=0 Цикл ОбработкаПрерыванияПользователя(); НоваяСтрока = ТаблицаЗагрузки.Добавить(); Для i=0 по КоличествоПолей-1 Цикл НоваяСтрока["Поле_"+СокрЛП(i+1)] = СокрЛП(Rs.Fields(i).Value); КонецЦикла; Rs.MoveNext(); КонецЦикла; Исключение Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; Rs.Close(); Соединение.Close(); |
|||
19
ВежливаяТварь
27.08.12
✎
16:44
|
Понял. сейчас попробую. Спасибо.
|
|||
20
ВежливаяТварь
28.08.12
✎
10:38
|
Добрый день. Ещё один вопрос возник. Сделал вот так:
Функция УстановитьSQL_соединение(ТекстЗапроса) ТаблицаЗагрузки= Новый ТаблицаЗначений; ТаблицаЗагрузки.Колонки.Добавить("Поле"); ServerName=СокрЛП("192.168.2.56"); //имя или IP-адрес сервера DSN=СокрЛП("RB_ATS"); //имя базы данных UID=СокрЛП("sa"); //логин пользователя PWD=СокрЛП("SW_Desktop"); //пароль ConnectString="Provider=SQLOLEDB;Data Source="+ServerName+";DatabaseName="+DSN+";Initial Catalog="+DSN+";UID="+UID+";PWD="+PWD; Соединение=Новый COMОбъект("ADODB.Connection"); Соединение.ConnectionTimeOut=600; Попытка Соединение.Open(ConnectString); Исключение Предупреждение("Не удалось соединиться с базой данных!"); Сообщить(ОписаниеОшибки()); Возврат Неопределено; КонецПопытки; Cmd=Новый COMОбъект("ADODB.Command"); Rs=Новый COMОбъект("ADODB.RecordSet"); Cmd.ActiveConnection=Соединение; Cmd.CommandTimeOut=600; Cmd.CommandType=1; //запрос на языке SQL Cmd.Commandtext=СокрЛП(ТекстЗапроса); Попытка Rs.ActiveConnection=Соединение; Rs=Cmd.Execute(); Исключение Сообщить(ОписаниеОшибки()); Возврат Неопределено; КонецПопытки; КоличествоПолей=Rs.Fields.Count(); Попытка Пока Rs.EOF()=0 Цикл НоваяСтрока = ТаблицаЗагрузки.Добавить(); Для i=0 по КоличествоПолей-1 Цикл НоваяСтрока.Поле = СокрЛП(Rs.Fields(i).Value); КонецЦикла; Rs.MoveNext(); КонецЦикла; Исключение Сообщить(ОписаниеОшибки()); Возврат Неопределено; КонецПопытки; Rs.Close(); Соединение.Close(); Возврат ТаблицаЗагрузки; КонецФункции Текст запроса просто строка с запросом. А вот как педать парематеры в неё такие как @wtype_id @wtype_id @w_id @w_id Date_From @Date_To? Просто вписывать в строку? или есть более кошерные варианты? |
|||
21
ВежливаяТварь
28.08.12
✎
11:15
|
Нашёл такой ответ, может кому нибудь пригодится:
par = Command.CreateParameter("DATEN", 133, 3); Command.Parameters.Append(par); par.Value = ДатаН; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |