Страница 1 из 1

Помогите с интерфейсом

Добавлено: 30 ноя 2010, 19:00
Gameus_
Ко клику на кнопке cmAdd вызываю свой фейс, заполняется маркер со значениями, заполняю значениями из маркера свою времянку и хочу это все отобразить, но при попытке сделать rescanpanel(#oborot) или rereadrecord(bmain) все подвисает.

Подскажите где я перемудрил или как правильно это все написать.

Код: Выделить всё

#include galnet.ccm
#include galnet.csc
end;

interface add_avizo 'add avizo' cyan,DoAccept;

var
 d1:date;
 p_names,nodoc, CurDescr: string;
 pdr:comp;
 CurDescr_c:comp;
 sum:double;
 oborot_marker,mid:longint;

table struct tmain
(
 oborot_nrec: comp
)
with index
(
 i0 = oborot_nrec
)
;

create view vmain
as select * from tmain,oborot, katpodr katpodr_deb, katpodr katpodr_kr
where
((
	tmain.oborot_nrec/==oborot.nrec
	and oborot.KODSPO == katpodr_deb.nrec
	and oborot.KODSPK == katpodr_kr.nrec
));

create view vtemp as select * from tmain (memory);

create view v_ob
as select * from oborot where if(searchmarker(oborot_marker, oborot.nrec, mid), 1, 0)=1;

create view vpdr
as select * from katpodr where nrec=pdr;

parameters pdr;

screen smain;
show at (, 1, , 5);
fields
 CurDescr:pickbutton,protect;
 nodoc:noprotect;
 d1:pickbutton,noprotect;
 p_names:pickbutton,protect;
 sum:noprotect;
buttons
 cmAdd;
 cmDel;
 cmPrint;
<<
 „ҐбЄа    ь ¤®Єг¬Ґ­в     ‚лЇЁб ­
 .@@@@    .@@@@@@@@@@  .@@@@@@@@@@
 Џ®¤а §¤Ґ«Ґ­ЁҐ .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 ‘㬬          .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 <. „®Ў ўЁвм .> <. “¤ «Ёвм .> <. ЏҐз вм .>
>>
end;

browse bmain('Avizo',,sci148Ins);
show at (, 6, , );
table oborot;
fields
  vmain.oborot.datob '„ в '('Datob',,):protect,{Font={Color=0}},[3];
  vmain.oborot.nodok 'ь ¤®Єг¬Ґ­в '('Nodok',,):protect,{Font={Color=0}},[3];
  vmain.oborot.SCHETO+' '+vmain.oborot.SUBOSSCH+' '+vmain.katpodr_deb.name '„ҐЎҐв'('Debet',,):protect,{Font={Color=0}},[10];
  vmain.oborot.SCHETK+' '+vmain.oborot.SUBSCHK+' '+vmain.katpodr_kr.name 'ЉаҐ¤Ёв'('Kredit',,):protect,{Font={Color=0}},[10];
  vmain.oborot.SUMOB '‘㬬 '('sum',,):protect,{Font={Color=0}},[5];
  vmain.oborot.SUMVALUT '‚ ў «овҐ'('val',,):protect,{Font={Color=0}},[5];
end;

HandleEvent
cmInit:
{
	vtemp.delete all tmain;
	d1:=Cur_Date;
	CurDescr := sGetTune('USER.DESCR');
	if (vpdr.getfirst katpodr=tsok){p_names:=vpdr.katpodr.name;}
	nodoc:=substr(vpdr.katpodr.kod,1,3);
	oborot_marker:= initmarker('oborot_marker',8,0,1);
}

cmPick:
{
 PopAllConditions;
 if curfield=#p_names
 {  
  runinterface('Z_KATPODR::GetAnyPodr', pdr,4);
  if (vpdr.getfirst katpodr=tsok){p_names:=vpdr.katpodr.name;}
  nodoc:=substr(vpdr.katpodr.kod,1,3);
 }
}
cmAdd:
{
   if (vpdr.getfirst katpodr=tsok)
   {
	   if (substr(vpdr.katpodr.kod,1,3)='057'){runinterface('get_oborot', oborot_marker,date(1,month(d1),year(d1)),date(Last_Day(d1),month(d1),year(d1)),00010000000001DEh);}
	   if (substr(vpdr.katpodr.kod,1,3)='058'){runinterface('get_oborot', oborot_marker,date(1,month(d1),year(d1)),date(Last_Day(d1),month(d1),year(d1)),00010000000001E8h);}
	   if (substr(vpdr.katpodr.kod,1,3)='060'){runinterface('get_oborot', oborot_marker,date(1,month(d1),year(d1)),date(Last_Day(d1),month(d1),year(d1)),00010000000001F9h);}
	   if (substr(vpdr.katpodr.kod,1,3)='001' or substr(vpdr.katpodr.kod,1,3)='046'){runinterface('get_oborot', oborot_marker,date(1,month(d1),year(d1)),date(Last_Day(d1),month(d1),year(d1)),0001000000000039h);}
	   if (substr(vpdr.katpodr.kod,1,3)='055'){runinterface('get_oborot', oborot_marker,date(1,month(d1),year(d1)),date(Last_Day(d1),month(d1),year(d1)),0001000000000201h);}
	   if (substr(vpdr.katpodr.kod,1,3)='062'){runinterface('get_oborot', oborot_marker,date(1,month(d1),year(d1)),date(Last_Day(d1),month(d1),year(d1)),0001000000000210h);}
	   
	   v_ob._loop oborot
	   {
		vtemp.insert into tmain
		set
		oborot_nrec:=v_ob.oborot.nrec;
	   }
	   //rescanpanel(#oborot);
	   rereadrecord(bmain);
   }
}
End;
end.  

Re: Помогите с интерфейсом

Добавлено: 30 ноя 2010, 19:12
BlazeBio
Точно тормозить должно из-за жёсткой связи.
А зачем вам столько if? Так всегда сканятся все if. Используйте else if.
И лучше длбавлять записи через insert current tmain.
А зачем вам из маркера выгружать во времянку? По мне так двойная работа.
И загоните всё в одно view. Так лучше будет.

Re: Помогите с интерфейсом

Добавлено: 30 ноя 2010, 19:43
Gameus_
BlazeBio писал(а):Точно тормозить должно из-за жёсткой связи.
А зачем вам столько if? Так всегда сканятся все if. Используйте else if.
И лучше длбавлять записи через insert current tmain.
А зачем вам из маркера выгружать во времянку? По мне так двойная работа.
И загоните всё в одно view. Так лучше будет.
если жесткую связь не ставить, то попадают все обороты
if else if здесь погоды не делают (совет принял)
инсерт тоже недолго проходит
маркер и времянка - чтобы если пользователь выбрал не все обороты, которые ему нужны, он мог повторно нажать кнопочку и добавить нужные.
как все в одну вьюху загнать - не могу придумать, если подскажете, буду благодарен.

Re: Помогите с интерфейсом

Добавлено: 30 ноя 2010, 20:37
edward_K
ошибок вагон, ну как миниум 3.
1. (memory) - нафиг, она же и так временная.
2. это бы просто переписать на функцию - вы весь оборот в память гоните. Пробегитесь по маркеру и подберите нужные записи
create view v_ob
as select * from oborot where if(searchmarker(oborot_marker, oborot.nrec, mid), 1, 0)=1;
похоже пока маркер пустой еще как то шеволится, а как наполнили дык все.
Замените примерно так
where (( Item == oborot.nrec ))
..
for(i:=0;i<GetmarkerCount(marker);inc(i)
{ GetMarker(Markers, i, Item)
if v_ob.getfirst oborot=0 ...
}

3.
create view vpdr
as select * from katpodr where nrec=pdr;
замените на
create view vpdr
as select * from katpodr where (( ptr == nrec ));

причем тут жесткая подцепка вообще не понятно - должно работать и так и так одинаково.

Re: Помогите с интерфейсом

Добавлено: 01 дек 2010, 13:53
Gameus_
Сделал вот так :

Код: Выделить всё

#include galnet.ccm
#include galnet.csc
end;

interface add_avizo 'add avizo' cyan,DoAccept;

var
 d1:date;
 p_names,nodoc, CurDescr: string;
 pdr:comp;
 CurDescr_c,Item:comp;
 sum:double;
 oborot_marker,mid:longint;
 i:integer;

table struct tmain
(
 oborot_nrec: comp
)
with index
(
 i0 = oborot_nrec
)
;

create view vmain
as select * from tmain,oborot, katpodr katpodr_deb, katpodr katpodr_kr
where
((
	tmain.oborot_nrec==oborot.nrec
	and oborot.KODSPO == katpodr_deb.nrec
	and oborot.KODSPK == katpodr_kr.nrec
));

create view vtemp as select * from tmain;

create view vpdr
as select * from katpodr where ((pdr==nrec));

parameters pdr;

screen smain;
show at (, 1, , 5);
fields
 CurDescr:pickbutton,protect;
 nodoc:noprotect;
 d1:pickbutton,noprotect;
 p_names:pickbutton,protect;
 sum:noprotect;
buttons
 cmAdd;
 cmDel;
 cmPrint;
<<
 „ҐбЄа    ь ¤®Єг¬Ґ­в     ‚лЇЁб ­
 .@@@@    .@@@@@@@@@@  .@@@@@@@@@@
 Џ®¤а §¤Ґ«Ґ­ЁҐ .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 ‘㬬          .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 <. „®Ў ўЁвм .> <. “¤ «Ёвм .> <. ЏҐз вм .>
>>
end;

browse bmain('Avizo',,sci148Ins);
show at (, 6, , );
table oborot;
fields
  vmain.oborot.datob '„ в '('Datob',,):protect,{Font={Color=0}},[3];
  vmain.oborot.nodok 'ь ¤®Єг¬Ґ­в '('Nodok',,):protect,{Font={Color=0}},[3];
  vmain.oborot.SCHETO+' '+vmain.oborot.SUBOSSCH+' '+vmain.katpodr_deb.name '„ҐЎҐв'('Debet',,):protect,{Font={Color=0}},[10];
  vmain.oborot.SCHETK+' '+vmain.oborot.SUBSCHK+' '+vmain.katpodr_kr.name 'ЉаҐ¤Ёв'('Kredit',,):protect,{Font={Color=0}},[10];
  vmain.oborot.SUMOB '‘㬬 '('sum',,):protect,{Font={Color=0}},[5];
  vmain.oborot.SUMVALUT '‚ ў «овҐ'('val',,):protect,{Font={Color=0}},[5];
end;

HandleEvent
cmInit:
{
	vtemp.delete all tmain;
	d1:=Cur_Date;
	CurDescr := sGetTune('USER.DESCR');
	if (vpdr.getfirst katpodr=tsok){p_names:=vpdr.katpodr.name;}
	nodoc:=substr(vpdr.katpodr.kod,1,3);
	oborot_marker:= initmarker('oborot_marker',8,0,1);
}

cmPick:
{
 PopAllConditions;
 if curfield=#p_names
 {  
  runinterface('Z_KATPODR::GetAnyPodr', pdr,4);
  if (vpdr.getfirst katpodr=tsok){p_names:=vpdr.katpodr.name;}
  nodoc:=substr(vpdr.katpodr.kod,1,3);
 }
}
cmAdd:
{
   if (vpdr.getfirst katpodr=tsok)
   {
	   if (substr(vpdr.katpodr.kod,1,3)='057'){runinterface('get_oborot', oborot_marker,date(1,month(d1),year(d1)),date(Last_Day(d1),month(d1),year(d1)),00010000000001DEh);}
	   else if (substr(vpdr.katpodr.kod,1,3)='058'){runinterface('get_oborot', oborot_marker,date(1,month(d1),year(d1)),date(Last_Day(d1),month(d1),year(d1)),00010000000001E8h);}
	   else if (substr(vpdr.katpodr.kod,1,3)='060'){runinterface('get_oborot', oborot_marker,date(1,month(d1),year(d1)),date(Last_Day(d1),month(d1),year(d1)),00010000000001F9h);}
	   else if (substr(vpdr.katpodr.kod,1,3)='001' or substr(vpdr.katpodr.kod,1,3)='046'){runinterface('get_oborot', oborot_marker,date(1,month(d1),year(d1)),date(Last_Day(d1),month(d1),year(d1)),0001000000000039h);}
	   else if (substr(vpdr.katpodr.kod,1,3)='055'){runinterface('get_oborot', oborot_marker,date(1,month(d1),year(d1)),date(Last_Day(d1),month(d1),year(d1)),0001000000000201h);}
	   else if (substr(vpdr.katpodr.kod,1,3)='062'){runinterface('get_oborot', oborot_marker,date(1,month(d1),year(d1)),date(Last_Day(d1),month(d1),year(d1)),0001000000000210h);}
 
		for(i:=0;i<GetmarkerCount(oborot_marker);inc(i))
		{ GetMarker(oborot_marker, i, Item)
			vtemp.insert into tmain
			set
			oborot_nrec:=Item;	
		}
		//vtemp._loop tmain
		//{
		//message(vtemp.tmain.oborot_nrec);
		//}
	   rescanpanel(#oborot);
	   //rereadrecord(bmain);
   }
}
End;
end.  
message внизу показывает, что данные из маркера попадают во времянку, но в браузе данных нет, где я еще накосячил ? :)

Re: Помогите с интерфейсом

Добавлено: 01 дек 2010, 14:15
BlazeBio
А vmain._loop tmain месагой проверяли?
И сделайте лучше всё в одном вью. Проблем меньше будет. :)

Код: Выделить всё

create view
var pdr:comp;
as select * from tmain,oborot, katpodr katpodr_deb, katpodr katpodr_kr, katpodr
where
((
   tmain.oborot_nrec==oborot.nrec
   and oborot.KODSPO == katpodr_deb.nrec
   and oborot.KODSPK == katpodr_kr.nrec
));

parameters pdr;
А при добавлении сделайте так. :)

