CftClub.ru
Клуб специалистов ЦФТ-Банк

Вопрос опять по формированию проводок в цикле
На страницу 1, 2  След.
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеПт Май 04, 2018 16:31   Вопрос опять по формированию проводок в цикле Ответить с цитатой
Полезность: Нет оценки
doc_struct.[SUM_KSPL].[NEW#AUTO](
P_SYMBOL_KAS/*P#1*/ --Символ кассы
,to_number(P_SUMMA)/*P#2*/ --Сумма
,''/*P#IT_PRIX*/ --Признак прихода
,''/*P#TEXT*/ --Расшифровка
,''/*P#SUB_SYM*/ --Подсимвол кассы
,''/*P_OFF_SYMB*/ --Забалансовый символ
);

V_MAIN_DOC := ::[MAIN_DOCUM]%insert(doc_struct);

Кусок кода.
Ощущение такое, что не все очищаю.
Для одной проводки все нормально.
Для двух - беда.
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеПт Май 04, 2018 16:44    Ответить с цитатой
Полезность: Нет оценки
Ругается так.

Дублируется значение реквизита [Сумма документа по символам касплана] в типе [MAIN_DOCUM]
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеПт Май 04, 2018 16:47    Ответить с цитатой
Полезность: Нет оценки
Ну и весь код, если поможет.


i integer;
doc_struct [MAIN_DOCUM];
acc_fin_dt ref [AC_FIN];
acc_fin ref [AC_FIN];
V_CL_PART_CODE ref [CL_PART];
V_MAIN_DOC ref [MAIN_DOCUM];

Begin
i := 1;

while i<=P_COL loop
--Первая
doc_struct%init;
doc_struct.[DOCUMENT_NUM] := to_char(i);
doc_struct.[DATE_DOC] := sysdate;
doc_struct.[DOCUMENT_DATE] := sysdate;
doc_struct.[DOCUMENT_USER] := stdlib.UserId;
doc_struct.[SUM] := to_number(P_SUMMA);
doc_struct.[SUM_PO] := to_number(P_SUMMA);
doc_struct.[SUM_NT] := to_number(P_SUMMA);
doc_struct.[VID_DOC] := ::[NAME_PAYDOC]([CODE] = 'КАСС_ПРИХОД_ОРД');
doc_struct.[VID_OBOROTA] := ::[VID_OBOROT]([SHORT_NAME] = 'ОСНОВНЫЕ');
doc_struct.[NAZN] := 'Перечисляет '||P_CLIENT.[NAME]||' возмещение гос.пошлины за регистрацию доп.соглашения к договору № '||P_CREDIT;
doc_struct.[ACC_DT] := P_KASS.[3];

doc_struct.[BUD_REQS].[KBK_STR] := P_KBK;
doc_struct.[BUD_REQS].[OKATO_STR] := P_OKTMO;
-- doc_struct.[TYPE_MESS] := 1984043;

for (select x( x : REC)
in ::[AC_FIN] all
where x.[MAIN_V_ID] ='40911810800000000001')
loop
acc_fin := x.[rec];
exit;
end loop;

doc_struct.[PRIORITET] :='05';
doc_struct.[ACC_KT] := acc_fin;
doc_struct.[FILIAL] := this.[FILIAL];

for (
select u(u : c_code)
in ::[CL_PART] all
where u.[CODE]='0030000000'
)
loop
V_CL_PART_CODE := u.[c_code];
exit;
end loop;

doc_struct.[KL_DT].[2].[PART] := V_CL_PART_CODE;
doc_struct.[KL_DT].[1].[2] := P_KASS.[3];
doc_struct.[KL_DT].[1].[1] := P_KASS.[3].[CLIENT_V];
doc_struct.[KL_DT].[0] := 1;
doc_struct.[NUM_KS] := P_KASS;

doc_struct.[REQ_MAN].[CLIENTREF] := P_CLIENT;
doc_struct.[REQ_MAN].[NAME] := P_CLIENT.[NAME];
doc_struct.[REQ_MAN].[PASSPORT] := P_CLIENT.[DOC].[TYPE].[name];
doc_struct.[REQ_MAN].[DATE_V] := P_CLIENT.[DOC].[DATE];
doc_struct.[REQ_MAN].[SERIA] := P_CLIENT.[DOC].[SER];
doc_struct.[REQ_MAN].[NUMBER] := P_CLIENT.[DOC].[NUM];
doc_struct.[REQ_MAN].[WHO_V] := P_CLIENT.[DOC].[WHO];
doc_struct.[REQ_MAN].[DEPART_CODE] := P_CLIENT.[DOC].[DEPART_CODE];
doc_struct.[REQ_MAN].[BIRTHDAY] := P_CLIENT.[DATE_PERS];
doc_struct.[REQ_MAN].[BIRTH_PLACE] := P_CLIENT.[BORN];
doc_struct.[REQ_MAN].[REZIDENT] := true;
doc_struct.[REQ_MAN].[NO_CITIZENSHIP] := false;

doc_struct.[KL_KT].[2].[PART] := V_CL_PART_CODE;
doc_struct.[KL_KT].[1].[1] := acc_fin.[CLIENT_V];
doc_struct.[KL_KT].[1].[2] := acc_fin;
doc_struct.[KL_KT].[0] := 1;

doc_struct.[VALUTA] := ::[SYSTEM].[VARIABLES].NatCur;
doc_struct.[VALUTA_PO] := ::[SYSTEM].[VARIABLES].NatCur;

doc_struct.[HISTORY_STATE] := rtl.next_value('SEQ_ID');
doc_struct.[ARRAY_SUM_DOG] := rtl.next_value('SEQ_ID');
doc_struct.[ARRAY_DOG_ACC] := rtl.next_value('SEQ_ID');
doc_struct.[SUBDOCUMENTS] := rtl.next_value('SEQ_ID');
doc_struct.[SUBDOCUMENTS] := rtl.next_value('SEQ_ID');
doc_struct.[USER_TYPE] := rtl.next_value('SEQ_ID');
doc_struct.[LABELS] := null;
doc_struct.[TO_ZP] := rtl.next_value('SEQ_ID');
doc_struct.[FOR_SVOD] := rtl.next_value('SEQ_ID');
doc_struct.[RC_SIGNED_BY] := rtl.next_value('SEQ_ID');

doc_struct.[SUM_KSPL].[NEW#AUTO](
P_SYMBOL_KAS/*P#1*/ --Символ кассы
,to_number(P_SUMMA)/*P#2*/ --Сумма
,''/*P#IT_PRIX*/ --Признак прихода
,''/*P#TEXT*/ --Расшифровка
,''/*P#SUB_SYM*/ --Подсимвол кассы
,''/*P_OFF_SYMB*/ --Забалансовый символ
);

V_MAIN_DOC := ::[MAIN_DOCUM]%insert(doc_struct);

--Вторая
doc_struct%init;
doc_struct.[DOCUMENT_NUM] := to_char(i);
doc_struct.[DATE_DOC] := sysdate;
doc_struct.[DOCUMENT_DATE] := sysdate;
doc_struct.[DOCUMENT_USER] := stdlib.UserId;
doc_struct.[SUM] := to_number(P_SUMMA);
doc_struct.[SUM_PO] := to_number(P_SUMMA);
doc_struct.[SUM_NT] := to_number(P_SUMMA);
doc_struct.[VID_DOC] := ::[NAME_PAYDOC]([CODE] = 'БЕЗН_БАНК_ОРД');
doc_struct.[VID_OBOROTA] := ::[VID_OBOROT]([SHORT_NAME] = 'ОСНОВНЫЕ');
doc_struct.[NAZN] := 'Перечисляет '||P_CLIENT.[NAME]||' возмещение гос.пошлины за регистрацию доп.соглашения к договору № '||P_CREDIT;

doc_struct.[BUD_REQS].[KBK_STR] := P_KBK;
doc_struct.[BUD_REQS].[OKATO_STR] := P_OKTMO;
-- doc_struct.[TYPE_MESS] := 1984043;

for (select x( x : REC)
in ::[AC_FIN] all
where x.[MAIN_V_ID] ='40911810800000000001')
loop
acc_fin_dt := x.[rec];
exit;
end loop;

doc_struct.[ACC_DT] := acc_fin_dt;

for (select x( x : REC)
in ::[AC_FIN] all
where x.[MAIN_V_ID] ='60312810000000000671')
loop
acc_fin := x.[rec];
exit;
end loop;

