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

Запрос в интерфейсе

Добавлено: 13 июл 2010, 19:40
BlazeBio
Почему здесь всегда выводится одна и та же МЦ? (В суппорте нормально отрабатывается запрос и выводит всё как надо).

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

Interface FillTable 'Заполение таблицы ppkatstan';

create view pp
Select ecn1.name, ecs1.name, katmc.name
From Exclassname ecn1, Exclassseg ecs1, EXCLASSVAL ecv1, katmc//,ppkatstanmc,ppkatstan//(katmc01)
Where ((ecn1.classcode==ecs1.classcode and 1411==ecn1.wtable
  and ecn1.classcode==ecv1.classcode and ecs1.nrec==ecv1.CCLASSSEG
  /*and 1411==EXCLASSVAL.wtable*/ and ecv1.CREC==katmc.nrec))
        and ('Коллекция'=ecn1.name);
ORDER BY Exclassname.name+Exclassname.wtable, Exclassseg.name+Exclassseg.classcode;

handleEvent
		cmInit:
							pp._loop Exclassname
							{
									 pp._loop Exclassseg
									 {
										  pp._loop EXCLASSVAL
										 {
											  if pp.getfirst katmc=tsOk
											  { 
												  message(pp.katmc.name);
											  }
										 }
									 }
							}

	end;
end.

Re: Запрос в интерфейсе