Код: Выделить всё

cmAdd:
{
   if (getfirst katpodr where((pdr==katpodr.nrec))=tsok)
   {}

Re: Помогите с интерфейсом

Добавлено: 01 дек 2010, 14:26
Pehterev
еще в конце после вставки записей в tmain нужно
rereadrecord(#tmain);

Re: Помогите с интерфейсом

Добавлено: 01 дек 2010, 14:44
Gameus_
имеем:

Код: Выделить всё

#include galnet.ccm
#include galnet.csc
end;

interface add_avizo 'add avizo' cyan,DoAccept;

var
 d1:date;
 p_names,nodoc, CurDescr: string;
 pdr:comp;
 CurDescr_c,Item:comp;
 sum:double;
 oborot_marker,mid:longint;
 i:integer;

table struct tmain
(
 oborot_nrec: comp
)
with index
(
 i0 = oborot_nrec
)
;

create view
var pdr:comp;
as select * from tmain,oborot, katpodr katpodr_deb, katpodr katpodr_kr
where
((
	tmain.oborot_nrec==oborot.nrec
	and oborot.KODSPO == katpodr_deb.nrec
	and oborot.KODSPK == katpodr_kr.nrec
));

!create view vtemp as select * from tmain;

!create view vpdr as select * from katpodr where ((pdr==nrec));

parameters pdr;

screen smain;
show at (, 1, , 5);
fields
 CurDescr:pickbutton,protect;
 nodoc:noprotect;
 d1:pickbutton,noprotect;
 p_names:pickbutton,protect;
 sum:noprotect;
buttons
 cmAdd;
 cmDel;
 cmPrint;
<<
 „ҐбЄа    ь ¤®Єг¬Ґ­в     ‚лЇЁб ­
 .@@@@    .@@@@@@@@@@  .@@@@@@@@@@
 Џ®¤а §¤Ґ«Ґ­ЁҐ .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 ‘㬬          .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 <. „®Ў ўЁвм .> <. “¤ «Ёвм .> <. ЏҐз вм .>
>>
end;

browse bmain('Avizo',,sci148Ins);
show at (, 6, , );
table oborot;
fields
  oborot.datob '„ в '('Datob',,):protect,{Font={Color=0}},[3];
  oborot.nodok 'ь ¤®Єг¬Ґ­в '('Nodok',,):protect,{Font={Color=0}},[3];
  oborot.SCHETO+' '+oborot.SUBOSSCH+' '+katpodr_deb.name '„ҐЎҐв'('Debet',,):protect,{Font={Color=0}},[10];
  oborot.SCHETK+' '+oborot.SUBSCHK+' '+katpodr_kr.name 'ЉаҐ¤Ёв'('Kredit',,):protect,{Font={Color=0}},[10];
  oborot.SUMOB '‘㬬 '('sum',,):protect,{Font={Color=0}},[5];
  oborot.SUMVALUT '‚ ў «овҐ'('val',,):protect,{Font={Color=0}},[5];
end;

HandleEvent
cmInit:
{
	delete all tmain;
	d1:=Cur_Date;
	CurDescr := sGetTune('USER.DESCR');
	if (getfirst katpodr where((pdr==katpodr.nrec))=tsok){p_names:=katpodr.name;nodoc:=substr(katpodr.kod,1,3);}	
	oborot_marker:= initmarker('oborot_marker',8,0,1);
}

cmPick:
{
 PopAllConditions;
 if curfield=#p_names
 {  
  runinterface('Z_KATPODR::GetAnyPodr', pdr,4);
  if (getfirst katpodr where((pdr==katpodr.nrec))=tsok){p_names:=katpodr.name;nodoc:=substr(katpodr.kod,1,3);}  
 }
}
cmAdd:
{
   if (getfirst katpodr=tsok)
   {
	   if (substr(katpodr.kod,1,3)='057'){runinterface('get_oborot', oborot_marker,date(1,month(d1),year(d1)),date(Last_Day(d1),month(d1),year(d1)),00010000000001DEh);}
	   else if (substr(katpodr.kod,1,3)='058'){runinterface('get_oborot', oborot_marker,date(1,month(d1),year(d1)),date(Last_Day(d1),month(d1),year(d1)),00010000000001E8h);}
	   else if (substr(katpodr.kod,1,3)='060'){runinterface('get_oborot', oborot_marker,date(1,month(d1),year(d1)),date(Last_Day(d1),month(d1),year(d1)),00010000000001F9h);}
	   else if (substr(katpodr.kod,1,3)='001' or substr(katpodr.kod,1,3)='046'){runinterface('get_oborot', oborot_marker,date(1,month(d1),year(d1)),date(Last_Day(d1),month(d1),year(d1)),0001000000000039h);}
	   else if (substr(katpodr.kod,1,3)='055'){runinterface('get_oborot', oborot_marker,date(1,month(d1),year(d1)),date(Last_Day(d1),month(d1),year(d1)),0001000000000201h);}
	   else if (substr(katpodr.kod,1,3)='062'){runinterface('get_oborot', oborot_marker,date(1,month(d1),year(d1)),date(Last_Day(d1),month(d1),year(d1)),0001000000000210h);}
 
		for(i:=0;i<GetmarkerCount(oborot_marker);inc(i))
		{ GetMarker(oborot_marker, i, Item)
			insert into tmain
			set
			oborot_nrec:=Item;	
		}
		//vtemp._loop tmain
		//{
		//message(tmain.oborot_nrec);
		//}
	   rereadrecord(#tmain);
	   rescanpanel(#oborot);
	   //rereadrecord(bmain);
   }
}
End;
end.  
Мессадж показывает все выбранные записи, в браузе только последняя запись.

Re: Помогите с интерфейсом

Добавлено: 01 дек 2010, 15:02
edward_K
а oborot в browse не пробовали заменить на tmain? Так все правильно - видите все дочерние записи в oborot для tmain

Re: Помогите с интерфейсом

Добавлено: 01 дек 2010, 15:36
Gameus_

Код: Выделить всё

browse bmain('Avizo',,sci148Ins);
show at (, 6, , );
table tmain;
и

Код: Выделить всё

	   rereadrecord(#tmain);
	   rescanpanel(#tmain);
помогло, спасибо всем огромное за помощь !!!!!!!

Re: Помогите с интерфейсом

Добавлено: 01 дек 2010, 18:21
Vik
Gameus_ писал(а):

Код: Выделить всё


[code]
	   rereadrecord(#tmain);
	   rescanpanel(#tmain);
Rereadrecord делает то же самое, что и reascanpanel плюс еще кое-что. Поэтому, зачем здесь вызов rescanpanel после Rereadrecord ? )