Непонятное со ссылкой this
На страницу 1, 2 След.
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
cymtu Участник - экстремал
Вступление в Клуб: 26.03.2008
|
Пн Авг 09, 2010 05:12  Непонятное со ссылкой this |
|
Полезность: Нет оценки
|
Есть код на вкладке "Проверка"
Цитата: |
if p_message = 'DEFAULT' then
-- 1
if [CASE_GRAM].[LIB].get_case(this.[CLIENT].[DECL_FIO],::[CASE_GRAM]([CODE]='Р')) is null then
pragma error('Заемщик ' || this.[CLIENT].[NAME] || ' не имеет родительной формы наименования');
end if;
if [CASE_GRAM].[LIB].get_case(this.[CLIENT].[DECL_FIO],::[CASE_GRAM]([CODE]='Д')) is null then
pragma error('Заемщик ' || this.[CLIENT].[NAME] || ' не имеет дательной формы наименования');
end if;
--2
for z in [ZALOG] where z.[PART_TO_LOAN].[PRODUCT]=this loop
if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([CODE]='Р')) is null then
pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет родительной формы наименования');
end if;
if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([CODE]='Д')) is null then
pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет дательной формы наименования');
end if;
end loop;
excel.init_xls;
end if
|
пункт №1 отрабатывает нормально, а №2 программа даже не заходит в цикл.
Приходиться проверку осуществлять так
Цитата: |
if p_message = 'DEFAULT' then
if [CASE_GRAM].[LIB].get_case(this.[CLIENT].[DECL_FIO],::[CASE_GRAM]([CODE]='Р')) is null then
pragma error('Заемщик ' || this.[CLIENT].[NAME] || ' не имеет родительной формы наименования');
end if;
if [CASE_GRAM].[LIB].get_case(this.[CLIENT].[DECL_FIO],::[CASE_GRAM]([CODE]='Д')) is null then
pragma error('Заемщик ' || this.[CLIENT].[NAME] || ' не имеет дательной формы наименования');
end if;
PR_ZALOGS(this);
excel.init_xls;
end if; |
где PR_ZALOGS(this) это процедура в локальных описаниях
Цитата: |
procedure PR_ZALOGS(cr ref [PR_CRED]) is
begin
for z in [ZALOG] where z.[PART_TO_LOAN].[PRODUCT]=cr loop
if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([CODE]='Р')) is null then
pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет родительной формы наименования');
end if;
if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([CODE]='Д')) is null then
pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет дательной формы наименования');
end if;
end loop;
end;
|
В таком виде проверка осуществляеться нормально.
Почему так?????????????????????????????????????????
Почему первый вариант не работает????????????
В обоих вариантах операция компилируется нормально, никаких ошибок не выдает. |
|
 |
ГлСП Профи
Вступление в Клуб: 20.09.2007
|
Пн Авг 09, 2010 05:42   |
|
Полезность: Нет оценки
|
Посмотри, что приходит во втором варианте. И еще посмотри в какой запрос в pl/sql транслируется For . |
|
 |
cymtu Участник - экстремал
Вступление в Клуб: 26.03.2008
|
Пн Авг 09, 2010 06:59   |
|
Полезность: Нет оценки
|
Цитата: |
procedure PR_ZALOGS(CR IN number) is
begin
--# 744,6
declare
Z number;
cursor c_obj is
select a1.id
from Z#PART_TO_LOAN a2, Z#ZALOG a1
where a1.COLLECTION_ID is NULL and a1.C_PART_TO_LOAN=a2.collection_id
and (a2.C_PRODUCT = CR);
begin
for plp$c_obj in c_obj loop
Z := plp$c_obj.id;
--# 745,3
if Z$CASE_GRAM_LIB.GET_CASE(Z#CLIENT#INTERFACE.get_coll(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'DECL_FIO'),2048150) is NULL then
--# 746,11
MESSAGE.APP_ERROR('PR_CRED.VLB_PRINT_CRED','Поручитель '||Z#CLIENT#INTERFACE.get_str(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'NAME')||' не имеет родительной формы наименования');
end if;
--# 748,3
if Z$CASE_GRAM_LIB.GET_CASE(Z#CLIENT#INTERFACE.get_coll(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'DECL_FIO'),2048151) is NULL then
--# 749,11
MESSAGE.APP_ERROR('PR_CRED.VLB_PRINT_CRED','Поручитель '||Z#CLIENT#INTERFACE.get_str(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'NAME')||' не имеет дательной формы наименования');
end if;
end loop;
end;
return;
end; |
|
|
 |
prog Эксперт
Вступление в Клуб: 03.03.2008
|
Пн Авг 09, 2010 07:07   |
|
Полезность: Нет оценки
|
По-моему, проблемную часть кода нужно поменять так:
Код: |
--2
for z in [ZALOG] all where z.[PART_TO_LOAN].[PRODUCT]=this loop
if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([ code ]='Р')) is null then
pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет родительной формы наименования');
end if;
|
|
|
 |
cymtu Участник - экстремал
Вступление в Клуб: 26.03.2008
|
Пн Авг 09, 2010 07:13   |
|
Полезность: Нет оценки
|
prog пишет: | По-моему, проблемную часть кода нужно поменять так:
Код: |
--2
for z in [ZALOG] all where z.[PART_TO_LOAN].[PRODUCT]=this loop
if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([ code ]='Р')) is null then
pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет родительной формы наименования');
end if;
|
|
не помогло |
|
 |
prog Эксперт
Вступление в Клуб: 03.03.2008
|
Пн Авг 09, 2010 08:33   |
|
Полезность: Нет оценки
|
Отлаживайте...
1) что в this
2) выбирает ли что запрос
3) выполняется ли [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([ code ]='Р')) is null
и т. д.
Элементарный кусок кода. Проблемы как обычно в какой то мелочи  |
|
 |
cymtu Участник - экстремал
Вступление в Клуб: 26.03.2008
|
Пн Авг 09, 2010 09:31   |
|
Полезность: Нет оценки
|
prog пишет: | Отлаживайте...
1) что в this
2) выбирает ли что запрос
3) выполняется ли [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([ code ]='Р')) is null
и т. д.
Элементарный кусок кода. Проблемы как обычно в какой то мелочи  |
1) в this реальная сылка на кредит debug проверял
2) также debug -ом проверял, программа даже не заходить в цикл, хотя значение this не null.
Вылаживаю саму операцию можете сами проверить. |
|
 |
vtar Эксперт
Вступление в Клуб: 20.03.2009
|
Пн Авг 09, 2010 16:30   |
|
Полезность: Нет оценки
|
а если for поменять на for ( select ? |
|
 |
markoff Участник - экстремал
Вступление в Клуб: 09.06.2009
|
Пн Авг 09, 2010 17:21   |
|
Полезность: 1
|
Неоднократно попадал в примерную ситуацию, а именно проблема была с вот таким куском кода:
Код: | for x in ::tab loop
---
end loop |
Лечилось при помощи добавления all.
Код: | for x in ::tab all loop
---
end loop |
Из документации:
Цитата: | Если опции all или collections не указываются, то выборка осуществляется только по экземплярам, не входящим ни в какие коллекции. |
|
|
 |
kit83rd Участник со стажем
Вступление в Клуб: 05.02.2010
|
Вт Авг 10, 2010 01:44  Re: Непонятное со сылкой this |
|
Полезность: Нет оценки
|
cymtu пишет: | prog пишет: |
--2
for z in [ZALOG] where z.[PART_TO_LOAN].[PRODUCT]=this loop
null;
end loop;
|
не помогло |
Посмотри какой селект получился в итоге на PL/SQL.
Скорей всего в него добавлена проверка collection_id is null.
В этом случае добавь all перед where
Код: |
for z in [ZALOG] all where z.[PART_TO_LOAN].[PRODUCT]=this loop
null;
end loop;
|
|
|
 |
cymtu Участник - экстремал
Вступление в Клуб: 26.03.2008
|
Вт Авг 10, 2010 02:21   |
|
Полезность: Нет оценки
|
markoff пишет: | Неоднократно попадал в примерную ситуацию, а именно проблема была с вот таким куском кода:
Код: | for x in ::tab loop
---
end loop |
Лечилось при помощи добавления all.
Код: | for x in ::tab all loop
---
end loop |
Из документации:
Цитата: | Если опции all или collections не указываются, то выборка осуществляется только по экземплярам, не входящим ни в какие коллекции. |
|
Код: |
for z in ::[ZALOG] all where z.[PART_TO_LOAN].[PRODUCT]=this loop
if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([CODE]='Р')) is null then
pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет родительной формы наименования');
end if;
if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([CODE]='Д')) is null then
pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет дательной формы наименования');
end if;
end loop; |
заработало после добавление :: перед таблицей и all перед where.
Но всё равно мне не понятно, почему в локальных описаниях эта задача решаеться прекрасно без всяких :: и all. |
|
 |