doc_struct.[PRIORITET] :='05';
doc_struct.[ACC_KT] := acc_fin;
doc_struct.[FILIAL] := this.[FILIAL];

for (
select u(u : c_code)
in ::[CL_PART] all
where u.[CODE]='0030000000'
)
loop
V_CL_PART_CODE := u.[c_code];
exit;
end loop;

doc_struct.[KL_DT].[2].[PART] := V_CL_PART_CODE;
doc_struct.[KL_DT].[1].[1] := acc_fin_dt.[CLIENT_V];
doc_struct.[KL_DT].[1].[2] := acc_fin_dt;
doc_struct.[KL_DT].[0] := 1;

doc_struct.[KL_KT].[2].[PART] := V_CL_PART_CODE;
doc_struct.[KL_KT].[1].[1] := acc_fin.[CLIENT_V];
doc_struct.[KL_KT].[1].[2] := acc_fin;
doc_struct.[KL_KT].[0] := 1;

doc_struct.[VALUTA] := ::[SYSTEM].[VARIABLES].NatCur;
doc_struct.[VALUTA_PO] := ::[SYSTEM].[VARIABLES].NatCur;

doc_struct.[HISTORY_STATE] := rtl.next_value('SEQ_ID');
doc_struct.[ARRAY_SUM_DOG] := rtl.next_value('SEQ_ID');
doc_struct.[ARRAY_DOG_ACC] := rtl.next_value('SEQ_ID');
doc_struct.[SUBDOCUMENTS] := rtl.next_value('SEQ_ID');
doc_struct.[SUBDOCUMENTS] := rtl.next_value('SEQ_ID');
doc_struct.[USER_TYPE] := rtl.next_value('SEQ_ID');
doc_struct.[LABELS] := null;
doc_struct.[TO_ZP] := rtl.next_value('SEQ_ID');
doc_struct.[FOR_SVOD] := rtl.next_value('SEQ_ID');
doc_struct.[RC_SIGNED_BY] := rtl.next_value('SEQ_ID');
doc_struct.[SUM_KSPL] := rtl.next_value('SEQ_ID');

V_MAIN_DOC := ::[MAIN_DOCUM]%insert(doc_struct);

i := i+1;

end loop;

stdio.put_line_buf('Загрузка завершена');
end;
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеПт Май 04, 2018 17:01    Ответить с цитатой
Полезность: Нет оценки
doc_struct%init;

все init вынести перед циклом

в цикле

doc_struct := rtl.next_value('SEQ_ID');

бла бла бла
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеПт Май 04, 2018 17:07    Ответить с цитатой
Полезность: Нет оценки
vtar пишет:
doc_struct%init;

все init вынести перед циклом

в цикле

doc_struct := rtl.next_value('SEQ_ID');

бла бла бла


не похоже тут вот в чом проблема

так не надо делать

