2010-10-11 3 views
1

Je rencontre un problème lors de la conversion, par exemple, du champ AccountId dans Contacts en Nom du compte à partir de l'objet de compte.Problème Adobe Salesforce Modification de l'ID en Nom

J'ai essayé la requête suivante:

Nom select, Account.Name de contacter

Mais quand je regarde la console quand je déboguer l'application, je vois que cela a été converti en

select Salutation, FirstName, LastName, accountid from Entity_Contact

Le résultat est que seul l'identificateur de compte est affiché, que j'aurais pu obtenir à partir de l'enregistrement de contact en premier lieu.

Y at-il un moyen d'obtenir le nom du compte afin que je puisse l'afficher dans un DataGrid.

Merci

Roy

+0

Utilisez-vous Flash Builder pour Force.com? Si oui, je pense qu'il ne peut pas prendre en charge ces requêtes descendant. –

+0

Oui, je suis, d'une autre façon est là pour créer une application Air qui me permet d'utiliser ce type de requête, ou y at-il un workarround ?? – Roy

Répondre

3

Votre syntaxe est correcte. La classe DesktopWrapper de Flashbuilder for Force.com interagit directement avec le magasin de données local, qui à son tour gère la synchronisation avec Force.com. Malheureusement, dans la version actuelle, les requêtes de relation ne sont pas prises en charge depuis et vers le magasin local. C'est pourquoi vous voyez votre requête "aplatie".

Notez dans la fenêtre de la console que ce qui est enregistré est la traduction de SOQL vers SQL. Le SQLl est ce qui est exécuté par rapport au magasin local.

Si vous devez mettre les données hors ligne, vous devez exécuter deux requêtes via la classe app.wrapper et corréler ou joindre les données sur le client. Comme ActionScript est dynamique, vous pouvez simplement associer les données du compte aux données de contact avec l'identifiant de compte correspondant.

Voici un coup de poignard à ce qui pourrait ressembler à:

  [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> 

Si vous n'avez pas besoin d'avoir une capacité hors ligne, vous pouvez utiliser votre requête d'origine avec l'objet app.connection.

Questions connexes