kit83rd Участник со стажем
Вступление в Клуб: 05.02.2010
|
Вт Авг 10, 2010 04:35   |
|
Полезность: Нет оценки
|
Я все таки советую посмотреть какой получается реальный код PL/SQL -е, после компиляции без ::
В каком классе операция? Есть ли в этом типе реквезит с именем ZALOG?
:: Указывают компилятору что выборка делается именно из класса. |
|
 |
cymtu Участник - экстремал
Вступление в Клуб: 26.03.2008
|
Вт Авг 10, 2010 04:48   |
|
Полезность: Нет оценки
|
Код: |
for z in [ZALOG] all where z.[PART_TO_LOAN].[PRODUCT]=this loop
if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([CODE]='Р')) is null then
pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет родительной формы наименования');
end if;
if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([CODE]='Д')) is null then
pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет дательной формы наименования');
end if;
end loop; |
Код: |
declare
Z number;
plp$3$1 number;
cursor c_obj is
select a1.id
from Z#PART_TO_LOAN a2, Z#ZALOG a1
where a1.COLLECTION_ID=plp$3$1 and a1.C_PART_TO_LOAN=a2.collection_id
and (a2.C_PRODUCT = THIS);
begin
plp$3$1 := plp$var$.A#ZALOG;
for plp$c_obj in c_obj loop
Z := plp$c_obj.id;
--# 12,5
if Z$CASE_GRAM_LIB.GET_CASE(Z#CLIENT#INTERFACE.get_coll(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'DECL_FIO'),2048150) is NULL then
--# 13,11
MESSAGE.APP_ERROR('PR_CRED.VLB_PRINT_CRED_1','Поручитель '||Z#CLIENT#INTERFACE.get_str(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'NAME')||' не имеет родительной формы наименования');
end if;
--# 15,5
if Z$CASE_GRAM_LIB.GET_CASE(Z#CLIENT#INTERFACE.get_coll(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'DECL_FIO'),2048151) is NULL then
--# 16,11
MESSAGE.APP_ERROR('PR_CRED.VLB_PRINT_CRED_1','Поручитель '||Z#CLIENT#INTERFACE.get_str(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'NAME')||' не имеет дательной формы наименования');
end if;
end loop;
end; |
|
|
 |
kit83rd Участник со стажем
Вступление в Клуб: 05.02.2010
|
Вт Авг 10, 2010 05:53   |
|
Полезность: 1
|
Интересно, что вот это за условие
a1.COLLECTION_ID=plp$3$1
где plp$3$1 := plp$var$.A#ZALOG;
Оно видать и портит тебе все
И есть ли оно если скомпилировать с :: перед [ZALOG]? |
|
 |
cymtu Участник - экстремал
Вступление в Клуб: 26.03.2008
|
Вт Авг 10, 2010 05:57   |
|
Полезность: Нет оценки
|
Код: |
for z in ::[ZALOG] all where z.[PART_TO_LOAN].[PRODUCT]=this loop
if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([CODE]='Р')) is null then
pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет родительной формы наименования');
end if;
if [CASE_GRAM].[LIB].get_case(z.[USER_ZALOG].[DECL_FIO],::[CASE_GRAM]([CODE]='Д')) is null then
pragma error('Поручитель ' || z.[USER_ZALOG].[NAME] || ' не имеет дательной формы наименования');
end if;
end loop;
|
Код: |
declare
Z number;
cursor c_obj is
select a1.id
from Z#PART_TO_LOAN a2, Z#ZALOG a1
where a1.C_PART_TO_LOAN=a2.collection_id
and (a2.C_PRODUCT = THIS);
begin
for plp$c_obj in c_obj loop
Z := plp$c_obj.id;
--# 12,5
if Z$CASE_GRAM_LIB.GET_CASE(Z#CLIENT#INTERFACE.get_coll(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'DECL_FIO'),2048150) is NULL then
--# 13,11
MESSAGE.APP_ERROR('PR_CRED.VLB_PRINT_CRED_1','Поручитель '||Z#CLIENT#INTERFACE.get_str(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'NAME')||' не имеет родительной формы наименования');
end if;
--# 15,5
if Z$CASE_GRAM_LIB.GET_CASE(Z#CLIENT#INTERFACE.get_coll(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'DECL_FIO'),2048151) is NULL then
--# 16,11
MESSAGE.APP_ERROR('PR_CRED.VLB_PRINT_CRED_1','Поручитель '||Z#CLIENT#INTERFACE.get_str(Z#ZALOG#INTERFACE.get_ref(Z,'USER_ZALOG'),'NAME')||' не имеет дательной формы наименования');
end if;
end loop;
end;
|
Да так и есть.  |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|