Не работает update

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

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

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

Не работает update

Сообщение Nikos »

Добрый день. Решил посчитать количество материала на складе. Читаю таблицу saldomc и складываю в ResultSaldo итоги. Добавляются записи замечательно, а вот update не работает. Ошибок не выдает, но вместо того, чтоб суммировать количество, он его обнуляет. Может, я что-то не так делаю, или чего не заметил? Уже часа два бьюсь, кажется все перепробовал – ничего не получается. Подскажите, кто знает в чем причина.

if tsOk = getfirst ResultSaldo where ((saldomc.cpodr == ResultSaldo.Store_ID and KATMC.BARKOD == ResultSaldo.ProductNum))
{
ResultSaldo.CountDoc := ResultSaldo.CountDoc + saldomc.kol;
Update current ResultSaldo;
}
else
{
ClearBuffer(#ResultSaldo);
ResultSaldo.Store_ID := saldomc.cpodr;
ResultSaldo.ProductNum := KATMC.BARKOD;
ResultSaldo.ProductNam := KATMC.NAME;
ResultSaldo.UnitID := KATED.NREC;
ResultSaldo.UnitName := KATED.NAME;
ResultSaldo.CountDoc := saldomc.kol;
ResultSaldo.PZS_ID := '';
insert current ResultSaldo;
}

Вот описание таблицы:
table struct ResultSaldo(
Store_ID : comp,
ProductNum : string,
ProductNam : string,
UnitID : comp,
UnitName : string,
CountDoc : double,
PZS_ID : string)
with index (sald01=Store_ID+ProductNum);
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

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

Сообщение Nikos »

#ifndef _EXPSALD_VIP
#define _EXPSALD_VIP
#include expsald.vih

Interface IExpSald;

table struct ResultSaldo(
Store_ID : comp, //Структурное подразделение (склад)
ProductNum : string, //номенклатурный номер
ProductNam : string, //Наименование товара, сорт, размер, марка
UnitID : comp, //Единица измерения (код)
UnitName : string, //Единица измерения (наименование)
CountDoc : double, //Количество (по документу)
PZS_ID : string) //Номер ПЗС
with index (sald01=Store_ID+ProductNum);

create view MyView
var
DateFrom : date;
DateTo : date;
hDBFh : longInt;
typenakl : word;
as select *
from saldofnd,
saldomc,
katpodr,
katmc,
kated
where ((
3 == katpodr.CFUNC and
0 == saldofnd.sp and
katpodr.nrec /== saldofnd.CPODR and
saldofnd.cmc == katmc.nrec and
katmc.ced == kated.nrec
));

procedure FillResultTable;
{
_loop katpodr
{
_loop saldofnd
{
if tsOk = getlast saldomc where ((0 == saldomc.sp and
saldofnd.cmc == saldomc.cmc and
saldofnd.cpodr == saldomc.cpodr and
saldofnd.cmol == saldomc.cmol and
saldofnd.cparty == saldomc.cparty))
and saldomc.kol > 0 ordered by index SALDOMC04
{
if tsOk = getfirst ResultSaldo where ((katpodr.nrec == ResultSaldo.Store_ID and KATMC.BARKOD == ResultSaldo.ProductNum))
{
ResultSaldo.CountDoc := ResultSaldo.CountDoc + saldomc.kol;
Update current ResultSaldo;
}
else
{
ClearBuffer(#ResultSaldo);
ResultSaldo.Store_ID := katpodr.nrec; //Структурное подразделение (склад)
ResultSaldo.ProductNum := KATMC.BARKOD; //номенклатурный номер
ResultSaldo.ProductNam := KATMC.NAME; //Наименование товара, сорт, размер, марка
ResultSaldo.UnitID := KATED.NREC; //Единица измерения (код)
ResultSaldo.UnitName := KATED.NAME; //Единица измерения (наименование)
ResultSaldo.CountDoc := saldomc.kol; //Количество (по документу)
ResultSaldo.PZS_ID := ''; //Номер ПЗС
insert current ResultSaldo;
}
}
}
}
}

procedure CreateDbfFile;
{
var filename : string;
filename := 'C:\CUP\' + DateToStr(DateTo,'YYMMDD') + '-TOM-O.dbf';
hDBFh:=DBFOpen(filename, stCreate);
DBFAddField(hDBFh, 'Store_ID', dbChar, 20, 0); //Структурное подразделение (склад)
DBFAddField(hDBFh, 'ProductNum', dbChar, 50, 0); //номенклатурный номер
DBFAddField(hDBFh, 'ProductNam', dbChar, 100, 0); //Наименование товара, сорт, размер, марка
DBFAddField(hDBFh, 'UnitID', dbChar, 20, 0); //Единица измерения (код)
DBFAddField(hDBFh, 'UnitName', dbChar, 50, 0); //Единица измерения (наименование)
DBFAddField(hDBFh, 'CountDoc', DbNum, 15, 5); //Количество (по документу)
DBFAddField(hDBFh, 'PZS_ID', dbChar, 20, 0); //Код ПЗС
}

procedure FillDdfFile;
{
_loop ResultSaldo
{
DBFPutFieldValue(hDBFh, 'Store_ID', String(ResultSaldo.Store_ID)); //Структурное подразделение (склад)
DBFPutFieldValue(hDBFh, 'ProductNum', ResultSaldo.ProductNum); //номенклатурный номер
DBFPutFieldValue(hDBFh, 'ProductNam', ResultSaldo.ProductNam); //Наименование товара, сорт, размер, марка
DBFPutFieldValue(hDBFh, 'UnitID', String(ResultSaldo.UnitID)); //Единица измерения (код)
DBFPutFieldValue(hDBFh, 'UnitName', ResultSaldo.UnitName); //Единица измерения (наименование)
DBFPutFieldValue(hDBFh, 'CountDoc', DoubleToStr(ResultSaldo.CountDoc,'7.88888')); //Количество (по документу)
DBFPutFieldValue(hDBFh, 'PZS_ID', ResultSaldo.PZS_ID); //Код ПЗС

DBFInsertRecord(hDBFh);
}
DBFClose(hDBFh);
}

procedure RunRep;
{
DateFrom := Date(1,1,2007);
DateTo := Cur_Date;

delete all ResultSaldo;

FillResultTable;
CreateDbfFile;
FillDdfFile;
}

handleEvent
cmInit :
{
RunRep;
CloseInterface(cmDefault);
}
end;

end.
#end //_EXPSALD_VIP
Semi-bit
Постоянный обитатель
Сообщения: 123
Зарегистрирован: 01 фев 2007, 12:45
Откуда: Магнитогорск
Контактная информация:

Сообщение Semi-bit »

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

Сообщение Nikos »

Исправил следующим образом:
create view MyView
var
DateFrom : date;
DateTo : date;
hDBFh : longInt;
as select *
from saldofnd,
saldomc,
katpodr,
katmc,
kated,
ResultSaldo
where ((
3 == katpodr.CFUNC and
0 == saldofnd.sp and
katpodr.nrec /== saldofnd.CPODR and
saldofnd.cmc == katmc.nrec and
katmc.ced == kated.nrec and
katmc.barkod == ResultSaldo.ProductNum
));
Тогда заполнение изменилось так:
if IsValid(#ResultSaldo)
{
ResultSaldo.CountDoc := ResultSaldo.CountDoc + saldomc.kol;
Update current ResultSaldo;
}
else
{
ClearBuffer(#ResultSaldo);
ResultSaldo.Store_ID := katpodr.nrec; //Структурное подразделение (склад)
ResultSaldo.ProductNum := KATMC.BARKOD; //номенклатурный номер
ResultSaldo.ProductNam := KATMC.NAME; //Наименование товара, сорт, размер, марка
ResultSaldo.UnitID := KATED.NREC; //Единица измерения (код)
ResultSaldo.UnitName := KATED.NAME; //Единица измерения (наименование)
ResultSaldo.CountDoc := saldomc.kol; //Количество (по документу)
ResultSaldo.PZS_ID := ''; //Номер ПЗС
insert current ResultSaldo;
}
Но теперь только одна запись попадает в выгрузку, и не понятно, зачем временную таблицу помещать в MainView
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Сообщение Nikos »

По-прежнему не работает, но появилась доп. информация. Если после заполнения пишу
_loop ResultSaldo
update current ResultSaldo set ResultSaldo.CountDoc := 999;
, то обнуляются все позиции CountDoc, если же пишу
_loop ResultSaldo
update current ResultSaldo set ResultSaldo.UnitName := '999';
, то все отрабатывает нормально (как я и ожидаю).
Получается, что проблемы с полем типа double?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

в процедуре
procedure FillDdfFile;
по второму варианту сделайте
Resetbounds(#ResultSaldo)
в конце
setbounds(#ResultSaldo).
getfirst в пределах loop может вообще сломать выборку( на Oracle оссобенно), поэтому либо цикл на getfirst - getnext ( сие медленее но надежней) либо вообще никаких getfirst - поэтому второй вариант правильней.
попробуйте также CountDoc заменить на KolDoc - возможно вы с какой то функцией пересеклись.
ну а трассировка или logstrtofile позволят вам локализовать троблу точно.
В Mainview обязательно. В 810 компилятор это сделает сам и будет крыть матом за неакуратное написание.
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Сообщение Nikos »

Спасибо всем, кто разбирался в проблеме. Ошибка оказалась до слез глупой. В строке
DBFPutFieldValue(hDBFh, 'CountDoc', DoubleToStr(ResultSaldo.CountDoc,'7.88888'));
не правильно указан формат. Почему-то если значение не помещается в формат, то оно обнуляется. Таким образом, все, что было больше 10, в DBF загружалось как 0. А с update - просто совпадение (каждое значение по отдельности меньше 10, а сумма больше), потому так долго и не мог разобраться. Что касается добавления временной таблицы в Mainview, то я оставил как есть, мне так понятнее, причем компилятор не ругается (у нас 810).
Ответить