Помогите найти ошибку!

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

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

Ответить
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Помогите найти ошибку!

Сообщение Nikos »

Добрый день!
Коллеги, помогите найти ошибку - запутался в трех строках. Даже не знаю как назвать тему. Вот такая процедура:

StartNewVisual(vtNumericVisual,vfBreak,'Формирование отчета ...',0);
delete all FullGSM;
_loop PUTLST
{
_loop PUTGSM
{
if(putgsm.nrec = 4612101400378724834) Message ('start');
if tsOk = GetFirst FullGSM where ((PUTLST.NPL == FullGSM.numputlst))
{
if(putgsm.nrec = 4612101400378724834) Message('Error');
}
else
{
clearBuffer(#FullGSM);
FullGSM.numputlst := PUTLST.NPL;
insert current FullGSM;
if(putgsm.nrec = 4612101400378724834) Message ('finish');
}
}
}
StopVisual('',0);
На одной записи в таблице PUTGSM программа работает не так, как мне хотелось бы. Дело в том, что запись находится, при этом не будучи добавленной ни разу! В моем случае получаю сообщение "start", а затем "Error". Может, свежим взглядом кто увидит проблему... Или скажите, из-за чего такое возможно.

Вот вьюха:
create view mainview
var
dateFrom : date;
dateTo : date;
myOrg : comp;
as select *
from PUTLST, PUTGSM, SAVE_DRV, TOPLIVO, KATPODR, SELPODR, ItogGSM, FullGSM, TRANSP
where ((1 == PUTLST.STATPL and
dateFrom <<= PUTLST.DATPL and
dateTo >>= PUTLST.DATPL and
(myOrg = PUTLST.CORGTC) and
0 == PUTGSM.TIPINFO and
PUTLST.NREC == PUTGSM.CPUTLST and
PUTGSM.CTOPLIVO == TOPLIVO.NREC and
PUTLST.CPOL == KATPODR.NREC and
PUTLST.CPOL == SELPODR.NREC and
PUTLST.CTRANSP == TRANSP.NREC and
TRANSP.CMARKA == MARKA.NREC and
TRANSP.CKATOS == KATOS.NREC and
PUTLST.NREC == SAVE_DRV.CPUTLST));

Ну и таблица:
table struct FullGSM(gosnomer :string, //Гос. номер
marka :string, //Марка автомобиля
podr :string, //Подразделение эксплуатации
toplivon :string, //Топливо
normabaz :double, //Норма базисная
invnum :string, //Инвентарный номер
numputlst :string, //Номер путевого листа
cputlst :comp, //Уникальный код путевого листа
dateputlst :date, //Дата путевого листа
speedstart :double, //Показания спидометра при выезде
probeg :double, //Пробег автомобиля за период
speedend :double, //Показания спидометра при возвращении
voditel :string, //Водитель
timeAZSbeg :time, //Время первой заправки
timeAZSend :time, //Время последней заправки
nachost :double, //Остаток топлива в баках перед заправкой
prihod :double, //Приход ГСМ (общий)
AZS1 :double, //Тип заправки 1
AZS2 :double, //Тип заправки 2
AZS3 :double, //Тип заправки 3
AZS4 :double, //Тип заправки 4
AZS5 :double, //Тип заправки 5
AZS6 :double, //Тип заправки 6
AZS7 :double, //Тип заправки 7
AZS8 :double, //Тип заправки 8
AZS9 :double, //Тип заправки 9
AZS10 :double, //Тип заправки 10
AZS11 :double, //Тип заправки 11
AZS12 :double, //Тип заправки 12
rashod :double, //Расход ГСМ
norma :double, //Нормативный расход топлива
ostatok :double, //Остаток топлива
kontragent :string) //АЗС
with index (ind1=numputlst);
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

1. Лучше конечно искать по nrec. Кто сказал что у вас поле Putlst.npl уникально.
2. На оракле крайне не советую делать getfirst по табле из той же вьюхи что и _loop.
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Сообщение Nikos »

1. C nrec пробовал - результат тот же.
2. Платформа Pervasive, Галактика 8.10. Т.е. таблицу FullGSM нужно исключить из вьюхи? Попробовал - не помогло. Или GetFirst заменить другим оператором?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

делайте с nrec
лучше вынести тыды в отдельную вьюху или в этой наложить на нее условие и проверять наличие записей как isvalid(tnFullGsm).
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Сообщение Nikos »

Исправил вьюху:
as select *
from PUTLST, PUTGSM, SAVE_DRV, TOPLIVO, KATPODR, SELPODR, ItogGSM, TRANSP, FullGSM
where ((1 == PUTLST.STATPL and
dateFrom <<= PUTLST.DATPL and
dateTo >>= PUTLST.DATPL and
(myOrg = PUTLST.CORGTC) and
0 == PUTGSM.TIPINFO and
PUTLST.NREC == PUTGSM.CPUTLST and
PUTGSM.CTOPLIVO == TOPLIVO.NREC and
PUTLST.CPOL == KATPODR.NREC and
PUTLST.CPOL == SELPODR.NREC and
PUTLST.CTRANSP == TRANSP.NREC and
TRANSP.CMARKA == MARKA.NREC and
TRANSP.CKATOS == KATOS.NREC and
PUTLST.NREC == FullGSM.cputlst and
PUTLST.NREC == SAVE_DRV.CPUTLST));

Ну и саму функцию:
delete all from FullGSM;

_loop PUTLST
{
_loop PUTGSM
{
if(putgsm.nrec = 4612101400378724834) Message ('Start');

if isvalid(tnFullGsm)
{
if(putgsm.nrec = 4612101400378724834) Message ('Error');
}
else
{
if(putgsm.nrec = 4612101400378724834) Message('Finish');

clearBuffer(#FullGSM);
FullGSM.cputlst := PUTLST.NREC;
insert current FullGSM;
}
}
}
результат тот же. Если вообще убрать добавление новых записей в таблицу FullGSM, то работает как надо. Видимо при добавлении что-то портится.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

а запись в PUTGSM одна?
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Сообщение Nikos »

Действительно! Записей-то несколько (еще 2 пустые) - весь день промаялся :shock:! Большое спасибо - теперь все стало понятно.
Ответить