I created a class for me from found solution from a forum page :
class KRC_WMSOrder
{
WMSShipment wmsShipment;
SalesTable salesTable;
WMSPickingRoute wmsPickingRoute;
WMSPickingRouteLink wmsPickingRouteLink;
salesLine salesLine;
}
void createOrderLine(Qty _qty = salesLine.RemainSalesPhysical)
{
InventMovement inventMovement;
WMSOrder wmsOrder;
WMSOrderCreate orderCreate;
WMSOrderTrans wmsOrderTrans;
;
inventMovement = InventMovement::construct(salesLine);
orderCreate = WMSOrderCreate::newMovement(inventMovement,_qty);
orderCreate.parmMustBeWMSOrderControlled(true);
orderCreate.parmQty(_qty);
orderCreate.parmMaxQty(_qty);
orderCreate.run();
wmsOrder = orderCreate.parmWMSOrder();
wmsOrder.updateShipment(wmsShipment,_qty, wmsPickingRoute.PickingRouteID);
}
void createWmsPickingRoute()
{
;
wmsPickingRoute.clear();
wmsPickingRoute.initTypeOrderPick(wmsShipment, WMSExpeditionStatus::Activated,
WMSPickRequestTable::construct(salesTable),"", true);
wmsPickingRoute.ActivationDateTime = DateTimeUtil::utcNow();
wmsPickingRoute.insert();
}
void createWmsPickingRouteLink()
{
;
wmsPickingRouteLink.clear();
wmsPickingRouteLink.initFromSalesTable(salesTable);
wmsPickingRouteLink.initFromWMSPickingRoute(wmsPickingRoute);
wmsPickingRouteLink.insert();
}
void createWmsShipment()
{
;
wmsShipment.clear();
wmsShipment.initTypeOrderPick();
wmsShipment.insert();
}
SalesLine parmSalesLine(SalesLine _salesLine = salesLine)
{
;
salesLine = _salesLine;
return salesLine;
}
SalesTable parmSalesTable(SalesTable _salesTable = salesTable)
{
;
salesTable = _salesTable;
return salesTable;
}
void reserveItem(Qty _qty = salesLine.RemainSalesPhysical)
{
InventUpd_Reservation invUpdReservation;
;
invUpdReservation = InventUpd_Reservation::newInventDim(InventMovement::construct(salesLine,InventMovSubType::None),
salesLine.inventDim(),_qty,false);
invUpdReservation.updateNow();
}
Sample usage:
KRC_WMSOrder kWMS = new krc_wmsorder();
kWMS.createWmsShipment();
;
ttsbegin;
kWMS.parmSalesTable(salesTable);
kWMS.createWmsPickingRoute();
kWMS.createWmsPickingRouteLink();
kWMS.parmSalesLine(salesLine);
kWMS.reserveItem();
kWMS.createOrderLine();
ttscommit;
create etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
create etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
5 Mayıs 2016 Perşembe
1 Aralık 2015 Salı
AX 2012 - Add/update Customer and Vendor accounts
Customer account:
CustTable custTable;
DirParty dirParty;
DirPartyPostalAddressView dirPartyPostalAddressView;
DirPartyContactInfoView dirPartyContactInfo;
CustGroup custGroup;
DirPartyTable partyTable;
DirPartyLocation dirLocation;
LogisticsPostalAddress address;
LogisticsLocation logisticsLocation;
;
select firstOnly forUpdate custTable
where custTable.AccountNum == custAccount;
//-------------------- custtable --------------------------
if (custTable.RecId == 0)
{
custTable.initValue();
custTable.AccountNum = custAccount;
custTable.CustGroup = custGroupId;
custTable.VATNum = vatNum;
custTable.IdentificationNumber = identificationNumber;
custTable.TaxOfficeName_TR = taxOfficeName_TR;
custTable.Blocked = custBlocked;
custTable.insert(DirPartyType::Organization, custName);
}
else
{
custTable.CustGroup = custGroupId;
custTable.VATNum = vatNum;
custTable.TaxOfficeName_TR = taxOfficeName_TR;
custTable.IdentificationNumber = identificationNumber;
custTable.Blocked = custBlocked;
custTable.update();
update_recordSet partyTable setting name = custName, NameAlias = nameAlias
where partyTable.RecId == custTable.Party;
}
//-------------------- adres -----------------------------
dirParty = DirParty::constructFromCommon(custTable);
select firstonly dirPartyPostalAddressView
where dirPartyPostalAddressView.Party == custTable.Party &&
dirPartyPostalAddressView.LocationName == "Address";
dirPartyPostalAddressView.LocationName = "Adres";
dirPartyPostalAddressView.City = city;
dirPartyPostalAddressView.State = state;
dirPartyPostalAddressView.Street = street;
dirPartyPostalAddressView.IsPrimary = NoYes::Yes;
dirPartyPostalAddressView.CountryRegionId = countryRegionId;
dirParty.createOrUpdatePostalAddress(dirPartyPostalAddressView);
if (phone)
{
dirParty = DirParty::constructFromCommon(custTable);
select firstonly dirPartyContactInfo
where dirPartyContactInfo.Party == custTable.Party &&
dirPartyContactInfo.LocationName == "Phone";
dirPartyContactInfo.LocationName ="Phone";
dirPartyContactInfo.Locator = phone;
dirPartyContactInfo.IsPrimary = NoYes::Yes;
dirPartyContactInfo.Type = LogisticsElectronicAddressMethodType::Phone;
dirParty.createOrUpdateContactInfo(dirPartyContactInfo);
}
if (email)
{
select firstonly dirPartyContactInfo
where dirPartyContactInfo.Party == custTable.Party &&
dirPartyContactInfo.LocationName == "E-mail";
dirPartyContactInfo.LocationName ="E-mail";
dirPartyContactInfo.Locator = email;
dirPartyContactInfo.IsPrimary = NoYes::Yes;
dirPartyContactInfo.Type = LogisticsElectronicAddressMethodType::Email;
dirParty.createOrUpdateContactInfo(dirPartyContactInfo);
}
There's just one difference with vendor and customer creating is about separated creating DirParty record. If account is a person instead of organization, you have to use DirPersonName table instead of DirOrganization table:
VendTable vendTable;
DirParty dirParty;
DirPartyPostalAddressView dirPartyPostalAddressView;
DirPartyContactInfoView dirPartyContactInfo;
VendGroup vendGroup;
DirPartyTable partyTable;
DirPartyLocation dirLocation;
LogisticsPostalAddress address;
LogisticsLocation logisticsLocation;
DirOrganization organization;
;
select firstOnly forUpdate vendTable
where vendTable.AccountNum == vendAccount;
//-------------------- vendTable --------------------------
if (vendTable.RecId == 0)
{
organization.Name = vendName;
organization.NameAlias = nameAlias;
organization.LanguageId = CompanyInfo::languageId();
organization.insert();
vendTable.initValue();
vendTable.party = organization.recid;
vendTable.AccountNum = vendAccount;
vendTable.vendGroup = vendGroupId;
vendTable.VATNum = vatNum;
vendTable.Blocked = VendBlocked;
vendTable.TaxOfficeName_TR = taxOfficeName_TR;
vendTable.insert();
}
else
{
vendTable.vendGroup = vendGroupId;
vendTable.VATNum = vatNum;
vendTable.Blocked = VendBlocked;
vendTable.update();
update_recordSet organization setting name = vendName, NameAlias = nameAlias
where organization.RecId == vendTable.Party;
}
CustTable custTable;
DirParty dirParty;
DirPartyPostalAddressView dirPartyPostalAddressView;
DirPartyContactInfoView dirPartyContactInfo;
CustGroup custGroup;
DirPartyTable partyTable;
DirPartyLocation dirLocation;
LogisticsPostalAddress address;
LogisticsLocation logisticsLocation;
;
select firstOnly forUpdate custTable
where custTable.AccountNum == custAccount;
//-------------------- custtable --------------------------
if (custTable.RecId == 0)
{
custTable.initValue();
custTable.AccountNum = custAccount;
custTable.CustGroup = custGroupId;
custTable.VATNum = vatNum;
custTable.IdentificationNumber = identificationNumber;
custTable.TaxOfficeName_TR = taxOfficeName_TR;
custTable.Blocked = custBlocked;
custTable.insert(DirPartyType::Organization, custName);
}
else
{
custTable.CustGroup = custGroupId;
custTable.VATNum = vatNum;
custTable.TaxOfficeName_TR = taxOfficeName_TR;
custTable.IdentificationNumber = identificationNumber;
custTable.Blocked = custBlocked;
custTable.update();
update_recordSet partyTable setting name = custName, NameAlias = nameAlias
where partyTable.RecId == custTable.Party;
}
//-------------------- adres -----------------------------
dirParty = DirParty::constructFromCommon(custTable);
select firstonly dirPartyPostalAddressView
where dirPartyPostalAddressView.Party == custTable.Party &&
dirPartyPostalAddressView.LocationName == "Address";
dirPartyPostalAddressView.LocationName = "Adres";
dirPartyPostalAddressView.City = city;
dirPartyPostalAddressView.State = state;
dirPartyPostalAddressView.Street = street;
dirPartyPostalAddressView.IsPrimary = NoYes::Yes;
dirPartyPostalAddressView.CountryRegionId = countryRegionId;
dirParty.createOrUpdatePostalAddress(dirPartyPostalAddressView);
if (phone)
{
dirParty = DirParty::constructFromCommon(custTable);
select firstonly dirPartyContactInfo
where dirPartyContactInfo.Party == custTable.Party &&
dirPartyContactInfo.LocationName == "Phone";
dirPartyContactInfo.LocationName ="Phone";
dirPartyContactInfo.Locator = phone;
dirPartyContactInfo.IsPrimary = NoYes::Yes;
dirPartyContactInfo.Type = LogisticsElectronicAddressMethodType::Phone;
dirParty.createOrUpdateContactInfo(dirPartyContactInfo);
}
if (email)
{
select firstonly dirPartyContactInfo
where dirPartyContactInfo.Party == custTable.Party &&
dirPartyContactInfo.LocationName == "E-mail";
dirPartyContactInfo.LocationName ="E-mail";
dirPartyContactInfo.Locator = email;
dirPartyContactInfo.IsPrimary = NoYes::Yes;
dirPartyContactInfo.Type = LogisticsElectronicAddressMethodType::Email;
dirParty.createOrUpdateContactInfo(dirPartyContactInfo);
}
There's just one difference with vendor and customer creating is about separated creating DirParty record. If account is a person instead of organization, you have to use DirPersonName table instead of DirOrganization table:
VendTable vendTable;
DirParty dirParty;
DirPartyPostalAddressView dirPartyPostalAddressView;
DirPartyContactInfoView dirPartyContactInfo;
VendGroup vendGroup;
DirPartyTable partyTable;
DirPartyLocation dirLocation;
LogisticsPostalAddress address;
LogisticsLocation logisticsLocation;
DirOrganization organization;
;
select firstOnly forUpdate vendTable
where vendTable.AccountNum == vendAccount;
//-------------------- vendTable --------------------------
if (vendTable.RecId == 0)
{
organization.Name = vendName;
organization.NameAlias = nameAlias;
organization.LanguageId = CompanyInfo::languageId();
organization.insert();
vendTable.initValue();
vendTable.party = organization.recid;
vendTable.AccountNum = vendAccount;
vendTable.vendGroup = vendGroupId;
vendTable.VATNum = vatNum;
vendTable.Blocked = VendBlocked;
vendTable.TaxOfficeName_TR = taxOfficeName_TR;
vendTable.insert();
}
else
{
vendTable.vendGroup = vendGroupId;
vendTable.VATNum = vatNum;
vendTable.Blocked = VendBlocked;
vendTable.update();
update_recordSet organization setting name = vendName, NameAlias = nameAlias
where organization.RecId == vendTable.Party;
}
31 Ocak 2013 Perşembe
AXAPTA - Create Sales Order with X++
...
SalesTable salesTable;
NumberSeq NumberSeq;
SalesLine salesLine;
AxSalesLine axSalesLine = new axSalesLine();
AxSalesTable axsalesTable = new axSalesTable();
;
...
ttsbegin;
axsalesTable.parmSalesId();
if (ServiceOrder.CustName == "")
axsalesTable.parmCustAccount(ServiceOrder.CustAccount);// Cust Account
else
axsalestable.parmOneTimeCustomer(Dialog_OneTime.value());
axsalesTable.parmDlvMode(Dialog_DLVMode.value());
axsalesTable.parmDlvTerm(Dialog_DLVTerm.value());
axsalesTable.save();
while select forupdate Lines where Lines.RepairJournalId == _RepairJournalId && Lines.SalesId == "" &&
Lines.CSApproval == B_Approval::Approved && Lines.ItemId != "" && Lines.Qty > 0
{
axSalesLine = AxSalesLine::construct();
axSalesLine.parmSalesId(axsalesTable.parmSalesId());
axSalesLine.parmItemId(Lines.ItemId);
axSalesLine.parmSalesQty(Lines.Qty);
axSalesline.parmSalesPrice(Lines.ProjSalesPrice);
axSalesline.parmCurrencyCode(Lines.ProjCurrencyCode);
axSalesline.parmSalesUnit(Lines.Unit);
Lines.SalesId = axsalesTable.parmSalesId();
Lines.update();
axSalesLine.save();
}
ttscommit;
...
SalesTable salesTable;
NumberSeq NumberSeq;
SalesLine salesLine;
AxSalesLine axSalesLine = new axSalesLine();
AxSalesTable axsalesTable = new axSalesTable();
;
...
ttsbegin;
axsalesTable.parmSalesId();
if (ServiceOrder.CustName == "")
axsalesTable.parmCustAccount(ServiceOrder.CustAccount);// Cust Account
else
axsalestable.parmOneTimeCustomer(Dialog_OneTime.value());
axsalesTable.parmDlvMode(Dialog_DLVMode.value());
axsalesTable.parmDlvTerm(Dialog_DLVTerm.value());
axsalesTable.save();
while select forupdate Lines where Lines.RepairJournalId == _RepairJournalId && Lines.SalesId == "" &&
Lines.CSApproval == B_Approval::Approved && Lines.ItemId != "" && Lines.Qty > 0
{
axSalesLine = AxSalesLine::construct();
axSalesLine.parmSalesId(axsalesTable.parmSalesId());
axSalesLine.parmItemId(Lines.ItemId);
axSalesLine.parmSalesQty(Lines.Qty);
axSalesline.parmSalesPrice(Lines.ProjSalesPrice);
axSalesline.parmCurrencyCode(Lines.ProjCurrencyCode);
axSalesline.parmSalesUnit(Lines.Unit);
Lines.SalesId = axsalesTable.parmSalesId();
Lines.update();
axSalesLine.save();
}
ttscommit;
...
22 Aralık 2011 Perşembe
AXAPTA invent journal
When we were working with forms we just select InventJournalName and default parameters come. At working with code we have to put our parameters (or that is the way just I can found):
InventJournalTrans inventJournalTrans;
InventJournalTable inventJournalTable;
InventJournalName inventJournalName;
InventDim toInventDim;
InventDim tempInventDimTo;
;
// Process Journal Header
inventJournalName = "MyJournalName"
inventJournalTable.initValue();
inventJournalTable.JournalId = NumberSeq::newGetNum(InventParameters::numRefInventJournalId()).num();
inventJournalTable.Description = InventJournalName.Description;
inventJournalTable.Reservation = ItemReservation::Automatic;
inventJournalTable.JournalType = inventJournalType::Transfer;
inventJournalTable.BlockUserGroupId = inventJournalName.BlockUserGroupId;
inventJournalTable.JournalNameId = inventJournalName.JournalNameId;
inventJournalTable.ApprUserGroup = inventJournalName.ApprUserGroup;
inventJournalTable.ApprFromSiteId = inventJournalName.ApprFromSiteId;
inventJournalTable.ApprFromLocationId = inventJournalName.ApprFromLocationId;
inventJournalTable.ApprFromWMSLocationId= inventJournalName.ApprFromWMSLocationId;
inventJournalTable.ApprFromBatchId = inventJournalName.ApprFromBatchId;
inventJournalTable.ApprToSiteId = inventJournalName.ApprToSiteId;
inventJournalTable.ApprToLocationId = inventJournalName.ApprToLocationId;
inventJournalTable.ApprToWMSLocationId = inventJournalName.ApprToWMSLocationId;
inventJournalTable.ApprToBatchId = inventJournalName.ApprToBatchId;
inventJournalTable.VoucherSeqId = inventJournalName.VoucherSeqId;
inventJournalTable.insert();
toInventDim.clear();
toInventDim.initValue();
toInventDim.wMSLocationId = inventJournalName.ApprtoWMSLocationId;
toInventDim.InventLocationId = inventJournalName.ApprtoLocationId;
toInventDim.InventSiteId = inventJournalName.ApprtoSiteId;
// Process journal lines
inventJournalTrans.initValue();
inventjournaltrans.initFromInventJournalTable(inventJournalTable);
inventJournalTrans.Voucher = NumberSeq::newGetNum(InventParameters::numRefInventJournalVoucherId()).num();
inventJournalTrans.ItemId = "MyItem001";
InventJournalTrans.initFromInventTable(Inventtable::find(InventJournalTrans.ItemId));
inventJournalTrans.TransDate = systemDateGet();
inventJournalTrans.Qty = -1;
inventJournalTrans.InventDimId = tempInventDimto.inventDimId;
// reservation check
if (!InventMoveMent::setAutoReserving(InventJournalTrans))
{
inventJournalTable.delete();
return;
}
inventJournalTrans.insert();
InventJournalTable inventJournalTable;
InventJournalName inventJournalName;
InventDim toInventDim;
InventDim tempInventDimTo;
;
// Process Journal Header
inventJournalName = "MyJournalName"
inventJournalTable.initValue();
inventJournalTable.JournalId = NumberSeq::newGetNum(InventParameters::numRefInventJournalId()).num();
inventJournalTable.Description = InventJournalName.Description;
inventJournalTable.Reservation = ItemReservation::Automatic;
inventJournalTable.JournalType = inventJournalType::Transfer;
inventJournalTable.BlockUserGroupId = inventJournalName.BlockUserGroupId;
inventJournalTable.JournalNameId = inventJournalName.JournalNameId;
inventJournalTable.ApprUserGroup = inventJournalName.ApprUserGroup;
inventJournalTable.ApprFromSiteId = inventJournalName.ApprFromSiteId;
inventJournalTable.ApprFromLocationId = inventJournalName.ApprFromLocationId;
inventJournalTable.ApprFromWMSLocationId= inventJournalName.ApprFromWMSLocationId;
inventJournalTable.ApprFromBatchId = inventJournalName.ApprFromBatchId;
inventJournalTable.ApprToSiteId = inventJournalName.ApprToSiteId;
inventJournalTable.ApprToLocationId = inventJournalName.ApprToLocationId;
inventJournalTable.ApprToWMSLocationId = inventJournalName.ApprToWMSLocationId;
inventJournalTable.ApprToBatchId = inventJournalName.ApprToBatchId;
inventJournalTable.VoucherSeqId = inventJournalName.VoucherSeqId;
inventJournalTable.insert();
toInventDim.clear();
toInventDim.initValue();
toInventDim.wMSLocationId = inventJournalName.ApprtoWMSLocationId;
toInventDim.InventLocationId = inventJournalName.ApprtoLocationId;
toInventDim.InventSiteId = inventJournalName.ApprtoSiteId;
// Process journal lines
inventJournalTrans.initValue();
inventjournaltrans.initFromInventJournalTable(inventJournalTable);
inventJournalTrans.Voucher = NumberSeq::newGetNum(InventParameters::numRefInventJournalVoucherId()).num();
inventJournalTrans.ItemId = "MyItem001";
InventJournalTrans.initFromInventTable(Inventtable::find(InventJournalTrans.ItemId));
inventJournalTrans.TransDate = systemDateGet();
inventJournalTrans.Qty = -1;
inventJournalTrans.InventDimId = tempInventDimto.inventDimId;
// reservation check
if (!InventMoveMent::setAutoReserving(InventJournalTrans))
{
inventJournalTable.delete();
return;
}
2 Aralık 2011 Cuma
AXAPTA Create new record at another form and return from
Sometimes you can want to or have to create new record at another form. There are some Axapta forms do it with complex ways. I couldn't understand Axapta's ways.
This is mine simple way:
Main forms data source create method:
public void create(boolean _append = false)
{
Args args;
FormRun formCreate;
;
args = new Args();
args.name(formstr(B_ExpressServiceNew));
args.caller(element);
formCreate = classfactory.formRunClass(args);
formCreate.init();
formCreate.run();
formCreate.wait();
}
B_ExpressServiceNew, is my new record forms name.
This part should write at new record forms new record method:
if (element.args() && element.args().caller() && element.args().caller().name() == formstr(B_ExpressService))
{
mainForm = element.args().caller();
mainForm.SetRecord(oTable);
}
B_ExpressService is my main form, oTable is my new record.
Setrecord method at main form for locate new record:
void SetRecord(SMAServiceOrderTable _order)
{
;
SMAServiceOrderTable.reread();
SMAServiceOrderTable.data(_order);
SMAServiceOrderTable_DS.setCurrent();
}
This is mine simple way:
Main forms data source create method:
{
Args args;
FormRun formCreate;
;
args = new Args();
args.name(formstr(B_ExpressServiceNew));
args.caller(element);
formCreate = classfactory.formRunClass(args);
formCreate.init();
formCreate.run();
formCreate.wait();
}
B_ExpressServiceNew, is my new record forms name.
This part should write at new record forms new record method:
if (element.args() && element.args().caller() && element.args().caller().name() == formstr(B_ExpressService))
{
mainForm = element.args().caller();
mainForm.SetRecord(oTable);
}
B_ExpressService is my main form, oTable is my new record.
Setrecord method at main form for locate new record:
void SetRecord(SMAServiceOrderTable _order)
{
;
SMAServiceOrderTable.reread();
SMAServiceOrderTable.data(_order);
SMAServiceOrderTable_DS.setCurrent();
}
30 Kasım 2011 Çarşamba
AXAPTA create number sequence
First we have to find table and class for our module. Mine is SMAParameters .
My table is SMAParameters (It can find from modules parameters screen, setup tab). Add this method to table:
public server static NumberSequenceReference numRefRMARequestNo()
{
return NumberSeqReference::findReference(
typeid2extendedtypeid(typeid(B_RMARequestNo)));
}
Update for AX 2012:
Instead of
typeid2extendedtypeid(typeid(B_RMARequestNo))
write
extendedTypeNum(SNBmasterNum)
"B_RMARequestNo" at here is our tables key field's extended data type.
After that we have to go number sequence class. Related class name can be find from parameter table's numberSeqModule method. Write this code part at loadModule method:
/* RMA Request No */
numRef.DataTypeId = typeId2ExtendedTypeId(typeid(B_RMARequestNo));
numRef.ConfigurationKeyId = configurationkeynum(SMAManagement);
numRef.ReferenceHelp = literalstr("My Number Seq...");
numRef.WizardContinuous = false;
numRef.WizardFetchAheadQty = 20;
numRef.WizardManual = NoYes::No;
numRef.WizardAllowChangeDown = NoYes::No;
numRef.WizardAllowChangeUp = NoYes::No;
numRef.SortField = 11;
this.create(numRef);
Put upper numberseqs sortfield value +1 to Sortfield field.
Update for AX 2012:
Before launch wizard run this command
NumberSeqApplicationModule::loadAll();
Then Basic->Setup->Number sequences->Number sequences. Run Wizard.
Look service parameters->number sequence tab at related modules menu for check.
Now we can use this number sequence at forms...
Add this line at forms classDeclaration method:
NumberSeqFormHandler numberSeqFormHandler;
Add this method to form:
NumberSeqFormHandler numberSeqFormHandler()
{
;
if (!numberSeqFormHandler)
{
numberSeqFormHandler = NumberSeqFormHandler::newForm(SMAParameters::numRefRMARequestNo().NumberSequence,
element,
B_RMARequestTable_DS,
fieldnum(B_RMARequestTable,RequestNo));
}
return numberSeqFormHandler;
}
Update: Upper line should be like below for AX 2012:
numRefRMARequestNo().NumberSequenceId
instead of
numRefRMARequestNo().NumberSequence
B_RMARequestTable_DS is my tables datasource. RequestNo is key field.
Form close method:
public void close()
{
if (numberSeqFormHandler)
{
numberSeqFormHandler.formMethodClose();
}
super();
}
Data source methods:
public void linkActive()
{
;
element.numberSeqFormHandler().formMethodDataSourceLinkActive();
super();
}
public boolean validateWrite()
{
boolean ret;
ret = super();
ret = element.numberSeqFormHandler().formMethodDataSourceValidateWrite(ret) && ret;
return ret;
}
public void write()
{
super();
element.numberSeqFormHandler().formMethodDataSourceWrite();
}
public void create(boolean _append = false,boolean extern = false)
{
element.numberSeqFormHandler().formMethodDataSourceCreatePre();
super(_append);
if (!extern)
{
element.numberSeqFormHandler().formMethodDataSourceCreate();
}
}
That's all..
My table is SMAParameters (It can find from modules parameters screen, setup tab). Add this method to table:
public server static NumberSequenceReference numRefRMARequestNo()
{
return NumberSeqReference::findReference(
typeid2extendedtypeid(typeid(B_RMARequestNo)));
}
Update for AX 2012:
Instead of
typeid2extendedtypeid(typeid(B_RMARequestNo))
write
extendedTypeNum(SNBmasterNum)
"B_RMARequestNo" at here is our tables key field's extended data type.
After that we have to go number sequence class. Related class name can be find from parameter table's numberSeqModule method. Write this code part at loadModule method:
/* RMA Request No */
numRef.DataTypeId = typeId2ExtendedTypeId(typeid(B_RMARequestNo));
numRef.ConfigurationKeyId = configurationkeynum(SMAManagement);
numRef.ReferenceHelp = literalstr("My Number Seq...");
numRef.WizardContinuous = false;
numRef.WizardFetchAheadQty = 20;
numRef.WizardManual = NoYes::No;
numRef.WizardAllowChangeDown = NoYes::No;
numRef.WizardAllowChangeUp = NoYes::No;
numRef.SortField = 11;
this.create(numRef);
Put upper numberseqs sortfield value +1 to Sortfield field.
Update for AX 2012:
Before launch wizard run this command
NumberSeqApplicationModule::loadAll();
Then Basic->Setup->Number sequences->Number sequences. Run Wizard.
Look service parameters->number sequence tab at related modules menu for check.
Now we can use this number sequence at forms...
Add this line at forms classDeclaration method:
NumberSeqFormHandler numberSeqFormHandler;
Add this method to form:
{
;
if (!numberSeqFormHandler)
{
numberSeqFormHandler = NumberSeqFormHandler::newForm(SMAParameters::numRefRMARequestNo().NumberSequence,
element,
B_RMARequestTable_DS,
fieldnum(B_RMARequestTable,RequestNo));
}
return numberSeqFormHandler;
}
Update: Upper line should be like below for AX 2012:
numRefRMARequestNo().NumberSequenceId
instead of
numRefRMARequestNo().NumberSequence
B_RMARequestTable_DS is my tables datasource. RequestNo is key field.
Form close method:
{
if (numberSeqFormHandler)
{
numberSeqFormHandler.formMethodClose();
}
super();
}
Data source methods:
{
;
element.numberSeqFormHandler().formMethodDataSourceLinkActive();
super();
}
{
boolean ret;
ret = super();
ret = element.numberSeqFormHandler().formMethodDataSourceValidateWrite(ret) && ret;
return ret;
}
{
super();
element.numberSeqFormHandler().formMethodDataSourceWrite();
}
public void delete()
{
ttsbegin;
element.numberSeqFormHandler().formMethodDataSourceDelete();
super();
ttscommit;
}
{
ttsbegin;
element.numberSeqFormHandler().formMethodDataSourceDelete();
super();
ttscommit;
}
{
element.numberSeqFormHandler().formMethodDataSourceCreatePre();
super(_append);
if (!extern)
{
element.numberSeqFormHandler().formMethodDataSourceCreate();
}
}
That's all..
Etiketler:
AX,
ax 2012,
AXAPTA,
create,
number sequence
AXAPTA create sequential number
There is "Number Sequence class" for creating numbers for Axapta tables. But if you just want to create a "next number" function for just a string? Like "AB0001"->"AB0002". There isn't any built-in function in Axapta for that or I couldn't find. This is my number generator function:
Static str AutoNum(str Num)
{
int i;
int bas;
str b;
;
for (i=StrLen(num);i>=1;i--)
{
b=SubStr(num,i,1);
if (b<"0" || b>"9")
{
bas=i+1;
Break;
}
if (i==1)
bas=1;
}
num=StrReplace(SubStr(num,1,bas-1)+
Num2Str(Str2Num( SubStr(num,bas,StrLen(num) - bas + 1) )+1,
StrLen(num) - bas + 1,0,1,0)," ","0");
Return num;
}
Static str AutoNum(str Num)
{
int i;
int bas;
str b;
;
for (i=StrLen(num);i>=1;i--)
{
b=SubStr(num,i,1);
if (b<"0" || b>"9")
{
bas=i+1;
Break;
}
if (i==1)
bas=1;
}
num=StrReplace(SubStr(num,1,bas-1)+
Num2Str(Str2Num( SubStr(num,bas,StrLen(num) - bas + 1) )+1,
StrLen(num) - bas + 1,0,1,0)," ","0");
Return num;
}
Kaydol:
Kayıtlar (Atom)