![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Весь в непонятках. Хранимая процедура(+) [IB6.x]
AlexSerp © (2004-05-19 12:09:00)имеет 71 возвращаемое поле.
Работает на отчет (по авансовым отчетам).
Попросили добавить пару полей.
Добавил. Один сотрудник из отчета пропал.
Убрал те два поля, все появилось.
Никакой логики никак не могу увидеть.
Это глюк или ограичение ИБ6?
Что-то я нигде таких ограничений не видел.
Или плохо смотрел?
Digitman (2004-05-20 09:20:00) [1]
> Andriano (20.05.04 08:35) [33]
> Признаюсь, терпения не хватило понять смысл опубликованной
> процедуры
примерный смысл, кажется, понятен судя по названию
GURNAL_SCHET_71S
типа, журнал какой-то отчетности по счетам, корреспондирующим с 71-ым счетом
судя по куче полей в выборке, большинство полей предназначено для возврата инф-ции по тому или иному узлу счет/субсчет/шифр_аналитики/и т.д., фигурирующему на момент вызова в справочнике счетов ... растет-плодится справочник - растет и число полей в выборке !
дурней логики и в кошмарном сне не придумаешь ..
Andriano (2004-05-20 08:35:00) [2]М-да... Закончил складской учет писать. Там и доки и справочники с деревьями, и журналы, и отчеты, и всякие сервисы. Но НИ ОДНОЙ такой процедуры или что-то подобного.
Настоятельно рекомендую: разберись в данных, да напиши свои запросы и процедуры.
Признаюсь, терпения не хватило понять смысл опубликованной процедуры. Да и нет там смысла, просто кого-то переклинило на хранимых процедурах.
Digitman (2004-05-19 17:07:00) [3]
> AlexSerp (19.05.04 16:42) [31]
мне искренне жаль, что ты торчишь в этой заднице
желаю выбраться из нее поскорей, иначе - кирдык ... ввязнешь по самые ухи ..
AlexSerp (2004-05-19 16:42:00) [4]Digitman, ситуация поганенькая.
Программы сданы. Исходники переданы.
Кажин месяц гемор бессистемный.
Уже задолбало все до жути.
А мое дело не только админить, но и ошибки исправлять (исходники-то сданы). А также наполнять программы новой функциональностью (жаль только редко программировать удается) как на Делфи, так и на ИБ. Если б вы только видели исходники тех программ! Без слез не взглянешь. Я, когда ошибки исправляю, то разговариваю только матом.
А вообще, если б я знал, что проги будут писать дилетанты в прикладном программировании, то не пошел бы на эту работу. Правда, в тот момент мне предложили хорошую зарплату.
Теперь ищу место программиста.
Digitman (2004-05-19 16:31:00) [5]
> AlexSerp (19.05.04 16:06) [29]
ну и умница
только вот еслим так и дальше будет продолжаться в том же духе - геморрой тебе гарантирован)
не царское (не админское !) это дело - лезть в дебри прикладного программингга чего бы то ни было ... не работает чья-то задача ? нафиг ее сразу ! и - ставь перед фактом руководство ..
AlexSerp (2004-05-19 16:06:00) [6]Ребята, да, наобум "ИЛИ" поставил.
Точно мозги закисли.
Там везде формируется какая-та переменная NS.
Похоже на то, что когда писалась эта процедура разработчик таким образом прикрыл какую-то дыру.
Меня,есссно, в известность никто не ставил.
Оказалось, что тот сотрудник и попал под раздачу - NS=48у него было.
Огромное всем спасибо.
Все решилось.
И с остаткоами на конец периода тоже.
Digitman (2004-05-19 15:29:00) [7]
> Поставил вместо AND -> OR
от балды, чувствуется, поставил ? абы задышало хоть как-то, а дальше - трава не расти ? ну так еще и XOR попробуй)
если "работало", то, значит, именно AND был нужен по логике !
и задача твоя, коль уж на то пошло, - выяснить, в какой точке кода процедуры происходит нечто ведущее к нарушаению истинности условного выражения
(FIO<>'нет') and (SM_DBN<>0 or SM_KRN<>0 or NS<>48)
AlexSerp (2004-05-19 15:07:00) [8]Digitman, до того, как я прочитал твое сообщение,
уже именно это
if ((FIO<>'нет') and (SM_DBN<>0 or SM_KRN<>0 or NS<>48)) then begin
NSTR=NSTR+1;
suspend;
end
и проверил.
От же ж блин, оно ж работало без тех двух полей.
А теперь нет.
Поставил вместо AND -> OR.
Сотрудник появился.
Только там осталось покопаться в дебётах/кредётах.
Вот же как на админском деле мозги закисают.
Кабы в программеры обратно.
Нет ни у кого места в Москве? ;-)
Digitman (2004-05-19 14:49:00) [9]
> AlexSerp (19.05.04 14:27) [21]
как это у тебя запись исчезает из выборки ?
у тебя процедура же селективная ?
вот смотри сюда :
если таки WHERE-условие SELECT-предложения верно (т.е. однозначно приводит к выборке одной записи), то далее я вижу, что собственно suspend у тебя выполняется условно
if((FIO<>'нет') and (SM_DBN<>0 or SM_KRN<>0 or NS<>48)) then begin
NSTR=NSTR+1;
suspend;
end
если условие в этом ifне выполняется, то и suspend не выполнится !
о чем это говорит ? говорит это о том, что если обращение клиента к процедуре происходит как к селективной процедуре , то выборка будет пуста
отсюда вывод : проверяй правильность формирования этого if-условия, оно у тебя напрямую зависит от вычисленных значений переменных, и в связи с добавлением новых полей эти вычисленные значения запросто могут не соответствовать ожидаемым в условиях сравнения с константами
и оч важно здесь замечание Johnmen © (19.05.04 13:57) [18] - скорей всего оттуда и растут ноги у проблемы
Соловьев (2004-05-19 14:47:00) [10]
> Отладкой пользовался из QuickDesk.
качай - http://www.ibexpert.com/rus/ibe_sfx.exe
AlexSerp (2004-05-19 14:44:00) [11]Digitman> и какой же (слов нет кто он) все это писал-то ?)
Это ж какие ты слова подобрал! ;-) Я обычно говорю ............ вот уже несколько лет, постоянно разгребая все, что понаписали доблестные разработчики.
База даже не спроектирована, это просто хранилище данных.
Проги написаны так, что постоянно что-то исчезает или задваивается/затраивается/....
Причем происходит все бессистемно.
Ну да ладно. Боремся помалек.
MIKE kouzmine, именно один и тот же сотрудник.
Отладкой пользовался из QuickDesk.
Видно совсем башкой ослаб.
Ща попробую шнягу с комментированием и оставлением каждого запроса отдельно. Может выплывет что-нть.
MIKE kouzmine (2004-05-19 14:35:00) [12]А исчезают именно только они или случайные? Если они, то пройти отладкой именно по ним и понять, почему суспенд не выполняется.
if ((FIO<>'нет') and (SM_DBN<>0 or SM_KRN<>0 or NS<>48)) then begin
NSTR=NSTR+1;
suspend;
end
Digitman (2004-05-19 14:35:00) [13]и какой же (слов нет кто он) все это писал-то ?)
а завтра в корреспонденции с заданным фикс.счетом окажется новый счет, которого до сей поры не было в справочнике - и что ? снова процедуру переписывать ? еще поле добавлять ? а если послезавтра еще косой десяток счетов бухгалтеру стукнет в голову добавить ? так и будем раздувать кол-во реквизитов таблиц/запросов/процедур/взглядов ? они ж не резиновые))
AlexSerp (2004-05-19 14:27:00) [14]MIKE kouzmine, именно.
Хотя в каждом отдельном запросе сотрудник выбирается без проблем.
Запросы неизменными остались.
Добавилось только два поля и их заполнение.
MIKE kouzmine (2004-05-19 14:17:00) [15]Они исчезают из выборки? Или что?
AlexSerp (2004-05-19 14:04:00) [16]Johnmen, пустота присваивается после вычислений.
Johnmen (2004-05-19 13:57:00) [17]Видимо дело в арифметических операциях со значением NULL.
Т.е. 123+NULL=NULL и т.п.
AlexSerp (2004-05-19 13:50:00) [18]Те два поля выделены жирным.
Ниже по тексту идет разблюдовка по полям.
AlexSerp (2004-05-19 13:48:00) [19]if (SM_5105=0) then begin SM_5105=Null; NS=NS+1; end
if (SM_5106=0) then begin SM_5106=Null; NS=NS+1; end
if (SM_5107=0) then begin SM_5107=Null; NS=NS+1; end
if (SM_5108=0) then begin SM_5108=Null; NS=NS+1; end
if (SM_5001K=0) then begin SM_5001K=Null; NS=NS+1; end
if (SM_7902=0) then begin SM_7902=Null; NS=NS+1; end
SM_KR1=SM_7102D+SM_5002D+SM_910421D+SM_50D+SM_4402+SM_260022124+SM_230000012+
SM_260011310+SM_260033365+SM_6021+SM_19042+SM_8402+
SM_9104+SM_7302
+SM_0804+SM_1001111+SM_1003000+SM_1003100+SM_1003200+
SM_1005000+SM_1006+SM_1009000+SM_230078027+SM_260022128+
SM_260022130+SM_4401+SM_4403+SM_910494+SM_9703+SM_8401+SM_7902K+SM_1002200+
SM_1008+SM_910451+SM_230071027;
SM_ITOGO=SM_KR1;
if (SM_ITOGO=0) then SM_ITOGO=Null;
if (SM is Null) then SM=0;
SM_DB_KR=SM+(SM_DB1-SM_KR1);
if (SM=0) then SM=Null;
if (SM_DB_KR>0) then begin SM_DBK=SM_DB_KR;SM_KRK=Null; end
if (SM_DB_KR<0) then begin SM_KRK=-SM_DB_KR;SM_DBK=Null;end
if (SM_DB_KR=0) then begin SM_KRK=Null;SM_DBK=Null; SM_DB_KR=Null; end
if (SM_7102D=0) then begin SM_7102D=Null; NS=NS+1; end
if (SM_5002D=0) then begin SM_5002D=Null; NS=NS+1; end
if (SM_910421D=0) then begin SM_910421D=Null; NS=NS+1; end
if (SM_50D=0) then begin SM_50D=Null; NS=NS+1; end
if (SM_4402=0) then begin SM_4402=Null; NS=NS+1; end
if (SM_260022124=0) then begin SM_260022124=Null; NS=NS+1; end
if (SM_230000012=0) then begin SM_230000012=Null; NS=NS+1; end
if (SM_260011310=0) then begin SM_260011310=Null; NS=NS+1; end
if (SM_260033365=0) then begin SM_260033365=Null; NS=NS+1; end
if (SM_6021=0) then begin SM_6021=Null; NS=NS+1; end
if (SM_6021KOM=0) then begin SM_6021KOM=Null; NS=NS+1; end
if (SM_19042=0) then begin SM_19042=Null; NS=NS+1; end
if (SM_8402=0) then begin SM_8402=Null; NS=NS+1; end
if (SM_9104=0) then begin SM_9104=Null; NS=NS+1; end
if (SM_7302=0) then begin SM_7302=Null; NS=NS+1; end
if (SM_5001D=0) then begin SM_5001D=Null; NS=NS+1; end
if (SM_0804=0) then begin SM_0804=Null; NS=NS+1; end
if (SM_1001111=0) then begin SM_1001111=Null; NS=NS+1; end
if (SM_1003000=0) then begin SM_1003000=Null; NS=NS+1; end
if (SM_1003100=0) then begin SM_1003100=Null; NS=NS+1; end
if (SM_1003200=0) then begin SM_1003200=Null; NS=NS+1; end
if (SM_1005000=0) then begin SM_1005000=Null; NS=NS+1; end
if (SM_1006=0) then begin SM_1006=Null; NS=NS+1; end
if (SM_1009000=0) then begin SM_1009000=Null; NS=NS+1; end
if (SM_230078027=0) then begin SM_230078027=Null; NS=NS+1; end
if (SM_260022128=0) then begin SM_260022128=Null; NS=NS+1; end
if (SM_260022130=0) then begin SM_260022130=Null; NS=NS+1; end
if (SM_4401=0) then begin SM_4401=Null; NS=NS+1; end
if (SM_4403=0) then begin SM_4403=Null; NS=NS+1; end
if (SM_910494=0) then begin SM_910494=Null; NS=NS+1; end
if (SM_9703=0) then begin SM_9703=Null; NS=NS+1; end
if (SM_8401=0) then begin SM_8401=Null; NS=NS+1; end
if (SM_7902K=0) then begin SM_7902K=Null; NS=NS+1; end
if (SM_5004=0) then begin SM_5004=Null; NS=NS+1; end
if (SM_1002200=0) then begin SM_1002200=Null; NS=NS+1; end
if (SM_1008=0) then begin SM_1008=Null; NS=NS+1; end
if (SM_910451=0) then begin SM_910451=Null; NS=NS+1; end
if (SM_230071027=0) then begin SM_230071027=Null; NS=NS+1; end
/*if ((FIO<>'нет') and (SM_DB1<>0 or SM_KR1<>0
or SM_DBN<>0 or SM_KRN<>0)) then suspend;*/
/*if (FIO<>'нет') then suspend;*/
if ((FIO<>'нет') and (SM_DBN<>0 or SM_KRN<>0 or NS<>48)) then begin
NSTR=NSTR+1;
suspend;
end
end
END
AlexSerp (2004-05-19 13:48:00) [20]SM_260022128=0;
SM_260022130=0;
SM_4401=0;
SM_4403=0;
SM_910494=0;
SM_9703=0;
SM_8401=0;
SM_7902K=0;
SM_1002200=0;
SM_1008=0;
SM_910451=0;
SM_230071027=0;
for
Select SM,DB,KR,N from BUX_OBOROT
where
(KLIENT_N=:N_SOTR and DATA>=:DATA_N and DATA<=:DATA_K
and MODUL in (5,51))
or
(N_SOTRUD>0 and N_SOTRUD=:N_SOTR and DATA>=:DATA_N and DATA<=:DATA_K
and MODUL=3)
order by DB,KR
into :SM_SH,:SH2,:SH1,:N_BUX do begin
if (SM_SH is Null) then SM_SH=0;
if (SH1 is Null) then SH1='';
if (SH2 is Null) then SH2='';
/*DEBET*/
if (SH2 like '7101%') then begin
if (SH1 like '7102%') then SM_7102=SM_7102+SM_SH;
if (SH1 like '51%') then SM_51=SM_51+SM_SH;
if (SH1 like '50%') then SM_50K=SM_50K+SM_SH;
/*if (SH1 like '5101%') then SM_5101=SM_5101+SM_SH;*/
/*if (SH1 like '5102%') then SM_5102=SM_5102+SM_SH;
/*if (SH1 like '5103%') then SM_5103=SM_5103+SM_SH;
/*if (SH1 like '5104%') then SM_5104=SM_5104+SM_SH;
/*if (SH1 like '5105%') then SM_5105=SM_5105+SM_SH;
/*if (SH1 like '5106%') then SM_5106=SM_5106+SM_SH;
/*if (SH1 like '5107%') then SM_5107=SM_5107+SM_SH;
/*if (SH1 like '5108%') then SM_5108=SM_5108+SM_SH;*/
if (SH1 like '5004%') then SM_5004=SM_5004+SM_SH;
if (SH1 like '5001%') then SM_5001K=SM_5001K+SM_SH;
if (SH1 like '7902%') then SM_7902=SM_7902+SM_SH;
end
/*KREDIT*/
if (SH1 like '7101%') then begin
if (SH2 like '7102%') then SM_7102D=SM_7102D+SM_SH;
if (SH2 like '5002%') then SM_5002D=SM_5002D+SM_SH;
if (SH2 like '910421%') then SM_910421D=SM_910421D+SM_SH;
if (SH2 like '50%') then SM_50D=SM_50D+SM_SH;
if (SH2 like '5001%') then SM_5001D=SM_5001D+SM_SH;
if (SH2 like '4402%') then SM_4402=SM_4402+SM_SH;
if (SH2 like '260022124%') then SM_260022124=SM_260022124+SM_SH;
if (SH2 like '230000012%') then SM_230000012=SM_230000012+SM_SH;
if (SH2 like '260011310%') then SM_260011310=SM_260011310+SM_SH;
if (SH2 like '260033365%') then SM_260033365=SM_260033365+SM_SH;
/*if (SH2 like '6021%') then SM_6021=SM_6021+SM_SH;
if (SH2 like '6021kom%') then SM_6021KOM=0;*/
if (SH2 like '19042%') then SM_19042=SM_19042+SM_SH;
if (SH2 like '8402%') then SM_8402=SM_8402+SM_SH;
/*if (SH2 like '9104%') then SM_9104=SM_9104+SM_SH;*/
if (SH2 like '7302%') then SM_7302=SM_7302+SM_SH;
if (SH2 like '0804%') then SM_0804=SM_0804+SM_SH;
if (SH2 like '1001111%') then SM_1001111=SM_1001111+SM_SH;
if (SH2 like '1003000%') then SM_1003000=SM_1003000+SM_SH;
if (SH2 like '1003100%') then SM_1003100=SM_1003100+SM_SH;
if (SH2 like '1003200%') then SM_1003200=SM_1003200+SM_SH;
if (SH2 like '1005000%') then SM_1005000=SM_1005000+SM_SH;
if (SH2 like '1006%') then SM_1006=SM_1006+SM_SH;
if (SH2 like '1009000%') then SM_1009000=SM_1009000+SM_SH;
if (SH2 like '230078027%') then SM_230078027=SM_230078027+SM_SH;
if (SH2 like '260022128%') then SM_260022128=SM_260022128+SM_SH;
if (SH2 like '260022130%') then SM_260022130=SM_260022130+SM_SH;
if (SH2 like '4401%') then SM_4401=SM_4401+SM_SH;
if (SH2 like '4403%') then SM_4403=SM_4403+SM_SH;
if (SH2 like '910494%') then SM_910494=SM_910494+SM_SH;
if (SH2 like '9703%') then SM_9703=SM_9703+SM_SH;
if (SH2 like '8401%') then SM_8401=SM_8401+SM_SH;
if (SH2 like '7902%') then SM_7902K=SM_7902K+SM_SH;
if (SH2 like '1002200%') then SM_1002200=SM_1002200+SM_SH;
if (SH2 like '1008%') then SM_1008=SM_1008+SM_SH;
if (SH2 like '910451%') then SM_910451=SM_910451+SM_SH;
if (SH2 like '230071027%') then SM_230071027=SM_230071027+SM_SH;
end
end
SM_DB1=SM_7102+SM_50K+SM_5101+SM_5102+SM_5103+SM_5104+SM_5105
+SM_5106+SM_5107+SM_5108+SM_7902;
NS=0;
if (SM_7102=0) then begin SM_7102=Null; NS=NS+1; end
if (SM_51=0) then begin SM_51=Null; NS=NS+1; end
if (SM_50K=0) then begin SM_50K=Null; NS=NS+1; end
if (SM_5101=0) then begin SM_5101=Null; NS=NS+1; end
if (SM_5102=0) then begin SM_5102=Null; NS=NS+1; end
if (SM_5103=0) then begin SM_5103=Null; NS=NS+1; end
if (SM_5104=0) then begin SM_5104=Null; NS=NS+1; end