if (v1.Getfirst katmc =tsok)
{
do
{
if (Getfirst sklorder where ((katsopr.nrec == sklorder.csopr /*and 1==sklorder.vidorder*/)) =tsok)
{
do
{
If (Getfirst soprorda where (( spsopr.nrec == soprorda.cspsopr(noindex) and v1.katmc.nrec==soprorda.cmc(noindex)))=Tsok )
{
do
{
If (Getfirst sporder where ((sklorder.nrec == sporder.csklorder and v1.katmc.nrec==sporder.cmc))=tsok)
{
do
{
//'L_SKLAD::ACTCOMPL.EDITSOPR.SCRHEADERFROM.b_SCRHEADERFROM_Формирование_ордеров'
if (b=1 and 0=sklorder.vidorder)
{
sporder.rsrprice:=soprorda.price;
update current sporder;
rescanpanel(#sporder);
message('РО1 '+sporder.rsrprice);
}
if (b=1 and 1=sklorder.vidorder)
{
sporder.rsrprice:=spsopr.rprice;
update current sporder;
rescanpanel(#sporder);
message('РО2 '+sporder.rsrprice);
}
if (b=0 and 1=sklorder.vidorder)
{
sporder.rsrprice:=soprorda.price;
update current sporder;
rescanpanel(#sporder);
message('ПО1 '+sporder.rsrprice);
}
if (b=0 and 0=sklorder.vidorder)
{
sporder.rsrprice:=spsopr.rprice;
update current sporder;
rescanpanel(#sporder);
message('ПО2 '+sporder.rsrprice);
}
//'L_SKLAD::ACTCOMPL.EDITSOPR.SCRHEADERTO.b_SCRHEADERTO_Формирование_ордеров'
}
while (Getnext sporder where ((sklorder.nrec == sporder.csklorder and v1.katmc.nrec==sporder.cmc))=tsok);
}
}
While (getnext soprorda where ((spsopr.nrec==soprorda.cspsopr(noindex) and v1.katmc.nrec==soprorda.cmc(noindex)))=Tsok );
}
}
while (Getnext sklorder where ((katsopr.nrec == sklorder.csopr /*and 1==sklorder.vidorder*/))=tsok);
}
}
while (v1.Getnext katmc =tsok);
}
Как оказалось, что обычный пробег по таблице katmc не привёл ни к чему. Использовалось только значение из окна EDITSOPR. А view вроде как работает ну очень уже уж долго .
А связаны таблицы SOPRORDA и SPSOPR только через katmc.nrec.
В общем, я мало что понял, чего вы пытаетесь сделать. От всей этой вложенности if - ов c GetFirst where (()) стоит избавиться.
"А связаны таблицы SOPRORDA и SPSOPR только через katmc.nrec." - тоже не понял, чего вы этим хотели сказать.
Может вы имели ввиду что-нить типа такого:
В этом запросе SOPRORDA и SOPRORDER ссылаются на SPSOPR.NREC. Но может быит несколько SPORDER.RSRPRICE и несколько SOPRORDA.PRICE. Допустим 3 и 3. Нужно, чтобы цена SOPRORDA.PRICE. записаль в определённую позицию цены SPORDER.RSRPRICE. Два браузера,в которых фигурируют эти цены, различаются только по katmc.name и katmc.barkod.
Мне необходимо, чтобы по Katmc.name происходил update SPORDER.RSRPRICE. Вот в этом то и загвоздка.
Честно говоря, я с этими таблицами и документами сталкивался очень давно, поэтому подзабыл, что за табличка SOPRORDA. Но я так понял,
вы хотите что -то такое:
во 2 одно = пропущено.
про 1 и 3 даже говорить не хочется - никогда так не пишите. В индексных отборах слева условия, справа табла а никак все привыкли писать в обычном SQL.
If (getfirst sklorder where ((katsopr.nrec==sklorder.csopr)) = tsOk)
{
do
{
p_cSklOrder:=sklorder.nrec;
FixRelations(p_cSklOrder );
//message(p_cSklOrder);
v1._loop Sporder
{//message (SPORDER.rsrprice);
if (v1.getFirst SoprOrdA = tsOk)
{
if (b=1 and 0=sklorder.vidorder)
{
v1.sporder.rsrprice:=soprorda.price;
update current sporder;
rescanpanel(#sporder);
message('РО1 '+v1.sporder.rsrprice);
}
if (b=1 and 1=sklorder.vidorder)
{
v1.sporder.rsrprice:=v1.spsopr.rprice;
update current sporder;
rescanpanel(#sporder);
message('РО2 '+v1.sporder.rsrprice);
}
if (b=0 and 1=sklorder.vidorder)
{
v1.sporder.rsrprice:=v1.soprorda.price;
update current sporder;
rescanpanel(#sporder);
message('ПО1 '+v1.sporder.rsrprice);
}
if (b=0 and 0=sklorder.vidorder)
{
v1.sporder.rsrprice:=v1.spsopr.rprice;
update current sporder;
rescanpanel(#sporder);
//message('ПО2 '+sporder.rsrprice);
}
}
}
}
while (getnext sklorder where ((katsopr.nrec==sklorder.csopr)) = tsOk);
}
create view v1
as select
katmc.*
from katmc where ((katmc.nrec==soprorda.cmc and katmc.nrec== sporder.cmc and soprorda.csopr == sporder.csopr ));
как то так
Почему вам так нравится использовать getFirst where (()) getNext where (()). Это же на производительности не в лучшую сторону сказывается. Опишите все нужные вам связи во вьюхе. Вы пляску от акта начинаете? Может тогда связка со складским ордером вообще не нужна?
Что -то типа:
621 == KatSopr.VidSopr
and 1 ==SpSopr.PrMc
and KatSopr.Nrec == SpSopr.cSopr
and SpSopr.Nrec == SpOrder.cSpSopr
and p_wVidOrder == SpOrder.VidOrder
and SpSopr.Nrec == SoprOrdA.cSpSopr
and SpOrder.cMc == SoprOrdA.cMc (noindex)
if (Getfirst sklorder where ((katsopr.nrec == sklorder.csopr /*and 1==sklorder.vidorder*/)) =tsok)
{
do
{
If (Getfirst sporder where ((sklorder.nrec == sporder.csklorder))=tsok)
{
do
{ message('sklorder.nrec='+sklorder.nrec);
message('sklorder.vidorder='+sklorder.vidorder);
If (Getfirst soprorda where ((SklOrder.cSopr == SoprOrdA.cSoprDoc and SpOrder.cMc == SoprOrdA.cMc))=tsok)
{
do
{message('SPSOPR.RPRICE='+spsopr.rprice);
message('sklorder.nrec2='+sklorder.nrec);
message('sklorder.vidorder2='+sklorder.vidorder);
if (b=1 and word(0)=sklorder.vidorder)
{
sporder.rsrprice:=soprorda.price;
update current sporder;
rescanpanel(#sporder);
message('РО1 '+sporder.rsrprice);
}
if (b=1 and word(1)=sklorder.vidorder)
{
sporder.rsrprice:=spsopr.rprice;
update current sporder;
rescanpanel(#sporder);
message('РО2 '+sporder.rsrprice);
}
if (b=0 and word(1)=sklorder.vidorder)
{
sporder.rsrprice:=soprorda.price;
update current sporder;
rescanpanel(#sporder);
message('ПО1 '+sporder.rsrprice);
}
if (b=0 and word(0)=sklorder.vidorder)
{
sporder.rsrprice:=spsopr.rprice;
update current sporder;
rescanpanel(#sporder);
message('ПО2 '+sporder.rsrprice);
}
//'L_SKLAD::ACTCOMPL.EDITSOPR.SCRHEADERTO.b_SCRHEADERTO_Формирование_ордеров'
}
while (Getnext soprorda where ((SklOrder.cSopr == SoprOrdA.cSoprDoc and SpOrder.cMc == SoprOrdA.cMc ))=tsok);
}
}
While (Getnext sporder where ((sklorder.nrec == sporder.csklorder))=tsok);
}
}
while (Getnext sklorder where ((katsopr.nrec == sklorder.csopr /*and 1==sklorder.vidorder*/))=tsok);
}
if (b=1 and word(1)=sklorder.vidorder)
{
sporder.rsrprice:=spsopr.rprice;
update current sporder;
rescanpanel(#sporder);
message('РО2 '+sporder.rsrprice);
}
If (Getfirst soprorda where ((SklOrder.cSopr == SoprOrdA.cSoprDoc and SpOrder.cMc == SoprOrdA.cMc))=tsok)
{
...
}
страбатывают. После (внутри if) почему-то не выводится месадж, когда sklorder.vidorder2 =1, а только sklorder.vidorder2 =0, хотя до нормально выводит sklorder.vidorder =1 и sklorder.vidorder =0. Из-за этого не срабатывает условие.
Может кто-нибудь объяснить почему так происходит ?
Последний раз редактировалось BlazeBio 13 июл 2010, 20:18, всего редактировалось 1 раз.
Я использую getFirst where (())... getNext where (()), потому что как сейчас loop часто не срабатывает.
На счёт ордеров. При формировании ордеров формируются два ордера приходный и расходный. После формирования именно в этих конкретных сформировавшихся ордерах нужно произвести update.
Я бы рад произвести через _loop, но почему или идёт полный цикл по таблице или если использовать view v1 никакого цикла не происходит. Вот я интересуюсь почему ?