Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос MSsql  [new]
ВежливаяТварь
Member

Откуда:
Сообщений: 12
Добрый день. Столкнулся с весьма озадачивающей проблемой. Имеется запрос MSSQL (2005 express). Я пытаюсь выполнить его из 1с. То есть я подключаюсь к sql передаю текст запроса. Проблема в том что в этом запросе есть параметры которые нужно вместе с ним передавать. Я решил передавать их прям в строке запроса. Со всеми параметрами вроде как разобрался кроме одного. Не могли бы вы подсказать мне что нужно передавать в параметр @l в первой строке?


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
|+ Code
|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
28 авг 12, 15:10    [13076642]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
ВежливаяТварь,
сверху допишите.
declare @l int  

А так правильно хоть как процедуру оформить сие чудо.
28 авг 12, 15:13    [13076681]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
ВежливаяТварь
Member

Откуда:
Сообщений: 12
Оно оформлено как процедура. Не хотелось не нужной информацией грузить. Спасибо за подсказку сейчас попробую.
28 авг 12, 15:15    [13076697]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
ВежливаяТварь
Member

Откуда:
Сообщений: 12
А вот так как написано во втором коментарии это я так объявляю переменную?
28 авг 12, 15:22    [13076780]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
ВежливаяТварь,
да.Что то не так?
28 авг 12, 15:27    [13076838]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
ВежливаяТварь
Member

Откуда:
Сообщений: 12
Нет все так. Просто для себя уточнил. Просто хотелось бы понимать, что там написано, вот и учу потихоньку.
Не могли бы Вы ещё раз подсказать мне. При попытке сформировать отчет выдаёт ошибку

{Форма.Форма.Форма(1011)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Неправильный синтаксис около конструкции "+".
Что я делаю не так?
28 авг 12, 15:36    [13076936]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
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
|+ Code
|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 



это вообще откуда там?

|SET DATEFORMAT DMY
|SET QUOTED_IDENTIFIER OFF
|+ Code
28 авг 12, 15:40    [13076968]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
ВежливаяТварь
Member

Откуда:
Сообщений: 12
Запрос не мой я его вытянул из одной программы и пытаюсь заставить работать под 1с. Я так понял практически все переменные я могу из него убрать кроме даты начала и даты конца. Остальные фильтры мне не нужны.
Теперь отчет имеет такой вид:

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
|SET DATEFORMAT DMY
|SET QUOTED_IDENTIFIER OFF
|+ Code
|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
28 авг 12, 15:43    [13076988]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
вы что-то не то вытянули или не из той программы =)
и пользуйтесь тегом SRC
28 авг 12, 15:44    [13076997]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
ВежливаяТварь
Member

Откуда:
Сообщений: 12
Konst_One
вы что-то не то вытянули или не из той программы =)
и пользуйтесь тегом SRC
а что это за тег? и что будет если +code просто убрать?
28 авг 12, 15:47    [13077031]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
ВежливаяТварь
Konst_One
вы что-то не то вытянули или не из той программы =)
и пользуйтесь тегом SRC
а что это за тег? и что будет если +code просто убрать?
Это тег для оформления своих сообщений на форуме, чтобы другие, читая, не ломали об них глаза.
28 авг 12, 15:48    [13077038]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
попробуйте эти 3 строчки, что я привёл выше, выкинуть.
28 авг 12, 15:50    [13077061]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
А вертикальная черта в первой позиции каждой строки - это правильно, да?
28 авг 12, 16:43    [13077537]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
вероятно , что вертикальная черта - это что-то вроде символа склеивания строки в какой-то программе, откуда этот скрипт копировали. естественно её "|" нужно удалить из срипта
28 авг 12, 16:54    [13077660]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
ВежливаяТварь
Member

Откуда:
Сообщений: 12
+
CREATE PROCEDURE rep_CheckSalesWorks_Desktop
	@User_id INT = NULL,
	@Cust_id INT = NULL,
	@DBF_Path NVARCHAR(255) = NULL
