Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






  • Использование представлений в хранимых процедурах






    Как уже упоминалось ранее, использование представлений, практически, ничем не отличается от использования обычных таблиц. Тем не менее, представления позволяют больше, чем обычные таблицы. Расмотрим следующий пример. В базе данных имеется таблица, определяющая наличие товаров на складах некоторой фирмы: коды складов, коды товаров, количества товаров. Кроме того, в базе данных находятся накладные, отражающие движение товаров между складами, факты продаж и т.д. Таблица, отражающая состояние складов, является результатом обработки накладных, которые по мере их создания, но не в режиме реального времени, поступают с различных складов на компьютер, хранящий рассматриваемую базу данных. По различным причинам накладные не могут обрабатываться мгновенно и существуют довольно длительные моменты времени, когда таблица состояния складов соответствует только обработанным накладным. Необработанные накладные временно содержат информацию, не проверенную менеджером, контролирующим удаленные на сотни километров склады. Но поскольку, б о льшая часть из непроверенных накладных отражает реальное движение товаров, этой информацией могут пользоваться менеджеры по продажам и закупкам. Поэтому данные о товарах на складах для этих менеджеров необходимо корректировать с учетом необработанных накладных.

    Поскольку таблица с накладными довольно большая (особенно в конце месяца) и б о льшая ее часть включает бесполезные для данной задачи обработанные накладные, удобно заранее извлечь из необработанных накладных информацию и поместить ее в отдельную таблицу, отражающую товары, ушедшие и пришедшие на склады. Для записи информации о движении товаров, хранимой в необработанных накладных можно использовать процедуру, похожую на процедуру ЗаписьВКорЗапасы из листинга 21.8.

    Листинг 21.8 Процедура заполнения таблицы с информацией из необработанных накладных

    1: CREATE PROCEDURE ЗаписьВКорЗапасы

    2: /* заполняет таблицу T1N2 товарами из необработанных накладных */

    3: AS

    4: DECLARE @КодСклада varchar (4)

    5: DECLARE @КодТовара varchar (12)

    6: DECLARE @КоличТовара int

    7: /* объявить курсор */

    8: DECLARE Cur CURSOR FOR

    9: SELECT КодСклада, КодТовара, SUM(КоличТовара * ПриходРасход)

    10: FROM СпецификацииНакладных

    11: WHERE ПризнакОбработки = 0

    12: GROUP BY КодСклада, КодТовара

    13: /* открыть курсор */

    14: OPEN Cur

    15: /* cчитать данные при помощи курсора */

    16: FETCH Cur INTO @КодСклада, @КодТовара, @КоличТовара

    17: WHILE @@FETCH_Status = 0

    18: BEGIN

    19: /* записать данные в таблицу T1N2 */

    20: INSERT INTO КорЗапасы (КодСклада, КодТовара, КоличТовара)

    21: VALUES (@КодСклада, @КодТовара, @КоличТовара)

    22: /* cчитать “следующие” данные при помощи курсора */

    23: FETCH Cur INTO @КодСклада, @КодТовара, @КоличТовара

    24: END

    25: /* закрыть курсор */

    26: CLOSE Cur

    27: /* удалить курсор из памяти */

    28: DEALLOCATE Cur

    В строках 4–6 объявляются переменные для считывания данных из курсора Cur, объявленного в строках 8–12. Этот курсор создается для набора, состоящего из кодов складов, кодов товаров и суммарных количеств с учетом приходов (ПриходРасход=1) и расходов (ПриходРасход=1) товаров. Признак обработки (поле ПризнакОбработки) в таблице СпецификацииНакладных, равный значению 0, указывает на то, что накладная не обработана, т.е. ведомость товаров не учитывает движение товара этой накладной.

    Запись информации в таблицу T1N2 выполняется, как обычно, в цикле с «продвижением» по записям набора с использованием курсора (строки 17–24). В строках 26 и 28 курсор закрывается и удаляется из памяти.

    В листинге 21.9 — код представления Запасы_КорЗапасы, предназначенного для объединения двух таблиц: инвентаризации и учета необработанных накладных.

    Листинг 21.9 Представление, объединяющее файлы инвентаризации и учета необработанных накладных

    1: CREATE VIEW Запасы_КорЗапасы

    2: /* объединение файлов инвентаризации и учета необработанных накладных */

    3: AS

    4: SELECT КодТовара, КоличТовара, КодСклада

    5: FROM Запасы

    6: UNION

    7: SELECT КодТовара, SUM(КоличТовара), КодСклада

    8: FROM КорЗапасы

    9: GROUP BY КодТовара, КодСклада

    Процедура ВедомостьТоваровСклада (листинг 21.10) формирует ведомость товаров указанного (в аргументе @КодСклада) склада с учетом или без учета необработанных накладных. Во втором случае используется представление Запасы_КорЗапасы (строки 17–23). Таким образом, если учитывать необработанные накладные не нужно, используется только таблица Запасы и Товары (справочник товаров с кодами и наименованиями товаров), в противном случае используется представление Запасы_КорЗапасы.

    Листинг 21.10 Процедура формирования ведомости товаров склада

    1: CREATE PROCEDURE ВедомостьТоваровСклада

    2: /* ведомость товаров на складе без учета (@with_kor = 0) */

    3: /* и с учетом (@with_kor < > 0) необработанных накладных */

    4: @КодСклада nvarchar(4),

    5: @maska nvarchar(10), @LenMaska int, @with_kor int

    6: AS

    7: IF @with_kor =0

    8: /* необработанные накладные не учитываются */

    9: SELECT a.НаименТовара, b.КоличТовара

    10: FROM Запасы b, Товары a

    11: WHERE b.КодТовара =a.КодТовара

    12: AND SUBSTRING(a.НаименТовара, 1, @LenMaska)= RTRIM(@maska)

    13: AND b.КодСклада =@КодСклада

    14: ORDER BY a.НаименТовара

    15: ELSE

    16: /* необработанные накладные учитываются */

    17: SELECT a.НаименТовара, sum(b.КоличТовара)

    18: FROM Запасы_КорЗапасы b, t2 a

    19: WHERE b.КодТовара =a.КодТовара

    20: AND SUBSTRING(a. НаименТовара, 1, @LenMaska)= RTRIM(@maska)

    21: AND b. КодСклада =@КодСклада

    22: GROUP BY a.НаименТовара

    23: ORDER BY 1

    В листинге 21.11 представлена процедура СуммыТоваров, также использующая представление Запасы_КорЗапасы. Эта процедура возвращает суммарную инвентаризационную ведомость указанных в списке @SkladList складов для товаров, наименования которых начинаются со строки, совпадающей с маской @maska.

    Листинг 21.11 Процедура — ведомость товаров на указанных складах

    1: CREATE PROCEDURE СуммыТоваров

    2: /* Ведомость товаров на указанных складах */

    3: @maska char(20), @with_kor int,

    4: @SkladList nvarchar(200), @ilen int

    5: AS

    6: /* объявления */

    7: DECLARE @i smallint

    8: DECLARE @ilen1 int

    9: DECLARE @LenMaska

    10: DECLARE @TempTable TABLE (КодСклада varchar (4) NOT NULL)

    11: /* заполнить табличную переменную кодами складов из @SkladList */

    12: IF LEN(@SkladList) > 0

    13: BEGIN

    14: SET @ilen1= LEN(@SkladList)/4

    15: SET @i=1

    16: WHILE @ilen1 > 0

    17: BEGIN

    18: INSERT INTO @TempTable (КодСклада)

    19: VALUES (SUBSTRING(@SkladList, @i, 4))

    20: SET @i=@i+4

    21: SET @ilen1=@ilen1-1

    22: END

    23: END

    24: /* для товара с группой @maska сформировать ведомость */

    25: SET @LenMaska=LEN(@maska)

    26: IF @with_kor=0

    27: /* необработанные накладные НЕ учитываются */

    28: SELECT a.НаименТовара as 'Наименование',

    29: sum(b.КоличТовара) as 'Кол-во', b.КодТовара

    30: FROM Товары a, Запасы b

    31: WHERE a.КодТовара = b.КодТовара

    32: AND SUBSTRING(a. НаименТовара, 1, @LenMaska)= RTRIM(@maska)

    33: AND b.C_WHERE IN (SELECT C_WHERE FROM @TempTable)

    34: GROUP BY a.НаименТовара, b.КодТовара

    35: ORDER BY a.НаименТовара, b.КодТовара

    36: ELSE

    37: /* необработанные накладные УЧИТЫВАЮТСЯ */

    38: SELECT a.НаименТовара as 'Наименование',

    39: sum(b.КоличТовара) as 'Кол-во', b.КодТовара

    40: FROM Товары a, Запасы_КорЗапасы b

    41: WHERE a.КодТовара = b.КодТовара

    42: AND SUBSTRING(a.НаименТовара, 1, @LenMaska) = RTRIM(@maska)

    43: AND b. КодСклада IN (SELECT КодСклада FROM @TempTable)

    44: GROUP BY a.НаименТовара, b.КодТовара

    45: ORDER BY a.НаименТовара, b.КодТовара

    Завершить раздел о хранимых процедурах хочется замечанием о том, что хранимые процедуры предназначены не только для формирования передаваемых клиентской программе наборов данных. Например, процедура может вообще не возвращать клиенту никаких данных. Основное назначение хранимых процедур заключается как раз в обратном — как можно меньше пересылать информации по сети. Все, что можно сделать с данными без передачи их клиенту, нужно делать на сервере.






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.