Скрипты 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