AS
	SET NOCOUNT ON
	SET DATEFORMAT DMY
	/* Кол-во дней просроченных по дате выгрузки данных из уч. системы */
	DECLARE @WarningCPI_Days INT, @CriticalCPI_Days INT
	SET @WarningCPI_Days = 2
	SET @CriticalCPI_Days = 3 /* 0..1(no color) | 1..3(yellow) | 3..(red) */
	
	/* Кол-во дней период выгрузки продаж */
	
	/****************************************************************************************************/
	SET @User_id = ISNULL(@User_id, 0)
	SET @Cust_id = ISNULL(@Cust_id, 0)
	SET @DBF_Path = COALESCE(@DBF_Path,	(SELECT PrefValue FROM tblGlobalSettings WHERE Pref_id = 20063), 'C:\SalesWorks Enterprise\CUS2SW' )
		
	UPDATE tblGlobalSettings SET PrefValue = @DBF_Path WHERE Pref_Id = 20063
	IF @@ROWCOUNT = 0
		INSERT INTO tblGlobalSettings(Pref_id, PrefValue, PrefDescription, Direction, DLM, Visible)
			VALUES(20063, @DBF_Path, 'Путь ДБФ для отчета "Анализ работы системы"', 0, GETDATE(), 2)
	
	DECLARE @IsLocal BIT /* Флаг локальной продукции */
	DECLARE @Prov NVARCHAR(10) /* Провайдер подключения к ДБФ */
	SET @IsLocal = (SELECT CONVERT(BIT, PrefValue) FROM tblGlobalSettings WHERE Pref_id = 52)
	
	CREATE TABLE #General( -- Своевременность поступления данных
		id INT IDENTITY(1,1),
		priority_ INT,
		name NVARCHAR(255) COLLATE database_default,
		value NVARCHAR(MAX) COLLATE database_default,
		descr NVARCHAR(MAX) COLLATE database_default
	)
	
	CREATE TABLE #Head( -- Шапка для даных ДБФ
		id INT IDENTITY(1,1),
		name NVARCHAR(255) COLLATE database_default, 
		descr NVARCHAR(MAX) COLLATE database_default
	)

	CREATE TABLE #Head_db( -- Шапка для даных данных в базе
		id INT IDENTITY(1,1),
		name NVARCHAR(255) COLLATE database_default, 
		descr NVARCHAR(MAX) COLLATE database_default
	)
		
	CREATE TABLE #Res (
		id INT IDENTITY(1,1), 
		type_ NVARCHAR(100) COLLATE database_default,
		priority_ INT DEFAULT 1,
		name1 NVARCHAR(255) COLLATE database_default, field1 NVARCHAR(MAX) COLLATE database_default, 
		name2 NVARCHAR(255) COLLATE database_default DEFAULT NULL, field2 NVARCHAR(MAX) COLLATE database_default DEFAULT NULL,
		name3 NVARCHAR(255) DEFAULT NULL, field3 NVARCHAR(MAX) DEFAULT NULL,
		sort INT default 10
	)

	INSERT INTO #General(name, value, descr, priority_)
	SELECT TOP 1 
		'Дата синхронизации с центральным модулем', 
		CONVERT(NVARCHAR, LastSyncDateTime, 104) + ' '  + CONVERT(NVARCHAR(5), LastSyncDateTime, 108), 
		'(Ключ. польз.) Необходимо нажать "Синхронизация" при входе в программу.',
		CASE 
			WHEN DATEDIFF(D,LastSyncDateTime, GETDATE()) < @WarningCPI_Days THEN 0 
			WHEN DATEDIFF(D,LastSyncDateTime, GETDATE()) < @CriticalCPI_Days THEN 1
			WHEN DATEDIFF(D,LastSyncDateTime, GETDATE()) >= @CriticalCPI_Days THEN 2
		END 
	FROM tblCustomers
	
	/******************************************* Sales ********************************************************/
	SELECT 
	*, 
	DATEDIFF(DD, min_period, max_period) + 1 period,
	CASE WHEN all_cnt_period=0 THEN 0 ELSE	ROUND(update_cnt_period*1.0/all_cnt_period*100,2) END [perc_updated]
	INTO #Sales
	FROM (
	SELECT 
		(SELECT MIN(DATE) FROM tblSaloutH h WHERE DLM >= CONVERT(NVARCHAR, MAX(tblSaloutH.DLM), 104)) min_period,
		(SELECT MAX(DATE) FROM tblSaloutH h WHERE DLM >= CONVERT(NVARCHAR, MAX(tblSaloutH.DLM), 104)) max_period,
		( /* Накл всего за период последней выгрузки */
			SELECT 
				Count(*) 
			FROM tblSaloutH hh 
			WHERE
				Date 
					BETWEEN (SELECT MIN(DATE) FROM tblSaloutH h WHERE DLM >= CONVERT(NVARCHAR, MAX(tblSaloutH.DLM), 104))
					AND (SELECT MAX(DATE) FROM tblSaloutH h WHERE DLM >= CONVERT(NVARCHAR, MAX(tblSaloutH.DLM), 104))
		) all_cnt_period,
		( /* Накл обновл за период последней выгрузки */
			SELECT 
				Count(*) 
			FROM tblSaloutH hh 
			WHERE 
				Date 
					BETWEEN (SELECT MIN(DATE) FROM tblSaloutH h WHERE DLM >= CONVERT(NVARCHAR, MAX(tblSaloutH.DLM), 104))
					AND (SELECT MAX(DATE) FROM tblSaloutH h WHERE DLM >= CONVERT(NVARCHAR, MAX(tblSaloutH.DLM), 104))
				AND CONVERT(NVARCHAR, DLM, 104) = CONVERT(NVARCHAR, MAX(tblSaloutH.DLM), 104)
		) update_cnt_period
	FROM tblSaloutH 
	) S
	
	INSERT INTO #General(name, value, descr, priority_)
	SELECT TOP 1 'Дата последней выгрузки продаж', CONVERT(NVARCHAR, MAX(DLM), 104), 
		'(Ключ. польз.) Необходимо выгрузить данные из учетной системы в SalesWorks.',
		CASE 
			WHEN DATEDIFF(D,MAX(DLM), GETDATE()) < @WarningCPI_Days THEN 0 
			WHEN DATEDIFF(D,MAX(DLM), GETDATE()) < @CriticalCPI_Days THEN 1
			WHEN DATEDIFF(D,MAX(DLM), GETDATE()) >= @CriticalCPI_Days OR MAX(DLM) IS NULL THEN 2
		END 
	FROM tblSaloutH

	INSERT INTO #General(name, value, descr, priority_)
	SELECT TOP 1 'Период выгрузки продаж', 
		CONVERT(NVARCHAR, period) + 'дн.(' + CONVERT(NVARCHAR(5), min_period, 104) + ' - ' + CONVERT(NVARCHAR(5), max_period, 104) + ')', 
		'(Ключ. пользователь) Необходимо выгружать данные за больший период времени.',
		CASE WHEN period < 7 THEN 2 WHEN period < 15 THEN 1 ELSE 0 END 
	FROM #Sales
	
	/*INSERT INTO #General(name, value, descr, priority_)
	SELECT TOP 1 'Период выгрузки продаж, по датам', CONVERT(NVARCHAR, period), '(Ключ. пользователь) Необходимо выгружать данные за больший период времени.',
		CASE WHEN period < 7 THEN 2 WHEN period < 15 THEN 1 ELSE 0 END 
	FROM #Sales*/
	
	/*SELECT 
		'Кол-во накл. в периоде выгрузки/накл. обновленных/%', 
		CONVERT(NVARCHAR, */
	
	IF(SELECT COUNT(*) FROM tblSalinH) > 0
	INSERT INTO #General(name, value, descr, priority_)
	SELECT TOP 1 'Дата последней выгрузки приходов', CONVERT(NVARCHAR, MAX(DLM), 104), 
		'(Ключ. польз.) Необходимо выгрузить данные из учетной системы в SalesWorks.', 0
		/* приходы могут быть давно, это не ошибка*/
		/* CASE 
			WHEN DATEDIFF(D,MAX(DLM), GETDATE()) < @WarningCPI_Days THEN 0 
			WHEN DATEDIFF(D,MAX(DLM), GETDATE()) < @CriticalCPI_Days THEN 1
			WHEN DATEDIFF(D,MAX(DLM), GETDATE()) >= @CriticalCPI_Days OR MAX(DLM) IS NULL THEN 2
		END */
	FROM tblSalinH
	
	IF(OBJECT_ID('tblMerchandisers', 'U') IS NULL AND EXISTS (SELECT * FROM tblGlobalSettings WHERE Pref_id = 10024 AND PrefValue=1))
	EXEC ('
	IF(SELECT COUNT(*) FROM tblProductIniStocks) > 0
	INSERT INTO #General(name, value, descr, priority_)
	SELECT TOP 1 ''Дата последней выгрузки остатков'', CONVERT(NVARCHAR, MAX(DLM), 104), 
		''(Ключ. польз.) Необходимо выгрузить данные из учетной системы в SalesWorks.'',
		CASE 
			WHEN DATEDIFF(D,MAX(DLM), GETDATE()) < ' + @WarningCPI_Days + ' THEN 0 
			WHEN DATEDIFF(D,MAX(DLM), GETDATE()) < ' + @CriticalCPI_Days + ' THEN 1
			WHEN DATEDIFF(D,MAX(DLM), GETDATE()) >= ' + @CriticalCPI_Days + ' OR MAX(DLM) IS NULL THEN 2
		END 
	FROM tblProductIniStocks')
	
	IF(SELECT COUNT(*) FROM tblArchivedStocks) > 0
	INSERT INTO #General(name, value, descr, priority_)
	SELECT TOP 1 'Дата последних архивных остатков', CONVERT(NVARCHAR, MAX(StockDate), 104), 
		'(Ключ. польз.) Необходимо выгрузить данные из учетной системы в SalesWorks.',
		CASE 
			WHEN DATEDIFF(D,MAX(StockDate), GETDATE()) < @WarningCPI_Days THEN 0 
			WHEN DATEDIFF(D,MAX(StockDate), GETDATE()) < @CriticalCPI_Days THEN 1
			WHEN DATEDIFF(D,MAX(StockDate), GETDATE()) >= @CriticalCPI_Days OR MAX(StockDate) IS NULL THEN 2
		END 
	FROM tblArchivedStocks
	
	/***********************************************
	Проверка интерфейса
	***********************************************/	
	
	/* RealTime UNDER CONSTRUCTION
	IF EXISTS (SELECT * FROM tblGlobalSettings WHERE pref_id = 10013 AND PrefValue = 0)
	BEGIN TRY -- Check RealTimeCPI
		DECLARE @max_date_log DATETIME
		SET @max_date_log = (SELECT CONVERT(NVARCHAR(100), MAX(StartDate), 101) FROM tblSystemJournal WHERE SW_User = 'RealTime_CPI')
	
		/* i_salout:ProdCode */
		INSERT INTO #Head(name) VALUES('Продажи: Продукции нет в БД')
		INSERT INTO #Res(type_, name1, field1, name2, field2)
		SELECT
			'Продажи: Продукции нет в БД',
			'Код продукции', SUBSTRING(Description,65,100) [Код продукции],
			'Дата последнего появления ошибки', CONVERT(NVARCHAR(10), MAX(StartDate), 104) + ' ' + CONVERT(NVARCHAR(10), MAX(StartDate), 108)
		FROM tblSystemJournal 
		WHERE
			SW_User = 'RealTime_CPI'
			AND Description LIKE '<%'
			AND StartDate BETWEEN @Date_From AND @Date_To
		GROUP BY SUBSTRING(Description,65,100)
		
	END TRY
	BEGIN CATCH
		INSERT INTO #Head(name, descr) VALUES('Ошибка анализа данных в RealTimeCPI', 'Рекомендуется обратится в службу поддержки и выслать данный отчет')
		INSERT INTO #Res(type_, name1, field1) VALUES('Ошибка анализа данных в RealTimeCPI', 'Сообщение', ERROR_MESSAGE())
	END CATCH
	ELSE*/
	BEGIN TRY -- Check DBF
		IF IS_SRVROLEMEMBER('sysadmin')<>1 
			RAISERROR('SQL пользователь должен иметь роль sysadmin для запуска отчета',11,1)

		IF EXISTS (SELECT * FROM master.dbo.sysservers WHERE srvname = 'SW_Check_DBF') EXEC sp_dropserver 'SW_Check_DBF', 'droplogins'
		
		/* проверка наличия провайдеров */
		CREATE TABLE #Prov (Name sysname NOT NULL, ParseName sysname NOT NULL,Description sysname NOT NULL )
		INSERT #Prov  EXECUTE xp_enum_oledb_providers
		IF NOT EXISTS(SELECT * FROM #prov WHERE Name ='Advantage OLE DB Provider' OR Name='VFPOLEDB')
		BEGIN
			IF(CONVERT(NVARCHAR(MAX), SERVERPROPERTY('Edition')) LIKE '%64%')
				RAISERROR('Необходимо установить драйвер по ссылке: http://devzone.advantagedatabase.com/dz/content.aspx?Key=20&Release=16&Product=15',11,1)
			RAISERROR('Необходимо установить драйвер по ссылке: http://www.microsoft.com/en-us/download/details.aspx?id=14839',11,1)
		END

		IF EXISTS(SELECT * FROM #prov WHERE Name='VFPOLEDB')
		BEGIN
			SET @Prov = 'VFP'
			EXEC sp_msset_oledb_prop N'VFPOLEDB', N'AllowInProcess', 1
			EXEC sp_addlinkedserver 
				@server = N'SW_Check_DBF', 
				@provider = N'VFPOLEDB', 
				@srvproduct = N'VFPOLEDB',
				@datasrc = @DBF_Path
		END
		ELSE
		BEGIN
			SET @Prov = 'ADV'
			EXEC sp_msset_oledb_prop N'Advantage OLE DB Provider', N'AllowInProcess', 1
			EXEC sp_addlinkedserver 
				 @server = N'SW_Check_DBF', 
				 @provider = N'Advantage OLE DB Provider', 
				 @srvproduct = N'Advantage OLE DB Provider',
				 @datasrc = @DBF_Path,
				 @provstr =N'ServerType=ADS_LOCAL_SERVER; TableType=ADS_VFP;'	
		END
		EXEC sp_addlinkedsrvlogin @rmtsrvname=N'SW_Check_DBF',@useself=N'False'
		
		if OBJECT_ID('tempdb..##outlets_dbf') IS NOT NULL DROP TABLE ##outlets_dbf
		if OBJECT_ID('tempdb..##oldebts_dbf') IS NOT NULL DROP TABLE ##oldebts_dbf
		if OBJECT_ID('tempdb..##oldebdet_dbf') IS NOT NULL DROP TABLE ##oldebdet_dbf
		if OBJECT_ID('tempdb..##olpform_dbf') IS NOT NULL DROP TABLE ##olpform_dbf
		if OBJECT_ID('tempdb..##prlist_dbf') IS NOT NULL DROP TABLE ##prlist_dbf
		if OBJECT_ID('tempdb..##inistock_dbf') IS NOT NULL DROP TABLE ##inistock_dbf
		if OBJECT_ID('tempdb..##arstock_dbf') IS NOT NULL DROP TABLE ##arstock_dbf
		if OBJECT_ID('tempdb..##arstockg_dbf') IS NOT NULL DROP TABLE ##arstockg_dbf
		if OBJECT_ID('tempdb..##loclprod_dbf') IS NOT NULL DROP TABLE ##loclprod_dbf
		if OBJECT_ID('tempdb..##salouth_dbf') IS NOT NULL DROP TABLE ##salouth_dbf
		if OBJECT_ID('tempdb..##saloutd_dbf') IS NOT NULL DROP TABLE ##saloutd_dbf
		if OBJECT_ID('tempdb..##saloutld_dbf') IS NOT NULL DROP TABLE ##saloutld_dbf
		if OBJECT_ID('tempdb..##salinh_dbf') IS NOT NULL DROP TABLE ##salinh_dbf
		if OBJECT_ID('tempdb..##salind_dbf') IS NOT NULL DROP TABLE ##salind_dbf
		if OBJECT_ID('tempdb..##salinld_dbf') IS NOT NULL DROP TABLE ##salinld_dbf

		EXEC('SELECT * INTO ##outlets_dbf FROM OPENQUERY(SW_Check_DBF, ''SELECT * FROM OUTLETS'')')
		EXEC('SELECT * INTO ##oldebts_dbf FROM OPENQUERY(SW_Check_DBF, ''SELECT * FROM OLDEBTS'')')
		EXEC('SELECT * INTO ##oldebdet_dbf FROM OPENQUERY(SW_Check_DBF, ''SELECT * FROM OLDEBDET'')')
		EXEC('SELECT * INTO ##inistock_dbf FROM OPENQUERY(SW_Check_DBF, ''SELECT * FROM INISTOCK'')')
		EXEC('SELECT * INTO ##loclprod_dbf FROM OPENQUERY(SW_Check_DBF, ''SELECT * FROM LOCLPROD'')')
		EXEC('SELECT * INTO ##salouth_dbf FROM OPENQUERY(SW_Check_DBF, ''SELECT * FROM SALOUTH'')')
		EXEC('SELECT * INTO ##saloutd_dbf FROM OPENQUERY(SW_Check_DBF, ''SELECT * FROM SALOUTD'')')
		EXEC('SELECT * INTO ##saloutld_dbf FROM OPENQUERY(SW_Check_DBF, ''SELECT * FROM SALOUTLD'')')
		EXEC('SELECT * INTO ##salinh_dbf FROM OPENQUERY(SW_Check_DBF, ''SELECT * FROM SALINH'')')
		EXEC('SELECT * INTO ##salind_dbf FROM OPENQUERY(SW_Check_DBF, ''SELECT * FROM SALIND'')')
		EXEC('SELECT * INTO ##salinld_dbf FROM OPENQUERY(SW_Check_DBF, ''SELECT * FROM SALINLD'')')

		-- outlets.dbf
		INSERT INTO #Head(name, descr) VALUES('Outlets:Owner_id ТП нет в базе', '(Ключ. польз.) Необходимо сопоставить код торгового представителя в уч. системе')
		INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'Owner_id', Owner_id  FROM ##outlets_dbf
		CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
		WHERE Owner_id NOT IN (SELECT Merch_id FROM tblMerchandisers) AND Owner_id <> 0
		
		INSERT INTO #Head(name, descr) VALUES('Outlets:Ol_Code дубликаты ТТ', '(Программист) Код ТТ должен быть уникальный')
		INSERT INTO #Res(type_, name1, field1) SELECT h.name, 'OL_Code', CASE WHEN OL_Code = '' THEN 'Пусто' ELSE OL_Code END FROM ##outlets_dbf
		CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
		GROUP BY h.name, ol_code HAVING COUNT(*)>1
		
		-- oldebts.dbf
		IF EXISTS (SELECT * FROM tblGlobalSettings WHERE Pref_id = 10003 AND PrefValue=1)
		BEGIN
			INSERT INTO #Head(name, descr) VALUES('OlDebts:OL_Code торговая точка не существует', '(Программист) Долг на торговую точку, которой нет в Outlets.dbf')
			INSERT INTO #Res(type_, name1, field1) SELECT h.name, 'OL_Code', OL_code FROM ##oldebts_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			WHERE OL_Code COLLATE database_default NOT IN (SELECT OL_Code FROM tblOutlets UNION SELECT OL_Code COLLATE database_default FROM ##outlets_dbf)
			
			INSERT INTO #Head(name, descr) VALUES('OlDebts:Ol_Code дубликаты ТТ', '(Программист) Код ТТ должен быть уникальный')
			INSERT INTO #Res(type_, name1, field1) SELECT h.name, 'OL_Code', CASE WHEN OL_Code = '' THEN 'Пусто' ELSE OL_Code END FROM ##oldebts_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			GROUP BY h.name, ol_code HAVING COUNT(*)>1
		END
		
		-- oldebdet.dbf
		IF EXISTS (SELECT * FROM tblGlobalSettings WHERE Pref_id = 10029 AND PrefValue=1)
		BEGIN
			INSERT INTO #Head(name, descr) VALUES('OlDebDet:OL_Code торговая точка не существует', '(Программист) Долг на торговую точку, которой нет в Outlets.dbf')
			INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'OL_Code', OL_code FROM ##oldebdet_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			WHERE OL_Code COLLATE database_default NOT IN (SELECT OL_Code FROM tblOutlets UNION SELECT OL_Code COLLATE database_default FROM ##outlets_dbf)
			
			INSERT INTO #Head(name, descr) VALUES('OlDebDet:DebTypCode Некорректный тип долга', '(Программист) Необходимо указывать корректный тип долга')
			INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'DebTypCode', DebTypCode FROM ##oldebdet_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			WHERE DebTypCode COLLATE database_default NOT IN (SELECT ExternalCode FROM tblDebtTypes)
			
			INSERT INTO #Head(name, descr) VALUES('OlDebDet:OL_Code | Date | Comment дубликаты','(Программист) Необходимо указывать уникальный код накладной в коментарии')
			INSERT INTO #Res(type_, name1, field1)
			SELECT DISTINCT h.name, 'OL_Code | Date | Comment', RTRIM(OL_Code) + ' | ' + RTRIM(Date) + ' | ' + RTRIM(Comment) FROM ##oldebdet_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h	
			GROUP BY h.name, OL_Code, Date, Comment HAVING COUNT(*) >1
		END
		
		-- inistock.dbf
		IF EXISTS (SELECT * FROM tblGlobalSettings WHERE Pref_id = 10024 AND PrefValue=1)
		BEGIN
		INSERT INTO #Head(name, descr) VALUES('IniStock:Wareh_Code некорректный код склада', '(Программист) Доступные коды можно посмотреть в справочнике складов SalesWorks')
		INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'Wareh_Code', wareh_code FROM ##inistock_dbf
		CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
		WHERE Wareh_Code COLLATE database_default NOT IN (SELECT W_ExternalCode FROM tblWarehouses WHERE W_ExternalCode<>'0')
	
		IF @IsLocal = 0
		BEGIN
			INSERT INTO #Head(name, descr) VALUES('IniStock:ProdCode продукции с таким кодом нет в базе','(Ключ. польз.) Неправильно сопоставлена продукция. Доступные коды можно посмотреть в справочнике продукции SalesWorks.')
			INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'ProdCode', CASE WHEN ProdCode = '' THEN 'Пусто' ELSE RTRIM(ProdCode) END FROM ##inistock_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			WHERE ProdCode COLLATE database_default NOT IN (SELECT ProductCode FROM tblProducts)

			INSERT INTO #Head(name, descr) VALUES('IniStock:Wareh_Code | ProdCode | Lot_id дубликаты кода продукции','(Ключ. польз.) Продукция сопоставлена дважды.')
			INSERT INTO #Res(type_, name1, field1)
			SELECT DISTINCT h.name, 'Wareh_Code | ProdCode | Lot_id', RTRIM(wareh_code) + ' | ' + RTRIM(ProdCode) + ' | ' + RTRIM(Lot_id) FROM ##inistock_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h	
			GROUP BY h.name, Wareh_Code, ProdCode, Lot_id HAVING COUNT(*) >1
		END
		ELSE
		BEGIN
			INSERT INTO #Head(name, descr) VALUES('IniStock:LocalCode продукции с таким кодом нет в базе','(Программист) Продукцию с таким кодом необходимо выгружать в LoclProd.dbf')
			INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'LocalCode', CASE WHEN LocalCode = '' THEN 'Пусто' ELSE RTRIM(LocalCode) END FROM ##inistock_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			WHERE LocalCode COLLATE database_default NOT IN (SELECT LocalProductCode FROM tblLocalProducts UNION SELECT LocalCode FROM ##loclprod_dbf)

			INSERT INTO #Head(name, descr) VALUES('IniStock:Wareh_Code | LocalCode | Lot_id Дубликаты продукции', '(Программист) Продукция должна иметь не более одного остатка')
			INSERT INTO #Res(type_, name1, field1) 
			SELECT DISTINCT h.name, 'Wareh_Code | LocalCode | Lot_id', RTRIM(wareh_code) + ' | ' + RTRIM(LocalCode) + ' | ' + RTRIM(Lot_id) FROM ##inistock_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			GROUP BY h.name, wareh_code, LocalCode, Lot_id HAVING (Count(*)>1)
		END
		END
		
		-- olpform.dbf
		IF EXISTS (SELECT * FROM tblGlobalSettings WHERE Pref_id = 10020 AND PrefValue=1)
		BEGIN
			EXEC('SELECT * INTO ##olpform_dbf FROM OPENQUERY(SW_Check_DBF, ''SELECT * FROM OLPFORM'')')
			INSERT INTO #Head(name, descr) VALUES('OlPForm:OL_Code торговая точка не существует', '(Программист) Торговая точка должна быть в Outlets.dbf')
			INSERT INTO #Res(type_, name1, field1) SELECT h.name, 'OL_Code', OL_code FROM ##olpform_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			WHERE OL_Code COLLATE database_default NOT IN (SELECT OL_Code FROM tblOutlets UNION SELECT OL_Code COLLATE database_default FROM ##outlets_dbf)
			
			INSERT INTO #Head(name, descr) VALUES('OlPForm:PayForm_id форма оплаты не существует', '(Программист) Необходимо выгружать корректный код формы оплаты')
			INSERT INTO #Res(type_, name1, field1) SELECT h.name, 'PayForm_id', PayForm_id FROM ##olpform_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			WHERE PayForm_id NOT IN (SELECT PayForm_id FROM tblPayForms)
			
			INSERT INTO #Head(name, descr) VALUES('OlPForm:OL_Code | PayForm_id дубликаты кодов', '(Программист) Не должно быть дубликатов OL_Code | PayForm_id')
			INSERT INTO #Res(type_, name1, field1) SELECT h.name, 'OL_Code | PayForm_id', RTRIM(OL_code) + ' | ' + CONVERT(NVARCHAR(MAX), PayForm_id) FROM ##olpform_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			GROUP BY h.name, OL_Code, PayForm_id HAVING COUNT(*)>1
		END
		

		-- prlist.dbf
		IF EXISTS (SELECT * FROM tblGlobalSettings WHERE Pref_id = 10019 AND PrefValue=1)
		BEGIN
			EXEC('SELECT * INTO ##prlist_dbf FROM OPENQUERY(SW_Check_DBF, ''SELECT * FROM PRLIST'')')

			INSERT INTO #Head(name, descr) VALUES('OlPForm:PayForm_id форма оплаты не существует', '(Программист) Необходимо выгружать корректный код формы оплаты')
			INSERT INTO #Res(type_, name1, field1) SELECT h.name, 'PayForm_id', PayForm_id FROM ##prlist_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			WHERE PayForm_id NOT IN (SELECT PayForm_id FROM tblPayForms)
			
			IF @IsLocal = 0
			BEGIN
				INSERT INTO #Head(name, descr) VALUES('PrList:Code продукции с таким кодом нет в базе','(Ключ. польз.) Неправильно сопоставлена продукция. Доступные коды можно посмотреть в справочнике продукции SalesWorks.')
				INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'Code', CASE WHEN Code = '' THEN 'Пусто' ELSE RTRIM(Code) END FROM ##prlist_dbf
				CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
				WHERE Code COLLATE database_default NOT IN (SELECT ProductCode FROM tblProducts)

				INSERT INTO #Head(name, descr) VALUES('PrList:PayForm_id | Code дубликаты продукции','(Ключ. польз.) Продукция сопоставлена дважды.')
				INSERT INTO #Res(type_, name1, field1)
				SELECT DISTINCT h.name, 'PayForm_id | Code', CONVERT(NVARCHAR(MAX), PayForm_id) + ' | ' + RTRIM(Code) FROM ##prlist_dbf
				CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h	
				GROUP BY h.name, PayForm_id, Code HAVING COUNT(*) >1
			END
			ELSE
			BEGIN
				INSERT INTO #Head(name, descr) VALUES('PrList:LocalCode продукции с таким кодом нет в базе','(Программист) Продукцию с таким кодом необходимо выгружать в LoclProd.dbf')
				INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'LocalCode', CASE WHEN LocalCode = '' THEN 'Пусто' ELSE RTRIM(LocalCode) END FROM ##prlist_dbf
				CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
				WHERE LocalCode COLLATE database_default NOT IN (SELECT LocalProductCode FROM tblLocalProducts UNION SELECT LocalCode FROM ##loclprod_dbf)

				INSERT INTO #Head(name, descr) VALUES('PrList:PayForm_id | LocalCode дубликаты продукции', '(Программист) Продукция должна иметь одну цену')
				INSERT INTO #Res(type_, name1, field1) 
				SELECT DISTINCT h.name, 'PayForm_id | LocalCode', CONVERT(NVARCHAR(MAX), PayForm_id) + ' | ' + RTRIM(LocalCode) FROM ##prlist_dbf
				CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
				GROUP BY h.name, PayForm_id, LocalCode HAVING (Count(*)>1)
			END
		END
		
		-- arstock.dbf
		IF EXISTS (SELECT * FROM tblGlobalSettings WHERE Pref_id = 10043 AND PrefValue=1)
		BEGIN
		IF @IsLocal = 0
		BEGIN
			EXEC('SELECT * INTO ##arstockg_dbf FROM OPENQUERY(SW_Check_DBF, ''SELECT * FROM ARSTOCKG'')')
			-- arstockg.dbf
			INSERT INTO #Head(name, descr) VALUES('ArStockG:Code продукции с таким кодом нет в базе','(Ключ. польз.) Неправильно сопоставлена продукция. Доступные коды можно посмотреть в справочнике продукции SalesWorks.')
			INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'Code', CASE WHEN Code = '' THEN 'Пусто' ELSE RTRIM(Code) END FROM ##arstockg_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			WHERE Code COLLATE database_default NOT IN (SELECT ProductCode FROM tblProducts)
			
			INSERT INTO #Head(name, descr) VALUES('ArStockG:Wareh_Code склада с таким кодом нет в базе','(Ключ. польз.) Доступные коды можно посмотреть в справочнике складов SalesWorks')
			INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'Wareh_Code', CASE WHEN Wareh_Code = '' THEN 'Пусто' ELSE RTRIM(Wareh_Code) END FROM ##arstockg_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			WHERE Wareh_Code COLLATE database_default NOT IN (SELECT W_ExternalCode FROM tblWarehouses WHERE W_ExternalCode<>'0')
			
			INSERT INTO #Head(name, descr) VALUES('ArStockG:Wareh_Code | Code | Date дубликаты кода продукции','(Ключ. польз.) Продукция сопоставлена дважды.')
			INSERT INTO #Res(type_, name1, field1)
			SELECT DISTINCT h.name, 'Wareh_Code | Code | Date | Lot_id', RTRIM(wareh_code) + ' | ' + RTRIM(Code) + ' | ' + CONVERT(NVARCHAR, Date, 104) + ' | ' + RTRIM(Lot_id) FROM ##arstockg_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			GROUP BY h.name, Wareh_Code, Code, Date, Lot_id HAVING COUNT(*) >1
		END
		ELSE
		BEGIN
			EXEC('SELECT * INTO ##arstock_dbf FROM OPENQUERY(SW_Check_DBF, ''SELECT * FROM ARSTOCK'')')
			
			INSERT INTO #Head(name, descr) VALUES('ArStock:LocalCode продукции с таким кодом нет в базе','(Программист) Продукцию с таким кодом необходимо выгружать в LoclProd.dbf')
			INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'LocalCode', CASE WHEN LocalCode = '' THEN 'Пусто' ELSE RTRIM(LocalCode) END FROM ##arstock_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			WHERE LocalCode COLLATE database_default NOT IN (SELECT LocalCode FROM tblLocalProducts UNION SELECT LocalCode FROM ##loclprod_dbf)
			
			INSERT INTO #Head(name, descr) VALUES('ArStock:Wareh_Code склада с таким кодом нет в базе','(Ключ. польз.) Неправильно указан код склада. Доступные коды можно посмотреть в справочнике складов SalesWorks.')
			INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'Wareh_Code', CASE WHEN Wareh_Code = '' THEN 'Пусто' ELSE RTRIM(Wareh_Code) END FROM ##arstock_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			WHERE Wareh_Code COLLATE database_default NOT IN (SELECT W_ExternalCode FROM tblWarehouses WHERE W_ExternalCode<>'0')
			
			INSERT INTO #Head(name, descr) VALUES('ArStock:Wareh_Code | LocalCode | Date дубликаты кода продукции','(Программист) Продукция не может иметь разных остатков в один день.')
			INSERT INTO #Res(type_, name1, field1)
			SELECT DISTINCT h.name, 'Wareh_Code | LocalCode | Date | Lot_id', RTRIM(wareh_code) + ' | ' + RTRIM(LocalCode) + ' | ' + CONVERT(NVARCHAR, Date, 104) + ' | ' + RTRIM(Lot_id) FROM ##arstock_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h	
			GROUP BY h.name, Wareh_Code, LocalCode, Date, Lot_id HAVING COUNT(*) >1
		END
		END
		
		-- salouth.dbf
		INSERT INTO #Head(name, descr) VALUES('SaloutH:OL_Code торговая точка не существует', '(Программист) Продажа на торговую точку, которой нет в Outlets.dbf')
		INSERT INTO #Res(type_, name1, field1) SELECT h.name, 'OL_Code', OL_code FROM ##salouth_dbf
		CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
		WHERE OL_Code COLLATE database_default NOT IN (SELECT OL_Code FROM tblOutlets UNION SELECT OL_Code COLLATE database_default FROM ##outlets_dbf) AND OL_Code<>'' AND OL_Code<>'0'

		INSERT INTO #Head(name, descr) VALUES('SaloutH:Invoice_No дубликаты накладных', '(Программист) Код накладной должен быть уникальным')
		INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'Invoice_No', CASE WHEN Invoice_No = '' THEN 'Пусто' ELSE Invoice_No END FROM ##salouth_dbf
		CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
		GROUP BY h.name, Invoice_No HAVING COUNT(*)>1

		INSERT INTO #Head(name, descr) VALUES('SaloutH:Merch_id ТП не существует', '(Программист) Доступные коды можно посмотреть в справочнике ТП SalesWorks')
		INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'Merch_id', Merch_id FROM ##salouth_dbf
		CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
		WHERE Merch_id NOT IN (SELECT Merch_id FROM tblMerchandisers) AND Merch_id<>0
		
		INSERT INTO #Head(name, descr) VALUES('SaloutH:Order_No заказ не существует', '(Программист) Заказ должен быть с кодом из SalesWorks')
		INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'Order_No', Order_No FROM ##salouth_dbf
		CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
		WHERE Order_No NOT IN (SELECT CONVERT(NVARCHAR(MAX), OrderNo) FROM tblOutletOrderH) AND RTRIM(Order_No)<>'' AND RTRIM(Order_No)<>'0'
				
		-- salinh.dbf
		INSERT INTO #Head(name, descr) VALUES('SalinH:Invoice_No дубликаты накладных', '(Программист) Код накладной должен быть уникальным')
		INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'Invoice_No', CASE WHEN Invoice_No = '' THEN 'Пусто' ELSE Invoice_No END FROM ##salinh_dbf
		CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
		GROUP BY h.name, Invoice_No HAVING COUNT(*)>1
		
		IF EXISTS (SELECT * FROM tblGlobalSettings WHERE Pref_id = 10050 AND PrefValue=1) /* Обязательный склад */
		BEGIN
			INSERT INTO #Head(name, descr) VALUES('SaloutH:Wareh_Code некорректный код склада', '(Программист) Доступные коды можно посмотреть в справочнике складов SalesWorks')
			INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'Wareh_Code', wareh_code FROM ##salouth_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			WHERE Wareh_Code COLLATE database_default NOT IN (SELECT W_ExternalCode FROM tblWarehouses WHERE W_ExternalCode<>'0')
			
			INSERT INTO #Head(name, descr) VALUES('SalinH:Wareh_Code некорректный код склада', '(Программист) Доступные коды можно посмотреть в справочнике складов SalesWorks')
			INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'Wareh_Code', wareh_code FROM ##salinh_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			WHERE Wareh_Code COLLATE database_default NOT IN (SELECT W_ExternalCode FROM tblWarehouses WHERE W_ExternalCode<>'0')
		END
		
		IF EXISTS (SELECT * FROM tblGlobalSettings WHERE Pref_id = 52 AND PrefValue=0) /* Глобальная продукция */
		BEGIN
			-- saloutd.dbf
			INSERT INTO #Head(name, descr) VALUES('SaloutD:Code продукции с таким кодом нет в базе','(Ключ. польз.) Неправильно сопоставлена продукция. Доступные коды можно посмотреть в справочнике продукции SalesWorks.')
			INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'Code', CASE WHEN Code = '' THEN 'Пусто' ELSE RTRIM(Code) END FROM ##saloutd_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			WHERE Code COLLATE database_default NOT IN (SELECT ProductCode FROM tblProducts)
			
			INSERT INTO #Head(name, descr) VALUES('SaloutD:Code Дубликаты продукции в накладной', '(Программист) В одной накладной не должно быть двух и более одинаковых позиций с одинаковой ценой и партией.')
			INSERT INTO #Res(type_, name1, field1, name2, field2) SELECT DISTINCT h.name, 'Invoice_No', RTRIM(Invoice_No), 'Code', CASE WHEN Code = '' THEN 'Пусто' ELSE RTRIM(Code) END FROM ##saloutd_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			GROUP BY h.name, invoice_no, code, price, lot_id HAVING (Count(*)>1)
			
			-- salind.dbf
			INSERT INTO #Head(name, descr) VALUES('SalinD:Code продукции с таким кодом нет в базе','(Ключ. польз.) Неправильно сопоставлена продукция. Доступные коды можно посмотреть в справочнике продукции SalesWorks.')
			INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'Code', CASE WHEN Code = '' THEN 'Пусто' ELSE RTRIM(Code) END FROM ##salind_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			WHERE Code COLLATE database_default NOT IN (SELECT ProductCode FROM tblProducts)
			
			INSERT INTO #Head(name, descr) VALUES('SalinD:Code Дубликаты продукции в накладной', '(Программист) В одной накладной не должно быть двух и более одинаковых позиций с одинаковой ценой и партией.')
			INSERT INTO #Res(type_, name1, field1, name2, field2) SELECT DISTINCT h.name, 'Invoice_No', RTRIM(Invoice_No), 'Code', CASE WHEN Code = '' THEN 'Пусто' ELSE RTRIM(Code) END FROM ##salind_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			GROUP BY h.name, invoice_no, code, price, lot_id HAVING (Count(*)>1)
		END
		ELSE
		BEGIN /* Локальная продукция */
			-- saloutld.dbf
			INSERT INTO #Head(name, descr) VALUES('SaloutLD:LocalCode продукции с таким кодом нет в базе','(Программист) Продукцию с таким кодом необходимо выгружать в LoclProd.dbf')
			INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'LocalCode', CASE WHEN LocalCode = '' THEN 'Пусто' ELSE RTRIM(LocalCode) END FROM ##saloutld_dbf 
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			WHERE LocalCode COLLATE database_default NOT IN (SELECT LocalProductCode FROM tblLocalProducts UNION SELECT LocalCode FROM ##loclprod_dbf)
			
			INSERT INTO #Head(name, descr) VALUES('SaloutLD:LocalCode Дубликаты продукции в накладной', '(Программист) В одной накладной не должно быть двух и более одинаковых позиций с одинаковой ценой и партией.')
			INSERT INTO #Res(type_, name1, field1, name2, field2) 
			SELECT DISTINCT h.name,
				'Invoice_No | LocalCode', RTRIM(Invoice_No) + ' | ' + CASE WHEN LocalCode = '' THEN 'Пусто' ELSE RTRIM(LocalCode) END,
				'Lot_id | Price', CASE WHEN Lot_id = '' THEN 'Пусто' ELSE RTRIM(Lot_id) END + ' | ' + CONVERT(NVARCHAR(100), Price)
			FROM ##saloutld_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			GROUP BY h.name, invoice_no, localcode, price, lot_id HAVING (Count(*)>1)

			-- salinld.dbf
			INSERT INTO #Head(name, descr) VALUES('SalinLD:LocalCode продукции с таким кодом нет в базе','(Программист) Продукцию с таким кодом необходимо выгружать в LoclProd.dbf')
			INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'LocalCode', CASE WHEN LocalCode = '' THEN 'Пусто' ELSE RTRIM(LocalCode) END FROM ##salinld_dbf 
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			WHERE LocalCode COLLATE database_default NOT IN (SELECT LocalProductCode FROM tblLocalProducts UNION SELECT LocalCode FROM ##loclprod_dbf)
			
			INSERT INTO #Head(name, descr) VALUES('SalinLD:LocalCode Дубликаты продукции в накладной', '(Программист) В одной накладной не должно быть двух и более одинаковых позиций с одинаковой ценой и партией.')
			INSERT INTO #Res(type_, name1, field1, name2, field2) 
			SELECT DISTINCT h.name,
				'Invoice_No | LocalCode', RTRIM(Invoice_No) + ' | ' + CASE WHEN LocalCode = '' THEN 'Пусто' ELSE RTRIM(LocalCode) END,
				'Lot_id | Price', CASE WHEN Lot_id = '' THEN 'Пусто' ELSE RTRIM(Lot_id) END + ' | ' + CONVERT(NVARCHAR(100), Price)
			FROM ##salinld_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			GROUP BY h.name, invoice_no, localcode, price, lot_id HAVING (Count(*)>1)
			
			-- loclprod.dbf
			INSERT INTO #Head(name, descr) VALUES('LoclProd:Code продукции с таким кодом нет в базе','(Ключ. польз.) Продукция неверно сопоставлена в уч. системе. Доступные коды можно посмотреть в справочнике продукции SalesWorks.')
			INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'Code', RTRIM(Code) FROM ##loclprod_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			WHERE Code COLLATE database_default NOT IN (SELECT ProductCode FROM tblProducts) AND Code <> ''

			INSERT INTO #Head(name, descr) VALUES('LoclProd:LocalCode Дубликаты продукции','(Прогаммист) Продукция должна иметь уникальный код.')
			INSERT INTO #Res(type_, name1, field1) SELECT DISTINCT h.name, 'LocalCode', RTRIM(LocalCode) FROM ##loclprod_dbf
			CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
			GROUP BY h.name, LocalCode HAVING (Count(*)>1)
		END
		
		EXEC sp_dropserver 'SW_Check_DBF', 'droplogins'
	END TRY
	BEGIN CATCH
		INSERT INTO #Head(name, descr) VALUES('Ошибка анализа данных в ДБФ файлах', 'Рекомендуется обратится в службу поддержки и выслать данный отчет')
		IF(@Prov = 'VFP')
			INSERT INTO #Res(type_, name1, field1, name3, field3) 
			VALUES('Ошибка анализа данных в ДБФ файлах', 'Сообщение', ERROR_MESSAGE() + ' Line:' + CONVERT(NVARCHAR(255), ERROR_LINE()), 
					'Варианты решения', 
					'1. Проверить наличие всех ДБФ файлов ' + CHAR(13) + 
					'2. Удалить файлы *.CDX в папке с ДБФ файлами' + CHAR(13) + 
					'3. Установить полный доступ в для пользователя Everyone к папке с ДБФ файлами и папкам верхнего уровня' + CHAR(13) + 
					'4. Если папка с ДБФ файлами сетевая, необходимо расшарить её для всех пользователей или для пользователя под которым запущен сервис sqlservr.exe' + CHAR(13) +
					'5. Если используется RDP подключение, необходимо создать файл C:\Program Files\Advantage 10.10\OLEDB\ads.ini с содержанием из 2х строк:' + CHAR(13) +
					'[SETTINGS]' + CHAR(13) + 'MTIER_LOCAL_CONNECTIONS=1')
		ELSE
			INSERT INTO #Res(type_, name1, field1, name3, field3) 
			VALUES('Ошибка анализа данных в ДБФ файлах', 'Сообщение', ERROR_MESSAGE() + ' Line:' + CONVERT(NVARCHAR(255), ERROR_LINE()), 
					'Варианты решения', 
					'1. Проверить наличие всех ДБФ файлов ' + CHAR(13) + 
					'2. Установить полный доступ в для пользователя Everyone к папке с ДБФ файлами и папкам верхнего уровня' + CHAR(13) + 
					'3. Если папка с ДБФ файлами сетевая, необходимо расшарить её для всех пользователей или для пользователя под которым запущен сервис sqlservr.exe')
	END CATCH

	-- торговые точки
	INSERT INTO #Res(type_, priority_, name1, field1, name2, field2) SELECT 'Анализ данных в базе', 0, 'Название', 'Кол-во ТТ | Активных | Новых', 'Значение', 
		CONVERT(NVARCHAR(MAX), COUNT(DISTINCT tblOutlets.OL_ID)) + ' | ' + 
		CONVERT(NVARCHAR(MAX), SUM(CASE WHEN tblOutlets.Status=2 THEN 1 ELSE 0 END)) + ' | ' + 
		CONVERT(NVARCHAR(MAX), SUM(CASE WHEN tblOutlets.Status=0 THEN 1 ELSE 0 END))
	FROM tblOutlets

	INSERT INTO #Res(type_, priority_, field1, field2) SELECT 'Анализ данных в базе', 0, 
		'Кол-во ТТ на маршрутах | не на маршрутах',
		(SELECT CONVERT(NVARCHAR(MAX), COUNT(DISTINCT tblOutlets.OL_ID)) FROM tblOutletRoutes JOIN tblOutlets ON tblOutletRoutes.OL_id = tblOutlets.OL_id AND tblOutletRoutes.status=2 AND tblOutlets.status=2) + ' | ' +
		(SELECT CONVERT(NVARCHAR(MAX), COUNT(DISTINCT tblOutlets.OL_ID)) FROM tblOutlets WHERE OL_ID NOT IN (SELECT OL_ID FROM tblOutletRoutes WHERE status=2) AND status=2)

	-- маршруты
	INSERT INTO #Res(type_, priority_, field1, field2) SELECT 'Анализ данных в базе', 0, 
		'Кол-во ТП | маршрутов',
		(SELECT CONVERT(NVARCHAR(MAX), COUNT(tblMerchandisers.Merch_id)) FROM tblMerchandisers WHERE status=2) + ' | ' +
		(SELECT CONVERT(NVARCHAR(MAX), COUNT(tblRoutes.Route_id)) FROM tblRoutes WHERE status=2)
		
	INSERT INTO #Res(type_, priority_, field1, field2) SELECT 'Анализ данных в базе', 0, 
		'Кол-во ТП ответственных за активные ТТ', COUNT(DISTINCT owner_id) FROM tblOutlets WHERE Status = 2

	INSERT INTO #Res(type_, priority_, field1, field2) SELECT 'Анализ данных в базе', 0, 
		'Типов операций', (SELECT CONVERT(NVARCHAR(MAX), COUNT(Operation_id)) FROM tblOperations WHERE status=2)

	INSERT INTO #Res(type_, priority_, field1, field2) SELECT 'Анализ данных в базе', 0, 
		'Складов | ТП привязанных к складам',
		(SELECT CONVERT(NVARCHAR(MAX), COUNT(W_id)) FROM tblWarehouses WHERE status=2 AND W_ExternalCode <> '0') + ' | ' +
		(SELECT CONVERT(NVARCHAR(MAX), COUNT(DISTINCT Merch_id)) FROM tblWarehouseRelations WHERE status=2)

	-- ФО
	INSERT INTO #Res(type_, priority_, field1, field2) SELECT 'Анализ данных в базе', 0, 
		'Кол-во ФО | сред. к-во СКЮ на ФО | мин. | макс.',
		(SELECT CONVERT(NVARCHAR(MAX), COUNT(tblPayForms.PayForm_id)) FROM tblPayForms WHERE status=2) + ' | ' +
		CONVERT(NVARCHAR(MAX),
			(SELECT COUNT(*) FROM tblPriceList pr JOIN tblPayForms pf ON pf.PayForm_id = pr.PayForm_id AND pf.Status = 2) / 
			(SELECT COUNT(*) FROM tblPayForms WHERE Status=2)
		) + ' | ' +
		(SELECT TOP 1 CONVERT(NVARCHAR(MAX), COUNT(*))
			FROM tblPayforms pf LEFT JOIN tblPriceList pr ON pf.PayForm_id = pr.PayForm_id
			WHERE pf.Status = 2
			GROUP BY pf.PayForm_id
			ORDER BY COUNT(*)) + ' | ' +
		(SELECT TOP 1 CONVERT(NVARCHAR(MAX), COUNT(*))
			FROM tblPayforms pf LEFT JOIN tblPriceList pr ON pf.PayForm_id = pr.PayForm_id
			WHERE pf.Status = 2
			GROUP BY pf.PayForm_id
			ORDER BY COUNT(*) DESC)
			
	INSERT INTO #Res(type_, priority_, field1, field2) SELECT 'Анализ данных в базе', 0, 
		'Вчера: Кол-во заказов', CONVERT(NVARCHAR(MAX), COUNT(*))
			FROM tblOutletOrderH oh
			JOIN tblOutletCardH ch ON oh.OlCard_id = ch.OLCard_id 
			WHERE OlOrderDate BETWEEN CONVERT(NVARCHAR(MAX), GETDATE() - 1, 104) AND CONVERT(NVARCHAR(MAX), GETDATE() - 1, 104) + ' 23:59'
		
	INSERT INTO #Res(type_, priority_, field1, field2) SELECT 'Анализ данных в базе', 0, 
		'Вчера: ТП взявших заказы | ТТ взявших заказы', CONVERT(NVARCHAR(MAX), COUNT(DISTINCT Merch_id)) + ' | ' + CONVERT(NVARCHAR(MAX), COUNT(DISTINCT OL_id))
			FROM tblOutletOrderH oh	JOIN tblOutletCardH ch ON oh.OlCard_id = ch.OLCard_id
			WHERE OlOrderDate BETWEEN CONVERT(NVARCHAR(MAX), GETDATE() - 1, 104) AND CONVERT(NVARCHAR(MAX), GETDATE() - 1, 104) + ' 23:59'
	
	IF @IsLocal = 1
	BEGIN
		INSERT INTO #Head_db(name, descr) VALUES('Непривязанная локальная продукция','(Пользователь) Необходимо сопоставить продукцию.')
		INSERT INTO #Res(type_, name1, field1, name3, field3)
		SELECT h.name, 'Код продукции', LocalProductCode, 'Название', LocalProductName FROM tblLocalProducts
		CROSS JOIN (SELECT TOP 1 name FROM #Head_db ORDER BY id DESC) h
		WHERE Product_id IS NULL AND Status = 2 AND IsMix = 0
			
		--INSERT INTO #Res(type_, priority_, sort, field1, field2) SELECT 'Анализ данных в базе', 100, 0, 
		--'Кол-во непривязанной локальной продукции', CONVERT(NVARCHAR(MAX), COUNT(*)) FROM tblLocalProducts WHERE Product_id IS NULL AND Status = 2 AND IsMix = 0
		--INSERT INTO #Res CROSS JOIN (SELECT TOP 1 name FROM #Head ORDER BY id DESC) h
	END
			
	/***********************************************
	End of Checks, below sending results to output
	***********************************************/
	INSERT INTO #res(sort, type_, priority_, name1, field1, name2, field2, name3, field3)
		SELECT 
			-1 sort, 
			'Своевременность поступления данных' type_, 
			priority_, 
			'Название' name1, name field1,
			'Значение' name2, value field2,
			'(Ответственный) Рекомендация' name3, 
			CASE WHEN priority_>0 THEN descr ELSE '' END field3
		FROM #General
		UNION ALL
		SELECT 
			0 sort,
			'Анализ обмена данными с учетной системой' type_,
			CASE WHEN ISNULL(cnt,0)=0 THEN 0 ELSE 1 END priority_, 
			'Тип данных' name1, name field1,
			'Кол-во ошибок' name2, CONVERT(NVARCHAR(255), ISNULL(cnt,0)) field2, 
			'(Ответственный) Рекомендация' name3, 
			CASE WHEN ISNULL(cnt,0)=0 THEN '' ELSE descr COLLATE DATABASE_DEFAULT END field3
		FROM #Head LEFT JOIN (SELECT type_, COUNT(*) cnt FROM #Res GROUP BY type_) res ON res.type_ COLLATE DATABASE_DEFAULT = Name
		UNION ALL
		SELECT 
			0 sort,
			'Анализ данных в базе' type_,
			CASE WHEN ISNULL(cnt,0)=0 THEN 0 ELSE 1 END priority_, 
			'Тип данных' name1, name field1,
			'Кол-во' name2, CONVERT(NVARCHAR(255), ISNULL(cnt,0)) field2, 
			'(Ответственный) Рекомендация' name3, 
			CASE WHEN ISNULL(cnt,0)=0 THEN '' ELSE descr COLLATE DATABASE_DEFAULT END field3
		FROM #Head_db 
		
		LEFT JOIN (SELECT type_, COUNT(*) cnt FROM #Res GROUP BY type_) res ON res.type_ COLLATE DATABASE_DEFAULT = Name
		
	/* Вставка результатов в системный журнал */
	IF(@user_id = -1) 
	BEGIN
		DECLARE @x NVARCHAR(MAX)
		SET @x = (
			SELECT id, type_, priority_, name1, LTRIM(RTRIM(field1)) field1, name2, LTRIM(RTRIM(field2)) field2, name3, LTRIM(RTRIM(field3)) field3, sort
			FROM #Res
			FOR XML RAW
		)
		
		UPDATE tblSystemJournal SET StartDate=GETDATE(), EndDate = GETDATE(),
			Pc_name = ISNULL(@@SERVERNAME, '-'), pc_user = SYSTEM_USER, Description = @x, dlm=getdate()
		WHERE 
			sw_user = 'rep_CheckSalesWorks_Desktop' AND CONVERT(VARCHAR, StartDate, 104) = CONVERT(VARCHAR, GETDATE(), 104)
		
		IF @@ROWCOUNT = 0
		INSERT INTO tblSystemJournal(Trans_Id, StartDate, EndDate, Type, status, Description, 
				Pc_name, pc_user, sw_user, dlm)
			VALUES (NEWID(), GETDATE(), GETDATE(), 2, 3, @x, 
				ISNULL(@@SERVERNAME, '-'), SYSTEM_USER, 'rep_CheckSalesWorks_Desktop', GETDATE())		
	END	
	ELSE /* Выборка в отчет */
	SELECT
		CASE WHEN @Cust_id = 0 THEN 'Все' ELSE (SELECT Cust_Name FROM tblCustomers WHERE Cust_Id = @Cust_id) END Cust_name, 
		id,	type_, priority_, name1, field1, name2, field2, name3, field3
	FROM #Res
	ORDER BY sort

Вы были правы я не то скопировал, вот это то что надо. Скажите то что это процедура -это означает что я могу запускать её всего лишь набрав её имя и передав пареметры?

Сообщение было отредактировано: 28 авг 12, 17:09
28 авг 12, 17:07    [13077775]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
exec dbo.rep_CheckSalesWorks_Desktop
	@User_id = 10,
	@Cust_id = 1,
	@DBF_Path = N'C:\temp'

примерно так
28 авг 12, 17:10    [13077800]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
ВежливаяТварь,

Будьте, пожалуйста, добры, и не издевайтесь над читающими ваши посты. Убирайте ваши простыни кода в тег spoiler. Спасибо.
28 авг 12, 17:10    [13077809]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
если есть
Guest
если есть права на запуск, ага
28 авг 12, 17:11    [13077814]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
ВежливаяТварь
Member

Откуда:
Сообщений: 12
Огромное спасибо. Я прошу прощения за неудобства, пока ещё не освоился со всеми инструментами для публикования сообщений.
28 авг 12, 17:12    [13077824]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
ВежливаяТварь
Member

Откуда:
Сообщений: 12
Konst_One
exec dbo.rep_CheckSalesWorks_Desktop
	@User_id = 10,
	@Cust_id = 1,
	@DBF_Path = N'C:\temp'

примерно так


Я дико извиняюсь, но dbo.rep -это путь к таблице?
дело в том что я нашел таблицу в которой порядка 10 строка и в каждой строке хранится текст скрипта и в соседних столбцах его описание. Для того что бы мне его запустить мне нужно воспользоваться вышеприведенной командой, но поставить свой путь к таблице?
28 авг 12, 17:20    [13077873]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
dbo.rep_CheckSalesWorks_Desktop - это название процедуры.

Вы точно уверены, что вам нужно запускать то, что вы не понимаете, как устроено?
28 авг 12, 17:28    [13077936]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
ВежливаяТварь
Member

Откуда:
Сообщений: 12
Я разговаривал с разработчиками этого счастья. Они сказали что если я хочу программно формировать тот отчет который у них работает от интерактивного нажатия в кнопке, то мне следует искать ответ именно в этой таблице и в этом скрипте. Судя по коду я так понял что эта процедура просто выводит отчет. Когда я её пытаюсь запустить как указано выше мне выдаётся ошибка мол процедура с таким именем не найдена.
28 авг 12, 17:34    [13077989]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
значит этой процедуры у вас нет в базе.
1) выполните ваш скрипт на создание этой ХП
2) или возьмите содержимое процедуры + добавьте вначале описание входных параметров и их заполнение и выполните это в окне запроса SSMS

PS
а вообще, сначала посоветуйтесь с вашими разработчиками
28 авг 12, 17:39    [13078022]     Ответить | Цитировать Сообщить модератору
 Re: Запрос MSsql  [new]
ВежливаяТварь
Member

Откуда:
Сообщений: 12
Удалось запустить по названию процедуры. вроде пошло нормально единственное не могу результат вытянуть. Но это уже проблема не SQL, а программы из которой я пытаюсь запустить. Всем огромное спасибо за терпение и помощь.
28 авг 12, 17:50    [13078089]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить