container, set, map
Container
Container conNull
Container peek
Container replace at a position
str to container
Set:List of values
Set:Search on a value
Map
Map with value container - Remove - insert
Map created from container
RecordInsertList
List
Array

Container
	container              con;
	UserGroupInfo          userGroupInfo;
	while select userGroupInfo
		order by Id desc
	{
		con += [[userGroupInfo.Id, userGroupInfo.Name]];
	}
	return con;

Container conNull
    container  		ContPackageContainerId;
	;
	ContPackageContainerId = conNull();

Container peek
    container                   ContPackageContainerId;
    int                         iCont;
	;
	ContPackageContainerId = conNull();
	ContPackageContainerId = SPLProdFinishedLocalization::PackageContainerIdList(salesLine);
	for (iCont = 1; iCont <= conLen(ContPackageContainerId); iCont++)
	{
		SPLProdFinishedLocalization.PackageContainerId = conpeek(ContPackageContainerId,iCont);
	}

Container replace at a position
static void conPokeExample(Args _arg)
{
    container c1 = ["item1", "item2", "item3"];
    c1 = conPoke(c1, 2, "item2_new");

//-> C1 = ["item1", "item2_new", "item3"];
}

str to container
str2con -> transform str to con 

ex :
//Call report with parm str 
    if (SPLhebPickingFormat && markingLabel && existTransfer)
    {
        markingArgs = new Args();
        markingArgs.record(wmsPickingRoute);
        strStatus = (showRegistered ? "1" : "0") + "," + (showActivated ? "1" : "0") + "," +  (showStarted ? "1" : "0")  + "," + (showPicked ? "1" : "0") + "," +
                    (showStaged ? "1" : "0")     + "," + (showLoaded ? "1" : "0")    + "," +  (showCanceled ? "1" : "0") + "," + (showCompleted ? "1" : "0");
        markingArgs.parm(strStatus);
        markingMf = new MenuFunction(menuItemOutputStr(SPLBasicItemReportRouteId), MenuItemType::Output);
        markingReport = markingMf.create(markingArgs);
        markingReport.report().interactive(false);
        markingReport.run(true);
    }

//Report read the str	
    boolean          showRegistered, showActivated, showStarted, showPicked, showStaged, showLoaded, showCanceled, showCompleted;

    switch (element.args().dataset())
    {
        case tablenum(wmsPickingRoute):
            wmsPickingRoute = element.args().record();
            //curJournalId = inventJournalTrans.JournalId;
            showStatusStr = element.args().parm();
            [showRegistered, showActivated, showStarted, showPicked, showStaged, showLoaded, showCanceled, showCompleted] = str2con(showStatusStr);
            break;
        default:
            throw error("@SPL2194");

    }

Probleme with function string to container;
Ex 
costCenters = "001,002";
cont = str2cont(costCenters ​,","); - "1","2" - It remove the 0 !

Solution : 
    List listCostCenter;
    str  costCenters = "001,002";
    ;
    listCostCenter = new List(Types::String);
    listCostCenter = StrSplit(costCenters,','); //"001","002"	
	

Set:List of values
	//Set : List of values
	Set	SPLwmsLocationIdSet;
	SPLwmsLocationIdSet = new Set(Types::String);
	SPLwmsLocationIdSet.add(wmsLocation.wMSLocationId);
	if (!SPLwmsLocationIdSet || SPLwmsLocationIdSet.elements() == 0)
		return;

	se = SPLwmsLocationIdSet.getEnumerator();
	while (se.moveNext())
	{
		wmsLocation = se.current();
	}

	SetEnumerator       se;
	se = wmsShipmentIdSet.getEnumerator();
	while (se.moveNext())
	{
		wmsShipment = WMSShipment::find(se.current());
		if (wmsShipment.PackingType == WMSPackingType::Order)
		{
			this.sumBy(AccountOrder::None);
			break;
		}
	}

