Ваш синтаксис правильный.Класс DesktopWrapper Flashbuilder для Force.com напрямую взаимодействует с локальным хранилищем данных, которое в свою очередь обрабатывает синхронизацию с Force.com.К сожалению, в текущем выпуске запросы отношений не поддерживаются в локальном хранилище и из него.Вот почему вы видите ваш запрос «плоским».
Обратите внимание, что в окне консоли регистрируется перевод с SOQL на SQL.SQLl - это то, что выполняется для локального хранилища.
Если вам нужно отключить данные, вам потребуется выполнить два запроса через класс app.wrapper и сопоставить или объединить данные на клиенте.Поскольку ActionScript является динамическим, вы можете просто прикрепить данные учетной записи к контактным данным с соответствующим идентификатором учетной записи.
Вот пример того, как это может выглядеть:
[Bindable]
protected var myData:ArrayCollection = new ArrayCollection();
protected function loginCompleteHandler( event : LoginResultEvent ) : void {
CursorManager.removeBusyCursor();
// When the login is complete the main state should be shown.
currentState = "main";
//Execute the contact Query
app.wrapper.query("Select Id, FirstName, LastName, AccountId From Contact",
new AsyncResponder(contactQueryHandler, faultHandler, myData)
);
}
// This function will iterate over the results creating a string value for the
// "in" clause of the embedded Account query. It also creates a field on the
// Contact dynamic entity so that our data binding works after initially setting
// the data provider variable.
protected function contactQueryHandler(qr:ArrayCollection, token:Object):void {
var acctIdss:String = "";
for each(var contact:DynamicEntity in qr) {
if (contact.AccountId != null && acctIdss.indexOf(contact.AccountId) == -1) {
acctIdss += "'" + contact.AccountId + "',";
}
contact.AccountName = ""; // Add field to contact for account name
myData.addItem(contact); // Add contact to grid data data provider
}
acctIdss = acctIdss.substr(0, acctIdss.length - 1);
// Query for the accounts based on the account ids found in the contact list
app.wrapper.query("Select Id, Name From Account Where Id in (" + acctIdss + ")",
new AsyncResponder(accountQueryHandler, faultHandler));
}
// This function simply iterates over the results and then iterates over the data grid
// data provider to set the Account name for the correct contact. Since data binding has
// already occurred, the account name will be automatically displayed in the grid.
protected function accountQueryHandler(accounts:ArrayCollection, token:Object):void {
for each (var account:DynamicEntity in accounts) {
for each(var contact:DynamicEntity in myData) {
if (contact.AccountId == account.Id) {
contact.AccountName = account.Name;
}
}
}
}
<s:Group includeIn="main"
enabled="{!app.loginPending}"
width="100%"
height="100%">
<s:layout>
<s:BasicLayout/>
</s:layout>
<s:VGroup paddingTop="10"
paddingLeft="10"
paddingRight="10"
paddingBottom="10" width="100%" height="100%">
<mx:DataGrid id="dGrid" dataProvider="{myData}" width="100%" height="100%">
</mx:DataGrid>
</s:VGroup>
<flexforforce:StatusBar left="0"
bottom="0"/>
</s:Group>
Если вывам не нужно иметь возможность работать в автономном режиме, вы можете использовать исходный запрос с объектом app.connection.