![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
тяжелое условие в ХП [IB или FB]
GanibalLector © (2004-07-20 01:51:00)Имеется некая таблица партий товаров.
Поля...много их.Вот основные:
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
то,все удалится.А нужно одну оставить.
А вот что делать со вторым условием в котором переброс в любую партию с таким же кодом???Тут даже ума не приложу.
Хотелось бы услышать советов.Спасибо!!!
GanibalLector (2004-07-21 18:56:00) [1]Вот...родил этот код.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
bushmen (2004-07-20 11:13:00) [2]> Там замес с кассовым аппаратом.
А что, разве кассовый аппарат пробивает нулевое количество товара?
GanibalLector (2004-07-20 10:24:00) [3]>пересмотреть логику работы программы
Невозможно!!!Там замес с кассовым аппаратом. Еще варианты есть???
bushmen (2004-07-20 09:46:00) [4]Согласен с [5] - на этапе ввода можно проверять вводится ли нулевое количество товара, и если вводится, то не писать в базу.
Наталия (2004-07-20 09:36:00) [5]Ещё вариант - пересмотреть логику работы программы, чтобы таких записей вообще не создавать.
GanibalLector (2004-07-20 09:32:00) [6]2 ЮЮ
>И не жалко удалять информацию которую кто-то с таким трудои вводил?
Нет,не жалко.В процентном отношении по сравнению со всеми записями,причинных -5%.
2 ALL
А еще варианты есть???
ЮЮ (2004-07-20 03:20:00) [7]А оно надо? Завтра опять появится запись для уже существующего товара существующей партии. И что, начинать заново? Просто показывай этот запрос вместо таблицы.
P/S. И не жалко удалять информацию которую кто-то с таким трудои вводил? :)
GanibalLector (2004-07-20 02:51:00) [8]>Остается дело за малым - залить это в таблицу вместо того, что там есть
И как?
ЮЮ (2004-07-20 02:37:00) [9]запрос
SELECT plu, num, SUM(kol) kol
FROM part group by num, plu
HAVING SUM(kol) <> 0
отобразит твою тавлицу в том виде, как ты желаешь (но я бы не пожелал даже врагу :). Остается дело за малым - залить это в таблицу вместо того, что там есть