venerdì 24 novembre 2023

D365FFO - How to release to warehouse cross docking works even in case of warehouse "full reservation" release method

 In case in the warehouse setup we have the following parameters set 

-    Requirement for inventory reservation: Require full reservation

   Insufficient quantity response: Generate an error




It is still possible to release a sales order to warehouse even if there is no stock but at least a purchase order is marked against a sales order.

The crossdocking template is set in the following way:

-    Demand requirements set as Marking

-    Work template defined in the work template

-    Supply source defined as "Purchase order"

-    Location type: Location directives




We create the sales order as follows.


We create the purchase order directly from the sales order as follows.


In order to release the sales order to the warehouse it is required to launch the batch procedure as follows:

-    The value "Quantity to release": Reserved physically and cross dock



The sales order generates the following shipment.




The shipment has a planned cross docking defined as follows.

Instead if we use the fulfillment policy on the sales order header blocking the release to warehouse in case of missing items in the stock, the system is not able to skip the planned cross docking lines.


giovedì 23 novembre 2023

D365FFO - How to create a transfer order using the warehouse mobile app

Using the warehouse mobile app it is possible to generate a transfer order declaring the warehouse to we want to ship the goods and the license plate we want to move.

Before performing the transaction we have to set the following menu item.









Then we have to make sure that we have in stock (in the starting warehouse) the license plate that we want to move.



Then we access, in the warehouse mobile app, the menu item previously created.


We scan the destination warehouse.


We scan the license plate we want to move.


Once we complete the transfer order we can click on the button complete order underlined above.

Then we have to run the procedure "Process warehouse app events".

The transfer order will be then generated as follows.





martedì 21 novembre 2023

D365FFO - Register material consumption using warehouse mobile device

It is now possible to register the material consumption for production orders directly using the warehouse mobile device. In order to do it, the following feature "Register material consumption on the mobile app on a scale unit" must be switched on.



We create a production order, not setting any location directive for picking components or wave / work templates. At the end we release the production order not generating any work for picking goods, as reported below.


Then we can start the production order using the mobile app or the feature on the production order form (ensuring to not consume components while doing it).


After that we can access the warehouse mobile app feature related to the following menu item defined into the parameters.


Using the mobile app it is possible to generate automatically a picking list journal directly related to the production order.


After scanning the production order, it is required to scan the picking location as reported below.


Then it is required to scan all the other information:

- itemid

- batchid (if needed)

- serial number (if needed)

and to confirm the quantity to be picked as shown below.


Once completed the picking procedure the button Done must be clicked as reported below.


After clicking on the Done the system generates a picking journal posted against the production order scanned during the procedure.



lunedì 20 novembre 2023

D365FFO - How to backflush components using RAF from warehouse mobile device

In the warehouse mobile device app there is the option to report as finish (RAF from now on) the production orders using for instance the following setup in the menu item for mobile app.

While reporting as finished a production order it can be needed to consume all the production order components (backflush of components).

In order to do it the following parameters (Respect flushing principle during overpicking set to YES) must be set in the report as finished warehouse app menu item.


And the following must be set in the production order defaults form under the tab "Report as finished":

-    Picking list journal name

   Automatic bom consumption set to Flushing principle










Then on the Bom lines that we want to consume at the report as finished of the production orders we have to set as flushing principle "Finish" (as reported below).


Once we are reporting as finished a production order using the warehouse mobile app (as below)



We get the following journals posted on the production order related.


A picking list journal for consuming the components of the production order and a report as finished journal for producing the final item.




martedì 24 ottobre 2023

D365 FFO - Creare una form di selezione / deselezione

In questo post vediamo come creare una form selezione / deselezione, come quelle che c'è sui batch group per esempio:



La form inoltre avrà anche un campo per poter filtrare il nome degli elementi

Per creare queste form AX mette disposizione l'oggetto "SysListPanelRelationTableCallback"

Allo scopo occorrono 3 Tabelle:

1) Anagrafica dei gruppi (LILGroupTable)

2) Anagrafica degli elementi che assegneremo di volta in volta ai gruppi (LILElementTable)

3) Tabella che contiene il legame (LILGroupElementTable), che sarà interemente gestita tramite l'oggetto "SysListPanelRelationTableCallback"

Ogni elemento inoltre potrà appartenere contemporaneamente a più di un gruppo alla volta.

Le tre tabelle saranno così fatte:




                                                 


Definiamo a questo punto una nuova form con il seguente design:



E che conterrà il seguente codice:
 [Form]  
 class LILGroupElementInfo extends FormRun  
 {  
   SysListPanelRelationTableCallback sysListPanel;  
   Num                groupId;  
   Description            elementNameFilter;  
   
   public void close()  
   {  
     sysListPanel.finalize();  
     super();  
   }  
   
   void init()  
   {  
     #ResAppl  
   
     sysListPanel = SysListPanelRelationTableCallback::newForm(element,  
                element.controlId(formControlStr(LILGroupElementInfo, ListPanelGroup)),  
                "@SYS113180", "@SYS78228", #ImageUser,  
                tablenum(LILGroupElementTable),  
                fieldnum(LILGroupElementTable, ElementId),  
                fieldnum(LILGroupElementTable, GroupId),  
                tablenum(LILElementTable),  
                fieldnum(LILElementTable, ElementId),  
                [fieldnum(LILElementTable, ElementId), fieldnum(LILGroupTable, Description)],  
                fieldNum(LILElementTable, Description), '',  
                identifierstr(Validate), '', '');  
     sysListPanel.parmDataRangeAsFilter(true);  
   
     super();  
   
     sysListPanel.init();  
   }  
   
   public edit str elementNameFilter(boolean _set, str _elementName)  
   {  
     if (_set && _elementName != elementNameFilter)  
     {  
       elementNameFilter = _elementName;  
     }  
   
     return elementNameFilter;  
   }  
   
   void tabChanged(int fromTab, int toTab)  
   {  
     #define.TabGroups(1)  
     #define.TabGroupElement(2)  
   
     groupId = LILGroupTable.GroupID;  
     switch (toTab)  
     {  
       case #TabGroups:  
         break;  
       case #TabGroupElement:  
         sysListPanel.parmDataRangeValue(elementNameFilter ? elementNameFilter : '*');  
         sysListPanel.parmRelationRangeValue(LILGroupTable.GroupID);  
         sysListPanel.parmRelationRangeRecId(LILGroupTable.RecId);  
         sysListPanel.fill();  
         break;  
     }  
   }  
   
   boolean validate(userId _userId, AddRemove _addRemove, SysListPanelRelationTable _listViewHandler)  
   {  
     return true;  
   }  
   
   [DataSource]  
   class LILGroupTable  
   {  
     public boolean validateWrite()  
     {  
       boolean ret;  
   
       str leftTrimedGroupId;  
       str rightTrimedGroupId;  
    
       leftTrimedGroupId = strltrim(LILGroupTable.GroupID);  
       rightTrimedGroupId = strrtrim(leftTrimedGroupId);  
   
       LILGroupTable.GroupID = rightTrimedGroupId;  
   
       ret = super();  
   
       return ret;  
     }  
   
     int active()  
     {  
       int ret;  
   
       ret = super();  
       element.elementNameFilter(true, '');  
       element.tabChanged(0, tab.tab());  
       return ret;  
     }  
   
   }  
   
   [Control("Tab")]  
   class Tab  
   {  
     void tabChanged(int fromTab, int toTab)  
     {  
       element.tabChanged(fromTab, toTab);  
       super(fromTab, toTab);  
     }  
   
   }  
   
   [Control("TabPage")]  
   class Groups  
   {  
     public boolean allowPageDeactivate()  
     {  
       boolean ret;  
   
       ret = super();  
   
       if (!LILGroupTable.RecId)  
       {  
         if (LILGroupTable_ds.validateWrite())  
           LILGroupTable.write();  
         else  
           return false;  
       }  
   
       return ret;  
     }  
   
   }  
   
   [Control("Button")]  
   class FilterButton  
   {  
     public void clicked()  
     {  
       super();  
   
       sysListPanel.parmDataRangeValue(elementNameFilter ? elementNameFilter : '*');  
       sysListPanel.fill(true);  
     }  
   
   }  
   
 }  

Il risultato sarà il seguente:







mercoledì 27 settembre 2023

D365FFO - Messaggio di errore: "Stopped (error): X++ Exception: The text associated with this work item cannot be found in the assignee’s language"


Eseguire i seguenti passaggi:

  1. Richiamare il Workflow;
  2. Andare alla versione attiva del flusso e controllare che la configurazione del flusso di lavoro disponga delle traduzioni nelle lingue utilizzate dagli utenti come lingue predefinite;
  3. Controllare che la lingua predefinita degli utenti del flusso sia la stessa in uso dal workflow.


D365FFO - Financial Tag

 

