Проблема с использованием table struсt в Link-формах

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Проблема с использованием table struсt в Link-формах

Сообщение Vik »

У меня такой вопрос. Пытаюсь использовать таблицу в памяти в линк-форме (интерактивный отчет). Описал ее в проекте, как было написано в какой-то теме на форуме:

table Struct tmpKredit
(
TKNrec : comp , // Nrec записи
TKNomer : String, // Номер кредитного договора
TKDate : Date, // Дата создания кр. договора
TKNss : String, // Номер ссудного счета
TKPrgod : Double, // Процент годовых
TKOspol : Double, // Основная сумма (начисление)
TKPrpol : Double, // Проценты (начисление)
TKOspg : Double, // Основная сумма (погашение)
TKPrpg : Double // Проценты (погашение)
)
with index
(
Index1 = TKNrec,
Index2 = TKNomer
)
;

END

#MAKE '*.vip'
#MAKE '*.frm'

Описал интерфейс для инициализации таблицы (в файле .vip) :

Interface iniTable 'Table Struct' AlwaysReturn ;
create view
Var Action : word ;
as select *
from
tmpKredit
;
Parameters Action ;
HandleEvent
cmInit : {
case Action of
1 : {
DELETE All From tmpKredit ;
mtChangeRefCount( # tmpKredit , 1 );
}
2 : {
DELETE All From tmpKredit ;
mtChangeRefCount( # tmpKredit , -1 );
}
end;
Abort;
}
End;
END.

Далее использую ее в форме, привожу основные моменты:

.LinkForm 'TREEAN_01_NDE_VIK31122' Prototype is 'TreeAn'
.NameInList 'Кредиты_проба'
.DEFO LANDSCAPE
.var
pps:Boolean
var_tidK, var_tip : Word
tmpNrec: Comp
n: integer
Ospol,Prpol,Ospg,Prpg : Double
var_nodoc : String
var_datvip : Date
var_prgod : Double
var_schet1 : String
.endvar

.Create
view KrTb
as
select veksl.nodoc,veksl.datvip,veksl.prgod,
grafkred.tip, plpor.nodok, plpor.tidk, katbank.schet1, plpor.cbankpol
from veksl,grafkred,plpor,katbank

where ((
grafkred.cveksl /== veksl.nrec
and
vekslop.cgraf /== grafkred.nrec
and
vekslop.cbasefin /== basefin.nrec
and
basefin.CPLPOR /== plpor.nrec
and
plpor.cbankplat /== katbank.nrec
))
and
veksl.tidk = 86
and
plpor.nodok = DocNumber

;

// описание других вьюх

.fields
// описание полей
.endfields

// стандартное описание шапки
.begin
RunInterface('iniTable',1);
end.

.{CheckEnter TREEAN_GROUPHEADER
^^
.}

.begin
pps := false;
n:=0;
end.

.{CheckEnter TREEAN_DATA // стандартный цикл для вывода проводок

.{?internal; KrTb.getfirst = tsOK
.begin
var_tidK := KrTb.plpor.tidk ;
var_nodoc := KrTb.veksl.nodoc ;
var_tip := KrTb.grafkred.tip;
var_nodoc := KrTb.veksl.nodoc;
var_datvip := KrTb.veksl.datvip;
var_prgod := KrTb.veksl.prgod;
var_schet1 := KrTb.katbank.schet1;
pps :=true ;
end.
.}

.begin
if pps then
{
If (GetFirst tmpKredit where ((var_nodoc == tmpKredit.TKNomer))) <> tsOk then // такого кредитного договора в таблице нет
{
// действия с полями таблицы
}
else // в таблице найдена запись для текущего кредитного договора, изменяем в ней нужные поля
{
// действия с полями таблицы
}
}
end.
.}
.{CheckEnter TREEAN_GROUPFOOTER
.}
.}
.{table 'tmpTbKr'
нрек ^
номер документ ^
дата выписки ^
номер сс ^
процент годовых ^
Общая сумма(пол) ^
проценты (начис) ^
Общая сумма(пг) ^
проценты (пг) ^

.}
.begin
RunInterface('iniTable',2);
end.
.endform

И возникла проблема: без условия If (GetFirst tmpKredit where ((var_nodoc == tmpKredit.TKNomer)))<>TsOk, то есть, если закоментировать весь блок begin-end, который его содержит, цикл .{?internal; KrTb.getfirst = tsOK ... } отрабатывает как положено. Вход в него производится когда надо и всем переменным присваиваются нужные значения. С условием же, в цикл даже войти не получается. При этом не важно, что в теле этого условия. Цикл вообще не отрабатывает, переменная pss соответственно всегда false и условие не срабатывает. Что я не правильно делаю?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

1. логика слабо прослеживается, зачем фейс вызывать, зачем такие плохие не индексные условия во view и т.п.
2. никогда не обращайтесь к табле без указания имени вьюхи - тем более что у вас их несколько. Здесь похоже ваша времянка запихнулась в KrTb - из-за этого и троблы.
3. для того чтобы очистить таблу прямо во форме напишите строку из фейса(с указанием вьюхи) перед первым циклом.
4.KrTb.getfirst можно сделать и в програмном блоке - зачем тут internal.
5. вердикт - учиться учиться и еще раз учиться в частности на этом форуме. Проще надо быть и все будет работать как часы.
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vik »

Хм.. Я только начал этим заниматься, поэтому мне были необходимы советы, но не такие: 'проще надо быть' - так не научишься..
1) Фейс вызывал только потому, что именно на этом форуме так посоветовали. А вот про плохие неиндексные условия можно было бы и поподробнее. Я с этой вьюхой промучался много времени, прежде чем все заработало так, как надо.
2) проверю, спасибо за совет
3) делал - не помогло (то есть без вызова фейса я уже пробовал)
4) в програмном блоке все и было сделано, в internal поместил уже потом, когда уже не знал, что еще предпринять (изначально переменных вообще не было)
5) это и так ясно, думал форумы для того и существуют, чтобы помогать в этом, а не напоминать об этом каждый раз..
Ответить