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;
}
Im Moment ist der Blog im Entstehen. Es ist im Moment noch eine Ansammlung an kurzen Codestücken und Jobs Eine schönere und genauere Beschreibung folgt.
Mittwoch, 19. November 2014
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;
}
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::
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.

2. Create a new Form. My form has two data sources, InventDimDisplay and InventDim (required) and a grid.

3. Set the InventDim data source properties to:

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:

5. On class declaration add the following piece of code:
Override Data source’s method Active.
Set the following properties:
MenuItemType: Display
MenuItemName: InventDimParmFixed
12. By the end of this tutorial, your form should look like this.

13. The results:
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.
2. Create a new Form. My form has two data sources, InventDimDisplay and InventDim (required) and a grid.
3. Set the InventDim data source properties to:
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:
5. On class declaration add the following piece of code:
public class FormRun extends ObjectRun { // Declare the class InventDimCtrl_Frm_6. Now, create a new method in form.EditDimensions InventDimCtrl_Frm_ EditDimensions inventDimFormSetup; }
public InventDimCtrl_Frm_7. Override the form’s method Init.EditDimensions inventDimSetupObject() { return inventDimFormSetup; }
public void init() { super(); // This method will be used to show default fields at form startup element.updateDesign(8. Create a new method, this method is responsible to show the Inventory Controls.InventDimFormDesignUpdate:: Init); }
void updateDesign(9. We have to create a method on data source to update our table InventDimId and use the method Active to refresh the controls.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())); } }
Override Data source’s method Active.
public int active() { int ret; ret = super(); element.updateDesign(10. Now, override the method Modified for ItemId field in your data source.InventDimFormDesignUpdate:: Active); return ret; }
public void modified() { super(); element.updateDesign(11. We have to create a MenuItemButton to call the Display Dimension form where the user can select which dimensions he want to display.InventDimFormDesignUpdate:: FieldChange); InventDim.clearNotSelectedDim( element.inventDimSetupObject() .parmDimParmEnabled()); }
Set the following properties:
MenuItemType: Display
MenuItemName: InventDimParmFixed
12. By the end of this tutorial, your form should look like this.
13. The results:
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
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('
sqty = Salesline2.
updated = SalesUpdateRemain::
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 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,
; salesline = salesline::findInventTransId("
InventTransOrigin = InventTransOrigin::
while select * from InventTrans
where InventTrans.InventTransOrigin == InventTransOrigin.RecId
{
MarkedInventTransOrigin = InventTransOrigin::find(
MarkedInventTrans = InventTrans::
}
}
AX2012
Lookup Methode in Klasse mit DialogField dynamisch überschreiben
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.
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!
{
WMSOrderTrans WMSOrderTrans;
InventDim InventDim;
InventUpd_Reservation reservation;
; select forUpdate * from WMSOrderTrans where WMSOrderTrans.routeId == "00066";
InventDim = WMSOrderTrans.inventDim();
reservation = InventUpd_Reservation::
reservation.updateNow();
WMSOrderTrans.
}
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::
InventTransOriginId receiptInventTransOriginId = InventTransOrigin::
InventQty qtyToMark = _inventQty; ttsBegin;
issueInventTrans = InventTrans::
[con, qty] = TmpInventTransMark::
InventTransOrigin::find(
issueInventTrans.inventDim(),
issueInventTrans.Qty);
mapTmp = Map::create(con);
mapEnumerator = mapTmp.getEnumerator(); while (mapEnumerator.moveNext())
{
tmpInventTransMask = mapEnumerator.currentValue(); if (tmpInventTransMask.
{
tmpInventTransMask.QtyMarkNow = qtyToMark;
tmpInventTransMask.QtyRemain -= tmpInventTransMask.QtyMarkNow; mapMarkNow = new Map(Types::Int64, Types::Record);
mapMarkNow.insert(
TmpInventTransMark::
issueInventTransOriginId,
issueInventTrans.inventDim(),
-qtyToMark,
mapMarkNow.pack()); break;
}
} ttsCommit;
}
Abonnieren
Posts (Atom)