Добавлено: 14 июл 2010, 07:52
Pehterev
BlazeBio писал(а):Почему здесь всегда выводится одна и та же МЦ? (В суппорте нормально отрабатывается запрос и выводит всё как надо).

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

							pp._loop Exclassname
							{
									 pp._loop Exclassseg
									 {
										  pp._loop EXCLASSVAL
										 {
наверно это надо заменить на

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

							pp._loop ecn1
							{
									 pp._loop ecs1
									 {
										  pp._loop ecv1
										 {

Re: Запрос в интерфейсе

Добавлено: 14 июл 2010, 09:28
edward_K
1. убрать order by - все равно не по тем таблицам что в where
2. подобрать все таки нужные индексы, это вам для примера - уж поменяете местами что надо

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

from katos(KATOS13)
where ((
    15 == katos.tidk and 1 == katos.isleaf
and 3000 == EXCLASSNAME.wtable
and 'TEST' ==EXCLASSNAME.name
and EXCLASSNAME.classcode == exclassval.classcode
and 3000 == exclassval.wtable
and katos.nrec ==exclassval.crec << в вашем случае здесь наоборот
and exclassval.cclassseg == exclassseg.nrec
)) ;

Re: Запрос в интерфейсе

Добавлено: 14 июл 2010, 14:17
BlazeBio
Как быть всё же с сортировкой по МЦ. Cделал такое view, тут по order by в суппорте выводятся данные, а через vip ничего(вывод МЦ происходит только без order by и без сортировки, а нужна сортировка):

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

Interface FillTable 'Заполение таблицы ppkatstan';
var knrec:comp;
create view
as	Select  ecn1.name,ecs1.name,katmc.name
	From  Exclassname  ecn1(EXCLASSNAME2),Exclassseg ecs1(EXCLASSSEG06),katmc(KATMC02), EXCLASSVAL ecv1//ppkatstanmc,ppkatstan//(katmc01)
	Where ((
	1411==ecn1.wtable
	and ('Коллекция'=ecn1.name or 'Цветность'=ecn1.name)
	  and ecn1.classcode==ecv1.classcode
	  and 1411==ecv1.wtable
	and ecv1.CREC==katmc.nrec
	and ecv1.CCLASSSEG==ecs1.nrec));
	//order by katmc.name+katmc.barkod;  
create view pp
as select *
from
ppkatstanmc,ppkatstan;

handleEvent
		cmInit:
			{
				StartNewVisual(vtRotateVisual ,
							vfTimer+vfBreak+vfConfirm, 'Идёт заполнение таблицы ppkatstan,ppkatstanmc...', 0);
				j:=0;
				m:=1;
				if getfirst ppkatstan=tsOk
 					{
						delete all ppkatstan;
					}
				if getfirst ppkatstanmc=tsOk
 					{
						delete all ppkatstanmc;
					}
							//message(katmc.name);
							_loop ecn1
							{//message(ecn1.name);
								 _loop ecs1
								{//message(ecs1.name);
									_loop ecv1
									{
										if getfirst katmc=tsOk
										{
												message(katmc.name);
											clearbuffer(#ppkatstanmc);
											ppkatstanmc.cmc:=katmc.nrec;
											If (s1<>ecs1.name) and ('Цветность'=ecs1.name) and (katmc.name<>'')
											{
											clearbuffer(#ppkatstan);
											s:=s1+ecs1.name;
											ppkatstan.name:=s;
											insert current ppkatstan;
											knrec:=ppkatstanmc.atl_nrec;
											}
											s1:=ecs1.name;
											ppkatstanmc.cppkatstan:=knrec;
											insert current ppkatstanmc;
										}
									}
								}
							}
			StopVisual('', 0);
			}
	end;
end.

Re: Запрос в интерфейсе

Добавлено: 14 июл 2010, 17:40
BlazeBio
Сортировка не работает по Katmc02 и Katmc07, другие более длинные составные индексы из Katmc не использовал. Как я писал при Order by katmc.name+katmc.barkod не выводится ни одной строки. Что делать? Наверное индекс добавлять в katmc будет не совсем корректно. Может можно сделать ещё как-то сортировку по katmc, может коряво, может медленным способом?

Re: Запрос в интерфейсе

Добавлено: 14 июл 2010, 17:50
edward_K
1. в order by поля нужно писать через запятую а не через +
2. задав порядок по katmc вы сваливаетесь во внешнюю выгрузку, что во первых медленно во вторых не всегда корректно работает.
либо надо тогда переделать на мой образец - katmc должна быть главной таблицей, добавив жесткую подцепку, либо выгрузить нужные поля во временную таблицу
delete all tmp_table
insert tmp_table select ..... from .. where .. ;

Re: Запрос в интерфейсе

Добавлено: 14 июл 2010, 20:27
BlazeBio
edward_K писал(а):... выгрузить нужные поля во временную таблицу
delete all tmp_table
insert tmp_table select ..... from .. where .. ;
Создал таким образом временную таблицу t1. Фишка интерфейса в том, что создать по коллекции+цветности МЦ в таблице ppkatstan, которая связана с таблицей katmc через таблицу связей ppkatstanmc, в ppkatstanmc должны быть записаны все ссылки на katmc в состав которых входят коллекции+цветность из ppkatstan. Но данный фейс создаёт много дубликатов в таблице ppkatstan, а нужно чтобы не было повторяющихся значений. Может можно как-то избавиться от дублирующихся значений в t1 или ppkatstan?. (Примечание:таблицы ppkastan и ppkatstanmc созданы мной.) И вообщее как организовать сортировку в t1 по нескольким позициям?

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

Interface FillTable 'Заполение таблицы ppkatstan';
var knrec:comp;
	i,l,m,j,d:integer;
	s1,s2,s:string[200];
	 table struct t1
				 (
					nrec : comp,
//					cmc : comp,
					name: string, // наименование
				 	name2:string,
				 	name3:string
//					isarch:string,
//					cppgrformat: string
				 )
				 with index
				 (
					 t101 = nRec,//(Unique,Surrogate),
					 //t102 = name,
				     t103 = name+name3+name2
				 );

create view
as	Select  katmc.name,Exclassname.name,Exclassseg.name
	From  Exclassname(EXCLASSNAME2),Exclassseg(EXCLASSSEG06),katmc(KATMC02), EXCLASSVAL, ppkatstanmc,ppkatstan//(katmc01)
	Where ((
	1411==Exclassname.wtable
	and ('Коллекция'=Exclassname.name or 'Цветность'=Exclassname.name)
	  and Exclassname.classcode==EXCLASSVAL.classcode
	  and 1411==EXCLASSVAL.wtable
	and EXCLASSVAL.CREC==katmc.nrec
	and EXCLASSVAL.CCLASSSEG==Exclassseg.nrec));

create view t
as select name,name2,name3
from t1(t103);

/*create view els
as select * from
ppkatstan,ppkatstanmc,ppgrformat,ppline; //where ((comp(281474976729069)==katmc.nrec));*/
handleEvent
		cmInit:
			{
				StartNewVisual(vtRotateVisual ,
							vfTimer+vfBreak+vfConfirm, 'Идёт заполнение таблицы ppkatstan,ppkatstanmc...', 0);
				j:=0;
				m:=1;
				if getfirst ppkatstan=tsOk
 					{
						delete all ppkatstan;
					}
				if getfirst ppkatstanmc=tsOk
 					{
						delete all ppkatstanmc;
					}
					if t.getfirst t1=tsOk
								{
									t.delete all t1;
								}



							//message(katmc.name);
							_loop Exclassname
							{//message(ecn1.name);
								 _loop Exclassseg
								{//message(ecs1.name);
									_loop EXCLASSVAL
									{
										if getfirst katmc=tsOk
										{
												//message(katmc.name);
												t.t1.nrec:=katmc.nrec;
												t.t1.name:=katmc.name;
												t.t1.name2:=Exclassseg.name;
												t.t1.name3:=Exclassname.name;
												t.insert current t1;
										}
									}
								}
							}
								s1:=' ';
								t._loop t1
								{
										//message(t.t1.name+' '+t.t1.name2+' '+t.t1.name3);
										clearbuffer(#ppkatstanmc);
										clearbuffer(#ppkatstan);
										ppkatstanmc.cmc:=t.t1.nrec;
										if (s1=' ')
										{
												s:=t.t1.name2;
												ppkatstan.name:=s;
												insert current ppkatstan;
												knrec:=ppkatstan.atl_nrec;
										}
										else
										{
												If (s1<>t.t1.name2 and 'Цветность'=t.t1.name3 and t.t1.name<>'')
												{
												s:=s1+' '+t.t1.name2;
												ppkatstan.name:=s;
												insert current ppkatstan;
												knrec:=ppkatstan.atl_nrec;
												}
												If (s1<>t.t1.name2 and 'Коллекция'=t.t1.name3 and t.t1.name<>'')
												{
												s:=t.t1.name2;
												ppkatstan.name:=s;
												insert current ppkatstan;
												knrec:=ppkatstan.atl_nrec;
												}


										}
										s1:=t.t1.name2;
										ppkatstanmc.cppkatstan:=knrec;
										insert current ppkatstanmc;
								}

			StopVisual('', 0);
			}
	end;
end.