Форум: "Базы";
Текущий архив: 2003.02.13;
Скачать: [xml.tar.bz2];
Внизoracle и тип нумбер Найти похожие ветки
← →
Big_Rom (2003-01-28 07:20) [0]Доброго всем дня,ночи,вечера и утра
вот такой блин касяк в процедуре сравниваю два нумбера
т.е
OPEN DolgList;
LOOP
FETCH DolgList INTO DolgRecord;
EXIT WHEN DolgList%NOTFOUND;
SELECT NVL(SUM(sumplat), 0) INTO Plats
FROM kbnadmin.plat
WHERE ( plat.nlschet = DolgRecord.nlschet ) AND
( plat.dateplat >= CalcDate );
SELECT NVL(SUM(sumplat), 0) INTO PlatsWrk
FROM kbnadmin.plat_wrk
WHERE ( plat_wrk.nlschet = DolgRecord.nlschet ) AND
( plat_wrk.dateplat >= CalcDate );
--если оплачено не полностью
IF (PlatsWrk) < DolgRecord.SumDlg THEN вот здесь собственно и
вылазит т.е в реале PlatsWrk = DolgRecord.SumDlg и в таблицу встовляется 0.01 почему вроде понятно но как избавится незнаю
INSERT INTO kbnadmin.abonent_ring ( nlschet, phone, dolg )
VALUES ( DolgRecord.nlschet, DolgRecord.phone,
( DolgRecord.SumDlg - PlatsWrk ) );
COMMIT;
END IF;
END LOOP;
CLOSE DolgList;
← →
Sergey13 (2003-01-28 08:50) [1]> вот здесь собственно и вылазит
А чего вылазит то?
Ты поподробнее опиши проблему, может и разберется кто и подскажет чего нить. Курсор свой расшифруй, например. Код ошибки дай. А то сунул кусок кода - и вылезает там что-то.
На вскидку, непонятна конструкция NVL(SUM(sumplat), 0) может наоборот надо SUM(NVL(sumplat, 0)) а то вроде как всякого смысла лишено.
← →
Big_Rom (2003-01-28 09:34) [2]как ето лишено если sumplat=null то 0 пишем
хотя и повторой схеме ответ тодже
вылазит собственно то что в таблицу вставляется 0.01
DolgRecord.SumDlg - PlatsWrk зночит = 0.01
но в условии < ,а когда ручками считаю то у меня = недолжен он
вставлять 0.01
вот собственно проблема
з.ы. если что забыл говорите :))
← →
roottim (2003-01-28 09:36) [3]>т.е в реале PlatsWrk = DolgRecord.SumDlg
Насколько в реале...
есои есть PL/SQL Developer протрассируй эту функцию и посмотри переменные "в реале"
← →
Sergey13 (2003-01-28 10:06) [4]2Big_Rom © (28.01.03 09:34)
>как ето лишено если sumplat=null то 0 пишем
А так и лишено. В твоем случае NVL(SUM(sumplat), 0) ты проводишь проверку на NULL конечного результата функции SUM. А надо наоборот, иначе функция может вернуть неправильное значение ("если sumplat=null").
Формат полей sumplat в обеих таблицах одинаков?
← →
dragon (2003-01-28 10:24) [5]а есть ли данные в запросах удовлетворяющие указанным условим?
поставь селекты в exception ... end; посмотри, что получится
← →
Big_Rom (2003-01-28 10:37) [6]все ясно буду пробовать тросиравать процедуру
потом скажу что получилось
вопрос
а если платежей нет то будет нул для этого я nvl туда и поставил
з.ы. вот так день и кончился :))
← →
Big_Rom (2003-01-28 10:47) [7]хотя зачем ее тросировать и так я знаю что там есть
только если посмотреть что из селекта выходит ?
← →
Sergey13 (2003-01-28 11:13) [8]2Big_Rom © (28.01.03 10:37)
>а если платежей нет то будет нул для этого я nvl туда и поставил
А если запись по платежу есть, а суммы самого платежа нет? Твоя схема будет работать правильно, если только стоит sumplat not null или есть значение по умолчанию.
И недурно все таки глянуть на формат полей, и каким макаром они заносятся - простой ручной ввод или ввод значения какого то расчета.
← →
Big_Rom (2003-01-28 11:32) [9]create table PLAT_WRK
(
NLSCHET NUMBER(6) not null,
PHONE NUMBER(6) not null,
DATEPLAT DATE not null,
SUMPLAT NUMBER(10,2) not null,
PLACEPLAT NUMBER(2) not null,
NPLACEPLAT VARCHAR2(27),
NUMPLAT NUMBER(2) default 0 not null,
PACKETNUM NUMBER(3) default 0 not null,
DOCNUM NUMBER(3) default 0 not null,
CODE_TYPE NUMBER(2),
NAME_TYPE VARCHAR2(13),
COPERGET NUMBER(2),
COPERRUN NUMBER(2),
STPLAT NUMBER(1) default 1 not null,
MEMO VARCHAR2(50)
)
вот формат полей для плат
заносятся иммено sumplat ручной ввод вот :))
← →
Sergey13 (2003-01-28 11:47) [10]А у DolgRecord.SumDlg тот-же формат?
← →
Big_Rom (2003-01-28 12:04) [11]угу DolgRecord.SumDlg тот-же формат
← →
roottim (2003-01-28 12:15) [12]я никогда не ставлю ограничение, особенно в платежах, и таких проблем небыло...
все же наверняка при формировании курсора происходит какая то фигня.. попробуй в курсоре указать на поле SumDlg
cursor my_cur is select ... , cast(t.SmDlg as number(10,2)) as sumDlg, .. from ...
← →
Big_Rom (2003-01-28 12:58) [13]дело втом что моя програма надстройка над другой старой при старой
еще досовской (так мысли в слух)
и там ограничение 10,2 а поскольку после меня данные идут туда
то зделал также
кстати ошибка не ушла после приведения к типу непомогло
наверно лучьше повеситься
что самое интересное считает она правильно где суумы больше нуля
только при равном долге и платежах така @ поевляется
← →
roottim (2003-01-28 13:14) [14]и все-же убери ограничения.. просто number и все.
а в DOS базу делай round(pole,2) .. проблем-то тут нет
← →
Big_Rom (2003-01-28 13:18) [15]я к этому и пришел (долголи коротко) :))
ладно попробую
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.02.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c