| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			Помогите разобраться с запросом по РБП
			 
			
			Задача: вывечти с форме списка РБП только те карточки, в которых есть открытые модели. 
		
		
		
		
		
		
		
	SELECT * FROM RDeferralsTable JOIN FIRSTONLY * FROM RDeferralsBook WHERE RDeferralsTable.DeferralsId = RDeferralsBook.DeferralsId AND ((Status = В работе)) По результатам данного запроса в списке РБП выводиться столько строк РБП, сколько открытых моделей. Что неправильно в запросе?  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			esists join для этого есть
		 
		
		
		
		
		
		
			
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			FetchMode - это совсем другое свойство 
		
		
		
		
		
		
			
		
		
		
		
	Вам нужно свойство JoinMode  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			уже сообразила, не успела отменить )))
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Еще вопрос.  
		
		
		
		
		
		
		
	При первом входе он делает все верно. Свзявает источник ds формы и тот источник, который я указываю qbdsStd = qbds1.addDataSource(tablenum(RDeferralsBook)); Но стоит мне повторно обратиться к методу executeQuery на источнике формы из метода modifide на checkbox после метода super() и он видит только один источник данных в запросе в методе executeQuery. Т.е. он игнорирует qbdsStd и строчки дальше. Отладчиком он по ним идет, но query не меняет. Вообще код простой. X++: public void executeQuery() { QueryBuildDataSource qbds; QueryBuildRange qbdsrange3; QueryBuildDataSource qbds1; str _rangeClose; QueryBuildDataSource qbdsStd; QueryBuildRange qbrStatus; ; //запрос по таблице РБП qbds1 = this.query().dataSourceTable(tableNum(RDeferralsTable)); qbds1.clearRanges(); qbds1.clearLinks(); qbdsStd = qbds1.addDataSource(tablenum(RDeferralsBook)); qbdsStd.joinMode(JoinMode::ExistsJoin); qbdsStd.relations(true); qbrStatus =qbdsStd.addRange(fieldnum(RDeferralsBook,Status)); /* if (Cat_OpenDef.value() == NoYes::No) { */ qbrStatus.value(enum2str(RDeferralsStatus::Open)); // } super(); }  | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Код: public void executeQuery()
{
    QueryBuildDataSource qbds;
    QueryBuildRange      qbdsrange3;
    QueryBuildDataSource qbds1;
    str                  _rangeClose;
    QueryBuildDataSource qbdsStd;
    QueryBuildRange      qbrStatus;
    ;
    //запрос по таблице РБП
    qbds1 = this.query().dataSourceTable(tableNum(RDeferralsTable));
    qbds1.clearRanges();
    qbds1.clearLinks();
    if (!query.dataSourceTable(tableNum(RDeferralsBook)))
        qbdsStd =  qbds1.addDataSource(tablenum(RDeferralsBook));    qbdsStd.joinMode(JoinMode::ExistsJoin);
    qbdsStd.relations(true);
    qbrStatus =qbdsStd.addRange(fieldnum(RDeferralsBook,Status));
 /*   if (Cat_OpenDef.value() == NoYes::No)
    {     */
        qbrStatus.value(enum2str(RDeferralsStatus::Open));
  //  }
    super();
}Последний раз редактировалось kashperuk; 18.04.2007 в 17:15.  | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 ---------------- 
		
			
	 | 
	
	
	
		
		
		
		 
			
			все как всегда, если вы меняете запрос, а он не меняется, значит... вы меняете не тот запрос  
		
		
		
		
		
		
		
	![]() if(this.queryRun()) qbds1 = this.queryRun().query().dataSourceTable(tableNum(RDeferralsTable)); else qbds1 = this.query().dataSourceTable(tableNum(RDeferralsTable));  | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 X++: public void executeQuery() { QueryBuildDataSource qbds; QueryBuildRange qbdsrange3; QueryBuildDataSource qbds1; str _rangeClose; QueryBuildDataSource qbdsStd; QueryBuildRange qbrStatus; ; //запрос по таблице РБП qbds1 = this.query().dataSourceTable(tableNum(RDeferralsTable)); qbds1.clearRanges(); qbds1.clearLinks(); if (!this.query().dataSourceTable(tableNum(RDeferralsBook))) { if (Cat_OpenDef.value() == NoYes::No) { qbdsStd = qbds1.addDataSource(tablenum(RDeferralsBook)); qbdsStd.joinMode(JoinMode::ExistsJoin); qbdsStd.relations(true); qbrStatus =qbdsStd.addRange(fieldnum(RDeferralsBook,Status)); qbrStatus.value(enum2str(RDeferralsStatus::Open)); } } else { qbdsStd = qbds1.addDataSource(tablenum(RDeferralsBook)); qbdsStd.joinMode(JoinMode::ExistsJoin); qbdsStd.relations(true); qbrStatus =qbdsStd.addRange(fieldnum(RDeferralsBook,Status)); qbrStatus.value(''); } super(); } qbdsStd = qbds1.addDataSource(tablenum(RDeferralsBook)); расценивает как один запрос и не соединяет его с первичным запросом qbds1 = this.query().dataSourceTable(tableNum(RDeferralsTable)); Т.е. на выходе у него появляется 2 отдельных запроса qbds1 и qbdsStd , а они должны были соединиться. А может причина в том, что RDeferralsTable является DS формы, а RDeferralsBook - нет? Последний раз редактировалось Arahnid; 18.04.2007 в 17:40.  | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Долго смотрел этот запрос. Честно говоря, так и не понял, что должно получиться в результате.  
		
		
		
			Если можно, расскажите словами. В любом случае, предлагаю альтернативный вариант запроса и пару вопросов: X++: public void executeQuery() { QueryBuildDataSource qbds; QueryBuildRange qbdsrange3; QueryBuildDataSource qbds1; str _rangeClose; QueryBuildDataSource qbdsStd; QueryBuildRange qbrStatus; ; //запрос по таблице РБП qbds1 = this.query().dataSourceTable(tableNum(RDeferralsTable)); qbds1.clearRanges(); qbds1.clearLinks(); qbdsStd = this.query().dataSourceTable(tableNum(RDeferralsBook)); if (!qbdsStd) { qbdsStd = qbds1.addDataSource(tablenum(RDeferralsBook)); qbdsStd.joinMode(JoinMode::ExistsJoin); qbdsStd.relations(true); } qbrStatus = SysQuery::findOrCreateRange(qbdsStd, fieldnum(RDeferralsBook,Status)); if (Cat_OpenDef.value() == NoYes::No) { qbrStatus.value(enum2str(RDeferralsStatus::Open)); } else { qbrStatus.value(SysQuery::valueUnlimited()); } super(); } 1. Зачем вы делаете присоединение источника из кода? 2. Почему бы не сделать это присоединение в методe init() источника?  | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Все просто. Есть справочник. Он требует только одного источника - таблица РБП. Сейчас , если по РБП закрыты все модели в таблице моделей, то строка в форме списка РБП окрашивается в серый цвет (это прописано в методе на DS таблицы РБП), а нужно, чтоб ее не было видно. 
		
		
		
		
		
		
		
		
			Я предположила, что надо написать запрос в источнике формы на таблицу РБП. Чтобы определить закрыты все модели или нет, мне нужен еще один источник таблица моделей РБП. Но я не хочу корежить источник для формы, потому и не меняю его. Значит я не логично делаю? Ваш вариант, конечно, работает. Только в нем есть оговорка. Модели если нет, то в список этот РБП ни туда, ни туда не попадает. Большое спасибо, буду играть дальше. Последний раз редактировалось Arahnid; 18.04.2007 в 19:21.  | 
| 
	
 |