Tuesday, April 16, 2013

lookup et lookupReference sous AX 2012

Sous AX 2012, le système travaille sur beaucoup de tables avec des références de clés (RecID --> RefRecId). Contrairement à 2009, où les clés sont basées sur des Id indexés et non doublonnés, Ax 2012 avec son système de RecId permet d'homogénéiser les types de jointure entre les tables et également de faciliter l'affichage et la sélection sous forme de lookup par référence à une table.

C'est la différence entre un lookup (liste de choix) classique type "2009" et ceux de 2012 (LookupReference).

Pour créer un lookup sur clé classique (type Id), le lookup peut être implémenté par exemple dans un formulaire, directement dans le DataSource du champs ou directement en méthode de Designs.
Cette méthode ne renverra aucun objet car la requête est intrisèque au formulaire.
Dans les bonnes pratiques, vous appelerez si possible une méthode lookup de la table depuis le formulaire via un super().

Pour un lookup sur une référence (RefRecId), on utilise une méthode lookupReference qui renvoi un objet cette fois, l'objet de référence du recid (DirPartyTable par exemple).
Cet objet renvoyé par la méthode sera automatiquement retraité en recId par le referenceGroup de votre champ de formulaire et bénéficiera de l'affichage correspondant (souche par exemple).

Syntaxe :

public client static DirPartyTable lookupReferenceParty(FormReferenceControl _formRefControl,CustAccount _custAccount)
{
DirPartyTable dirPartyTable; // instancier un buffer
Query query =
new Query();
QueryBuildDataSource queryBuildDataSourceParty;
QueryBuildDataSource queryBuildDataSourceContact;
QueryBuildRange queryBuildRange;
SysReferenceTableLookup sysRefTableLookup;
;
 
//Create an instance of SysTableLookup with the form control passed in
sysRefTableLookup = SysReferenceTableLookup::newParameters(
tablenum(DirPartyTable), _formRefControl);

//Add the fields to be shown in the lookup form
sysRefTableLookup.addLookupfield(
fieldnum(DirPartyTable,Name));
//create the query datasource
queryBuildDataSourceParty = query.addDataSource(
tablenum(DirPartyTable));
queryBuildDataSourceContact = queryBuildDataSourceParty.addDataSource(
tableNum(ContactPerson));
queryBuildDataSourceContact.relations(
true);
queryBuildDataSourceContact.joinMode(JoinMode::ExistsJoin);
queryBuildRange = queryBuildDataSourceContact.addRange(fieldnum(ContactPerson, CustAccount));
queryBuildRange.value(
strFmt(_custAccount));

//add the query to the lookup form
sysRefTableLookup.parmQuery(query);
dirPartyTable = sysRefTableLookup.performFormLookup();
//alimenter le buffer
return dirPartyTable; // retourner l'objet
}

Ici un exemple de lookupReference qui va filtrer sur un client (méthode de table)

Dans la partie formulaire, l'appel sera fait ainsi :

public
 Common lookupReference(FormReferenceControl _formReferenceControl)
{
DirPartyTable dirPartyTable;
dirPartyTable = InventJournalTrans::lookupReferenceParty(_formReferenceControl, ProjTable.CustAccount);
return dirPartyTable;
}

No comments:

Post a Comment