Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Перевод процедуры Interbase с циклом For на MS SQL.  [new]
eclipse170790
Member

Откуда:
Сообщений: 27
Всем доброго времени суток! Снова задача перевести ХП Interbase на MS SQL. Есть таблица grafik, там у машин (nmash) время начала (vrem_begin), время конца (vrem_end), дата (data), смена (nsm), код (kod) и всего потраченного времени на каждый код (vsego).
Время конца текущей записи - это время начала следующей записи, к примеру -

Машина Код Время начала Время конца

№3 10 07.03.2019 08:00 07.03.2019 08:20
№3 15 07.03.2019 08:20 07.03.2019 08:55
№3 10 07.03.2019 08:55 07.03.2019 12:30


Вот сама ХП -

[SRC PLSQL][src]for  select nmash,vrem_begin from grafik where data=:IN_DATE and nsm=:IN_NCM  order by neks,vrem_begin into :ne_,:vb_  /*выбрали все записи по всем машинам*/
       do begin

       select vrem_begin from grafik where nmash=:ne_ and data=:in_date
           and vrem_begin>:vb_ and nsm=:in_ncm order by vrem_begin rows 1 into :out_dat; /*out_dat это vrem_begin след.записи*/

       begin
       if (:out_dat is not null) then  begin /*есть запись с временем конца*/
               ve_=:out_dat;
               update grafik set vrem_end=:ve_,vsego=(:ve_-:vb_)*24 where nmash=:ne_ and data=:in_date and vrem_begin=:vb_ and 
                          nsm=:in_ncm;
       end

        if (:out_dat is  null) then  begin /*нет записи с временем конца*/
        update grafikd set vrem_end=:in_kon,vsego=(:in_kon-:vb_)*24  where nmash=:ne_ and data=:in_date and vrem_begin=:vb_ and 
                         nsm=:in_ncm;     /*обновляет посл.запись*/

         end
         out_dat =null;
       end
     end
[/SRC][/SRC]


Как можно это реализовать в MS SQL без курсоров? Делать с помощью временной таблицы? А как тогда построчно пройтись? Заранее спасибо.
7 мар 19, 09:35    [21826961]     Ответить | Цитировать Сообщить модератору
 Re: Перевод процедуры Interbase с циклом For на MS SQL.  [new]
brick08
Member

Откуда:
Сообщений: 65
eclipse170790,
CREATE TABLE grafik (
	nmash INT
	,nsm INT
	,vrem_begin DATETIME
	,vrem_end DATETIME
	,vsego NUMERIC(12, 2)
	)

UPDATE grafik
SET vrem_end = t.vrem_end
	,vsego = t.vsego
FROM (
	SELECT g.nmash
		,g.nsm
		,g.vrem_begin
		,gn.vrem_begin AS vrem_end
		,(gn.vrem_begin - g.vrem_begin) * 24 AS vsego
	FROM grafik g
	OUTER APPLY (
		SELECT TOP 1 g1.vrem_begin
		FROM grafik g1
		WHERE g1.nmash = g.nmash
			AND g1.nsm = g.nsm
			AND g1.vrem_begin > g1.vrem_begin
		ORDER BY vrem_begin
		) gn
	) t
WHERE grafik.nmash = t.nmash
	AND grafik.nsm = t.nsm

типа так?
7 мар 19, 10:14    [21827000]     Ответить | Цитировать Сообщить модератору
 Re: Перевод процедуры Interbase с циклом For на MS SQL.  [new]
eclipse170790
Member

Откуда:
Сообщений: 27
brick08, интересно. Надо попробовать. На сталкивалась с "OUTER APPLY". Спасибо.
10 мар 19, 17:46    [21828749]     Ответить | Цитировать Сообщить модератору
 Re: Перевод процедуры Interbase с циклом For на MS SQL.  [new]
eclipse170790
Member

Откуда:
Сообщений: 27
brick08, возможно глупый вопрос. Я ведь могу этот код перенести в процедуру, и передавать машину, дату и смену входными параметрами? Программа написана на Delphi и предподчтение отдаём процедурам.
11 мар 19, 07:38    [21828859]     Ответить | Цитировать Сообщить модератору
 Re: Перевод процедуры Interbase с циклом For на MS SQL.  [new]
eclipse170790
Member

Откуда:
Сообщений: 27
brick08,

UPDATE grafik
SET vrem_end = t.vrem_end
	,vsego = t.vsego
FROM (
	SELECT g.nmash
                ,g.data
		,g.nsm
		,g.vrem_begin
		,gn.vrem_begin AS vrem_end
		,(gn.vrem_begin - g.vrem_begin) * 24 AS vsego
	FROM grafik g
	OUTER APPLY (
		SELECT TOP 1 g1.vrem_begin
		FROM grafik g1
		WHERE g1.nmash = g.nmash
			AND g1.nsm = g.nsm
			AND g1.vrem_begin > g1.vrem_begin
		ORDER BY vrem_begin
		) gn
	) t
WHERE grafik.nmash = t.nmash
            AND grafik.data= t.data
	    AND grafik.nsm = t.nsm

            AND grafik.nmash = @IN_MASH
            AND grafik.data = @IN_DATA
	    AND grafik.nsm = @IN_NSM


Такого вида? Плюс добавила дату по которой мне надо пройтись.
11 мар 19, 08:06    [21828867]     Ответить | Цитировать Сообщить модератору
 Re: Перевод процедуры Interbase с циклом For на MS SQL.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 27934
eclipse170790
Я ведь могу этот код перенести в процедуру, и передавать машину, дату и смену входными параметрами?
Конечно.
11 мар 19, 10:37    [21828932]     Ответить | Цитировать Сообщить модератору
 Re: Перевод процедуры Interbase с циклом For на MS SQL.  [new]
eclipse170790
Member

Откуда:
Сообщений: 27
brick08, не сработало. Время конца события обновилось, но вставило одно и тоже значение (время начала первого события).
12 мар 19, 12:10    [21830094]     Ответить | Цитировать Сообщить модератору
 Re: Перевод процедуры Interbase с циклом For на MS SQL.  [new]
eclipse170790
Member

Откуда:
Сообщений: 27
Попробовала так, по конкретной машине за конкретную дату -

UPDATE grafik SET vrem_end = t.vrem_end--,vsego = t.vsego 
							,vsego=0	
			   FROM (
					 SELECT g.nmash, g.data, g.ncm, g.vrem_begin,
					        gn.vrem_begin AS vrem_end
						    --(gn.vrem_begin - g.vrem_begin) * 24 AS vsego 
						    FROM grafik g
						   
	                 OUTER APPLY (
		                  SELECT TOP 1 g1.vrem_begin FROM grafik g1
								 WHERE g1.nmash= g.nmash
									   AND g1.ncm = g.ncm
									   AND g1.vrem_begin > g.vrem_begin 
									   and g1.ncm = 1 
									   and g1.data= '2018-09-01' 
									   and g1.nmash=41 ORDER BY vrem_begin) gn
	            ) t
		WHERE 
		--grafikd.nmash= t.nmash
		--AND grafikd.data = t.data 
		--AND grafikd.ncm = t.ncm 
		
	        grafikd.data = '2018-09-01'
		AND grafikd.ncm = 1
		and grafikd.nmash=41
12 мар 19, 12:18    [21830101]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить