How to end a quarantine order through x++ code?

Hi,

I’ve a customized form that will reduce onhand quantity by posting a pickinglist journal and when i enter a negative quantity it will create a quarantine order for that item though web service

I need to end that quarantine order through code

This is my class that i’m passing values from webpage to ax:

public void insertcreatetool(str location,str itemid,str prodid,str wrkctr,str wrkctrname,str empid,real qty,real onhand)
{
    ProdJournalTable    prodJournalTable;
    ProdJournalBOM      prodJournalBOM;
    toolitemlocationmaster tilm;
    inventdim           invdim;
    ProdTable           prodTable;
    ToolConsumption tcm;
    ProdJournalCheckPostBOM     prodJournalCheckPostbom;
    str message;
    Inventquarantinemultiend iqe=new Inventquarantinemultiend();
    SysFormRun_doRe                 sysFormRun_doRe;
    InventQuarantineOrder inq;
    Args args;
    ;
    breakpoint;
    select tcm;
    tcm.Location=location;
    tcm.ToolID=itemid;
    tcm.ProdID=prodid;
    tcm.wrkCtrId=wrkctr;
    tcm.wrkCtrName=wrkctrname;
    tcm.EmplId=empid;
    tcm.Qty=qty;
    tcm.OnHandWhenPicked=onhand;
    tcm.insert();
    message="Inserted and Journal Created in Tool Consumption";
        prodJournalTable.clear();
        prodJournalTable.initValue();
        prodJournalTable.JournalType    = ProdJournalType::Picklist;
        prodJournalTable.JournalNameId  = 'pickJrnl';
        prodJournalTable.Description    = " Prod pick list journal";
        prodJournalTable.ProdId         = tcm.ProdID;
        prodJournalTable.VoucherDraw    = JournalVoucherDraw::Post;
        prodJournalTable.NumOfLines = 1;
        prodJournalTable.VoucherSeqId = NumberSequenceTable::find(ProdParameters::numRefProdJournalVoucherId().NumberSequence).NumberSequence;
        prodJournalTable.insert();

        prodJournalBOM.clear();
        prodJournalBOM.initValue();
        prodJournalBOM.JournalId        = prodJournalTable.JournalId;
        prodJournalBOM.initFromInventTable(InventTable::find(tcm.ToolID));
        prodJournalBom.ProdId           = tcm.ProdID;
        prodJournalBom.LineNum          = 1;

        select tilm where tilm.InventLocationId == tcm.Location && tilm.ItemId == tcm.ToolID;
        select inventdimid from invdim where invdim.wMSLocationId == tilm.InventLocationId && invdim.InventSiteId == tilm.InventSiteId && invdim.InventLocationId == tilm.InventWarehouse;

        prodJournalBom.InventDimId      = invdim.inventDimId;//"00014332_069";
        //    prodJournalBom.TransDate        = systemDateGet();
        prodJournalBom.BOMUnitId        = "Pcs";
        prodJournalBom.BOMConsump       = tcm.Qty;
        prodJournalBom.InventConsump    = tcm.Qty;
        prodJournalBom.Comments         = "Workcenter ID: "+tcm.wrkCtrId;
        prodJournalBom.insert();

        ttsBegin;
        tcm.selectForUpdate(true);
        tcm.JournalId = prodJournalTable.JournalId;
        tcm.update();
        ttsCommit;
        try
        {
            ttsbegin;
            prodJournalCheckPostbom = prodJournalCheckPostbom::newPostJournal(tcm.JournalId,true);
            prodJournalCheckPostbom.run();
            ttscommit;
        }
        catch(Exception::Error)
        {
            continue;
        }
    
    
    iqe.run();
    ttsbegin;
    inq.selectForUpdate(true);
    inq.Status=InventQuarantineStatus::Ended;
    inq.update();
    ttscommit;

   
}

i need to end this quarantine order for this tool consumption with neegative quantity

Use InventQuarantineUpdEnd class,

inventQuarantineUpdEnd = InventQuarantineUpdEnd::newQuarantineOrder(inventQuarantineOrder, inventQuarantineOrder.Qty);
inventQuarantineUpdEnd.run();

this is my job

 toolinsertcreatejournal tcj=new toolinsertcreatejournal();

 tcj.insertcreatetool("A0116","TT00062","CS004538","APS","APS Coating","Al fitch",-8,2);

This is my class coding

static str webtoolinsertcreateposttool(str location,str itemid,str prodid,str wrkctr,str wrkctrname,str empid,real qty,real onhand)
{
    ProdJournalTable    prodJournalTable;
    ProdJournalBOM      prodJournalBOM;
    toolitemlocationmaster tilm;
    inventdim           invdim;
    ProdTable           prodTable;
    ToolConsumption tcm;
    ProdJournalCheckPostBOM     prodJournalCheckPostbom;
    str message;
    ;
    //breakpoint;
    select tcm;
    tcm.Location=location;
    tcm.ToolID=itemid;
    tcm.ProdID=prodid;
    tcm.wrkCtrId=wrkctr;
    tcm.wrkCtrName=wrkctrname;
    tcm.EmplId=empid;
    tcm.Qty=qty;
    tcm.OnHandWhenPicked=onhand;
    tcm.insert();
    //Picking List Journal Creation
        prodJournalTable.clear();
        prodJournalTable.initValue();
        prodJournalTable.JournalType    = ProdJournalType::Picklist;
        prodJournalTable.JournalNameId  = 'pickJrnl';
        prodJournalTable.Description    = " Prod pick list journal";
        prodJournalTable.ProdId         = tcm.ProdID;
        prodJournalTable.VoucherDraw    = JournalVoucherDraw::Post;
        prodJournalTable.NumOfLines = 1;
        prodJournalTable.VoucherSeqId = NumberSequenceTable::find(ProdParameters::numRefProdJournalVoucherId().NumberSequence).NumberSequence;
        prodJournalTable.insert();

        prodJournalBOM.clear();
        prodJournalBOM.initValue();
        prodJournalBOM.JournalId        = prodJournalTable.JournalId;
        prodJournalBOM.initFromInventTable(InventTable::find(tcm.ToolID));
        prodJournalBom.ProdId           = tcm.ProdID;
        prodJournalBom.LineNum          = 1;

        select tilm where tilm.InventLocationId == tcm.Location && tilm.ItemId == tcm.ToolID;
        select inventdimid from invdim where invdim.wMSLocationId == tilm.InventLocationId && invdim.InventSiteId == tilm.InventSiteId && invdim.InventLocationId == tilm.InventWarehouse;

        prodJournalBom.InventDimId      = invdim.inventDimId;//"00014332_069";
        //    prodJournalBom.TransDate        = systemDateGet();
        prodJournalBom.BOMUnitId        = "Pcs";
        prodJournalBom.BOMConsump       = tcm.Qty;
        prodJournalBom.InventConsump    = tcm.Qty;
        prodJournalBom.Comments         = "Workcenter ID: "+tcm.wrkCtrId;
        prodJournalBom.insert();

        ttsBegin;
        tcm.selectForUpdate(true);
        tcm.JournalId = prodJournalTable.JournalId;
        tcm.update();
        ttsCommit;
      //posting pickinglist journal
        try
        {
            ttsbegin;
            prodJournalCheckPostbom = prodJournalCheckPostbom::newPostJournal(tcm.JournalId,true);
            prodJournalCheckPostbom.run();
            ttscommit;
        }
        catch(Exception::Error)
        {
            continue;
        }
        message="Journal Created and Posted in Tool Consumption and Journal Id is "+ tcm.JournalId;
        return message;
}

When I run this quarantine order with started status is getting created

but not getting ended…

how to select that created quarantine order for this tool id

pastedimage1536651781190v1.png

