Mittwoch, 19. November 2014

AX2012: Eine einzelne Finanzdimension aus den Finanzdimensionen raus lösen und in ein Set von Finanzdimensionen hinzufügen. Hier am Beispiel der ProdTable und der Finanzdimension JobID




static void IAXfindLedgerDimension(Args _args)
{
    DimensionAttribute  DimensionAttribute;
    DimensionAttributeValue DimensionAttributeValue;
    DimensionAttributeValueSetItem    DimensionAttributeValueSetITem,DimensionAttributeValueSetITem2;
    DimensionAttributeValueSet  DimensionAttributeValueSEt;
    ProdTable           ProdTable,ProdTable2;
    DimensionDefault                defaultDimension;               
    ;
    ProdTable = ProdTable::find('000585');
    ProdTable2 = ProdTable::find('000584');

    DimensionAttributeValueSetITem  = DimensionAttributeValueSetItem::find(ProdTable.DefaultDimension);

    DimensionAttribute = DimensionAttribute::findByName('jobID');

    DimensionAttributeValueSet = DimensionAttributeValueSet::find(ProdTable.DefaultDimension);

    defaultDimension = DimensionDefaultingService::serviceReplaceAttributeValue(ProdTable2.DefaultDimension, DimensionAttributeValueSet.RecId, DimensionAttribute.RecId);
  
    ttsBegin;
        ProdTable2.selectForUpdate(true);
    ProdTable2.DefaultDimension = defaultDimension;
    ProdTable2.update();
    ttsCommit;
}
AX2012
Finanzdimensionen bei einem Debitoren per Code setzen


static void setFinancialDimensionToCustomer(CustAccount _custAccount) 
 { 
  CustTable custTable; 
  Struct struct = new Struct(); 
  container ledgerDimension; 
  DimensionDefault DimensionDefault; 
  ; 
  struct.add('BookingChannel', '30'); 
  struct.add('Carrier', '01'); 
  struct.add('Department', '30'); 
  struct.add('Destination', '01'); 
  struct.add('Division', '30'); 
  struct.add('Origin', '01'); 
  struct.add('Product', '30'); 
  ledgerDimension += struct.fields(); 
  ledgerDimension += struct.fieldName(1); 
  ledgerDimension += struct.valueIndex(1); 
  ledgerDimension += struct.fieldName(2); 
  ledgerDimension += struct.valueIndex(2); 
  ledgerDimension += struct.fieldName(3); 
  ledgerDimension += struct.valueIndex(3); 
  ledgerDimension += struct.fieldName(4); 
  ledgerDimension += struct.valueIndex(4); 
  ledgerDimension += struct.fieldName(5); 
  ledgerDimension += struct.valueIndex(5); 
  ledgerDimension += struct.fieldName(6); 
  ledgerDimension += struct.valueIndex(6); 
  ledgerDimension += struct.fieldName(7); 
  ledgerDimension += struct.valueIndex(7); 
  ttsBegin; 
  DimensionDefault = AxdDimensionUtil::getDimensionAttributeValueSetId(ledgerDimension); 
  custTable = CustTable::find(_custAccount, true); 
  custTable.DefaultDimension = DimensionDefault; 
  custTable.update(); 
  ttsCommit; 
 } 

Dienstag, 18. November 2014


AX2012 Reservierungen über Code ändern/setzen


Die folgenden beiden Zeilen funktionieren auch für die Salesline dazu einfach im construct die Salesline übergeben.


Eine negative Menge (hier -5) heißt, dass diese SalesLine 5 mehr reserviert, eine positive Menge reduziert die reservierte Menge


reservation = InventUpd_Reservation::newMovement(InventMovement::construct(WMSOrderTrans),-5,true);
reservation.updateNow();
AX2012


Dimensionsanzeige Formular in einem Formular hinzufügen




Today I will post about how to display only the inventory dimensions selected by the user.
This post is rather long because I decided show it step-by-step but I hope you guys enjoy it.

1. The table must have the field InventDimId and it must have a relation with InventDim.
Image
2. Create a new Form. My form has two data sources, InventDimDisplay and InventDim (required) and a grid.
Image
3. Set the InventDim data source properties to:
Image
4. On form Design, create a new Grid and move the ItemId to your grid and then create a new Group and then set the properties below:
Image
5. On class declaration add the following piece of code:
public class FormRun extends ObjectRun
{
    // Declare the class InventDimCtrl_Frm_EditDimensions
    InventDimCtrl_Frm_EditDimensions        inventDimFormSetup;
}
6. Now, create a new method in form.
public InventDimCtrl_Frm_EditDimensions inventDimSetupObject()
{
    return inventDimFormSetup;
}
7. Override the form’s method Init.
public void init()
{
    super();
    // This method will be used to show default fields at form startup
    element.updateDesign(InventDimFormDesignUpdate::Init);
}
8. Create a new method, this method is responsible to show the Inventory Controls.
void updateDesign(InventDimFormDesignUpdate mode)
{
    InventDimParm inventDimParmVisible;

    switch (mode)
    {
        // Form Init
        case InventDimFormDesignUpdate::Init    :
            if (!inventDimFormSetup)
                inventDimFormSetup  = InventDimCtrl_Frm_EditDimensions::newFromForm(element);
                inventDimFormSetup.parmSkipOnHandLookUp( true);

                // Use the methods on InventDimParm
                // to set which dimensions to show when form is initialized
                inventdimparmvisible.inventsiteidflag       = true;
                inventdimparmvisible.InventLocationIdFlag   = true;
                inventDimFormSetup.parmDimParmVisibleGrid(inventDimParmVisible);

        // Datasource Active
        case InventDimFormDesignUpdate::Active  :
            inventDimFormSetup.formActiveSetup(InventDimGroupSetup::newItemId(InventDimDisplay.ItemId)); //InventDimDisplay is the datasource name.
            inventDimFormSetup.formSetControls( true);
            break;

        // Datasource Field change
        case InventDimFormDesignUpdate::FieldChange :
            inventDimFormSetup.formActiveSetup(InventDimGroupSetup::newItemId(InventDimDisplay.ItemId)); //InventDimDisplay is the datasource name.
            InventDim.clearNotSelectedDim(inventDimFormSetup.parmDimParmEnabled()); // InventDim is referring to datasource name
            inventDimFormSetup.formSetControls( true);
            break;

        default :
            throw error(strFmt ("@SYS54195", funcName()));
    }
}
9. We have to create a method on data source to update our table InventDimId and use the method Active to refresh the controls.
Override Data source’s method Active.
public int active()
{
    int ret;
    ret = super();
    element.updateDesign(InventDimFormDesignUpdate::Active);
    return ret;
}
10. Now, override the method Modified for ItemId field in your data source.
public void modified()
{
    super();
   
    element.updateDesign(InventDimFormDesignUpdate::FieldChange);
    InventDim.clearNotSelectedDim(element.inventDimSetupObject().parmDimParmEnabled());
}
11. We have to create a MenuItemButton to call the Display Dimension form where the user can select which dimensions he want to display.
Set the following properties:
MenuItemType: Display
MenuItemName: InventDimParmFixed
12. By the end of this tutorial, your form should look like this.
Image
13. The results:
Image
AX2012
Klasse mit Query im Dialog


CLASS syncVendDlvTime Extends   RunBaseBatch
   
    METHODS
      SOURCE classDeclaration
        public class syncVendDlvTime extends RunBaseBatch
        {
            DialogRunbase   dialog;
       
            DialogField     dialogLocationspezific; //STandortspezifische Auftragseinstellungen
            DialogField     dialogItem; //Artikeldeckung
       
            NoYesId          Locationspecific;
            NoYesId         Item;
       
            QueryRun        QueryRun;
            Query                   query;
       
            DEFINE.CurrentVersion(1)
            LOCALMACRO.CurrentList
                Locationspecific,
                Item
            ENDMACRO
        }
      ENDSOURCE
      SOURCE dialog
        protected Object dialog()
        {
            Object ret;
            ;
            dialog = super();
            //ret = super();
       
            dialogLocationspezific = dialog.addFieldValue(extendedTypeStr(NoYesId),Locationspecific,"");
            dialogItem = dialog.addFieldValue(extendedTypeStr(NoYesId),Item,"");
            return dialog;
        }
      ENDSOURCE
      SOURCE getFromDialog
        public boolean getFromDialog()
        {
            boolean ret;
            ;
       
            ret = super();
            Locationspecific = dialogLocationspezific.value();
            Item = dialogItem.value();
       
            return ret;
        }
      ENDSOURCE
      SOURCE initQuery
    
        protected void initQuery()
        {          
            QueryBuildDataSource    qbds2;
       
            QueryBuildRange         qr_Item;
            QueryBuildRange         qr_vend;
            ;
            query = new Query();
            qbds2 = query.addDataSource(tableNum(VendTable));

            qbds2 = qbds2.addDataSource(tableNum(InventTable));
            qbds2.relations(false);
            qbds2.addLink(fieldNum(VendTable,AccountNum),fieldNum(InventTable,PrimaryVEndorId));
            queryRun = new QueryRun(query);
        }
      ENDSOURCE
      SOURCE queryRun
   
        QueryRun queryRun()
        {
            queryRun = new QueryRun(query);
            return queryRun;
        }
      ENDSOURCE
      SOURCE run
        public void run()
        {
            InventTable InventTable;
            VendTable   VendTable;
            InventItemPurchSetup    InventItemPurchSetup;
            ReqItemTable        ReqItemTable;
            ;
            ttsBegin;
            while(QueryRun.next())
            {
                InventTAble = QueryRun.get(tableNum(InventTable));
                VendTable = QueryRun.get(tableNum(VendTable));
       
                //Sync Standardauftragseinstellungen
                inventItemPurchSetup = InventItemPurchSetup::findDefault(InventTable.ItemId,true);
                InventItemPurchSetup.LeadTime = VendTable.DlvdaysPurch;
                InventItemPurchSetup.CalendarDays = VendTable.Workingdays;
                InventItemPurchSetup.update();
                //sync STandortspezifische Auftragseinstellungen
                if(Locationspecific == NoYes::Yes)
                {
                    while select forUpdate * from InventItemPurchSetup
                        where InventItemPurchSetup.ItemId == InventTable.ItemId
                    {
                        InventItemPurchSetup.LeadTime = VendTable.DlvdaysPurch;
                        InventItemPurchSetup.CalendarDays = VendTable.Workingdays;
                        InventItemPurchSetup.update();
                    }
                }
                //Sync Artikeldeckung
                if(Item == NoYes::Yes)
                {
                    while select forupdate * from ReqItemTable
                        where ReqItemTable.ItemCovFieldsActive == NoYes::Yes
                        && ReqItemTable.VendId == VendTable.AccountNum
                        && ReqItemTable.LeadTimePurchaseActive == NoYes::Yes
                    {
                        ReqItemTable.LeadTimePurchase = VendTable.DlvdaysPurch;
                        ReqItemTable.CalendarDaysPurchase = VendTable.Workingdays;
                        ReqItemTable.update();
                    }
                }
                info(literalStr(""));
       
            }
            ttsCommit;
        }
      ENDSOURCE
      SOURCE showQueryValues
   
        boolean showQueryValues()
        {
            return true;
        }
      ENDSOURCE
      SOURCE main
        public static void main(Args args)
        {
                syncVendDlvTime syncVendDlvTime;
            ;
            syncVendDlvTime = new syncVendDlvTime();
            syncVendDlvTime.initQuery();
       
            if(syncVendDlvTime.prompt())
            {
                syncVendDlvTime.run();
            }
        }
      ENDSOURCE
    ENDMETHODS
  ENDCLASS

AX2012


Rest liefern z. B. der Auftragsposition über Code setzen


static void Test_resetRestLiefern(Args _args)
{
SalesLine Salesline2;
boolean updated;
Qty tqy = -6,sqty;
;
ttsBegin;
Salesline2 = SalesLine::findinventtransid('007136',true);
sqty = Salesline2.unitConvertInvent2Sales(Salesline2.RemainInventPhysical+tqy);
updated = SalesUpdateRemain::updateDeliveryRemainder(Salesline2,sqty,Salesline2.RemainInventPhysical+tqy);
info('test');
ttsCommit;
}

AX2009
Barcode auf Bericht drucken




Initialisieren des Barcodes:


Barcode initReportBarcodeControl(ReportStringControl _barcodeStringControl)
{
   BarCodeSetup                barcodeSetup;
   ;
    barcodeSetup    = BarcodeSetup::find(ProdParameters::find().swsBarcodeSetupId);
    if (barcodeSetup && barcodeSetup.barcodeType != BarcodeType::NoBarcode)
    {
         // set Font-Name and-Size for ReportStringControl
        _barcodeStringControl.font(barcodeSetup.fontName);
        _barcodeStringControl.fontSize(barcodeSetup.fontSize);
        return Barcode::construct(barcodeSetup.barcodeType == BarcodeType::EAN128 ?     BarcodeType::Code128 : barcodeSetup.barcodeType);


    }
    else
    {
        _barcodeStringControl.visible(false);
        return null;
    }
}


Im Init nach super()
barCode = this.initReportBarcodeControl(BarcodeNumber);
display Methode für Reportfield
display str BarcodeNumber()
{
    if (Barcode == null)
        return '';


    if(isCollectiveDocument)
    {
       if(isPEReport)
        {
            Barcode.string(true, int2str(curProdTable.swsProductionId));
        }
        else
        {
            Barcode.string(true, int2str(prodTable.swsProductionId));
        }
    }
    else
    {
        if(isPEReport)
        {
            Barcode.string(true, curProdTable.ProdId);
        }
        else
        {
            Barcode.string(true, prodTable.ProdId);
        }
    }
    return Barcode.barcodeStr();
}


Das Feld am Report selbst ist ein String:



AX2012


Dokumentenverwaltung als Buch/leere Seite in einem Formular anzeigen


Dokumentenverwaltung Buch:
Auf der Tabelle folgenden beiden Methoden:

boolean existDocu()
{
    DocuRef         docuRef;
    DocuType        docuType;
    ;

    select firstonly docuRef
        where docuRef.RefRecId == this.RecId&&
              docuRef.RefTableId == this.TableId;

    if (docuRef)
        return true;
    else
        return false;

}


display int docu()
{
    #macrolib.resource

    if (this.existDocu())
        return #RES_NODE_DOC;

    else
        return #RES_AM_NEW;


}
Im Formular:
1) Ein Feld vom Typ Window
2) Autodeclaration Yes
3) Width/height = 15
4) Datasource = Tabelle
5) Datamethode = Docu()
6) auf dem Feld folgende Methode:

int mouseUp(int _x, int _y, int _button, boolean _ctrl, boolean _shift)
{
    #define.leftClick(1)

    int ret;
    PurchTable   PurchTable2;
    FormRun         formRun;
    Args            args = new Args();
    ;

    ret = super(_x, _y, _button, _ctrl, _shift);

    select PurchTable2 where
        PurchTable2.RecId == PurchTable.RecId;


    // Open the document handling form
    args.name(formstr(DocuView));
    args.record(PurchTable2);
    formRun = classfactory.formRunClass(args);

    if (formRun)
    {
        formRun.init();
        formRun.run();
        formRun.detach();
    }

    return ret;
}


AX2012


Markierte InventTrans zu einer InventTrans finden:


static void FindMarkedTrans(Args _args)
{
SalesLine salesline;
InventTrans InventTRans,MarkedInventTrans;
InventTransOrigin InventTransOrigin,MarkedInventTransOrigin;
;
salesline = salesline::findInventTransId("007193");
InventTransOrigin = InventTransOrigin::findByInventTransId(salesline.InventTransId);
while select * from InventTrans
where InventTrans.InventTransOrigin == InventTransOrigin.RecId
{
MarkedInventTransOrigin = InventTransOrigin::find(InventTrans.MarkingRefInventTransOrigin);
MarkedInventTrans = InventTrans::findByInventTransOrigin(MarkedInventTransOrigin.RecId);
info(strFmt('Orig %1, Markiert %2',InventTransOrigin.InventTransId,MarkedInventTransOrigin.InventTransId));
}
 
}
AX2012


Lookup Methode in Klasse mit DialogField dynamisch überschreiben




fld2_1 ist die FieldId die das Dialogfeld bekommen hat --> Über personalisieren abfragen

public void fld12_1_lookup()    // fieldModifiedMethod RetailVariantId

{

    FormRun formRun = classfactory.formRunClass(new Args(formStr(RetailVariantLookup)));

    FormStringControl formControl = dfRetailVariantId.control();

    ;

 

    formRun.args().parm(itemId);

    formRun.init();

 

    formRun.run();

    formControl.performFormLookup(formRun);

}

 

Oder

 

public void fld17_1_lookup()    // fieldModifiedMethod InventSiteId

{

    FormControl         formControl = dfInventSiteId.control();

 

    InventSite::TCM_lookupSiteId(FormControl);

}

Zusätzlich noch folgende Methode überschreiben:

public void dialogPostRun(DialogRunbase _dialog)
{
    super(_dialog);
 
    _dialog.dialogForm().formRun().controlMethodOverload(true);
    _dialog.dialogForm().formRun().controlMethodOverloadObject(this);
}


AX2012


Der Job macht alles so wie wenn man die Reservierung manuell für eine KommListe setzt, also auch das splitten etc.
Und wenn bereits ein Teil reserviert ist, wird die Menge dazu reserviert!



static void tcmReservationWMSORderTrans(Args _args)
{

WMSOrderTrans WMSOrderTrans;
InventDim InventDim;
InventUpd_Reservation reservation;
;
select forUpdate * from WMSOrderTrans where WMSOrderTrans.routeId == "00066";
InventDim = WMSOrderTrans.inventDim(); 
reservation = InventUpd_Reservation::newMovement(InventMovement::construct(WMSOrderTrans),-5,true);
reservation.updateNow();
WMSOrderTrans.splitByInventTrans();
info('fertig');
}






AX2012


Markierung und Reservierung über Code setzen


static void updateMarking(InventTransId _issueInventTransId,
InventTransId _receiptInventTransId,
InventQty _inventQty)
{




InventTrans issueInventTrans;
TmpInventTransMark tmpInventTransMask;
Map mapMarkNow;
container con;
real qty;
Map mapTmp;
MapEnumerator mapEnumerator;






InventTransOriginId issueInventTransOriginId = InventTransOrigin::findByInventTransId(_issueInventTransId).RecId;
InventTransOriginId receiptInventTransOriginId = InventTransOrigin::findByInventTransId(_receiptInventTransId).RecId;
InventQty qtyToMark = _inventQty;
ttsBegin;
issueInventTrans = InventTrans::findByInventTransOrigin(issueInventTransOriginId);
[con, qty] = TmpInventTransMark::packTmpMark(
InventTransOrigin::find(issueInventTransOriginId),
issueInventTrans.inventDim(),
issueInventTrans.Qty);
mapTmp = Map::create(con);
mapEnumerator = mapTmp.getEnumerator();
while (mapEnumerator.moveNext())
{
tmpInventTransMask = mapEnumerator.currentValue();
if (tmpInventTransMask.InventTransOrigin == receiptInventTransOriginId)
{
tmpInventTransMask.QtyMarkNow = qtyToMark;
tmpInventTransMask.QtyRemain -= tmpInventTransMask.QtyMarkNow;
mapMarkNow = new Map(Types::Int64, Types::Record);
mapMarkNow.insert(tmpInventTransMask.RecId, tmpInventTransMask);
TmpInventTransMark::updateTmpMark(
issueInventTransOriginId,
issueInventTrans.inventDim(),
-qtyToMark,
mapMarkNow.pack());
break;
}
}
ttsCommit;
}