02.07.2003, 13:50 | #1 |
Участник
|
Как же все-таки организованиы Query и QueryRun?
У меня след. вопрос: я создаю запрос из кода, и в него добавляю два источника данных. Добавленные источники данных лежат на одном уровне, и связываются по полю MainId:
{ Query q = New Query(); q.addDatasource(tablenum(MainTable)); q.addDatasource(tablenum(LineTable)); q.dataSourceTable(LineTable).addRange(fieldnum(LineTable,MainId)).value("MainTable.MainId"); } Если данный запрос я присоединяю к источнику данных на форме, отображающей главную и подчиненную форму - то все работает прекрасно. Вопрос: Как я могу обратиться к записям таблиц(главной и подчиненной) через Query, QueryRun, в случае, если Query построен вышеописанным способом? Следующий метод возвращает пустую запись в LineTable: { QueryRun qr = New QueryRun(q); MainTable MainTable; LineTable LineTable; while (qr.next()) { MainTable = qr.get(MainTable); SalesTable = qr.get(LineTable); //пустая запись } } Также не помогло создавать для подчиненной таблицы свой QueryRun на основе Query с уже подставленным Range - возвращает произвольный набор строк из подчиненной таблицы |
|
03.07.2003, 13:01 | #2 |
Юзовские
|
Помести один datasource внутрь другого, например так:
PHP код:
PHP код:
|
|
03.07.2003, 15:10 | #3 |
Участник
|
Допустим у меня в MainTable и LineTable след. записи:
Заказ1 СтрокаLine1 СтрокаLine2 Заказ2 СтрокаLine3 Проблема в том, что если я так сделаю(свяжу источники данных, как главная и подчиненная, как addLink работает), то связь между таблицами MainTable и LineTable будет только InnerJoin (OuterJoin и т.д.) и после прикрепления этого запроса к источнику данных на форме данные будут отражаться след. образом: Заказ1 СтрокаLine1 СтрокаLine2 Заказ1 СтрокаLine1 СтрокаLine2 Заказ2 СтрокаLine3 А нужно, чтобы в query был независимый источник данных по MainTable(1-ый) и независимый источник данных по LineTable(2-ой), записи по которому отбираются по значению MainId в 1-м источнике данных. Непонятно, почему если я такой запрос присоединяю к источнику данных формы - все работает правильно, а когда делаю: MainTable MainTable; LineTable LineTable; QueryRun qr_main = New QueryRun(q);//q - исходный запрос QueryRun qr_desc; while (qr.next()) { MainTable = qr.get(tblenum(MainTable)); q.datasource(2).findrange(fieldnum(LineTable,MainId)).value(MainTable.MainId); qr_desc = New QueryRun(q); while (qr_desc.next())//СРАБОТАЕТ СТОЛЬКО РАЗ, СКОЛЬКО ЗАПИСЕЙ //В MAINTABLE + ОТОБРАННЫЕ ЗАПИСИ В LINETABLE????!!!!!! { .....отберет почему-то больше записей } } |
|
03.07.2003, 15:21 | #4 |
Юзовские
|
Если тебе все это надо для того чтобы сделать форму (похожую на заказы), то это можно сделать без программирования. На свойствах datasours'a формы есть свойства JoinSource и LinkType.
|
|
03.07.2003, 15:22 | #5 |
Участник
|
Черт побери Вообще-то, это логично, что queryrun выполняется по всем строкам всех входящих источников данных в Query!!!
В таком случае, надо формировать два query - для главной и подчиненной таблицы. На формах, кстати, автоматически так и делается - переменные MainTable_Q и LineTable_Q. |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Как подставить вычисляемое значение в Range у query | 16 | |||
Установка условия ИЛИ (OR) в Query | 3 | |||
Проблема с составлением Query | 10 | |||
queryRun в рамках RunBaseBatch | 6 | |||
Еще раз о Query | 7 |
|