Zeta Web. База знаний
  • База знаний
  • Как правильно поставить задачу в службу поддержки?
  • Введение
    • Краткое описание
    • Состав продукта Zeta Web
    • Экосистема Zeta Web
  • Установка и обновление
    • Системные требования
    • Краткий план внедрения продукта Zeta Web
    • Последовательность действий по обновлению программного продукта Zeta Web
    • Установка и обновление 1С-части
    • Установка и обновление веб-части
    • Настройки сайта после загрузки начальных данных и типового дизайна
      • Zeta Web 2.x
      • Zeta Web 3.x
    • Публикация сервисов 1С
    • SSL-сертификат (https)
  • Описание и настройка
    • Поиск
      • Поиск по строке
    • Управление номенклатурой
      • Бренды
      • Перекроссировка брендов
      • Работа с дублями
      • Система кроссирования
      • Каталог
      • Запрещенная и разрешенная номенклатура
      • Кратность продажи
      • Закладки (список избранных товаров)
    • Ценообразование
      • Для 1С Управление торговлей ред. 10.3
      • Для Альфа Авто
      • Ценообразование по сегментам номенклатуры
      • Установка типа цены на позицию для контрагента
      • Округление цены
      • Специальные цены
    • Способы доставки и оплаты
    • Склады и поставщики
      • Логистика
      • Группы доступности складов
    • Статусы строк заказов
    • Возвраты и отказы
    • Подключение онлайн-платежей
      • Яндекс.Касса (Yandex.Kassa)
      • Ассист (Assist)
      • Сбербанк (Sberbank)
    • Внешние сервисы и каталоги по подбору автозапчастей
      • Zeta TecDoc
      • Laximo
      • Zeta Веб-сервисы
      • Zeta Виртуальный склад 3.0 (ВС)
    • Автоматическое закрытие корзин сайта (заказов покупателей)
    • Группы синонимов поиска
    • Настройка рассылки прайс-листов
    • Уведомления (e-mail, SMS-сообщения)
    • Регламентные задания
  • SEO и управление контентом
    • Изображения и файлы
    • Дизайн
      • SVG - иконки
      • Favicon (фавиконка)
    • Домен
    • Страницы и переменные
      • Сортировка товаров на странице
    • Контролы и шаблоны контролов
    • Меню, карты, ссылки
      • Добавление пунктов меню
      • Добавление страницы в карту сайта
      • Меню-навигация в шапке сайта
      • Хлебные крошки (breadcrumbs)
    • Информационные блоки, баннеры, опросы
      • Баннеры
      • Наполнение слайдера на главной странице
    • SEO
      • Формирование URL Zeta Web
      • Карта сайта (Sitemap)
      • Настройка мета-тегов
      • Транслитерация наименований картинок
      • Настройка редиректов (IIS)
      • Инструменты веб-мастера
  • Развитие продукта
    • План развития продукта
    • История изменений
      • История изменений веб-части
      • История изменений 1С-части
    • Разработка и получение нового функционала
  • FAQ
    • Ответственный в заказе с сайта
    • Ошибка: Данное значение типа String из источника данных не может быть преобразовано в тип nvarchar
    • Ошибка при вызове метода контекста (ПрочитатьXML): Ошибка разбораXML
    • Ошибка Value in property DeliveryTypeId not set - что делать
    • Ошибка ограничения PRIMARY KEY. Повторяющееся значение ключа.
    • Настройка учетной записи электронной почты на странице "Восстановление пароля"
    • Как установить регион по умолчанию
    • Как посмотреть тариф Zeta Веб-сервисы
    • Почему флажок "Только в наличии" или "Только в наличии на своих складах" всегда включен
    • Как увидеть свойства номенклатуры на сайте
    • Как перезапустить процесс w3wp
    • Почему в типовом дизайне самовывоз два раза с одного и того же склада?
    • Почему не работает поиск по VIN?
    • Как скрыть группу каталога из хлебных крошек
    • Где настроить страницу каталога для хлебных крошек
    • Как изменить отображение группы каталога
    • Как настроить Google ReCaptcha
    • Как сделать связь по группе для раздела каталога
    • Почему поле "Описание" в карточке номенклатуры недоступно для редактирования
    • Как создать категорию для спеццены
    • Что входит в типовую стилизацию
    • Что делать, если данные на сайте не совпадают с данными в 1С
    • Ошибка при импорте оплаты платежной картой
    • Ошибка обмена "Недостаточно фактических параметров для метода фонового задания"
    • Откуда берется склад отгрузки в заказе покупателя
    • Как добавить файл для загрузки с сайта
    • Что означает подсветка строки контрагента пользователя в панели управления сайтом?
    • Почему договор покупателей не виден на сайте?
    • Если клиент не может выполнить вход на сайт,имея логин или пароль.
    • Как формируются title и alt для картинок
    • Почему в товаре не отображается картинка или показывается неправильное изображение?
    • Почему при наличии товара на складе, отсутствует возможность ее покупки на сайте?
    • Почему на сайте отображается неправильный срок доставки с Виртуального склада?
    • Ошибка в логе обмена при изменении ответственного у корзины
    • Как получить описание таблиц данных при выявлении ошибки в обмене?
    • Как проверить, что изменение цены документом "Переоценка товаров в рознице" выгрузилось на сайт?
    • Где можно ознакомиться с историей заказов покупателей с сайта?
    • Как на сайте организована подгрузка кроссов по товарам отсутствующим в ассортименте базы 1С?
    • Как изменять контент для роботов и других анонимных клиентов на сайте?
    • Как очистить кэш контролов?
    • Как настроить обозначение наличия товаров?
    • Настройка учетной записи Gmail в 1С
  • Техническая документация
    • API 1.0
    • Контролы
    • Описание контролов
      • 1. Поиск, каталог, товары
        • Laximo [+]
          • Контрол "Laximo. Список параметров в отборе по параметрам служебный"
          • Контрол "Laximo. Список свойств модели автомобиля служебный"
          • Контрол "Laximo. Этап 1. Список каталогов (производители автомобилей)(!)"
          • Контрол "Laximo. Этап 2. Результаты поиска моделей автомобилей(!)"
          • Контрол "Laximo. Этап 3.1. Каталог от производителя. Дерево групп!"
          • Контрол "Laximo. Этап 3.1. Общий каталог. Дерево групп!"
          • Контрол "Laximo. Этап 3.2. Каталог от производителя. Список узлов и агрегатов!"
          • Контрол "Laximo. Этап 3.2. Общий каталог. Список узлов и агрегатов!"
          • Контрол "Laximo. Этап 4. Информация о выбранном узле / агрегате (схема, запчасти / детали)!"
          • Контрол "Laximo. Этапы 1, 2, 3, 4. Текущее состояние поиска!"
          • Контрол "Laximo. Этапы 1, 2. Условия поиска моделей автомобилей (vin, frame, параметры)!"
        • TecDoc
          • Контрол "Выбор запчасти"
          • Контрол "Выбор запчасти. Список значений свойства."
          • Контрол "Выбор запчасти. Список изображений."
          • Контрол "Выбор запчасти. Список кроссов (OEM, EAN)"
          • Контрол "Выбор запчасти. Список свойств и ограничений применимости."
          • Контрол "Выбор категории запчастей"
          • Контрол "Выбор марки автомобиля / мотоцикла"
          • Контрол "Выбор модели автомобиля / мотоцикла"
          • Контрол "Выбор модификации автомобиля / мотоцикла"
          • Контрол "Применимость. Марки автомобиля / мотоцикла."
          • Контрол "Применимость. Модели автомобиля / мотоцикла"
          • Контрол "Применимость. Модификации автомобиля / мотоцикла"
        • Поиск. Автокаталог
          • Контрол "Автокаталог. Группы запчастей"
          • Контрол "Автокаталог. История поиска по автомобилю"
          • Контрол "Автокаталог. Марки"
          • Контрол "Автокаталог. Модели"
          • Контрол "Автокаталог. Модификации"
          • Контрол "Автокаталог. Поиск по двигателю"
          • Контрол "Автокаталог. Текущий автомобиль"
          • Контрол "ТО. Дополнительные работы по автомобилю"
          • Контрол "ТО. Техническая информация"
          • Контрол "ТО. Техническое обслуживание автомобиля"
        • Поиск. Гараж покупателя
          • Контрол "Гараж. Автомобили клиента"
          • Контрол "Гараж. Информация об автомобиле клиента"
        • Поиск. Загрузка из Excel
          • Контрол "Загрузка из Excel. Настройка загрузки"
          • Контрол "Загрузка из Excel. Результат поиска"
        • Поиск. Подбор шин и дисков по автомобилю
          • Контрол "Шины и диски. Выбор года выпуска автомобиля"
          • Контрол "Шины и диски. Выбор дисков"
          • Контрол "Шины и диски. Выбор марки автомобиля"
          • Контрол "Шины и диски. Выбор модели автомобиля"
          • Контрол "Шины и диски. Выбор шин"
          • Контрол "Шины и диски. Подбор шин / дисков по автомобилю"
        • Поиск. Фильтр товаров по свойствам
          • Контрол "Значения свойств для фильтра товаров по свойствам"
          • Контрол "Фильтр товаров по свойствам"
        • Контрол "Поиск. Аналоги товара v1."
        • Контрол "Поиск. Аналоги товара v2 (цены и наличие товаров)."
        • Контрол "Поиск. Вывод результатов поиска"
        • Контрол "Поиск. Группы каталога"
        • Контрол "Поиск. Дерево каталога"
        • Контрол "Поиск. История поиска"
        • Контрол "Поиск. Каталог товаров"
        • Контрол "Поиск. Поиск товаров (уточнение артикула и бренда товара)."
        • Контрол "Поиск. Проценка (цены и наличие товаров)."
        • Контрол "Поиск. Проценка (цены и наличие товаров). Фильтр по брендам."
        • Контрол "Поиск. Сопутствующие товары"
        • Контрол "Поиск. Сопутствующие товары v2 ( цены и наличие товаров)."
        • Контрол "Поиск. Условия поиска"
        • Контрол "Поиск. Уточненение поиска"
        • Контрол "Товар. Детальная информация"
        • Контрол "Товар. Список значений свойств"
        • Контрол "Товар. Список поисковых номеров (кроссов)"
      • 2. Покупатели
        • Авторизация / регистрация
          • Контрол "Авторизация / Текущий пользователь"
          • Контрол "Восстановление пароля"
          • Контрол "Изменение регистрационных данных"
          • Контрол "Регистрация нового веб-пользователя (v1)"
          • Контрол "Регистрация нового веб-пользователя (v2)"
        • Покупки
          • Акт сверки взаиморасчетов
            • Контрол "Акт сверки взаиморасчетов. Отборы."
            • Контрол "Акт сверки взаиморасчетов. Результат."
          • Валюта
            • Контрол "Курсы валют"
            • Контрол "Смена валюты"
          • Возвраты
            • Контрол "Возвраты. Журнал."
            • Контрол "Возвраты. Заявка на возврат товара."
            • Контрол "Возвраты. Заявка на отмену строки заказа."
            • Контрол "Возвраты. Фильтр журнала."
          • Журнал заказов
            • Контрол "Журнал заказов по заказам"
            • Контрол "Журнал заказов по реализациям"
            • Контрол "Журнал заказов по строкам заказов"
            • Контрол "Фильтр журнала заказов по заказам"
            • Контрол "Фильтр журнала заказов по реализациям"
            • Контрол "Фильтр журнала заказов по строкам заказов"
          • Корзина
            • Доставка и оплата
              • Контрол "Корзина. Подтверждение. Выбор поставщика услуг."
              • Контрол "Корзина. Подтверждение. Выбор способа доставки и оплаты."
              • Контрол "Корзина. Подтверждение. Выбор способа доставки."
              • Контрол "Корзина. Подтверждение. Выбор способа оплаты."
              • Контрол "Корзина. Подтверждение. Выбор точки выдачи поставщика / адреса доставки клиента."
              • Контрол "Корзина. Подтверждение. Вывод цены услуги."
            • Контрол "Корзина. Информация о подтверждённом заказе"
            • Контрол "Корзина. Перенос строк в другой договор."
            • Контрол "Корзина. Подтверждение"
            • Контрол "Корзина. Подтверждение. v2"
            • Контрол "Корзина. Поиск заказа по идентификатору"
            • Контрол "Корзина. Редактирование."
            • Контрол "Корзина. Редактирование. v2"
            • Контрол "Корзина. Смена склада отгрузки в строке заказа."
            • Контрол "Корзина. Список корзин по договорам клиента"
          • Контрол "Запрос отложенного платежа"
          • Контрол "Запрос отсрочки платежа"
          • Контрол "Печатная форма платежного документа"
          • Контрол "Состояние счета"
        • Сообщения
          • Контрол "Анкета, заявка"
          • Контрол "Сообщения. Отправка сообщения. [+]"
          • Контрол "Сообщения. Чат с менеджером. [+]"
        • Контрол "Адреса доставки"
        • Контрол "Адреса доставки - добавление нового адреса"
        • Контрол "Информация о менеджере"
        • Контрол "Настройка оповещений по статусам заказов"
        • Контрол "Платежный календарь"
        • Контрол "Подписка на новости"
        • Контрол "Рассылка прайс-листов"
        • Контрол "Смена договора контрагента"
        • Контрол "Смена склада отгрузки"
        • Контрол "Управление клиентами"
        • Контрол "Шаблон письма рассылки прайс-листов"
      • 3. Поставщики
        • Контрол "Статистика доставки"
      • 4. Наполнение
        • Наполнение. Галерея
          • Контрол "Наполнение. Превью картинок"
          • Контрол "Наполнение. Превью картинок. Новый"
          • Контрол "Наполнение. Просмотр выбранной картинки"
        • Наполнение. Голосования
          • Контрол "Наполнение. Голосование [+]"
          • Контрол "Наполнение. Список голосований. [+]"
        • Контрол "Наполнение. Баннеры [+]"
        • Контрол "Наполнение. Выбор текущего региона пользователя"
        • Контрол "Наполнение. Информационные блоки. [+]"
        • Контрол "Наполнение. Меню"
        • Контрол "Наполнение. Текущий регион пользователя"
      • 5. SEO
        • Контрол "SEO. Карта сайта"
        • Контрол "SEO. Хлебные крошки"
      • 6. Служебные
        • Пагинация
          • Контрол "Переключение страниц в таблицах"
          • Контрол "Число элементов на странице в таблицах"
        • Контрол "Анти-спам"
        • Контрол "Всплывающее окно"
        • Контрол "Информация о лицензии"
        • Контрол "Сообщение об ошибке"
      • Vue
        • Контрол "VueCatalogTree"
  • Требования к дизайну
  • Обслуживание баз данных
  • Скрипты SQL для проверки данных
  • Типовые сценарии работы
    • Удаленные склады
      • Добавление поставщика виртуального склада
