Скрипты SQL для проверки данных
Проверка позиции на сайте
SET NOCOUNT ON;
-- параметры
DECLARE @webUserLogin NVARCHAR(100) = N'{Логин}';
DECLARE @vendocrPurifiedCode NVARCHAR(200) = N'{Артикул}';
DECLARE @vendorName NVARCHAR(100) = N'{Бренд}';
-- проверка товара
DECLARE @productId UNIQUEIDENTIFIER;
DECLARE @restUnitId UNIQUEIDENTIFIER;
SELECT
@productId = [product].[ArtID]
, @restUnitId = [restUnit].[RestUnitOfIssueID]
FROM
[dbo].[Articles] [product]
LEFT JOIN [dbo].[RestUnitsOfIssue] [restUnit]
ON [restUnit].[RestUnitOfIssueID] = [product].[RestUnitOfIssueID]
WHERE
[product].[SearchArticle] = @vendocrPurifiedCode
AND [product].[BrandName] = @vendorName;
IF @productId IS NULL
BEGIN
IF NOT EXISTS
(
SELECT
1
FROM
[dbo].[SiteVirtualStorePriceLists] [priceList]
WHERE
[priceList].[ProductSearchArticle] = @vendocrPurifiedCode
AND [priceList].[ProductBrandAlias] = @vendorName
)
BEGIN
PRINT 'Товар не найден в списке номенклатуры и в прайс-листе';
RETURN;
END;
END;
-- проверка единицы измерений
IF @productId IS NOT NULL
AND @restUnitId IS NULL
BEGIN
PRINT 'Для товара не указана единица измерения';
END;
-- проверка кросса "сам на себя"
IF NOT EXISTS
(
SELECT
1
FROM
[dbo].[ArticlesCrosses] AS [cross]
WHERE
[cross].[CrossSearchArticle] = @vendocrPurifiedCode
AND [cross].[CrossBrandName] = @vendorName
AND [cross].[CrossType] = 1
)
BEGIN
PRINT 'Не найден кросс "сам на себя"';
RETURN;
END;
-- проверка белых списков
IF EXISTS
(
SELECT
1
FROM
zw.[WhitelistedProducts]
)
BEGIN
IF NOT EXISTS
(
SELECT
1
FROM
[zw].[WhitelistedProducts] [whiteList]
WHERE
[whiteList].[ProductSearchArticle] = @vendocrPurifiedCode
AND [whiteList].[ProductBrandName] = @vendorName
)
BEGIN
PRINT 'Белые списки включены. ТОвар не включен в белый список';
RETURN;
END;
END;
-- проверка черных списков
IF EXISTS
(
SELECT
1
FROM
[zw].[BlacklistedProducts] [blackList]
WHERE
[blackList].[ProductSearchArticle] = @vendocrPurifiedCode
AND [blackList].[ProductBrandName] = @vendorName
)
BEGIN
PRINT 'Товар находится в черном списке';
RETURN;
END;
-- поиск и проверка пользователя
DECLARE @webUserId UNIQUEIDENTIFIER;
DECLARE @webUserRestGroupId UNIQUEIDENTIFIER;
SELECT
@webUserId = [webUser].[UserID]
, @webUserRestGroupId = [webUser].[RestGroupId]
FROM
[dbo].[SiteUsers] [webUser]
WHERE
[webUser].[UserLogin] = @webUserLogin;
IF @webUserId IS NULL
BEGIN
PRINT 'Не найден веб-пользователь';
RETURN;
END;
-- поиск и проверка роли
DECLARE @roleId UNIQUEIDENTIFIER;
SELECT
@roleId = [webUserWebRole].[RoleID]
FROM
[dbo].[UsersRoles] [webUserWebRole]
WHERE
[webUserWebRole].[UserID] = @webUserId;
IF @roleId IS NULL
BEGIN
PRINT 'Не найдена роль веб-пользователя';
RETURN;
END;
DECLARE @webRoleRestGroupId UNIQUEIDENTIFIER;
SELECT
@webRoleRestGroupId = [webRole].[SiteUserStoresAvailabilityGroupsID]
FROM
[dbo].[SiteRoles] [webRole]
WHERE
[webRole].[RoleID] = @roleId;
-- поиск и проверка договоров
DECLARE @customerId UNIQUEIDENTIFIER;
DECLARE @customerContractId UNIQUEIDENTIFIER;
DECLARE @customerContractPriceTypeId UNIQUEIDENTIFIER;
DECLARE @customerContractBasePriceTypeId UNIQUEIDENTIFIER;
DECLARE @restGroupId UNIQUEIDENTIFIER;
DECLARE @pksd NVARCHAR(300);
DECLARE [customerTreatiesCursor] CURSOR FOR
SELECT
[customer].[ContractorID] AS [customerId]
, [customerContract].[ContractorsTreatiesID] AS [customerContractId]
, [customerContract].[ArticlesPriceTypesID] AS [customerContractPriceTypeId]
, [priceType].[BasePriceType] AS [customerContracBasetPriceTypeId]
, ISNULL([customer].[Name], '') + ' (' + ISNULL([customer].[Code], '') + '), ' + ISNULL([customerContract].[Name], '') + ' (' + ISNULL([customerContract].[Code], '') + '), ' + [priceType].[Name]
+ ' (' + CAST([customerContract].[ArticlesPriceTypesID] AS NVARCHAR(100)) + ')' + CHAR(10) AS [Name]
, COALESCE([customerContract].[SiteRestGroupId], [customer].[SiteRestGroupId], @webUserRestGroupId, @webRoleRestGroupId) AS [RestGroupId]
FROM
[dbo].[SiteUsersContractors] [webUserCustomer]
INNER JOIN [dbo].[Contractors] [customer]
ON [customer].[ContractorID] = [webUserCustomer].[ContractorID]
INNER JOIN [dbo].[ContractorsTreaties] [customerContract]
ON [customerContract].[ContractorID] = [customer].[ContractorID]
INNER JOIN [dbo].[ArticlesPriceTypes] [priceType]
ON [priceType].[ArticlesPriceTypesID] = [customerContract].[ArticlesPriceTypesID]
WHERE
[webUserCustomer].[UserID] = @webUserId;
OPEN [customerTreatiesCursor];
FETCH NEXT FROM [customerTreatiesCursor]
INTO
@customerId
, @customerContractId
, @customerContractPriceTypeId
, @customerContractBasePriceTypeId
, @pksd
, @restGroupId;
IF @@FETCH_STATUS <> 0
BEGIN
PRINT 'Не найдены догвооры контрагента';
RETURN;
END;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @pksd;
DECLARE @stockAvailability TABLE
(
RepositoryId UNIQUEIDENTIFIER
, SupplierId UNIQUEIDENTIFIER
, Quantity DECIMAL(15, 3)
);
IF @restGroupId IS NULL
BEGIN
INSERT INTO
@stockAvailability
(
[RepositoryId]
, [SupplierId]
, [Quantity]
)
SELECT
[stockAvailability].[RepositoryId]
, [stockAvailability].[SupplierId]
, [stockAvailability].[Quantity]
FROM
[dbo].[SiteRests2] [stockAvailability]
WHERE
[stockAvailability].[ProductSearchArticle] = @vendocrPurifiedCode
AND [stockAvailability].[ProductBrand] = @vendorName;
END;
ELSE
BEGIN
INSERT INTO
@stockAvailability
(
[RepositoryId]
, [SupplierId]
, [Quantity]
)
SELECT
[stockAvailability].[RepositoryId]
, [stockAvailability].[SupplierId]
, [stockAvailability].[Quantity]
FROM
[dbo].[SiteRestGroupRests2] [stockAvailability]
WHERE
[stockAvailability].[ProductSearchArticle] = @vendocrPurifiedCode
AND [stockAvailability].[ProductBrand] = @vendorName
AND [stockAvailability].[RestGroupId] = @restGroupId;
END;
DECLARE @quantity NVARCHAR(MAX) = N'Остатки:' + CHAR(10) + CHAR(13);
SELECT
@quantity = @quantity + COALESCE([stock].[Name], [order].[Number], [supplier].[Name]) + N': ' + CAST([stockAcailability].[Quantity] AS NVARCHAR(10)) + CHAR(10)
FROM
@stockAvailability [stockAcailability]
LEFT JOIN [dbo].[Stores] [stock]
ON [stockAcailability].[RepositoryId] = [stock].[StoreID]
LEFT JOIN [dbo].[OrderToSupplier] [order]
ON [stockAcailability].[RepositoryId] = [order].[OrderToSupplierID]
LEFT JOIN [dbo].[Contractors] [supplier]
ON [stockAcailability].[SupplierId] = [supplier].[ContractorID]
WHERE
[stockAcailability].[Quantity] <> 0;
PRINT @quantity;
DECLARE @price DECIMAL(15, 2);
IF @productId IS NOT NULL
BEGIN
SELECT TOP 1
@price = [price].[Price]
FROM
[dbo].[LC_ArticlesPrices] [price]
WHERE
(
[price].[ArticlesPriceTypesID] = @customerContractPriceTypeId
OR [price].[ArticlesPriceTypesID] = @customerContractBasePriceTypeId
)
AND [price].[ArtID] = @productId
AND [price].[ArticleDescriptionID] IS NULL
AND [price].[Period] <= GETDATE()
ORDER BY
CASE
WHEN [price].[ArticlesPriceTypesID] = @customerContractPriceTypeId THEN
1
ELSE
0
END DESC
, [price].[Period] DESC;
IF @price IS NULL
BEGIN
PRINT 'Цена компании в срезе цен не указана' + CHAR(10);
SELECT TOP 1
@price = [price].[Price]
FROM
[dbo].[ArticlesPrices] [price]
WHERE
(
[price].[ArticlesPriceTypesID] = @customerContractPriceTypeId
OR [price].[ArticlesPriceTypesID] = @customerContractBasePriceTypeId
)
AND [price].[ArtID] = @productId
AND [price].[ArticleDescriptionID] IS NULL
AND [price].[Period] <= GETDATE()
ORDER BY
CASE
WHEN [price].[ArticlesPriceTypesID] = @customerContractPriceTypeId THEN
1
ELSE
0
END DESC
, [price].[Period] DESC;
IF @price IS NULL
BEGIN
PRINT 'Цена компании не указана' + CHAR(10);
END;
ELSE
BEGIN
PRINT 'Цена компании: ' + CAST(@price AS NVARCHAR(10)) + CHAR(10);
END;
END;
ELSE
BEGIN
PRINT 'Цена компании в срезе цен: ' + CAST(@price AS NVARCHAR(10)) + CHAR(10);
END;
END;
DECLARE @priceListPrices NVARCHAR(MAX) = N'Цены поставщиков:' + CHAR(10) + CHAR(13);
SELECT
@priceListPrices
= @priceListPrices + COALESCE([priceList].[StoreName], [order].[Number], [supplier].[Name], 'Прайс-лист') + N': ' + CAST([supplierPrice].[Price] AS NVARCHAR(10)) + CHAR(10)
FROM
[dbo].[LC_ContractorsArticlesPrices] [supplierPrice]
LEFT JOIN [dbo].[OrderToSupplier] [order]
ON [supplierPrice].[ArticlesPriceTypesID] = [order].[OrderToSupplierID]
LEFT JOIN [dbo].[SiteVirtualStorePriceLists] [priceList]
ON [supplierPrice].[ProductSearchArticle] = [priceList].[ProductSearchArticle]
AND [supplierPrice].[ProductBrand] = [priceList].[ProductBrandAlias]
AND [supplierPrice].[ArticlesPriceTypesID] = [priceList].[StoreUid]
AND [supplierPrice].[Price] = [priceList].[Price]
LEFT JOIN [dbo].[Contractors] [supplier]
ON [priceList].[SupplierId] = [supplier].[ContractorID]
WHERE
(
@productId IS NOT NULL
AND [supplierPrice].[ArtID] = @productId
OR @productId IS NULL
AND [supplierPrice].[ProductSearchArticle] = @vendocrPurifiedCode
AND [supplierPrice].[ProductBrand] = @vendorName
AND [supplierPrice].[ArtID] IS NULL
);
PRINT @priceListPrices;
FETCH NEXT FROM [customerTreatiesCursor]
INTO
@customerId
, @customerContractId
, @customerContractPriceTypeId
, @customerContractBasePriceTypeId
, @pksd
, @restGroupId;
END;
CLOSE [customerTreatiesCursor];
DEALLOCATE [customerTreatiesCursor];Проверка собственных остатков
Проверка корректности пересчета среза цен
Очистка остатков и отключение триггеров (перед полным обменом)
Включение триггеров и пересчет остатков (после полного обмена)
Last updated