powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Перевод процедуры Interbase с циклом For на MS SQL.
8 сообщений из 8, страница 1 из 1
Перевод процедуры Interbase с циклом For на MS SQL.
    #39783354
eclipse170790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго времени суток! Снова задача перевести ХП 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


Вот сама ХП -

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
[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 без курсоров? Делать с помощью временной таблицы? А как тогда построчно пройтись? Заранее спасибо.
...
Рейтинг: 0 / 0
Перевод процедуры Interbase с циклом For на MS SQL.
    #39783382
Фотография brick08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eclipse170790,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
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


типа так?
...
Рейтинг: 0 / 0
Перевод процедуры Interbase с циклом For на MS SQL.
    #39784290
eclipse170790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
brick08, интересно. Надо попробовать. На сталкивалась с "OUTER APPLY". Спасибо.
...
Рейтинг: 0 / 0
Перевод процедуры Interbase с циклом For на MS SQL.
    #39784334
eclipse170790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
brick08, возможно глупый вопрос. Я ведь могу этот код перенести в процедуру, и передавать машину, дату и смену входными параметрами? Программа написана на Delphi и предподчтение отдаём процедурам.
...
Рейтинг: 0 / 0
Перевод процедуры Interbase с циклом For на MS SQL.
    #39784341
eclipse170790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
brick08,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
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



Такого вида? Плюс добавила дату по которой мне надо пройтись.
...
Рейтинг: 0 / 0
Перевод процедуры Interbase с циклом For на MS SQL.
    #39784380
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eclipse170790Я ведь могу этот код перенести в процедуру, и передавать машину, дату и смену входными параметрами?Конечно.
...
Рейтинг: 0 / 0
Перевод процедуры Interbase с циклом For на MS SQL.
    #39784802
eclipse170790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
brick08, не сработало. Время конца события обновилось, но вставило одно и тоже значение (время начала первого события).
...
Рейтинг: 0 / 0
Перевод процедуры Interbase с циклом For на MS SQL.
    #39784807
eclipse170790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовала так, по конкретной машине за конкретную дату -

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Перевод процедуры Interbase с циклом For на MS SQL.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]