Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
w00per Профи
Вступление в Клуб: 17.10.2007
|
Вт Фев 17, 2009 16:24  «Во славу» ЦФТшного кода |
|
|
Код: |
jurist := false;
....
-- проверим является ли v_client Юристом, или Нотариусом
begin
select co(1) in v_client->(::[CL_CORP])[CODES_OKONH]
where co.[CODE ] = '97820' and rownum < 2
into I;
select okv(1) in v_client->(::[CL_CORP])[OKVEDS]
where okv.[CODE ] = '74.11' and rownum < 2
into I;
jurist := true;
exception
when NO_DATA_FOUND then null;
end;
|
Внимание вопрос: "Что произойдет если у клиента не заполнен массив ОКОНХ, но заполнен ОКВЭД?".
Совершенно верно: "Исключение 'NO_DATA_FOUND' в первом запросе и кривое значение флага 'jurist'!!!". _________________ I Lie About Everything. |
|
 |
zinovjeva_n Участник - экстремал
Вступление в Клуб: 15.10.2008
|
Чт Фев 19, 2009 17:19   |
|
|
Меня тут порадовало другое немножко. Надо было по условиям заказчика создать в справочнике текстовое поле размером в 32000 символов. Создали средствами ЦФТ - на тестировании все падает. Причина проста - Оракл предусматривает величину типа varchar до 4000 байт и ЦФТ великолепно вместо запрошенных 32000 обрезает их до 4000. Пришлось скриптами напрямую на базе править тип поля на long в таблице. _________________ Coding for food |
|
 |
dnk_dz Эксперт
Вступление в Клуб: 19.09.2007
|
Пт Фев 20, 2009 06:53   |
|
|
zinovjeva_n пишет: | Меня тут порадовало другое немножко. Надо было по условиям заказчика создать в справочнике текстовое поле размером в 32000 символов. Создали средствами ЦФТ - на тестировании все падает. Причина проста - Оракл предусматривает величину типа varchar до 4000 байт и ЦФТ великолепно вместо запрошенных 32000 обрезает их до 4000. Пришлось скриптами напрямую на базе править тип поля на long в таблице. |
А зачем напрямую в БД правили? ИБСО прекрасно поддерживает типы LONG, RAW, LONG RAW, CLOB, BLOB. ИМХО, не кошерно менять модель мимо Администратора словаря...
А текстовые поля размером 32000 используются только в коде операций. |
|
 |
timochev Эксперт
Вступление в Клуб: 02.07.2007
|
Чт Мар 03, 2011 18:35   |
|
|
Вывожу в Excel реализации ф.135 на разные даты и вижу все время в шапке отчета "по состоянию на 03 марта".
Оставил в коде строки, где используется dDate:
Код: | Procedure WriteHeader(rRP ref [REPS_PARAMS] ) is
...
dDate Date;
Begin
...
If dDate is null Then
dDate := ::[SYSTEM].OP_DATE;
End If;
debug_pipe( 'Дата в заголовке: ' || to_char(dDate, 'dd/mm/yyyy'), 2 );
vMonth := [REPS]::[SLIB].Date_Str( dDate, False);
Put( 10, 11, to_char(dDate, 'dd') );
Put( 10, 13, vMonth );
Put( 10, 17, to_char(dDate, 'yyyy') );
...
end; |
версия 10.5.21 |
|
 |
dbmaslov Профи
Вступление в Клуб: 11.07.2007
|
Сб Мар 05, 2011 15:04   |
|
|
В 10.6.15 ничего не изменилось. Но отдел отчетности похоже не беспокоит данный вопрос, во всяком случае молчат. |
|
 |
timochev Эксперт
Вступление в Клуб: 02.07.2007
|
Сб Мар 05, 2011 16:00   |
|
|
dbmaslov пишет: | В 10.6.15 ничего не изменилось. Но отдел отчетности похоже не беспокоит данный вопрос, во всяком случае молчат. | Мне написали, что работы планируется завершить 29 марта  |
|
 |
dbmaslov Профи
Вступление в Клуб: 11.07.2007
|
Чт Мар 10, 2011 16:12   |
|
|
PS. Я имел ввиду отдел отчетности нашего банка, в ЦФТ не сообщал. |
|
 |