La feature Financial Tag, attivabile dalla Gestione funzionalità dà la possibilità di definire fino a 20 tag definiti dall’utente, da utilizzare nei giornali (Giornale generale e Giornale generale globale).

Caratteristiche ed utilizzo dei Finacial Tag:

  • I tag non fanno parte della struttura dei conti;
  • I valori dei tag non vengono convalidati durante l’immissione o la registrazione;
  • I valori dei tag predefiniti non vengono immessi dai dati anagrafici;
  • I valori dei tag non sono inclusi nei set di dimensioni, in D365 non è possibile generare un bilancio di verifica per visualizzare i saldi per i valori dei tag. I valori dei tag sono visualizzati come dettaglio delle transazioni;
  • I tag dovrebbero essere utilizzati per tenere traccia di valori non riutilizzabili (numeri di documi o numeri di riferimento);
  • Possono essere attivi o disattivati in qualsiasi momento;
  • Non possono essere eliminati;
  • I valori dei tag vengono utilizzati solo per l’analisi e l’elaborazione interna;
  • I tag vengono impostati a livello di persona giuridica, possono essere condivisi utilizzando la funzione Dati condivisi.

1 Set up


1.1 Impostazione delimitatore dei Financial Tag


In Contabilità generale à Impostazione contabilità generale à Parametri di contabilità generale, selezionare il Tab Tag finanziari e definire il Delimitatore segmento di tag finanziari. Il delimitore non deve essere utilizzato in nessun valore di tag immesso nelle transazioni e non può essere modificato dopo essere stato definito.



       1.2 Creazione Financial Tag

In Contabilità generale à Piano dei conti à Tag finanziari à Tag finanziari, selezionare Nuovo e creare un Tag finanziario.

  •          Inserire l’etichetta (non sono ammessi gli spazi ed i caratteri speciali);
  •         Nel campo Tipo valore selezionare Testo, Elenco o Elenco personalizzato;
  •         Se si è selezionato Elenco nel campo Tipo valore, selezionare l’origine valore nel campo           Utilizza valori da. Il campo contiene un elenco di entità da cui è possibile seleziona i valori       dei tag durante l’immissione della transazione.






Selezionare il Tab Attiva o disattiva tag per attivare il tag finanziario creato e poi selezionare OK.




       2 Inserimento Financial Tag nelle transazioni


Quando si immettono le registrazioni, è possibile definire i valori dei Tag nell’intestazione delle registrazioni. Tali valori verranno utilizza come valori predefiniti per le righe del giornale. Come per gli altri valori predefiniti nel giornale, verranno automaticamente inseriti nelle nuove righe aggiunte al giornale.




È possibile immettere il Tag finanziario direttamente sulla singola riga del giornale.




       2.1 Esempi di utilizzo

  • Stock: tenere traccia di tutte le transazioni per un’unità specifica tutta la vita di un bene;
  • Ratei fornitore: tenere traccia delle spese maturate per fornitore nella contabilità generare (inserendo l’ID fornitore per le spese provenienti dalle voci di competenza);
  • Lotto: tracciamento delle spese per lotti specifici, valore aggiunto, ecc. passando attraverso la contabilità generale;
  • Campagne di marketing: tenere traccia delle spese in base alla campagna di marketing.

martedì 26 settembre 2023

D365FFO - Creare campi calcolati su una vista

In questo post vediamo come creare campi calcolati su una vista.Come esempio creiamo una vista basata su VendTable che mostra come colonne l'account num e le dimensioni finzanziarie di default "Cost center" e "Business unit". Questa possibilità è stata introdotta con AX 2012 e potenziata con la 365. In Ax 2009 invece non è possibile aggiungere metodi alle viste.

1) Creare una nuova view che chiameremo LILVendTableDefaultDimension

2) Aggiungere come datasource VendTable

3) Aggiungere AccounNum come field

4) Aggiungere due nuovi campi di tipo string così:


        che chiameremo CostCenter e BU

