|  12.04.2015, 22:27 | #1 | 
| Участник | Полученное значение через QueryBuildDataSource 
			
			Как определить, вернулось ли что-нибудь с помощью QueryBuildDataSource?
		 | 
|  | 
|  12.04.2015, 23:02 | #2 | 
| Участник | 
			
			Нужно создать queryRun для всей query (к которой добавлен queryBuildDataSource), и вызвать на нем next() - это вернет true, если квери вернула что-нибудь.
		 | 
|  | 
|  12.04.2015, 23:07 | #3 | 
| Участник | 
			
			Возвращает true в любом случае. Могу предоставить код если необходимо. | 
|  | 
|  12.04.2015, 23:11 | #4 | 
| Участник | 
			
			Не утруждайтесь - это только начинающие программисты смотрят в исходный код, а настоящие гуру умеют всю нужную информацию видеть в хрустальном шаре. PS. См. также Как правильно задать вопрос, чтобы быть услышанным Последний раз редактировалось gl00mie; 12.04.2015 в 23:14. Причина: PS | 
|  | 
|  12.04.2015, 23:14 | #5 | 
| Участник | X++: Query query = new Query(); QueryRun queryRun; QueryBuildDataSource qbds; ; qbds = query.addDataSource(tableNum(RContractTable)); qbds.addRange(fieldNum(RContractTable, RContractAccount)).value(PayRequestTable.RContractAccount); queryRun = new QueryRun(query); if (queryRun.next()) { info("true"); } else if (!queryRun.next()) { info("false"); } | 
|  | 
|  12.04.2015, 23:22 | #6 | 
| Участник | 
			
			Всегда используйте queryValue() (он же SysQuery::value()) для "обработки" значений, подставляемых в QueryBuildRange, в данном случае для PayRequestTable.RContractAccount. Вероятно, соотв. значение в вашем случае - пустое, поэтому выборка из таблицы договоров фактически идет без фильтрации по рег.номеру - см. также, какое значение возвращает SysQueryValue::unlimited().
		 | 
|  | |
| За это сообщение автора поблагодарили: bitter (1). | |
|  12.04.2015, 23:49 | #7 | 
| Участник | Цитата: X++: if (queryRun.next()) { info("true"); } else { info("false"); } | 
|  | |
| За это сообщение автора поблагодарили: bitter (1). | |
|  13.04.2015, 00:08 | #8 | 
| Участник | Цитата: 
		
			Сообщение от gl00mie
			   Всегда используйте queryValue() (он же SysQuery::value()) для "обработки" значений, подставляемых в QueryBuildRange, в данном случае для PayRequestTable.RContractAccount. Вероятно, соотв. значение в вашем случае - пустое, поэтому выборка из таблицы договоров фактически идет без фильтрации по рег.номеру - см. также, какое значение возвращает SysQueryValue::unlimited(). Цитата: Я понял почему всегда возвращает true. Я сравниваю полученное значение со значением в таблице, которое априори там присутствует. Соответственно вопрос был задан некорректно, прошу прощения. Попытаюсь расписать алгоритм, который мне необходимо реализовать. На форме есть лукап, с помощью которого я выбираю значение из таблицы, по этому значению мне необходимо найти строку в другой таблице и выяснить заполнено ли определенное поле в данной строке. От того, заполнено ли это поле, будут зависеть мои дальнейшие действия. Я не совсем понимаю как мне выяснить заполнено ли поле найденной строки. Необходимо добавить еще один рейндж с этим полем в QueryBuildDataSource? | 
|  | 
|  13.04.2015, 03:14 | #9 | 
| Участник | 
			
			Для строкового поля: X++: qbds.addRange(fieldNum(, )).value(SysQuery::valueNotEmptyString());X++: qbds.addRange(fieldNum(, )).value(SysQuery::valueNot(0));Можно сделать через select X++: /* Выбираем первую попавшуюся запись с искомым RContractAccount и заполненым полем ContractDate */ select firstOnly RecId from rcontractTable where rcontractTable.RContractAccount == payRequestTable.RContractAccount && rcontractTable.ContractDate; /* Ваше поле */ if (rcontractTable) { info("запись существует"); } | 
|  | |
| За это сообщение автора поблагодарили: bitter (1). | |
|  13.04.2015, 07:51 | #10 | 
| Участник | Цитата: Если "таких" строк в принципе не может быть больше одной (выборка происходит по уникальному ключу), то возможно логичнее сначала прочитать значение этой записи (каким бы оно ни было пустым или заполненным) - проверить что сама запись в таблице есть, а уже вторым шагом проверить заполненность поля в выбранной записи. X++: if (queryRun.next()) { RContractTable = queryRun.get(tableNum(RContractTable)); // получаем выбранную запись if (RContractTable.ContractDate) { info("Поле заполнено"); } else { info("Поле не заполнено"); } } else { info("Запись не найдена"); } Последний раз редактировалось S.Kuskov; 13.04.2015 в 07:54. | 
|  | |
| За это сообщение автора поблагодарили: bitter (1). | |
|  13.04.2015, 10:22 | #11 | 
| Участник | |
|  |