Getting error when i add this code:

inventQuarantineUpdEnd = InventQuarantineUpdEnd::newQuarantineOrder(inventQuarantineOrder, inventQuarantineOrder.Qty);
inventQuarantineUpdEnd.run();

Are you selecting this correctly? At what point the quarantine order is created?

when we enter negative quantity, at that time a new quarantine order is creating automatically

if that item’s inventory model group have quarantine management

Does the quarantine order created for item selected on the picking list?

They must have the relation. Try using ProdJournalBOM.InventTransId to select the inventQuarantineOrder

inventQuarantineOrder.InventTransIdRef == ProdJournalBOM.InventTransId

Yes, Kranthi if we gave negative qty for that item picking list journal as well as quarantine order is creating for that item

select inventQuarantineOrder where inventQuarantineOrder.InventTransIdRef == prodJournalBom.InventTransId && inventQuarantineOrder.ItemId== prodJournalBom.ItemId;
inventQuarantineUpdEnd = InventQuarantineUpdEnd::newQuarantineOrder(inventQuarantineOrder, inventQuarantineOrder.Qty);
inventQuarantineUpdEnd.run();

I tried its ending the quarantine order, Thanks Kranthi

inventQuarantineUpdEnd = InventQuarantineUpdEnd::newQuarantineOrder(inventQuarantineOrder, inventQuarantineOrder.Qty);
inventQuarantineUpdEnd.run();

Is it creating a new quarantine order or ending the existing order for that item?

It will update the existing quarantine order. Look at \Classes\InventQuarantineUpdEnd\updateQuarantineOrder

Is it possible to do Report as finished and end the quarantine order?

Yes, you can post the RAF. See the below code example,

InventQuarantineUpdReportFinished inventQuarantineUpdReportFinished;
InventParmQuarantineOrder inventParmQuarantineOrder;

inventParmQuarantineOrder.initParmDefault();
inventParmQuarantineOrder.LineNum = 1;
inventParmQuarantineOrder.QuarantineId = inventQuarantineOrder.QuarantineId;
inventParmQuarantineOrder.Qty = inventQuarantineOrder.RemainQty;
inventParmQuarantineOrder.Type = InventQuarantineStatus::ReportedFinished;

inventQuarantineUpdReportFinished = InventQuarantineUpdReportFinished::newParmBuffer(inventParmQuarantineOrder);
inventQuarantineUpdReportFinished.run();
select inventQuarantineOrder where inventQuarantineOrder.InventTransIdRef == prodJournalBom.InventTransId && inventQuarantineOrder.ItemId== prodJournalBom.ItemId;
inventQuarantineMultiReportFinished = InventQuarantineMultiReportFinished::construct();
parmBuffer = inventQuarantineMultiReportFinished.defaultParmBuffer();
parmUpdate = inventQuarantineMultiReportFinished.defaultParmUpdate();
RunBaseMultiParm::initParm(inventQuarantineMultiReportFinished);

//init and insert update parameters that goes for all updates.
InventQuarantineMultiReportFinished.insertParmUpdate(parmUpdate);
parmBuffer.Linenum++;

InventQuarantineMultiReportFinished.insert(inventQuarantineOrder,parmBuffer);
InventQuarantineMultiReportFinished.run();

inventQuarantineMultiEnd = InventQuarantineMultiEnd::construct();

parmBuffer = inventQuarantineMultiEnd.defaultParmBuffer();
parmUpdate = inventQuarantineMultiEnd.defaultParmUpdate();

RunBaseMultiParm::initParm(inventQuarantineMultiEnd);

//init and insert update parameters that goes for all updates.
inventQuarantineMultiEnd.insertParmUpdate(parmUpdate);
parmBuffer.Linenum++;

inventQuarantineMultiEnd.insert(inventQuarantineOrder,parmBuffer);
inventQuarantineMultiEnd.run();

does this will work?

You can test it.

Have you tried the code i suggested?