Powered by GitBook
On this page
  • Проверка позиции на сайте
  • Проверка собственных остатков
  • Проверка корректности пересчета среза цен
  • Очистка остатков и отключение триггеров (перед полным обменом)
  • Включение триггеров и пересчет остатков (после полного обмена)

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

Проверка собственных остатков

В параметрах запроса указать (заменить):

  • {Артикул} - очищенный артикул для поиска

  • {Бренд} - бренд

SET NOCOUNT ON;
DECLARE @VendorCode NVARCHAR(200) = N'{Артикул}';
DECLARE @VendorName NVARCHAR(100) = N'{Бренд}';
DECLARE @ProductId UNIQUEIDENTIFIER = NULL;
DECLARE @ProductDescriptionId UNIQUEIDENTIFIER = NULL;

IF @ProductId IS NULL
    BEGIN
        SELECT
            @ProductId = [product].[ArtID]
        FROM
            [dbo].[Articles] [product]
        WHERE
            [product].[SearchArticle] = @VendorCode
            AND [product].[BrandName] = @VendorName;
        IF @@ROWCOUNT > 1
            BEGIN
                PRINT 'Найдено более одного товара с указанными артикулом и брендом. Пожалуйста, укажите идентификатор товара. Выбранный идентификатор товара: ' + CAST(@ProductId AS NVARCHAR(50));
            END;

    END;

IF @ProductId IS NULL
    BEGIN
        PRINT 'Не найден товар с указанным артикулом и брендом.';
        RETURN;
    END;

DECLARE @productMovement TABLE
    (
        [MovementType] NVARCHAR(50)
      , [StockId] UNIQUEIDENTIFIER
      , [StockName] NVARCHAR(250)
      , [StockType] NVARCHAR(20)
      , [RegistratorId] UNIQUEIDENTIFIER
      , [Quantity] DECIMAL(15, 3)
      , [Date] DATETIME2(7)
    );

WITH [productStockMovement]
AS (SELECT
        [productOnStcok].[MovementType]
      , [productOnStcok].[RegistratorId]
      , [productOnStcok].[StockId]
      , SUM([productOnStcok].[Quantity]) AS [Quantity]
      , MAX([productOnStcok].[Period]) AS [Date]
    FROM
    (
        SELECT
            'Остатки' AS [MovementType]
          , [productOnStcok].[Registrator] AS [RegistratorId]
          , [productOnStcok].[StoreID] AS [StockId]
          , [productOnStcok].[Quantity]
          , [productOnStcok].[Period]
        FROM
            [dbo].[ArticlesInStores] [productOnStcok]
        WHERE
            @ProductId = [productOnStcok].[ArtID]
            AND
            (
                @ProductDescriptionId IS NULL
                AND [productOnStcok].[ArticleDescriptionID] IS NULL
                OR @ProductDescriptionId = [productOnStcok].[ArticleDescriptionID]
            )
        UNION ALL
        SELECT
            'Перемещение' AS [MovementType]
          , [productTransfer].[Registrator] AS [RegistratorId]
          , [productTransfer].[StoreID] AS [StockId]
          , -[productTransfer].[Quantity]
          , [productTransfer].[Period]
        FROM
            [dbo].[ToTransferArticlesFromStores] [productTransfer]
        WHERE
            @ProductId = [productTransfer].[ArtID]
            AND
            (
                @ProductDescriptionId IS NULL
                AND [productTransfer].[ArticleDescriptionID] IS NULL
                OR @ProductDescriptionId = [productTransfer].[ArticleDescriptionID]
            )
        UNION ALL
        SELECT
            'Резерв' AS [MovementType]
          , [productReserve].[Registrator] AS [RegistratorId]
          , [productReserve].[StoreID] AS [StockId]
          , -[productReserve].[Quantity]
          , [productReserve].[Period]
        FROM
            [dbo].[ReservedArticlesInStores] [productReserve]
        WHERE
            @ProductId = [productReserve].[ArtID]
            AND
            (
                @ProductDescriptionId IS NULL
                AND [productReserve].[ArticleDescriptionID] IS NULL
                OR @ProductDescriptionId = [productReserve].[ArticleDescriptionID]
            )
        UNION ALL
        SELECT
            'Остатки' AS [MovementType]
          , [productRetailStock].[Registrator] AS [RegistratorId]
          , [productRetailStock].[StoreID] AS [StockId]
          , [productRetailStock].[Quantity]
          , [productRetailStock].[Period]
        FROM
            [dbo].[ArticlesInRetails] [productRetailStock]
        WHERE
            @ProductId = [productRetailStock].[ArtID]
            AND
            (
                @ProductDescriptionId IS NULL
                AND [productRetailStock].[ArticleDescriptionID] IS NULL
                OR @ProductDescriptionId = [productRetailStock].[ArticleDescriptionID]
            )
    ) [productOnStcok]
    GROUP BY
        [productOnStcok].[MovementType]
      , [productOnStcok].[StockId]
      , [productOnStcok].[RegistratorId])
INSERT INTO
    @productMovement
(
    [StockId]
  , [StockName]
  , [StockType]
  , [Date]
  , [MovementType]
  , [RegistratorId]
  , [Quantity]
)
SELECT
    [stock].[StoreID]
  , [stock].[Name]
  , [stock].[StoreType]
  , [productStockMovement].[Date]
  , [productStockMovement].[MovementType]
  , [productStockMovement].[RegistratorId]
  , [productStockMovement].[Quantity]
FROM
    [productStockMovement]
LEFT JOIN [dbo].[Stores] [stock]
    ON [productStockMovement].[StockId] = [stock].[StoreID];

DECLARE @StockId UNIQUEIDENTIFIER;

DECLARE [StockCursor] CURSOR FOR
SELECT
    [t].[StockId]
FROM
    @productMovement [t]
GROUP BY
    [t].[StockId];

OPEN [StockCursor];
FETCH NEXT FROM [StockCursor]
INTO
    @StockId;
WHILE @@FETCH_STATUS = 0
    BEGIN

        SELECT
            [t].[StockName] AS [Склад]
          , [t].[StockType] AS [ТипСклада]
          , [t].[MovementType] AS [ТипДвижения]
          , [t].[Date] AS [ДатаДвижения]
          , [t].[RegistratorId] AS [Регистратор]
          , [t].[Quantity] AS [Количество]
          , SUM([t].[Quantity]) OVER (ORDER BY
                                          [t].[StockName]
                                        , [t].[Date]
                                      ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
                                     ) AS [Итог]
        FROM
            @productMovement [t]
        WHERE
            @StockId = [t].[StockId]
        ORDER BY
            [t].[Date];

        SELECT
            [t].[StockName] AS [Склад]
          , [t].[StockType] AS [ТипСклада]
          , [t].[MovementType] AS [ТипДвижения]
          , SUM([t].[Quantity]) AS [Количество]
        FROM
            @productMovement [t]
        WHERE
            @StockId = [t].[StockId]
        GROUP BY
            [t].[StockName]
          , [t].[StockType]
          , [t].[MovementType];

        SELECT
            [productTotal].[StockName] AS [Склад]
          , [productTotal].[StockType] AS [ТипСклада]
          , [productTotal].[Quantity] AS [ВычесленноеКоличество]
          , [productStockTotalTrigger].[Quantity] AS [КоличествоВСрезе]
          , CASE
                WHEN [productTotal].[Quantity] <> [productStockTotalTrigger].[Quantity] THEN
                    'Да'
                ELSE
                    'Нет'
            END AS [Ошибка]
        FROM
        (
            SELECT
                [t].[StockId]
              , [t].[StockName]
              , [t].[StockType]
              , SUM([t].[Quantity]) AS [Quantity]
            FROM
                @productMovement [t]
            WHERE
                @StockId = [t].[StockId]
            GROUP BY
                [t].[StockId]
              , [t].[StockName]
              , [t].[StockType]
        ) [productTotal]
        LEFT JOIN [dbo].[SiteRests2] [productStockTotalTrigger]
            ON [productTotal].[StockId] = [productStockTotalTrigger].[RepositoryId]
               AND @ProductId = [productStockTotalTrigger].[ProductId]
               AND
               (
                   @ProductDescriptionId IS NULL
                   AND [productStockTotalTrigger].[ProductDescriptionId] IS NULL
                   OR @ProductDescriptionId = [productStockTotalTrigger].[ProductDescriptionId]
               );

        FETCH NEXT FROM [StockCursor]
        INTO
            @StockId;
    END;