5) Aggiungere due nuovi metodi alla vista, che chiameremo  getCostCenterDisplayValue e getBUDisplayValue,per recuperare il display value della dimensione CostCenter e Business unit

 public static str getCostCenterDisplayValue()  
   {  
     str VendTableDefaultDimension = SysComputedColumn::returnField(tableStr(LILVendTableDefaultDimension)  
                                     ,dataEntityDataSourceStr(LILVendTableDefaultDimension,VendTable)  
                                     ,fieldStr(VendTable, DefaultDimension));  
   
     str backingEntityType = int2Str(tableNum(DimAttributeOMCostCenter));  
   
   
     return strFmt(@"select  
                 top 1 DimensionAttributeValueSetItemView.DISPLAYVALUE  
             from  
                 DimensionAttributeValueSetItemView  
             join  
                 DIMENSIONATTRIBUTEVALUE  
             on  
                 DIMENSIONATTRIBUTEVALUE.RECID = DimensionAttributeValueSetItemView.DIMENSIONATTRIBUTEVALUE  
             join  
                 DIMENSIONATTRIBUTE  
             on  
                 DIMENSIONATTRIBUTE.RECID = DimensionAttributeValueSetItemView.DIMENSIONATTRIBUTE  
             where  
                 DIMENSIONATTRIBUTEVALUESET = %1  
             and   BACKINGENTITYTYPE     = %2",VendTableDefaultDimension  
                                 ,backingEntityType);  
   }  
 public static str getBUDisplayValue()  
   {  
     str VendTableDefaultDimension = SysComputedColumn::returnField(tableStr(LILVendTableDefaultDimension)  
                                     ,dataEntityDataSourceStr(LILVendTableDefaultDimension,VendTable)  
                                     ,fieldStr(VendTable, DefaultDimension));  
   
     str dimensionName = 'BusinessUnit';  
   
   
     return strFmt(@"select  
                 top 1 DimensionAttributeValueSetItemView.DISPLAYVALUE  
             from  
                 DimensionAttributeValueSetItemView  
             join  
                 DIMENSIONATTRIBUTEVALUE  
             on  
                 DIMENSIONATTRIBUTEVALUE.RECID = DimensionAttributeValueSetItemView.DIMENSIONATTRIBUTEVALUE  
             join  
                 DIMENSIONATTRIBUTE  
             on  
                 DIMENSIONATTRIBUTE.RECID = DimensionAttributeValueSetItemView.DIMENSIONATTRIBUTE  
             where  
                 DIMENSIONATTRIBUTEVALUESET = %1  
             and   DIMENSIONATTRIBUTE.NAME  = '%2'",VendTableDefaultDimension  
                                  ,dimensionName);  
   }  
N.B: se si usano le stringhe nei parametri della where ( per esempio dimensionattribute.name =...) vanno messi tra doppi apici ''

6) Compilare le proprietà ViewMethod dei due campi coi nomi dei metodi appena creati

7) Buildare e sincronizzare



In AX 2012 la firma del metodo deve contenere la parola "server":

 public static server str getBUDisplayValue()  
Inoltre la funzione 

dataEntityDataSourceStr

Non è disponibile è và sostituita con la stringa del nome del datasource nella view

giovedì 10 agosto 2023

How to extend the Dialog class in D365 FFO

How to extend the standard class DIALOG in order to use in different points the custom methods(like lookup, validation etc).
It can be useful to use methods and standardize the code.

class MyCustomDialog extends Dialog

  public void my_lookupCustom(FormControl _callingControl )
  {
  // some code
  }
  boolean my_validateCustom(FormControl _callingControl)
  {
    // some code
  }
  boolean my_CustomGenericMethod(FormControl _callingControl)
  {
     // some code
  }
}

How to use the custom methods:

MyCustomDialog dialog; // use my custom class

dialog = new MyCustomDialog("TEXT");
dialog.addText("Some text");
dialog.my_CustomGenericMethod(....) ; 

Another way to use the custom methods:

// other example
 fieldSite.registerOverrideMethod(methodStr(FormStringControl, validate),
                                  methodStr(MyCustomDialog , my_validateCustom), dialog); 

Below how appear:




We can create different methods to meet our needs.

enjoy

sabato 24 giugno 2023

D365FO - KIT management

 In D365Fo there is a standard embedded kit management. It is reachable at the following menu Retail and Commerce.


Three functions are available in that place:

-    Product kits

-    Released product kits

   Kit orders


The first function allows the generation of a product having the flag kit activated as reported below.


Clicking on the button Configure in the button group Product kit, it's possible to define all the components the kit is made of.


Once the kit is approved, it will automatically generate a new variant related to the product master, usable everywhere in the system (it is then visible in the menu Released product kits).

For producing instead a Kit it is required to access the Kit order menu previously mentioned.


Once the warehouse is defined and the quantities to be produced, clicking on the button Post the system will consume the components and produce the kitted product (this function will use a BOMJournal to perform this activity).