Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.03 c
8-1085916829
gyry
2004-05-30 15:33
2004.08.15
книги по работе з файлами мультимедиа


3-1090318756
Junior
2004-07-20 14:19
2004.08.15
Помогите с Blob полями!


14-1090990614
pavel_guzhanov
2004-07-28 08:56
2004.08.15
Приношу свои извинения


10-1021451546
Олег Лаукарт
2002-05-15 12:32
2004.08.15
Про устойчивость VisiBroker for C++ 4.1


1-1091101134
doodle
2004-07-29 15:38
2004.08.15
Как преобразовать Integer в String и прибавить к строке.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский