Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.15;
Скачать: CL | DM;

Вниз

тяжелое условие в ХП   Найти похожие ветки 

 
GanibalLector ©   (2004-07-20 01:51) [0]

Имеется некая таблица партий товаров.
Поля...много их.Вот основные:
plu-char(5)  // код товара
num-char(8) //партия
kol- NUMERIC(7,3) //кол-во
Выглядит примерно так:
1  15.07М  15,500
1  16.07М  12,000
2  16.07М  0,000
3  16.07М  45,000
3  02.04М  -15,00
3  15.05М   0,00

Так вот,возникла необходимость удалять партии товаров где:
-кол-во равно нулю и существуют еще партии с таким-же кодом (т.е. что бы не оставить товар без партии)
-кол-во меньше нуля и существуют еще партии с таким-же кодом,
НО после удаления кол-во необходимо  перекинуть с любую партию с таким же кодом.


Вот,написал для первого условия(где кол-во равно нулю):
CREATE PROCEDURE ZERO
AS
DECLARE VARIABLE M_PLU CHAR(5);
DECLARE VARIABLE M_NUM CHAR(8);
begin
for select plu,num from part where plu in(
select plu from part group by plu having count(plu)>1 ) and kol=0 into :M_PLU,:M_NUM do
delete from part where plu=:M_PLU and num=:M_NUM;
end
Как бы работает,но если все кол-во у партий с одинаковым кодом равно нулю,то все они удалятся.Что не есть хорошо.
Т.е. если так:
5  02.07М   0,000
5  03.07М   0,000
то,все удалится.А нужно одну оставить.

А вот что делать со вторым условием в котором  переброс в любую партию с таким же кодом???Тут даже ума не приложу.
Хотелось бы услышать советов.Спасибо!!!


 
ЮЮ ©   (2004-07-20 02:37) [1]

запрос

SELECT plu, num, SUM(kol) kol
FROM part group by num, plu
HAVING SUM(kol) <> 0

отобразит твою тавлицу в том виде, как ты желаешь (но я бы не пожелал даже врагу :). Остается дело за малым - залить это в таблицу вместо того, что там есть


 
GanibalLector ©   (2004-07-20 02:51) [2]

>Остается дело за малым - залить это в таблицу вместо того, что там есть

И как?


 
ЮЮ ©   (2004-07-20 03:20) [3]

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

P/S. И не жалко удалять информацию которую кто-то с таким трудои вводил? :)


 
GanibalLector ©   (2004-07-20 09:32) [4]

2 ЮЮ
>И не жалко удалять информацию которую кто-то с таким трудои вводил?
Нет,не жалко.В процентном отношении по сравнению со всеми записями,причинных -5%.

2 ALL
А еще варианты есть???


 
Наталия ©   (2004-07-20 09:36) [5]

Ещё вариант - пересмотреть логику работы программы, чтобы таких записей вообще не создавать.


 
bushmen ©   (2004-07-20 09:46) [6]

Согласен с [5] - на этапе ввода можно проверять вводится ли нулевое количество товара, и если вводится, то не писать в базу.


 
GanibalLector ©   (2004-07-20 10:24) [7]

>пересмотреть логику работы программы
Невозможно!!!Там замес с кассовым аппаратом.Еще варианты есть???


 
bushmen ©   (2004-07-20 11:13) [8]

> Там замес с кассовым аппаратом.

А что, разве кассовый аппарат пробивает нулевое количество товара?


 
GanibalLector ©   (2004-07-21 18:56) [9]

Вот...родил этот код.5 часов,млин.Многовато что-то...
CREATE VIEW ZERO1(PLU,NUM)
AS
select plu,num from part where plu in(
select plu from part group by plu having count(plu)>1 ) and kol=0;

CREATE PROCEDURE ZERO2
RETURNS (
   PLU CHAR(5) CHARACTER SET NONE,
   NUM CHAR(8) CHARACTER SET NONE)
AS
DECLARE VARIABLE MM1 CHAR(5);
DECLARE VARIABLE MM CHAR(5);
begin
mm="";mm1="";
for select plu,num from part where plu in(
select plu from part group by plu having count(plu)>1 )
and kol=0 into :plu,:num do
begin
if ((plu=mm) and (mm<>mm1)) then begin
                                   suspend;
                                   mm1=mm;
                                   end
mm=plu;
 end
end

Теперь такой запрос выдаст "ДОЛГОЖДАННОЕ" желаемое :
select zero1.plu, zero1.num from ZERO1  left join  zero2 on (zero1.num=zero2.num)
where zero2.num is null

Ну и,соответственно,запихнем все это в ХП:
CREATE PROCEDURE RUN_ZERO
AS
DECLARE VARIABLE V_PLU CHAR(5);
DECLARE VARIABLE V_NUM CHAR(8);
begin
for  select zero1.plu, zero1.num from ZERO1  left join  zero2 on (zero1.num=zero2.num)
where zero2.num is null   into :V_PLU,:V_NUM do
delete from part where plu=:v_plu and num=:v_num;
end

Намана-> execute procedure RUN_ZERO



Страницы: 1 вся ветка

Текущий архив: 2004.08.15;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.037 c
9-1082927118
Twinge
2004-04-26 01:05
2004.08.15
Вычисление корня n-ой степени


1-1090950045
parovoZZ
2004-07-27 21:40
2004.08.15
Настройки внутри *.exe


1-1091434395
AlexXn
2004-08-02 12:13
2004.08.15
Есть последовательност чисел 1, 2, ... , n


4-1089098942
Mc'Simm
2004-07-06 11:29
2004.08.15
размонтирование USB


14-1090840627
Труп Васи Доброго
2004-07-26 15:17
2004.08.15
Как работать с WinRar????