157 lines
7.2 KiB
Transact-SQL
157 lines
7.2 KiB
Transact-SQL
-- =============================================================================
|
||
-- Переход: counterparties → v_contractors (1С)
|
||
-- manufacturer_counterparty_map: counterparty_id → contractor_1c_id
|
||
-- Контрагенты и производители из 1С (v_contractors, v_producers)
|
||
-- =============================================================================
|
||
|
||
USE [mag_pbi]
|
||
GO
|
||
|
||
SET NOCOUNT ON;
|
||
|
||
-- Удаляем представления, ссылающиеся на map/counterparties
|
||
IF OBJECT_ID(N'[analytics].[v_manufacturer_counterparty_mapping]', N'V') IS NOT NULL
|
||
DROP VIEW [analytics].[v_manufacturer_counterparty_mapping];
|
||
GO
|
||
|
||
-- Удалить FK manufacturer_counterparty_map → counterparties (если есть)
|
||
DECLARE @fk NVARCHAR(256);
|
||
SELECT @fk = name FROM sys.foreign_keys
|
||
WHERE parent_object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]')
|
||
AND referenced_object_id = OBJECT_ID(N'[analytics].[counterparties]');
|
||
IF @fk IS NOT NULL
|
||
EXEC('ALTER TABLE [analytics].[manufacturer_counterparty_map] DROP CONSTRAINT ' + @fk);
|
||
GO
|
||
|
||
-- Очистить таблицу привязки
|
||
TRUNCATE TABLE [analytics].[manufacturer_counterparty_map];
|
||
PRINT 'manufacturer_counterparty_map: очищена';
|
||
GO
|
||
|
||
-- Заменить counterparty_id на contractor_1c_id
|
||
IF EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]') AND name = 'counterparty_id')
|
||
BEGIN
|
||
ALTER TABLE [analytics].[manufacturer_counterparty_map] DROP COLUMN [counterparty_id];
|
||
PRINT 'Удалена колонка counterparty_id';
|
||
END
|
||
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]') AND name = 'contractor_1c_id')
|
||
BEGIN
|
||
ALTER TABLE [analytics].[manufacturer_counterparty_map] ADD [contractor_1c_id] BINARY(16) NOT NULL;
|
||
PRINT 'Добавлена колонка contractor_1c_id';
|
||
END
|
||
GO
|
||
|
||
-- Удалить старые уникальные ограничения (на counterparty_id), создать новое
|
||
DECLARE @uq NVARCHAR(256);
|
||
SELECT @uq = name FROM sys.key_constraints
|
||
WHERE parent_object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]')
|
||
AND type = 'UQ' AND name = 'UQ_mcm_counterparty';
|
||
IF @uq IS NOT NULL
|
||
EXEC('ALTER TABLE [analytics].[manufacturer_counterparty_map] DROP CONSTRAINT ' + @uq);
|
||
|
||
SELECT @uq = name FROM sys.key_constraints
|
||
WHERE parent_object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]')
|
||
AND type = 'UQ' AND name = 'UQ_mcm_pair';
|
||
IF @uq IS NOT NULL
|
||
EXEC('ALTER TABLE [analytics].[manufacturer_counterparty_map] DROP CONSTRAINT ' + @uq);
|
||
|
||
-- Один контрагент — один производитель
|
||
IF NOT EXISTS (SELECT 1 FROM sys.key_constraints
|
||
WHERE parent_object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]') AND name = 'UQ_mcm_contractor')
|
||
ALTER TABLE [analytics].[manufacturer_counterparty_map] ADD CONSTRAINT [UQ_mcm_contractor] UNIQUE ([contractor_1c_id]);
|
||
-- Уникальная пара
|
||
IF NOT EXISTS (SELECT 1 FROM sys.key_constraints
|
||
WHERE parent_object_id = OBJECT_ID(N'[analytics].[manufacturer_counterparty_map]') AND name = 'UQ_mcm_pair')
|
||
ALTER TABLE [analytics].[manufacturer_counterparty_map] ADD CONSTRAINT [UQ_mcm_pair] UNIQUE ([manufacturer_id], [contractor_1c_id]);
|
||
GO
|
||
|
||
-- Удалить таблицу counterparties
|
||
IF OBJECT_ID(N'[analytics].[counterparties]', N'U') IS NOT NULL
|
||
BEGIN
|
||
DROP TABLE [analytics].[counterparties];
|
||
PRINT 'Удалена таблица analytics.counterparties';
|
||
END
|
||
GO
|
||
|
||
-- Создать v_contractors, v_producers если не существуют
|
||
IF OBJECT_ID(N'[analytics].[v_contractors]', N'V') IS NULL
|
||
BEGIN
|
||
EXEC('
|
||
CREATE VIEW [analytics].[v_contractors] AS
|
||
SELECT
|
||
c._IDRRef AS contractor_1c_id,
|
||
LOWER(CONCAT(
|
||
SUBSTRING(CONVERT(nvarchar(36), c._IDRRef, 2), 25, 8), ''-'',
|
||
SUBSTRING(CONVERT(nvarchar(36), c._IDRRef, 2), 21, 4), ''-'',
|
||
SUBSTRING(CONVERT(nvarchar(36), c._IDRRef, 2), 17, 4), ''-'',
|
||
SUBSTRING(CONVERT(nvarchar(36), c._IDRRef, 2), 1, 4), ''-'',
|
||
SUBSTRING(CONVERT(nvarchar(36), c._IDRRef, 2), 5, 12)
|
||
)) AS contractor_id,
|
||
c._Description AS contractor_name
|
||
FROM [MAG_2019].[dbo].[_Reference168] c
|
||
WHERE c._Marked = 0');
|
||
PRINT 'Создано представление v_contractors';
|
||
END
|
||
|
||
IF OBJECT_ID(N'[analytics].[v_producers]', N'V') IS NULL
|
||
BEGIN
|
||
EXEC('
|
||
CREATE VIEW [analytics].[v_producers] AS
|
||
SELECT
|
||
pr._IDRRef AS producer_1c_id,
|
||
LOWER(CONCAT(
|
||
SUBSTRING(CONVERT(nvarchar(36), pr._IDRRef, 2), 25, 8), ''-'',
|
||
SUBSTRING(CONVERT(nvarchar(36), pr._IDRRef, 2), 21, 4), ''-'',
|
||
SUBSTRING(CONVERT(nvarchar(36), pr._IDRRef, 2), 17, 4), ''-'',
|
||
SUBSTRING(CONVERT(nvarchar(36), pr._IDRRef, 2), 1, 4), ''-'',
|
||
SUBSTRING(CONVERT(nvarchar(36), pr._IDRRef, 2), 5, 12)
|
||
)) AS producer_id,
|
||
pr._Description AS producer_name
|
||
FROM [MAG_2019].[dbo].[_Reference260] pr
|
||
WHERE pr._Marked = 0');
|
||
PRINT 'Создано представление v_producers';
|
||
END
|
||
GO
|
||
|
||
-- Представление для API: map + manufacturer + contractor/producer (из 1С)
|
||
CREATE VIEW [analytics].[v_manufacturer_counterparty_mapping] AS
|
||
SELECT
|
||
mcm.id,
|
||
mcm.manufacturer_id,
|
||
p.producer_id,
|
||
man.manufacturer AS manufacturer_name,
|
||
mcm.contractor_1c_id,
|
||
c.contractor_id,
|
||
c.contractor_name AS contractor_name,
|
||
man.days_of_sales,
|
||
man.logistics_days,
|
||
man.roic_norm
|
||
FROM [analytics].[manufacturer_counterparty_map] mcm
|
||
LEFT JOIN [analytics].[manufacturers] man ON man.id = mcm.manufacturer_id
|
||
LEFT JOIN [analytics].[v_contractors] c ON c.contractor_1c_id = mcm.contractor_1c_id
|
||
LEFT JOIN [analytics].[v_producers] p ON LTRIM(RTRIM(p.producer_name)) = LTRIM(RTRIM(man.manufacturer));
|
||
GO
|
||
|
||
-- Исправить [analytics].[get_orders_list]: counterparties удалена, map по contractor_1c_id,
|
||
-- manufacturers без ROI_norm/n_percent/n_days/m_percent/m_days — использовать v_manufacturers_roi_compat
|
||
IF OBJECT_ID(N'[analytics].[get_orders_list]', N'V') IS NOT NULL
|
||
BEGIN
|
||
DECLARE @def NVARCHAR(MAX);
|
||
SELECT @def = OBJECT_DEFINITION(OBJECT_ID(N'[analytics].[get_orders_list]'));
|
||
IF @def LIKE N'%counterparties%'
|
||
BEGIN
|
||
SET @def = REPLACE(@def, N'LEFT JOIN [analytics].[counterparties] cp ON cp.[counterparty] = r._Description', N'');
|
||
SET @def = REPLACE(@def, N'map.[counterparty_id] = cp.id', N'map.[contractor_1c_id] = r._IDRRef');
|
||
-- manufacturers без старых полей — join на v_manufacturers_roi_compat (ROI_norm, n_percent, n_days, m_percent, m_days)
|
||
IF @def LIKE N'%ROI_norm%' AND OBJECT_ID(N'[analytics].[v_manufacturers_roi_compat]', N'V') IS NOT NULL
|
||
SET @def = REPLACE(@def, N'[analytics].[manufacturers] man', N'[analytics].[v_manufacturers_roi_compat] man');
|
||
DROP VIEW [analytics].[get_orders_list];
|
||
EXEC sp_executesql @def;
|
||
PRINT 'Обновлено представление analytics.get_orders_list';
|
||
END
|
||
END
|
||
GO
|
||
|
||
PRINT 'Готово: manufacturer_counterparty_map с contractor_1c_id, counterparties удалена';
|
||
GO
|