Set:Search on a value
    Set                     PackageContainerIdSet;      //Set of string;
    SetEnumerator           se;

    PackageContainerIdSet                       = new Set(Types::String);

	if (!PackageContainerIdSet.in(SPLProdFinishedLocalization.PackageContainerId))
	{
		PackageContainerIdSet.add(SPLProdFinishedLocalization.PackageContainerId);
    }
	...
    if (PackageContainerIdSet && PackageContainerIdSet.elements() != 0)
    {
        se = PackageContainerIdSet.getEnumerator();
        while (se.moveNext())
        {
            PackageContainerId = se.current();
            //We check if this package is already count.

Map
// We can use MapIterator (more and next) or getEnumerator (just moveNext)

	//new MapIterator
    MapIterator                     mi;
    Map                             mapLineDisc;
    ;
    mapLineDisc = new Map(Types::String,Types::Container);
    mi = new MapIterator(mapLineDisc);
    mi.begin();
    while (mi.more())
    {
        lineDisc            = mi.key();
        [qtyLine,qtyTable]  = mi.value();

        mi.next();
    }

	//getEnumerator
    MapEnumerator	me;
    me	= _mapCustRecId.getEnumerator();
	while (me.moveNext())
	{
		itemId              = me.currentKey();
		contQtyId           = me.currentValue();
		salesQty            = conpeek(contQtyId,1);
		salesLine.clear();
	}

// 	
mapLineDisc = new Map(Types::String,Types::Container);
if (!mapLineDisc.exists(SPLReplacementLine.LineDisc))
{
	qtyLine     = SPLReplacementLine.Qty * salesLine.SalesQty;
	qtyTable    = SPLReplacementTable.Qty * salesLine.SalesQty;
	mapLineDisc.insert(SPLReplacementLine.LineDisc,[qtyLine,qtyTable]);
}
else
{
	[qtyLine,qtyTable] = mapLineDisc.lookup(SPLReplacementLine.LineDisc);
	qtyLine     += SPLReplacementLine.Qty * salesLine.SalesQty;
	qtyTable    += SPLReplacementTable.Qty * salesLine.SalesQty;
	mapLineDisc.remove(SPLReplacementLine.LineDisc);
	mapLineDisc.insert(SPLReplacementLine.LineDisc,[qtyLine,qtyTable]);
}
	
	
	
//insert
	Common	tradeRecord;
	Map		mapTradeRecord = new Map(typeId2Type(typeid(recId)), Types::Record);
	// In AX2012           = new Map(typeName2Type(extendedTypeStr(RecId)), Types::Record);
	

	for (tradeRecord = tradeRecord_ds.getFirst(true) ? tradeRecord_ds.getFirst(true) : tradeRecord_ds.cursor(); tradeRecord; tradeRecord = tradeRecord_ds.getNext())
	{
		mapTradeRecord.insert(tradeRecord.RecId,tradeRecord);
	}
	
//MapIterator
	mapReceipt = new Map(Types::Container,Types::Real);
	mapReceipt.insert([inventTrans.InventRefTransId,receipt.InventDimId,receipt.StatusReceipt],qty);

	MapIterator mi;
	mi = new MapIterator(mapReceipt);
	mi.begin();
	while (mi.more())
	{
		[refTransId,inventDimIdReceipt,statusReceipt]   = mi.key();
		qty                                             = mi.value();
		
		mi.next();
	}
	
//example	
static void JobIteratePrinters2(Args _args)
{
	SysPrintOptions    sysPrintOptions;
	Map                _printerMap;
	MapIterator     mapIterator;
	PrinterName     printerName;
	PrinterName     displayPrinterName;
	ClassRunMode    classRunMode;

	;

	sysPrintOptions = new SysPrintOptions();
	sysPrintOptions.buildPrinterMap();
	_printerMap = sysPrintOptions.getPrinterMap();

	if (_printerMap.elements())
	{
		mapIterator = new MapIterator(_printerMap);
		mapIterator.begin();
		while (mapIterator.more())
		{
			[printerName, classRunMode, displayPrinterName] = mapIterator.value();
//           device.add(displayPrinterName);
			print displayPrinterName;
			mapIterator.next();
		}
	}

//   for (i=1; i X= numberOfPrinters; i++)
//   {
//       tmpPrinterName    = printJobSettings.getPrinter(i);
//       print tmpPrinterName; //the same as displayPrinterNaprinterMapme.
//       classRunMode    = printJobSettings.getRunOn(i);
//       displayPrinterName = '';
//       displayPrinterName = SysPrintOptions::getPrinterName(classRunMode, tmpPrinterName);
//       print displayPrinterName;
//
//   }
    pause;
}


//=== Map RecId ===
	Map                     lineMessage;
	lineMessage = new Map(typeId2Type(typeid(recId)), Types::Integer);
	if (!lineMessage.exists(priceDiscTable.RecId))
		lineMessage.insert(priceDiscTable.RecId,element.checkLines(priceDiscTable));

	if (lineMessage.lookup(priceDiscTable.RecId) != -1 && inventDimParmPriceWarning.toString())
		warningText.text(strfmt("@SYS70190",inventDimParmPriceWarning.toString()));

	lineMessage.remove(priceDiscTable.RecId);

	if (!lineMessage.exists(_priceDiscTable.RecId))
		lineMessage.insert(_priceDiscTable.RecId,element.checkLines(_priceDiscTable));

	return lineMessage.lookup(_priceDiscTable.RecId);

//=== Map Record ===
client static container getFormRecord(FormDataSource tradeRecord_ds)
{
	Common      tradeRecord;
	Map         mapTradeRecord = new Map(typeId2Type(typeid(recId)), Types::Record);

	for (tradeRecord = tradeRecord_ds.getFirst(true) ? tradeRecord_ds.getFirst(true) : tradeRecord_ds.cursor(); tradeRecord; tradeRecord = tradeRecord_ds.getNext())
	{
		mapTradeRecord.insert(tradeRecord.RecId,tradeRecord);
	}

	return mapTradeRecord.pack();
}

//=== Map Container ===
if (! mapReceipt)
	mapReceipt = new Map(Types::Container,Types::Real);

if (qty)
{
	mapReceipt.insert([inventTrans.InventRefTransId,receipt.InventDimId,receipt.StatusReceipt],qty);
}

if (mapReceipt)
{
	mi = new MapIterator(mapReceipt);
	mi.begin();
	while (mi.more())
	{
		[refTransId,inventDimIdReceipt,statusReceipt]   = mi.key();
		qty                                             = mi.value();

		inventDimReceipt = InventDim::find(inventDimIdReceipt);
	}
}
//Example of map with key with + : ex class : InventReleaseOrderPickingForm
//In this example we stock it in a map to avoid to find the stock if we find it before.
//Declaration :
    Map 				qtyPhysicalInventMap;       //Key : itemId+inventdimId, Value : qty physical available
protected InventQty findQtyPhysicalInvent(ItemId _itemId, InventDim _inventDim)
{
    InventQty           qtyPhysicalInvent;
    InventDimParm       inventDimParm;

    if (!qtyPhysicalInventMap)
    {
        qtyPhysicalInventMap   = new Map(Types::String, Types::Real);
    }

    if (qtyPhysicalInventMap.exists(_itemId + _inventDim.InventDimId))
    {
        qtyPhysicalInvent = qtyPhysicalInventMap.lookup(_itemId + _inventDim.InventDimId);
    }
    else
    {
        inventDimParm.initFromInventDim(_inventDim);
        qtyPhysicalInvent = InventOnhand::newParameters(_itemId,_inventDim, inventDimParm).physicalInvent();
        qtyPhysicalInventMap.insert(_itemId + _inventDim.InventDimId, qtyPhysicalInvent);
    }

    return qtyPhysicalInvent;
}

Map with value container - Remove - insert
// to update the container = value of the map we need to do remove insert of the updated value.

    WMSPickingRoute localWMSPickingRoute;
    Map  			SPLContPerCompMap  = new Map(Types::String,Types::Container);
    container		SplRouteIdCont;
    List 			SPLlistPerComp     = new List(Types::String);


    for (localWMSPickingRoute = wmsPickingRoute_ds.getFirst(true) ? wmsPickingRoute_ds.getFirst(true) : wmsPickingRoute_ds.cursor(); localWMSPickingRoute.RecId; localWMSPickingRoute = wmsPickingRoute_ds.getNext())
    {
        if (SPLContPerCompMap.exists(localWMSPickingRoute.dataAreaId))
        {
            SplRouteIdCont = SPLContPerCompMap.lookup(localWMSPickingRoute.dataAreaId);
            SplRouteIdCont += [localWMSPickingRoute.PickingRouteID];
            SPLContPerCompMap.remove(localWMSPickingRoute.dataAreaId);
            SPLContPerCompMap.insert(localWMSPickingRoute.dataAreaId,SplRouteIdCont);

        }
        else
		    SPLContPerCompMap.insert(localWMSPickingRoute.dataAreaId,[localWMSPickingRoute.PickingRouteID]);
    }
 
	//example to fill a list from a map with container .
    container               SplRouteIdCont;
 	MapIterator             SPLmi;
    SPLCompany              SPLCompany;
    int                     iCont;
 
	SPLmi = new MapIterator(SPLContPerCompMap);
	SPLmi.begin();
	while (SPLmi.more())
	{
		SPLCompany              = SPLmi.key();
        SplRouteIdCont          = conNull();
		SplRouteIdCont          = SPLmi.value();
     
        SPLlistPerComp          = new List(Types::String);
        for (iCont = 1; iCont X= conLen(SplRouteIdCont); iCont++)
	    {
            SPLlistPerComp.addEnd(conpeek(SplRouteIdCont,iCont));
	    }
        changeCompany(SPLCompany)
        {
            WMSPickingRoute::finishMulti(SPLlistPerComp.pack());//Note - this is not in a single tts, so some routes might be posted and others fail

            wmsDeliverPickedItems::checkDeliverPickedItems(localWMSPickingRoute.PickingRouteID,SPLlistPerComp.pack());
        } 
 		SPLmi.next();
	}
 }	
 cont

Map created from container
// example in MRP : Planned order, the column "Mark" is a map.
// when we call a class the class read the map of the caller form ex : ReqTransPoMarkChangeStatus

    ReqTransFormPO              reqTransForm;
    container                   conReqTransMark;
    MapIterator         mi;
    ReqTrans            reqTransMark;
    ReqTrans            reqTrans;
    ReqPO               reqPO;
    Map                 mapReqTransMark;
    ;
	//We keep the caller : in the caller there is the map object 
    ReqTransFormPO		reqTransForm = args.caller().reqTransForm();
	//the map is copied into a container
    [conReqTransMark] = reqTransForm.parmChangeTypePack();
    if (! this.countMarkedElements())
        return;
    mapReqTransMark     = new Map(typeId2Type(typeid(recId)), Types::Record);
	//the map is created from a container.
    mapReqTransMark     = Map::create(conReqTransMark);
	...
    reqTransForm.initMapReqTransMark(connull());
	
container parmChangeTypePack()
{
    this.markCurrent();
    return [this.mapReqTransMark().pack()];
}
public Integer countMarkedElements()
{
    if (!conReqTransMark)
        return 0;

    return Map::create(conReqTransMark).elements();
}	
public void initMapReqTransMark(container _con = connull())
{
    mapReqTransMark = (_con) ? Map::create(_con) : new Map(typeId2Type(typeid(recId)), Types::Record);
}
RecordInsertList
    RecordSortedList  recordSortedList;
    ;
    recordSortedList = new RecordSortedList(tablenum(CustInvoiceJour));
    recordSortedList.sortOrder(this.formLetterSorting(fieldnum(CustInvoiceJour, RecId));
//============================================================================//
//SorOrder give the field on with we want to test the duplicate. Here RecId. Seems to me that we need at least one field.
//============================================================================//
//journalList.ins(custInvoiceJourLocal,true); true : ?. // I don't know the difference between true and false

	RecordInsertList            recordInsertSalesParmSubTable;
	recordInsertSalesParmSubTable   = new RecordInsertList(tablenum(SalesParmSubTable));
	recordInsertSalesParmSubTable.add(salesParmSubTable);
	recordInsertSalesParmTable.insertDatabase();

//Form : custInvoiceJournal button print copy.

void clicked()
{
	CustInvoiceJour     custInvoiceJourLocal;
	Args                args = new Args();
	// 
	RecordSortedList    journalList      = SalesFormLetter::construct(DocumentStatus::Invoice).newJournalList();
	// 
	;

	//    args.caller(this);    Does this have to be set?

	for (custInvoiceJourLocal = custInvoiceJour_ds.getFirst(true) ? custInvoiceJour_ds.getFirst(true) : custInvoiceJour;
		 custInvoiceJourLocal;
		 custInvoiceJourLocal = custInvoiceJour_ds.getNext())
	{
	// 
		//Invoice copy pressed don't print original invoice
		if (isILFeature && !CustInvoiceJour::findRecId(custInvoiceJourLocal.RecId).OriginalPrinted_IL)
		{
		warning(strfmt ("@GIL106",
						custInvoiceJourLocal.InvoiceId,
						custInvoiceJourLocal.InvoiceDate));//Invoice (number %1, date %2) will not be printed. The Original should be printed first

		continue;
		}

		 journalList.ins(custInvoiceJourLocal);
	}

	journalList.first(custInvoiceJourLocal);
	while (custInvoiceJourLocal)
	{
	// 
		args.record(custInvoiceJourLocal);

		if (custInvoiceJourLocal.SalesId)
		{
			// Sales order invoice
			new MenuFunction(menuitemoutputstr(SalesInvoiceCopy), MenuItemType::Output).run(args);
		}
		else
		{
			// Free text invoice
			new MenuFunction(menuitemoutputstr(FreeTextInvoiceCopy), MenuItemType::Output).run(args);
		}
		// 
		if (! journalList.next(custInvoiceJourLocal))
			break;
		// 
	}
}
//function newJournalList();
public RecordSortedList  newJournalList()
{
    RecordSortedList  recordSortedList;
    ;

    recordSortedList = new RecordSortedList(tablenum(CustInvoiceJour));
    recordSortedList.sortOrderFromContainer(this.formLetterSorting(tablenum(CustInvoiceJour), fieldnum(CustInvoiceJour, RecId)));

    return recordSortedList;
}
//autre example =======
void fillPrivateLabelForInventTable()
{
    RecordSortedList            recordListReqPO;
;
    recordListReqPO = new RecordSortedList(tablenum(ReqPO));
    recordListReqPO.sortOrder(fieldnum(ReqPO, RecId));

    ttsbegin;

    mi = new MapIterator(mapReqTransMark);
    mi.begin();
    while (mi.more())
    {
		....
		recordListReqPO.ins(reqPO);
        mi.next();
    }
    if (recordListReqPO)
    {
        reqPO.clear();
        recordListReqPO.first(reqPO);
        while (reqPO)
        {
            reqPO.selectForUpdate(true);
            reqPO.delete();

            if (! recordListReqPO.next(reqPO))
                break;
        }
    }
    reqTransForm.initMapReqTransMark(connull());

    ttscommit;
	
//another example : read the DS, and put it in a RecordSortedList
static void main(Args args)
{
    BankPromissoryNoteDocumentCancel    bankPromissoryNoteDocumentCancel;
    LedgerJournalTrans                  ledgerJournalTrans;
    RecordSortedList                    ledgerJournalTransList = new RecordSortedList(tablenum(LedgerJournalTrans));
    FormDataSource                      formDS;
    ;

    if (! args || args.dataset() != tablenum(LedgerJournalTrans))
    {
        throw error(Error::missingRecord(funcname()));
    }

    ledgerJournalTransList.sortOrder(fieldnum(LedgerJournalTrans, RecId));

    formDS = args.record().dataSource();

    for (ledgerJournalTrans = formDS.getFirst(true)
            ? formDS.getFirst(true)
            : args.record(); ledgerJournalTrans; ledgerJournalTrans=formDS.getNext())
    {
        ledgerJournalTransList.ins(ledgerJournalTrans);
    }

    bankPromissoryNoteDocumentCancel = new BankPromissoryNoteDocumentCancel();
    bankPromissoryNoteDocumentCancel.parmLedgerJournalTransList(ledgerJournalTransList);

    if (bankPromissoryNoteDocumentCancel.prompt())
    {
        bankPromissoryNoteDocumentCancel.run();
    }
}

List
//Form WMSPickingRegistration
public void pickAllLines()
{
    List list = new List(Types::String);
    WMSPickingRoute localWMSPickingRoute;

    for (localWMSPickingRoute = wmsPickingRoute_ds.getFirst(true) ? wmsPickingRoute_ds.getFirst(true) : wmsPickingRoute_ds.cursor(); localWMSPickingRoute.RecId; localWMSPickingRoute = wmsPickingRoute_ds.getNext())
    {
        list.addEnd(localWMSPickingRoute.PickingRouteID);
    }

    WMSPickingRoute::finishMulti(list.pack());//Note - this is not in a single tts, so some routes might be posted and others fail

    wmsDeliverPickedItems::checkDeliverPickedItems(localWMSPickingRoute.PickingRouteID,list.pack());

    //done to clear all selected

    element.createSelectedLinesMap();
    wmsPickingRoute_DS.research(); //maybe some are finished and not ready for pick
    wmsPickingRoute_DS.refresh();
    wmsOrderTrans_DS.research();

    element.refreshCallerDatasource();
}
//Example List Enumerator
List enumerator
static client container getClassNames()
{
    List            extendedBy;
    ListEnumerator  le;
    extendedBy = dictClass.extendedBy();
    le = extendedBy.getEnumerator();
    while (le.moveNext())
    {
        curClass = new SysDictClass(le.current());​
    ​}
}
//=============================================================
server static public void finishMulti(container _packedList)
{
    #OCCRetryCount
    List            pickingRouteIdList;
    ListEnumerator  le;
    WMSPickingRoute wmsPickingRoute;

    if (!_packedList)
    {
        return;
    }

    pickingRouteIdList = List::create(_packedList);

    if (!pickingRouteIdList || pickingRouteIdList.elements() == 0)
    {
        return;
    }

    le = pickingRouteIdList.getEnumerator();

    while (le.moveNext())
    {
		ttsbegin;
		wmsPickingRoute = WMSPickingRoute::find(le.current(),true);

		if (wmsPickingRoute.RecId)
		{
			wmsPickingRoute.finish();
		}
		else
		{
			checkFailed(strFmt("@SYS103909",le.current()));
		}
		ttscommit;
    }
}

Array
//In the macro :#SPLPsCodes
#define.NumberOfTurbins(14)
real splStandardTurbinGasArray[#numberOfTurbins];
[splStandardTurbinGasArray,splStandardTurbinDieselArray] = splTurbCapacity::standardTurbinArray();
//
static container standardTurbinArray()
{
    SPLTurbinStandard       splTurbinStandard;
    int                     i;
    #SPLPsCodes
    real                        splStandardTurbinGazArray[#numberOfTurbins];
    real                        splStandardTurbinDieselArray[#numberOfTurbins];

    while select * from splTurbinStandard
    {
        i = SPLTurbCapacity::turbinId2ArrayNumber(splTurbinStandard.TurbinID);
        if (i)
        {
            splStandardTurbinGazArray[i]    =  splTurbinStandard.StandardTurbinGaz;
            splStandardTurbinDieselArray[i] =  splTurbinStandard.StandardTurbinDiesel;
        }
    }
    return [splStandardTurbinGazArray,splStandardTurbinDieselArray];
}

//another example
real DegradationArray[#numberOfTurbins];
//
[DegradationArray] = splTurbCapacity::degradation(this.datetime);
//
static container degradation(SPLPsDate _DateTime)
{
    SPLTurbinStandard       splTurbinStandard;
    SPLPsTurbHours          SPLPsTurbHours;
    int                     i;
    date                    dateMonth;
    #SPLPsCodes
    real                    degradationArray[#numberOfTurbins];

    dateMonth = FcsDateTimeAPI::convertToDateLocal(_DateTime);
    dateMonth = dateStartMth(dateMonth);
    while select splTurbinStandard
    {
        i = SPLTurbCapacity::turbinId2ArrayNumber(splTurbinStandard.TurbinID);
        if (i)
        {
            SPLPsTurbHours      = SPLPsTurbHours::Find(dateMonth,splTurbinStandard.TurbinID);
            /*
            if (!SPLPsTurbHours)
            {
                info(strFmt("@SPL2034",splTurbinStandard.TurbinID));
            }
            */
            degradationArray[i] = SPLPsCorrDegradation::CalcDegr(splTurbinStandard.TurbinID,SPLPsTurbHours.Hours) ;
        }
    }
    return [degradationArray];
}
// how to use : this.FactorArray[i] = tempCorr * DegradationArray[i];