Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Использование временных таблиц для «передачи» в процедуры массивов
Отсутствие массивов в T-SQL создает проблемы, когда необходимо передать в процедуру массив однотипных данных. Этим проблемам посвящено довольно много статей. Мне наиболее интересным кажется подход, при котором в процедуру передается строка с известной структурой. В листиге 21.6 приведена процедура, которая возвращает ведомость наличия товара с определенным кодом (переменная-аргумент @Kod) на складах, коды которых указаны в строке (переменная-аргумент @SkladList). Листинг 21.6 Процедура получения ведомости наличия товара на указанных складах 1: CREATE PROCEDURE СкладКолТовTempTable 2: /* Ведомость наличия товара с определенным кодом на указанных складах */ 3: @Kod char(12), @SkladList nvarchar(200) 4: AS 5: DECLARE @i int 6: DECLARE @ilen int 7: DECLARE @TempTable TABLE (КодСклада varchar (4) NOT NULL) 8: /* сначала заполним временную таблицу массивом-строкой SkladList */ 9: IF LEN(@SkladList) > 0 10: BEGIN 11: SET @ilen = LEN(@SkladList) / 4 12: set @i=1 13: WHILE @ilen > 0 14: BEGIN 15: INSERT INTO @T33TEMP (КодСклада) 16: VALUES (SUBSTRING(@SkladList, @i, 4)) 17: set @i=@i+4 18: set @ilen=@ilen-1 19: END 20: END 21: /* использовать в предложении WHERE подзапрос из табличной переменной */ 22: SELECT a.НаименСклада as 'Склад', b.КоличТовара as 'Кол-во' 23: FROM Подразделения a, Запасы b 24: WHERE b.КодТовара = @Kod AND a.КодСклада=b.КодСклада 25: AND b. КодСклада IN (SELECT КодСклада FROM @TempTable) 26: ORDER BY a.C_NAMEM Алгоритм заключается в том, что сначала из строки @ SkladList извлекаются коды складов (длиной четыре символа) и помещаются в табличную переменную @TempTable (строки 11–19). Далее (в строках 22–27) инструкция SELECT использует в предложении WHERE подзапрос из этой табличной переменной. Вызов процедуры СкладКолТовTempTable из Visual Basic может быть следующим: GoodCode = " 011133442233" ' код товара, конечно, код нужно выбрать из некоторой таблицы SladStr = " 011133442233" ' коды 0111, 3344 и 2233 rsADO.Source = " EXEC СкладКолТовTempTable @Kod ='" GoodCode & " ', @SkladList=' " SladStr & " ' " В рассмотренном случае структура списка-аргумента очень простая: четыре символа для каждого элемента. В следующем листинге используется строка-аргумент, в которой хранятся элементы произвольной длины (не более 20 символов), но каждый из них огранивается круглыми скобками, например: “(A)”, “(DVD)” или “(PC-CD)”. Здесь имеется в виду, что наименование каждого товара начинается с кода группы товаров, заключенного в круглые скобки. Код процедуры листинга 21.7 возвращает таблицу кодов и наименований товаров, группы которых содержатся в строке-аргументе. Листинг 21.7 Процедура получения списка товаров для указанных групп 1: CREATE PROCEDURE СписокТовДляГрупп 2: /* возвращает список товаров, указанных в строке @GroupList групп. 3: группы конкатенированы без пробелов, поскольку их выделяют скобки */ 4: @GroupList AS nvarchar(300) 5: AS 6: DECLARE @lenGroupList int, @i int, @stmp varchar(20), @s varchar(1) 7: DECLARE @KodTable TABLE (CODE varchar (20)) 8: /* формирование таблицы используемых групп из @GroupList */ 9: SET @i=1 10: SET @stmp = '' 11: SET @lenGroupList = LEN(@GroupList) 12: WHILE @i < @lenGroupList +1 13: BEGIN 14: SET @s = SUBSTRING(@GroupList, @i, 1) 15: SET @stmp = @stmp + @s 16: IF @s=')' 17: BEGIN 18: INSERT INTO @KodTable (CODE) VALUES (@stmp) 19: SET @stmp = '' 20: END 21: SET @i=@i + 1 22: END 23: /* формирование возвращаемого набора */ 24: SELECT КодТовара, НаименТовара FROM Товары 25: WHERE SUBSTRING(НаименТовара, 1, PATINDEX('%)%', НаименТовара)) 26: IN (SELECT * FROM @KodTable) 27: ORDER BY c_namet В строке 7 объявляется переменная @ KodTable типа TABLE. В цикле WHILE (строки 12–22) из строки-аргумента @GroupList выделяются лексемы, ограниченные круглыми скобками (коды групп товаров), и посредством инструкции INSERT помещаются в единственное поле таблицы @ KodTable (строка 18). В строках 24–27 помещенные в @ KodTable группы товаров используются в SELECT -запросе для выбора необходимых товаров. Для сравнения начальной части наименования товаров с выбранным списком кодов групп используется функция SUBSTRING в сочетании с PATINDEX.
|