eLVik

usp_GetCommodityItemOnTaxData

Dec 2nd, 2021
684
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. USE [ForestManagement]
  2. GO
  3. /****** Object:  StoredProcedure [dbo].[usp_GetCommodityItemOnTaxData]    Script Date: 02.12.2021 16:19:40 ******/
  4. SET ANSI_NULLS ON
  5. GO
  6. SET QUOTED_IDENTIFIER ON
  7. GO
  8. -- =============================================
  9. -- ОПИСАНИЕ:
  10. -- Возвращает наиболее подходящий элемент товарной таблицы
  11. -- для таксационного описания.
  12.  
  13. -- РЕЗУЛЬТАТ:
  14. -- 0 - нет ошибок
  15. -- 1 - @TaxData_OID указывает на несуществующую запись
  16. -- 2 - порода в таксационном описании не задана
  17. -- 3 - нет соответствия
  18. -- =============================================
  19. ALTER PROCEDURE [dbo].[usp_GetCommodityItemOnTaxData]
  20.     @TaxData_OID int,                    -- ключ таксационного описания
  21.     @CommodityTableKey smallint,         -- ключ справочника "Товарная таблица"
  22.     @CommodityTable_OID int output,      -- идентификатор найденной записи в товарной таблице
  23.     @CommodityStock_OID smallint output, -- код породы, по которой фактически была произведена выборка
  24.     @CommodityClass_OID smallint output, -- код класса товарности, по которому фактически была произведена выборка
  25.     -- Доли запасов по категориям крупности
  26.     @RK1 smallint output,                -- крупная 1-го сорта
  27.     @RK2 smallint output,                -- крупная 2-го сорта
  28.     @RK3 smallint output,                -- крупная 3-го сорта
  29.     @RK4 smallint output,                -- крупная 4-го сорта
  30.     @RC11 smallint output,               -- средняя-1 1-го сорта
  31.     @RC12 smallint output,               -- средняя-1 2-го сорта
  32.     @RC13 smallint output,               -- средняя-1 3-го сорта
  33.     @RC14 smallint output,               -- средняя-1 4-го сорта
  34.     @RC21 smallint output,               -- средняя-2 1-го сорта
  35.     @RC22 smallint output,               -- средняя-2 2-го сорта
  36.     @RC23 smallint output,               -- средняя-2 3-го сорта
  37.     @RC24 smallint output,               -- средняя-2 4-го сорта
  38.     @RM11 smallint output,               -- мелкая-1 1-го сорта
  39.     @RM12 smallint output,               -- мелкая-1 2-го сорта
  40.     @RM13 smallint output,               -- мелкая-1 3-го сорта
  41.     @RM2 smallint output,                -- мелкая-2
  42.     @RTX smallint output,                -- техническое сырье
  43.     @RTP smallint output,                -- дрова топливные
  44.     @ROTX smallint output,               -- отходы
  45.     @RKOR smallint output                -- кора
  46. AS
  47. BEGIN
  48.     SET NOCOUNT ON;
  49.  
  50.     SET @CommodityTable_OID = NULL
  51.     SET @CommodityClass_OID = NULL
  52.    
  53.     DECLARE @diameter smallint           -- фактический диаметр
  54.     DECLARE @height float                -- фактическая высота
  55.     DECLARE @stock_oid smallint          -- код породы
  56.     DECLARE @stock_oid_n smallint        -- код нормированной породы
  57.     DECLARE @oid int                     -- ключ
  58.     DECLARE @d smallint                  -- табличный диаметр
  59.     DECLARE @h float                     -- табличная высота
  60.     DECLARE @x float                     -- квадрат расстояния между фактическим и табличным значением
  61.     DECLARE @commodityClassOid smallint  -- код класса товарности
  62.     DECLARE @best_x float                -- лучший (наименьший) квадрат расстояния между фактическим и табличным значением
  63.  
  64.     SELECT @oid = OID, @diameter = Diameter, @height = Height, @stock_oid = Stock_OID, @commodityClassOid = CommodityClass_OID
  65.     FROM TaxData WHERE OID = @TaxData_OID
  66.  
  67.     IF (@oid IS NULL)
  68.         RETURN 1 -- неверно указан параметр @TaxData_OID
  69.  
  70.     IF (@stock_oid IS NULL)
  71.         RETURN 2 -- порода в таксационном описании не задана
  72.    
  73.     SET @CommodityStock_OID = @stock_oid
  74.    
  75.     IF (@commodityClassOid IS NULL)
  76.     BEGIN
  77.         -- В случае, если класс товарности в таксационном описании отсутствует, берем наихудший класс
  78.         -- для данной породы.
  79.  
  80.         SELECT @commodityClassOid = CommodityClass_OID FROM CommodityTable
  81.         WHERE CommodityTableKey = @CommodityTableKey AND Stock_OID = @stock_oid
  82.         ORDER BY CommodityClass_OID
  83.  
  84.         IF (@@ROWCOUNT = 0)
  85.         BEGIN
  86.             -- Если класс товарности не обнаружен - меняем породу на нормативное значение
  87.             SELECT @stock_oid_n = NormativeStock
  88.             FROM Stock
  89.             WHERE OID = @stock_oid
  90.  
  91.             IF (@stock_oid_n IS NULL OR @stock_oid_n = @stock_oid)
  92.                 RETURN 3  -- нет соответствия в справочнике.
  93.  
  94.             SET @CommodityStock_OID = @stock_oid_n
  95.            
  96.             -- Повторная выборка
  97.             SELECT @commodityClassOid = CommodityClass_OID FROM CommodityTable
  98.             WHERE CommodityTableKey = @CommodityTableKey AND Stock_OID = @stock_oid_n
  99.             ORDER BY CommodityClass_OID
  100.  
  101.             IF (@@ROWCOUNT = 0)
  102.                 RETURN 3 -- нет соответствия в справочнике.
  103.         END
  104.     END
  105.  
  106.     SET @CommodityClass_OID = @commodityClassOid
  107.  
  108.     -- Выборка из товарной таблицы
  109.     DECLARE my_cursor CURSOR FORWARD_ONLY FAST_FORWARD FOR
  110.     SELECT Diameter, Height, OID
  111.     FROM CommodityTable
  112.     WHERE CommodityTableKey = @CommodityTableKey AND Stock_OID = @CommodityStock_OID AND CommodityClass_OID = @commodityClassOid
  113.  
  114.     OPEN my_cursor
  115.    
  116.     FETCH NEXT FROM my_cursor INTO @d, @h, @oid
  117.     WHILE @@FETCH_STATUS = 0
  118.     BEGIN
  119.         SET @x = POWER(@diameter - @d, 2) + POWER(@height - @h, 2)
  120.         IF (@CommodityTable_OID IS NULL)
  121.         BEGIN
  122.             SET @best_x = @x
  123.             SET @CommodityTable_OID = @oid
  124.         END ELSE BEGIN
  125.             IF (@x < @best_x)
  126.             BEGIN
  127.                 SET @best_x = @x
  128.                 SET @CommodityTable_OID = @oid
  129.             END
  130.         END
  131.        
  132.         FETCH NEXT FROM my_cursor INTO @d, @h, @oid
  133.     END
  134.  
  135.     CLOSE my_cursor
  136.     DEALLOCATE my_cursor
  137.  
  138.     SELECT @RK1 = RK1, @RK2 = RK2, @RK3 = RK3, @RK4 = RK4, @RC11 = RC11, @RC12 = RC12, @RC13 = RC13, @RC14 = RC14,
  139.            @RC21 = RC21, @RC22 = RC22, @RC23 = RC23, @RC24 = RC24, @RM11 = RM11, @RM12 = RM12, @RM13 = RM13, @RM2 = RM2,
  140.            @RTX = RTX, @RTP = RTP, @ROTX = ROTX, @RKOR = RKOR
  141.     FROM CommodityTable
  142.     WHERE OID = @CommodityTable_OID
  143.    
  144.     RETURN 0
  145. END
  146.  
RAW Paste Data