Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поиск разрывов в цепи следования. [D6, IB6.x]


Страницы:   1 2

Kinda ©   (2003-09-30 22:31:00) 

Есть две таблицы с данными о движении вагонов.
В одной операции внутри страны, в другой - за
ее пределами. Необходимо отыскать разрывы в цепи следования,
например вагон выехал с одной страны, но не заехал в другую и т.п.

Я решил написать две ХП в одной сливаю данные двух таблиц, а в другой оранизован цикл по первой и внутри этого цикла
мне приходится опять же делать select из первой ХП чтобы посмотреть дату следующей операции и увидеть есть ли разрыв.

В результате все очень сильно тормозит, на 200 000 записей.
Скажите как можно сделать по-другому, только очень не хочется делать специальную таблицу для слива данных.

Заранее спасибо.


Kinda   (2003-09-30 23:56:00) [21]

Значит так:

Таблица 1:
NVAGON - номер вагона
DATAOP - дата операции
OPERATION - операция с вагоном (погрузка, выгрузка и т.д.)
....

Таблица 2:
NVAGON - номер вагона
DATEVH - дата входа в страну
DATEVIH - дата выхода из страны
KSTRAN - код страны.
....

Если с момента выхода вагона за пределы страны (табл. 1)
и до момента его возвращения между датами операций
более чем 1 сутки - то считать это разрывом цепи.


Johnmen   (2003-09-30 23:41:00) [22]

Да нет же. Приведи часть структур таблиц, описывающую следование вагонов. А также, что в содержательной части таблиц является разрывом, как он определяется ?


Kinda   (2003-09-30 23:31:00) [23]

CREATE PROCEDURE RAZRIV_PLATA
RETURNS (
NVAGON DOUBLE PRECISION,
DATAOP TIMESTAMP,
NDEPO VARCHAR (1),
STANPOGR VARCHAR (72),
STANNAZ VARCHAR (72),
STANPRIEM VARCHAR (72),
STANSDACH VARCHAR (72),
VES DOUBLE PRECISION,
DORZVIT VARCHAR (50),
SUMGRN DOUBLE PRECISION,
KSTRAN VARCHAR (2),
OPERATION VARCHAR (50),
PRIORITY INTEGER,
MESOT INTEGER,
GODOT INTEGER)
AS
DECLARE VARIABLE v_NVAGON DOUBLE PRECISION;
DECLARE VARIABLE v_DATAOP TIMESTAMP;
DECLARE VARIABLE v_NDEPO VARCHAR (1);
DECLARE VARIABLE v_STANPOGR VARCHAR (72);
DECLARE VARIABLE v_STANNAZ VARCHAR (72);
DECLARE VARIABLE v_STANPRIEM VARCHAR (72);
DECLARE VARIABLE v_STANSDACH VARCHAR (72);
DECLARE VARIABLE v_VES DOUBLE PRECISION;
DECLARE VARIABLE v_DORZVIT VARCHAR (50);
DECLARE VARIABLE v_SUMGRN DOUBLE PRECISION;
DECLARE VARIABLE v_KSTRAN VARCHAR (2);
DECLARE VARIABLE v_OPERATION VARCHAR (50);
DECLARE VARIABLE v_PRIORITY INTEGER;
DECLARE VARIABLE v_MESOT INTEGER;
DECLARE VARIABLE v_GODOT INTEGER;
DECLARE VARIABLE v_DATA_SLED TIMESTAMP;
DECLARE VARIABLE v_KSTRAN_SLED VARCHAR(2);
DECLARE VARIABLE v_MINPRIOR INTEGER;
BEGIN
/* Procedure body */
FOR SELECT NVAGON,DATAOP,NDEPO,STANPOGR,STANNAZ,STANPRIEM,STANSDACH,VES,DORZVIT,
SUMGRN,KSTRAN,OPERATION,PRIORITY,MESOT,GODOT FROM TRANSFORM_PLATA where
DATAOP BETWEEN "01.01.2003" AND "01.05.2003" ORDER BY NVAGON,DATAOP,PRIORITY
INTO :v_NVAGON,:v_DATAOP,:v_NDEPO,:v_STANPOGR,:v_STANNAZ,:v_STANPRIEM,
:v_STANSDACH,:v_VES,:v_DORZVIT,:v_SUMGRN,:v_KSTRAN,:v_OPERATION,
:v_PRIORITY,:v_MESOT,:v_GODOT
DO BEGIN
SELECT MIN(DATAOP),MIN(PRIORITY) FROM TRANSFORM_PLATA WHERE DATAOP>:v_DATAOP INTO :v_DATA_SLED,:v_MINPRIOR;
SELECT MIN(KSTRAN) FROM TRANSFORM_PLATA WHERE DATAOP=:v_DATA_SLED AND PRIORITY=:v_MINPRIOR
INTO :v_KSTRAN_SLED;
if ........ then
SUSPEND;
END
END

Это текст второй ХП.
Первая ХП (TRANSFORM_PLATA) объединяет данные двух таблиц
(в одной 150 000 в другой 50 000).


Johnmen   (2003-09-30 23:17:00) [24]

"Ты не умничай, ты рукой покажи" (c) известный анекдот


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо