Таблица в памяти

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

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

Ответить
Savich
Постоянный гость
Сообщения: 52
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Беларусь

Таблица в памяти

Сообщение Savich »

У меня возникла проблема с Update таблицы в памяти. Необходимо подбить итоги за период по приходам МЦ на несколько складов (суммы берутся из накладных).
Версия Галактики 5.85.02
Версия Атлантис 4.35

Проблема в следующем: при первом вхождении МЦ происходит вставка записи в таблицу в памяти, при повторном вхождении МЦ программа не находит ее в таблице и опять делает Insert, а хочется Update.

В чем причина? HELP !!!!

Вот текст программы:
!
! В prj-файле первой строкой идет
! #include grmc_struct.inc
! в котором описана таблица в памяти
!
!Table struct SMC
! (mname : String[80], // Наименование МЦ
! gcode : String[10], // Код группы МЦ
! ves_n : Double,
! sum_n : Double,
! ves_d : Double,
! sum_d : Double,
! nds : Double)
!with index (M1 = mname);
!
! Таблица в памяти используется для накопления итогов по МЦ по нескольким складам
!
.linkform 'PMN_1' prototype is 'EngSklad'
.NameInList ' ------------ '
.group 'PMN'
.defo Portrait
.p 80
.c 1
.o 10
.var
kgroup, mcname : string;
kol, rprice, sumnds : double; nds_1, ves_1, sum_1 : double;
nds_0, ves_0, sum_0 : double; nds_a, ves_a, sum_a : double;
.endvar
!
.Create view MySpSopr from SpSopr(readonly)
where (( nRec_SpSopr /== SpSopr.nrec and Spsopr.cmcusl /== KatMC.nrec ));
!
.Create view mctab from SMC;
!
.begin delete all from SMC end.
.fields
CommonFormHeader
'О Т Г Р У З К А П Р О Д У К Ц И И' 'с '+begper+' по '+endper
namemat ves_1 sum_1 nds_1 sum_1+nds_1
skl ves_0 sum_0 nds_0 sum_0+nds_0
mctab.mname mctab.ves_n mctab.sum_n mctab.nds mctab.sum_n+mctab.nds
ves_a sum_a nds_a sum_a+nds_a
.endfields
 Р ^
@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
.{
───────────────────────────────────┬────────────┬───────────────┬─────────────┬───────────────
Наименование МЦ │ вес, кг │ сумма без НДС │ НДС, руб. │ сумма с НДС
───────────────────────────────────┼────────────┼───────────────┼─────────────┼───────────────
.begin ves_0 := 0; sum_0 := 0; nds_0 := 0; end.
.{
.begin ves_1 := 0; sum_1 := 0; nds_1 := 0; end.
.{
.begin
kgroup := if(MySpSopr.getfirst SpSopr != tsOK, '',
if(MySpSopr.getfirst KatMC != tsOK, '', Trim(MySpSopr.KatMC.kgroupmc)));
kol := if(MySpSopr.getfirst SpSopr != tsOK, 0, MySpSopr.SpSopr.kol);
rprice := if(MySpSopr.getfirst SpSopr != tsOK, 0, MySpSopr.SpSopr.rprice);
sumnds := if(MySpSopr.getfirst SpSopr != tsOK, 0, MySpSopr.SpSopr.sumnds);
mcname := Trim(namemat);
nds_1 := nds_1 + sumnds; sum_1 := sum_1 + rprice*kol; ves_1 := ves_1 + kolprmas;
end.
.}
.begin
ves_0 := ves_0 + ves_1; sum_0 := sum_0 + sum_1; nds_0 := nds_0 + nds_1;
!
!
if ((GetFirst SMC where SMC.mname = mcname) = tsOk)
!
!
!
! Вот тут начинаются капризы.
! Условие ((GetFirst SMC where SMC.mname = mcname) = tsOk)
! никогда не выполняется и все время происходит вставка записи в SMC
!
!
!
then Update Current SMC Set
SMC.nds := SMC.nds + sumnds, SMC.sum_n := SMC.sum_n + rprice*kol,
SMC.ves_n := SMC.ves_n + kolprmas;
else { Insert SMC; Update Current SMC Set SMC.mname := mcname, SMC.gcode := kgroup,
SMC.ves_n := kolprmas, SMC.sum_n := rprice*kol, SMC.nds := sumnds;
}
end.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@│&#&&&&&&.&&&│&'&&&&&&&&&&&&&│&'&&&&&&&&&&&│&'&&&&&&&&&&&&&
.}
 Б@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@│&#&&&&&&.&&&│&'&&&&&&&&&&&&&│&'&&&&&&&&&&&│&'&&&&&&&&&&&&& Б
─────────────────────────────────────┴────────────┴───────────────┴─────────────┴─────────────

.if DetSkl
.{ DetSklC CheckEnter
.}
.end
.}
.if engsklad01
.if DetOrg
.{ DetOrgC CheckEnter
.}
.end
.end
!
! Далее следует вывод итоговой таблицы по МЦ
!
 Р
.endform
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Таблица в памяти

Сообщение edward_K »

then Update Current SMC Set
SMC.nds := SMC.nds + sumnds, SMC.sum_n := SMC.sum_n + rprice*kol,
SMC.ves_n := SMC.ves_n + kolprmas;
else {
перепеши
then
{

} else
{

}
если без этого то ";" не нужна перед else , но компилятор видимо не так съел.
Max_Fin
На пенсии
Сообщения: 797
Зарегистрирован: 29 мар 2005, 17:49
Откуда: г. Тюмень
Контактная информация:

Re: Таблица в памяти

Сообщение Max_Fin »

и вот еще
"else { Insert SMC; Update Current SMC Set SMC.mname := mcname, SMC.gcode := kgroup,..."
insert CURRENT SMC
а то непонятно, что затем апдейтить
или переписать так
insert current SMC set
SMC.mname := mcname, SMC.gcode := kgroup,...
Жду выхода Вселенная 2.12!
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Таблица в памяти

Сообщение edward_K »

и еще
поскольку в вашем примере описаны две вьюхи(только заметил) то все обращения нужно начинать с mctab.
mctab.getfirst ...
mctab.smc.mnname
иначе компилятор путается с каким селектом работать.
Savich
Постоянный гость
Сообщения: 52
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Беларусь

Re: Таблица в памяти

Сообщение Savich »

2Edward_K
На радостях поставил then {...} else {...} Результат, к сожалению, не изменился.

2Max_Fin
insert current SMC set... не срабатывает для таблицы в памяти.

Может у меня Vip кривой?
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Таблица в памяти

Сообщение Den »

Вот последнее замечение Edward_K насчет префикса имя лог. таблицы перед разного рода модификаторами (update, insert, delete)и навигаторами (getfirst, getnext...) полностью поддерживаю..
Priest Geo
Посетитель
Сообщения: 30
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва/Минск
Контактная информация:

Re: Таблица в памяти

Сообщение Priest Geo »

У меня была похожая проблема, пока в присваивании не добавил set:

if (getfirst PrZak where ((SM02.SpCompl2.cMC == PrZak.cMC)) <> tsOk) {
...
set PrZak.limit := lim1;
set PrZak.cMC := SM02.SpCompl2.cMC;
...
insert current PrZak;
}
else {
set PrZak.limit := PrZak.limit+lim1;
update current PrZak;
}
// PrZak - своя таблица, SM02 - вьюха
Priest Geo
Посетитель
Сообщения: 30
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва/Минск
Контактная информация:

Re: Таблица в памяти

Сообщение Priest Geo »

Да, и ещё замечание.
Перед вставкой новой записи необходимо очищать предыдущую информацию о значениях таблицы в буффере, иначе в новую запись перенесутся значения предыдущей записи, т.е. в нужном месте (перед if(getfirst PrZak... ) добавьте:
ClearBuffer(#PrZak);
Ответить