CLOSE [StockCursor];
DEALLOCATE [StockCursor];

SELECT
    [productTotalTrigger].[QuantityFromStore] AS [КоличествоВСрезеБезГруппДоступности]
  , [productTotalTrigger].[IsFromStore] AS [ЕстьВНаличииВСрезеБезГруппДоступности]
  , CASE
        WHEN [productTotalTrigger].[IsFromStore] = 0
             AND [productTotalTrigger].[QuantityFromStore] > 0
             OR [productTotalTrigger].[IsFromStore] = 1
                AND [productTotalTrigger].[QuantityFromStore] = 0 THEN
            'Да'
        ELSE
            'Нет'
    END AS [Ошибка]
FROM
    [dbo].[SiteRestsSummary2] [productTotalTrigger]
WHERE
    @ProductId = [productTotalTrigger].[ProductId]
    AND
    (
        @ProductDescriptionId IS NULL
        AND [productTotalTrigger].[ProductDescriptionId] IS NULL
        OR @ProductDescriptionId = [productTotalTrigger].[ProductDescriptionId]
    );

SELECT
    [productTotalTrigger].[RestGroupId] [ГруппаДоступности]
  , [productTotalTrigger].[QuantityFromStore] AS [КоличествоВСрезеCГруппамиДоступности]
  , [productTotalTrigger].[IsFromStore] AS [ЕстьВНаличииВСрезеСГруппамиДоступности]
  , CASE
        WHEN [productTotalTrigger].[IsFromStore] = 0
             AND [productTotalTrigger].[QuantityFromStore] > 0
             OR [productTotalTrigger].[IsFromStore] = 1
                AND [productTotalTrigger].[QuantityFromStore] = 0 THEN
            'Да'
        ELSE
            'Нет'
    END AS [Ошибка]
FROM
    [dbo].[SiteRestGroupRestsSummary2] [productTotalTrigger]
WHERE
    @ProductId = [productTotalTrigger].[ProductId]
    AND
    (
        @ProductDescriptionId IS NULL
        AND [productTotalTrigger].[ProductDescriptionId] IS NULL
        OR @ProductDescriptionId = [productTotalTrigger].[ProductDescriptionId]
    );

-- раскомментировать и запустить для перерасчета остатков
--EXEC [dbo].[RecalculateFromRetailRests];
--GO
--EXEC [dbo].[RecalculateFromStoreRests];
--GO
--EXEC [dbo].[RecalculateRestGroupSummary];

Проверка корректности пересчета среза цен

Если используется механизм подтяжки цен предложений поставщиков до собственных цен

SELECT
    [rs].[Id]
  , [rs].[ProductSearchArticle]
  , [rs].[ProductBrand]
  , [rs].[ProductId]
  , [rs].[ProductDescriptionId]
  , [rs].[Quantity]
  , [rs].[SortOrder]
  , [rs].[QuantityFromStore]
  , [rs].[QuantityInTransit]
  , [rs].[QuantityFromPrice]
  , [rs].[IsFromStore]
  , [rs].[IsInTransit]
  , [rs].[IsFromPrice]
  , [rs].[MinQuantity]
  , [rs].[MaxQuantity]
FROM
    [dbo].[SiteRestsSummary2] [rs]
WHERE
    [rs].[QuantityFromStore] > 0
    AND [rs].[IsFromStore] = 0
    OR [rs].[QuantityFromStore] = 0
       AND [rs].[IsFromStore] = 1
    OR [rs].[QuantityFromPrice] > 0
       AND [rs].[IsFromPrice] = 0
    OR [rs].[QuantityFromPrice] = 0
       AND [rs].[IsFromPrice] = 1
    OR [rs].[QuantityInTransit] > 0
       AND [rs].[IsInTransit] = 0
    OR [rs].[QuantityInTransit] = 0
       AND [rs].[IsInTransit] = 1;


SELECT
    *
FROM
    [dbo].[SiteRestGroupRestsSummary2] [rs]
WHERE
    [rs].[QuantityFromStore] > 0
    AND [rs].[IsFromStore] = 0
    OR [rs].[QuantityFromStore] = 0
       AND [rs].[IsFromStore] = 1
    OR [rs].[QuantityFromPrice] > 0
       AND [rs].[IsFromPrice] = 0
    OR [rs].[QuantityFromPrice] = 0
       AND [rs].[IsFromPrice] = 1
    OR [rs].[QuantityInTransit] > 0
       AND [rs].[IsInTransit] = 0
    OR [rs].[QuantityInTransit] = 0
       AND [rs].[IsInTransit] = 1;

При наличии ошибок в срезе необходимо выполнить пересчет остатков

EXEC [dbo].[RecalculateRestGroupSummary];
GO

Очистка остатков и отключение триггеров (перед полным обменом)

Позволяет очистить остатки и отключить триггеры (для ускорения полного обмена)

-- Выполнить на базе перед полным обменом ВСЕМИ остатками
-- очистка срезов и отключение индексов
TRUNCATE TABLE [dbo].[SiteRestGroupRests2];
ALTER INDEX ALL ON [SiteRestGroupRests2] DISABLE;
GO
TRUNCATE TABLE [dbo].[SiteRestGroupRestsSummary2];
ALTER INDEX ALL ON [SiteRestGroupRestsSummary2] DISABLE;
GO
TRUNCATE TABLE [dbo].[SiteRests2];
ALTER INDEX ALL ON [SiteRests2] DISABLE;
GO
TRUNCATE TABLE [dbo].[SiteRestsSummary2];
ALTER INDEX ALL ON [SiteRestsSummary2] DISABLE;
GO

-- очистка ВС
TRUNCATE TABLE [dbo].[SiteVirtualStorePriceLists]; -- закомментируйте эту строку, если не требуется полный обмен ВС
DISABLE TRIGGER ALL ON [SiteVirtualStorePriceLists]; -- закомментируйте эту строку, если не требуется полный обмен ВС
GO

-- очитска собственных остатков и отключение триггеров
TRUNCATE TABLE [dbo].[OrderingBuyers];
DISABLE TRIGGER ALL ON [OrderingBuyers];
GO
TRUNCATE TABLE [dbo].[OrdersToSuppliers];
DISABLE TRIGGER ALL ON [OrdersToSuppliers];
GO
TRUNCATE TABLE [dbo].[ArticlesInRetails];
DISABLE TRIGGER ALL ON [ArticlesInRetails];
GO
TRUNCATE TABLE [dbo].[ArticlesInStores];
DISABLE TRIGGER ALL ON [ArticlesInStores];
GO
TRUNCATE TABLE [dbo].[ToTransferArticlesFromStores];
DISABLE TRIGGER ALL ON [ToTransferArticlesFromStores];
GO
TRUNCATE TABLE [dbo].[ReservedArticlesInStores];
DISABLE TRIGGER ALL ON [ReservedArticlesInStores];

Включение триггеров и пересчет остатков (после полного обмена)

После полного обмена, если перед этим выключали триггеры

-- Выполнить на базе после полного обмена ВСЕМИ остатками
-- перерерасчет срезов
ALTER INDEX [PK_SiteRestGroupRests2] ON [SiteRestGroupRests2] REBUILD;
GO
ALTER INDEX [PK_SiteRestGroupRestsSummary2]
ON [SiteRestGroupRestsSummary2]
REBUILD;
GO
ALTER INDEX [PK_SiteRests2] ON [dbo].[SiteRests2] REBUILD;
GO
ALTER INDEX [PK_SiteRestsSummary2] ON [dbo].[SiteRestsSummary2] REBUILD;
GO
EXEC [dbo].[RecalculateFromPriceRests];
GO
EXEC [dbo].[RecalculateFromPricePrices];
GO
EXEC [dbo].[RecalculateFromRetailRests];
GO
EXEC [dbo].[RecalculateFromStoreRests];
GO
EXEC [dbo].[RecalculateInTransitRests];
GO
EXEC [dbo].[RecalculateInTransitPrices];
GO
EXEC [dbo].[RecalculateRestGroupSummary];
GO

-- включение триггеров
ENABLE TRIGGER ALL ON [OrderingBuyers];
GO
ENABLE TRIGGER ALL ON [OrdersToSuppliers];
GO
ENABLE TRIGGER ALL ON [ArticlesInRetails];
GO
ENABLE TRIGGER ALL ON [ArticlesInStores];
GO
ENABLE TRIGGER ALL ON [ToTransferArticlesFromStores];
GO
ENABLE TRIGGER ALL ON [ReservedArticlesInStores];
GO
ENABLE TRIGGER ALL ON [SiteVirtualStorePriceLists];
GO

-- включение индексов
ALTER INDEX ALL ON [SiteRestGroupRests2] REBUILD;
GO
ALTER INDEX ALL ON [SiteRestGroupRestsSummary2] REBUILD;
GO
ALTER INDEX ALL ON [SiteRests2] REBUILD;
GO
ALTER INDEX ALL ON [SiteRestsSummary2] REBUILD;
GO
ALTER INDEX ALL ON [SiteVirtualStorePriceLists] REBUILD;
GO
PreviousОбслуживание баз данныхNextУдаленные склады

Last updated 1 year ago