alexiy Профи
Вступление в Клуб: 29.06.2007
|
Вт Сен 23, 2014 15:16  ::[HOOK].[RC_GET_DOG_DPP_2] |
|
|
код, загадочный донельзя. смотрим на 2-ю и 7-ю строки:
Код: | if hook_bank_flag then
hook_bank_flag := true;
if ::[DOCUM_RC].[CACHE].cache_is_doc(P_DOC) then
declare
d date;
begin
P_DOC := nvl(P_DOC, null); -- BS00112959 - не удалять!
::[DOCUM_RC].[CACHE].cache_enter_critical_section;
d := [RC_GET_DOG_DPP_1](P_AGR, P_DOC, P_ADD);
::[DOCUM_RC].[CACHE].cache_exit_critical_section;
return d;
end;
else
return [RC_GET_DOG_DPP_1](P_AGR, P_DOC, P_ADD);
end if;
end if;
|
вопрос в студию: в чем смысл этих строк? _________________ two bee or not two bee |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Ср Сен 24, 2014 05:12  Re: ::[HOOK].[RC_GET_DOG_DPP_2] |
|
|
alexiy пишет: | код, загадочный донельзя. смотрим на 2-ю и 7-ю строки:
Код: | if hook_bank_flag then
hook_bank_flag := true;
if ::[DOCUM_RC].[CACHE].cache_is_doc(P_DOC) then
declare
d date;
begin
P_DOC := nvl(P_DOC, null); -- BS00112959 - не удалять!
::[DOCUM_RC].[CACHE].cache_enter_critical_section;
d := [RC_GET_DOG_DPP_1](P_AGR, P_DOC, P_ADD);
::[DOCUM_RC].[CACHE].cache_exit_critical_section;
return d;
end;
else
return [RC_GET_DOG_DPP_1](P_AGR, P_DOC, P_ADD);
end if;
end if;
|
вопрос в студию: в чем смысл этих строк? |
Поржал. До слёз!
Слушайте, скиньте название операций и ТБП? Лучше короткие.
Я тут замучу тему типа "Ляпы в нашем городке". Или "Нарочно не придумаешь".
Название темы тоже можете посоветовать
Пусть страна знает своих героев! |
|
 |
Amper Профи
Вступление в Клуб: 29.10.2010
|
Ср Сен 24, 2014 06:14  Re: ::[HOOK].[RC_GET_DOG_DPP_2] |
|
|
Random пишет: | alexiy пишет: | код, загадочный донельзя. смотрим на 2-ю и 7-ю строки:
Код: | if hook_bank_flag then
hook_bank_flag := true;
if ::[DOCUM_RC].[CACHE].cache_is_doc(P_DOC) then
declare
d date;
begin
P_DOC := nvl(P_DOC, null); -- BS00112959 - не удалять!
::[DOCUM_RC].[CACHE].cache_enter_critical_section;
d := [RC_GET_DOG_DPP_1](P_AGR, P_DOC, P_ADD);
::[DOCUM_RC].[CACHE].cache_exit_critical_section;
return d;
end;
else
return [RC_GET_DOG_DPP_1](P_AGR, P_DOC, P_ADD);
end if;
end if;
|
вопрос в студию: в чем смысл этих строк? |
Поржал. До слёз!
Слушайте, скиньте название операций и ТБП? Лучше короткие.
Я тут замучу тему типа "Ляпы в нашем городке". Или "Нарочно не придумаешь".
Название темы тоже можете посоветовать
Пусть страна знает своих героев! |
Цитата: | rem Устранено сбрасывание параметра вследствие обнуления глобальной переменной.
METH HOOK RC_GET_DOG_DPP_2 |
Более того, в этой заявке добавлена ровно одна эта строка. У меня есть предположение, что это особый костыль, который на той версии ядра (это заявка 2009 года) компилировался во что-то отличное от того, во что компилируется сейчас. Возможно, что целью было не столько использовать nvl, сколько "тронуть" переменную так, чтобы компилятор не вырезал код как бесполезный. Может быть тогда она действительно имела какой-то смысл, но я долго рассматривал код и так и не смог понять, что именно имелось в виду. |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Ср Сен 24, 2014 10:31  Re: ::[HOOK].[RC_GET_DOG_DPP_2] |
|
|
Amper пишет: | alexiy пишет: | Код: | P_DOC := nvl(P_DOC, null); -- BS00112959 - не удалять! |
|
Цитата: | rem Устранено сбрасывание параметра вследствие обнуления глобальной переменной.
METH HOOK RC_GET_DOG_DPP_2 |
Более того, в этой заявке добавлена ровно одна эта строка. У меня есть предположение, что это особый костыль, который на той версии ядра (это заявка 2009 года) компилировался во что-то отличное от того, во что компилируется сейчас. Возможно, что целью было не столько использовать nvl, сколько "тронуть" переменную так, чтобы компилятор не вырезал код как бесполезный. Может быть тогда она действительно имела какой-то смысл, но я долго рассматривал код и так и не смог понять, что именно имелось в виду. |
Согласен. Тем более, что я тоже использую функции +0 и ||'' в случае если мне нужно, чтобы оптимизатор не использовал индекс по какому-то реквизиту.
При таком использовании входящего in-параметра создаётся локальная переменная-копия этого параметра, которая по всему телу используется вместо этого параметра.
Но ведь параметр-то ведь IN.
Будь он IN-OUT, и такое присваивание не создало бы локальную переменную.
Если же что-то обналливалось внутри вызываемых функций (если у них к тому же IN-OUT-параметры), то во-первых, в случае in-out параметра создалась бы точно такая же локальная копия, а во-вторых, какая разница, что использовать - параметр или переменную, если действия над тем и над другим выполняются аналогичные?
Согласно заявке, проблемы были из-за кэширования. Подозреваю, что в 2009 году тут действительно формировался несколько другой код, чем сейчас.
В общем, к сожалению, здесь тайна покрыта мраком.
Было бы интересно и познавательно попробовать потестировать эту операцию лично в том далёком году... |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|