doc_struct.[SUM_KSPL].[NEW#AUTO](


надо так

после вставки записи

V_MAIN_DOC := ::[MAIN_DOCUM]%insert(doc_struct);

V_MAIN_DOC.[SUM_KSPL].[NEW#AUTO](

sum_kspl или как его - сам посмотришь мне щас некогда
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеПт Май 04, 2018 17:16   Re: Вопрос опять по формированию проводок в цикле Ответить с цитатой
Полезность: Нет оценки
mmm_kazan пишет:
doc_struct.[SUM_KSPL].[NEW#AUTO](
P_SYMBOL_KAS/*P#1*/ --Символ кассы
,to_number(P_SUMMA)/*P#2*/ --Сумма
,''/*P#IT_PRIX*/ --Признак прихода
,''/*P#TEXT*/ --Расшифровка
,''/*P#SUB_SYM*/ --Подсимвол кассы
,''/*P_OFF_SYMB*/ --Забалансовый символ
);

V_MAIN_DOC := ::[MAIN_DOCUM]%insert(doc_struct);

Кусок кода.
Ощущение такое, что не все очищаю.
Для одной проводки все нормально.
Для двух - беда.


На форуме есть кнопка Code

Код:
doc_struct.[SUM_KSPL].[NEW#AUTO](
         P_SYMBOL_KAS/*P#1*/      --Символ кассы
         ,to_number(P_SUMMA)/*P#2*/      --Сумма
         ,''/*P#IT_PRIX*/      --Признак прихода
         ,''/*P#TEXT*/      --Расшифровка
         ,''/*P#SUB_SYM*/      --Подсимвол кассы
         ,''/*P_OFF_SYMB*/      --Забалансовый символ
      );

      V_MAIN_DOC := ::[MAIN_DOCUM]%insert(doc_struct);

vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеПт Май 04, 2018 17:21   Re: Вопрос опять по формированию проводок в цикле Ответить с цитатой
Полезность: Нет оценки
Volod пишет:
На форуме есть кнопка Code


кстати да, годный баттон

жмеш и получаеш правильный, нужный, рабочий промышленный код !
RustamR
Участник


Вступление в Клуб: 26.04.2018
СообщениеПн Май 07, 2018 01:53    Ответить с цитатой
Полезность: Нет оценки
Чтобы наверняка я бы перед каждым doc_struct%init
делал бы doc_struc:=empty_doc_struc;

По СК vtar дело говорит.

Ну и по таким кускам

Код:

for (select x( x : REC)
in ::[AC_FIN] all
where x.[MAIN_V_ID] ='40911810800000000001')

можно вытянуть закрытый счет. Я б добавил order by x desc или добавил анализ на дату открытия/закрытия.
Alkov
Профи


Вступление в Клуб: 23.09.2010
СообщениеПн Май 07, 2018 06:01    Ответить с цитатой
Полезность: 2
mmm_kazan пишет:
Ну и весь код, если поможет.
doc_struct%init;
end;


Может doc_struct%init(true,true); ?

т.е. у массива "Сумма документа по символам касплан" id тот же остался что и у предыдущего дока.
можно ещё doc_struct.[SUM_KSPL] := rtl.next_value('SEQ_ID');


Последний раз редактировалось: Alkov (Вт Май 08, 2018 02:11), всего редактировалось 1 раз
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеПн Май 07, 2018 08:41    Ответить с цитатой
Полезность: Нет оценки
Спасибо, помогло кстати.
Alkov
Профи


Вступление в Клуб: 23.09.2010
СообщениеВт Май 08, 2018 02:09    Ответить с цитатой
Полезность: 1
mmm_kazan пишет:
Спасибо, помогло кстати.


тогда этот блок можно выкинуть Smile

Код:
doc_struct.[HISTORY_STATE] := rtl.next_value('SEQ_ID');
doc_struct.[ARRAY_SUM_DOG] := rtl.next_value('SEQ_ID');
doc_struct.[ARRAY_DOG_ACC] := rtl.next_value('SEQ_ID');
doc_struct.[SUBDOCUMENTS] := rtl.next_value('SEQ_ID');
doc_struct.[SUBDOCUMENTS] := rtl.next_value('SEQ_ID');
doc_struct.[USER_TYPE] := rtl.next_value('SEQ_ID');
doc_struct.[TO_ZP] := rtl.next_value('SEQ_ID');
doc_struct.[FOR_SVOD] := rtl.next_value('SEQ_ID');
doc_struct.[RC_SIGNED_BY] := rtl.next_value('SEQ_ID');
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеПн Май 14, 2018 10:49    Ответить с цитатой
Полезность: Нет оценки
Здравствуйте

Вот еще с чем столкнулся

В операции делаю проводки типа

20202 - 40911
40911 - 60312

В первой есть плательщик - заполняю там его реквизиты
Во второй не вычищается

Делаю так:

doc_struct [MAIN_DOCUM];
--Первая
doc_struct%init(true,true);
...
--Вторая
doc_struct%init(true,true);
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеПн Май 14, 2018 11:14    Ответить с цитатой
Полезность: Нет оценки
Все, разобрался. )
svn
Профи


Вступление в Клуб: 04.02.2008
СообщениеВт Май 15, 2018 00:06    Ответить с цитатой
Полезность: 1
не пробовали на БО все перевести а не руками каждую проводку собирать?
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеВт Май 15, 2018 08:32    Ответить с цитатой
Полезность: Нет оценки
Здравствуйте.
Да что-то нашел вариант вручную проводки делать.
Вроде получилось.
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
На страницу 1, 2  След.
Страница 1 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru