2010-11-29 6 views
1

Je souhaite envoyer une alerte dans Ax, lorsqu'un champ de la table du fournisseur change (et lors de la création/suppression d'un enregistrement).Dynamique Axe: Alerte lorsqu'un changement d'enregistrement

Dans l'alerte, je voudrais inclure la valeur précédente et actuelle. Mais, il semble que vous ne pouvez pas définir d'alertes pour les champs d'une table qui changent, mais que vous devez en définir un pour CHAQUE CHAMP ?! J'espère que je me trompe.

Et comment puis-je envoyer cette notification à un groupe de personnes

Répondre

3

j'ai créé une nouvelle classe avec une méthode statique que je peux facilement appeler de toute méthode .update() me alerter quand un enregistrement change, et ce qui a changé dans le dossier. Il utilise également les modèles d'e-mail intégrés de Axe.

static void CompareAndEmail(str emailTemplateName, str nameField, str recipient, Common original, Common modified) 
{ 
    UserInfo userInfo; 
    Map   emailParameterMap = new Map(Types::String, Types::String); 
    str   changes; 
    int   i, fieldId;  
    DictTable dictTable = new DictTable(original.TableId); 
    DictField dictField; 
; 

    for (i=1; i<=dictTable.fieldCnt(); i++) 
    { 
     fieldId = dictTable.fieldCnt2Id(i); 
     dictField = dictTable.fieldObject(fieldId); 

     if (dictField.isSystem()) 
      continue; 

     if (original.(fieldId) != modified.(fieldId)) 
     { 
      changes += strfmt("%1: %2 -> %3 \n\r", 
       dictField.name(), 
       original.(fieldId), 
       modified.(fieldId) 
      ); 
     } 
    } 

    //Send Notification Email 
    select Name from UserInfo where userInfo.id == curUserId(); 
    emailParameterMap.insert("modifiedBy", userInfo.Name); 
    emailParameterMap.insert("tableName", dictTable.name()); 
    emailParameterMap.insert("recordName", original.(dictTable.fieldName2Id(nameField))); 
    emailParameterMap.insert("recordChanges", changes); 

    SysEmailTable::sendMail(emailTemplateName, "en-us", recipient, emailParameterMap); 
} 

Puis, dans la méthode .update() j'ajouter juste cette ligne

//Compare and email differences 
RecordChangeNotification::CompareAndEmail(
    "RecChange",   //Template to use 
    "Name",     //Name field of the record (MUST BE VALID) 
    "[email protected]", //Recipient email 
    this_Orig,    //Original record 
    this     //Modified record 
); 

Les seules choses que je veux améliorer sont:

  • déplacer le nom du modèle et le destinataire dans une table , pour faciliter la maintenance
  • meilleur formatage pour la liste des modifications, je ne sais pas comment modéliser cela (voir: here)
2

Comme vous l'avez observé le système d'alerte n'est pas conçu pour « tout » changements sur le terrain, les changements que spécifiques sur le terrain.

Il s'agit d'une demande bidon, car cela générerait de nombreuses alarmes. La bonne chose à faire est d'activer la journalisation de la base de données de la table VendTable, puis envoyer un rapport quotidien (en lot) à ceux qui sont intéressés. Cela se fait dans Administration \ Setup \ Logging de base de données. Il y a un rapport dans Administration \ Rapports. Vous aurez besoin de connaître le numéro de la table pour sélectionner la table. Cette solution nécessite une clé de licence "Database logging".

+0

Ce n'est pas une "demande bidon". Lorsque les modifications sont enregistrées, nous souhaitons envoyer un e-mail unique avec les champs modifiés et leurs valeurs antérieures. Envoyer un lot quotidien est trop tard.Nous sommes en 2010, nous ne devrions pas travailler avec des lots nocturnes pour fournir des informations. Les vendeurs sont rarement mis à jour, mais s'ils sont modifiés, nos dirigeants veulent savoir IMMÉDIATEMENT. – CaffGeek

+0

Ok, puis exécutez le rapport chaque minute ou heure ce qui convient à vos cadres. –

+0

La solution que j'ai fournie est assez simple et délivre. Vous ne pouvez pas vous attendre à ce qu'AX fournisse une fonction imaginable dans la boîte. Votre demande de cadres n'est pas commune! –

1

Si vous avez vraiment besoin de cette fonctionnalité, vous pouvez créer une classe qui envoie un message/courrier électronique avec l'empreinte de l'ancien enregistrement par rapport au nouvel enregistrement. Ensuite, ajoutez simplement du code dans la méthode de table "write"/"update"/"save" pour vous assurer que la classe est exécutée chaque fois que vendtable est édité. Mais je suis d'accord avec Jan. Cela va générer beaucoup d'alertes. Je passerais un peu d'énergie à vérifier si les modifications effectuées dans vendtable sont conformes aux besoins de l'entreprise et à interdire les modifications illégales. Cela inclut de s'assurer que seules les bonnes personnes ont un accès suffisant.

Bonne chance!

+0

en s'assurant que les bonnes personnes ont accès. Il n'y a que 2 personnes avec un accès d'édition, mais cela ne signifie pas qu'elles sont les seules à avoir besoin de savoir quand des changements se produisent. Et je ne comprends pas non plus comment cela va générer "beaucoup d'alertes". Les enregistrements des fournisseurs sont mis à jour en moyenne 3 fois par jour au total (nous avons effectué des statistiques sur l'historique des modifications dans notre ancien logiciel). C'est 3 emails par jour. Un pour chaque fournisseur qui a été changé, quand il a été changé. A peine "beaucoup d'alertes". – CaffGeek

1

Je suis d'accord avec la suggestion de Skaue.vous écrivez juste et classe pour envoyer le courrier des changements dans la table de vente. et exécutez cette classe sur la méthode update de vendtable.

Merci et salutations, Deepak Kumar