Trying to add QuoteAsm to an existing quoteline

I am trying to add a new quote assembly to an existing line using the Kinetic Cloud, but I get this Correlation Error. This is my code:

/*
2023-09-12 Mikael Schreber, EverydayERP

This routine will read TActon loaded data from table UD01 and create nexessary subassemblies, 
operations and ingoing material to QuoteAsm, QuoteOpr and QuoteMtl tables

*/
string v_PartErrors = string.Empty;
string v_QuoteNum = string.Empty;
string v_QuoteLine = string.Empty;
string v_PartNum = string.Empty;
string v_RevNum = string.Empty;
var v_Guid = System.Guid.Empty;

bool v_exists = false;


using (var svcQuoteAsm = Ice.Assemblies.ServiceRenderer.GetService<Erp.Contracts.QuoteAsmSvcContract>(Db,true))
{
    Erp.Tablesets.QuoteAsmTableset QuoteAsmTs = new Erp.Tablesets.QuoteAsmTableset();

    var ttQuoteLine_xRow = (from ttQuoteLine_Row in ds.QuoteDtl
                      select ttQuoteLine_Row).FirstOrDefault();
    if (ttQuoteLine_xRow != null)
    {
        v_QuoteNum = Convert.ToString (ttQuoteLine_xRow.QuoteNum);
        v_QuoteLine = Convert.ToString (ttQuoteLine_xRow.QuoteLine);
    
        foreach (var UD01 in (from UD01T in Db.UD01
                              where UD01T.Company == Session.CompanyID
                              && UD01T.Key1 == v_QuoteNum
                              && UD01T.Key2 == v_QuoteLine
                              && UD01T.ShortChar04 != String.Empty
                              select UD01T))
        {
            if ((UD01.ShortChar01 != v_PartNum) && (UD01.ShortChar04 != v_RevNum))
            {

                QuoteAsmTs = svcQuoteAsm.GetByID(ttQuoteLine_xRow.QuoteNum, ttQuoteLine_xRow.QuoteLine, 0);
                QuoteAsmTs.QuoteAsm[0].CommentText = "Provar";
                svcQuoteAsm.Update (ref QuoteAsmTs);
                svcQuoteAsm.GetNewAssembly(ref QuoteAsmTs, ttQuoteLine_xRow.QuoteNum, ttQuoteLine_xRow.QuoteLine, 0, 0, 0);

                QuoteAsmTs.QuoteAsm[0].Company = Session.CompanyID;
                QuoteAsmTs.QuoteAsm[0].QuoteNum = ttQuoteLine_xRow.QuoteNum;
                QuoteAsmTs.QuoteAsm[0].QuoteLine = ttQuoteLine_xRow.QuoteLine;
                QuoteAsmTs.QuoteAsm[0].AssemblySeq = 1;
                QuoteAsmTs.QuoteAsm[0].PartNum = UD01.ShortChar01;
                QuoteAsmTs.QuoteAsm[0].Description = "**** Part Missing ****";
                QuoteAsmTs.QuoteAsm[0].RevisionNum = UD01.ShortChar04;
                QuoteAsmTs.QuoteAsm[0].QtyPer = UD01.Number01;
                QuoteAsmTs.QuoteAsm[0].ParentAssemblySeq = 0;
                QuoteAsmTs.QuoteAsm[0].ParentPartNum = ttQuoteLine_xRow.PartNum;
                QuoteAsmTs.QuoteAsm[0].ParentDescription = ttQuoteLine_xRow.LineDesc;
                QuoteAsmTs.QuoteAsm[0].ParentRevisionNum = ttQuoteLine_xRow.RevisionNum;
                QuoteAsmTs.QuoteAsm[0].IUM = UD01.ShortChar02;
                QuoteAsmTs.QuoteAsm[0].Direct = false;
                QuoteAsmTs.QuoteAsm[0].Parent = 0;
                QuoteAsmTs.QuoteAsm[0].PriorPeer = -1;
                QuoteAsmTs.QuoteAsm[0].NextPeer = -1;
                QuoteAsmTs.QuoteAsm[0].Child = -1;
                QuoteAsmTs.QuoteAsm[0].RequiredQty = UD01.Number01;
                QuoteAsmTs.QuoteAsm[0].ChildAssemblySeq = -1;
                QuoteAsmTs.QuoteAsm[0].PartExists = true;
                QuoteAsmTs.QuoteAsm[0].BomLevel = 0;
                QuoteAsmTs.QuoteAsm[0].BomSequence = 100;
                QuoteAsmTs.QuoteAsm[0].RelatedOperation = 0;
                QuoteAsmTs.QuoteAsm[0].FinalOpr = 0;
                QuoteAsmTs.QuoteAsm[0].RDStartNum = 1;
                QuoteAsmTs.QuoteAsm[0].RowMod = "A";
                QuoteAsmTs.QuoteAsm[0].SysRevID = 0;
                QuoteAsmTs.QuoteAsm[0].SysRowID = v_Guid;
                
                svcQuoteAsm.GetAsmPartInfo (ref QuoteAsmTs, v_exists);
                PublishInfoMessage("Artikeln finns " + v_Guid , Ice.Common.BusinessObjectMessageType.Information, Ice.Bpm.InfoMessageDisplayMode.Individual, "Company", "Update");

                svcQuoteAsm.Update (ref QuoteAsmTs);

                v_PartNum = UD01.ShortChar01;
                v_RevNum = UD01.ShortChar04;
            }
        }
    }
}

The error occurs when doing the last update.

I have an example from a few months where I did it in a Customization. Maybe it helps.

public void CreateQuoteAssembly(int quoteNum, int quoteLine, int parentAssemblySeq)
{
	this.SetProgress(5);
	var rows = this.QuoteAssy.AsEnumerable().Where(x => x.Field<string>("QuoteNum") == Convert.ToString(quoteNum));
			//&& x.Field<string>("QuoteLine") == Convert.ToString(quoteLine));
			//&& x.Field<string>("ParentAssemblySeq") == Convert.ToString(parentAssemblySeq));

	foreach (var excelRow in rows)
	{
		quoteLine = Convert.ToInt32(excelRow["QuoteLine"]);
		parentAssemblySeq = Convert.ToInt32(excelRow["ParentAssemblySeq"]);
		//this.SetStatusTextDirect("Processing QuoteAsm... " + Convert.ToString(excelRow["PartNum"]));
		// Display QuoteAsm QuoteNum, QuoteLine, ParentAssemblySeq, PartNum
		this.SetStatusTextDirect("Processing QuoteAsm... " + Convert.ToString(excelRow["QuoteNum"]) + ", " + Convert.ToString(excelRow["QuoteLine"]) + ", " + Convert.ToString(excelRow["ParentAssemblySeq"]) + ", " + Convert.ToString(excelRow["PartNum"]));

		// GetDatasetForTree
		SetStatusTextDirect("Processing QuoteAsm... GetDatasetForTree");
		int ipQuoteNum = quoteNum;
		int ipQuoteLine = quoteLine;
		int ipStartAssemblySeq = 0;
		int ipCurrentAssemblySeq = 0;
		bool ipCompleteTree = false;

		adapterQuoteAsm.GetDatasetForTree(ipQuoteNum, ipQuoteLine, ipStartAssemblySeq, ipCurrentAssemblySeq, ipCompleteTree);

		// GetNewAssembly
		SetStatusTextDirect("Processing QuoteAsm... GetNewAssembly");
		ipQuoteNum = quoteNum;
		ipQuoteLine = quoteLine;
		int assemblySeq = 0;
		int bomLevel = 0;
		int priorAssemblySeq = 0;

		if (parentAssemblySeq == 0)
		{
			assemblySeq = 0;
			bomLevel = 0;
			priorAssemblySeq = 0;
		}
		else
		{
			bomLevel = this.GetParentBOMLevel(quoteNum, quoteLine, parentAssemblySeq) + 1;
			priorAssemblySeq = 0; //parentAssemblySeq;
		}

		adapterQuoteAsm.GetNewAssembly(ipQuoteNum, ipQuoteLine, parentAssemblySeq, bomLevel, priorAssemblySeq);

		int rowCount = adapterQuoteAsm.QuoteAsmData.QuoteAsm.Rows.Count;
		DataRow quoteAsmRow = adapterQuoteAsm.QuoteAsmData.QuoteAsm.Rows[rowCount - 1];


		// CheckPrePartInfo
		SetStatusTextDirect("Processing QuoteAsm... CheckPrePartInfo");
		string partNum = Convert.ToString(excelRow["PartNum"]);
		string sourceTable = "QuoteAsm";
		System.Guid sourceSysRowID = System.Guid.Empty;
		string vMessage = String.Empty;
		bool vSubAvail = false;
		string vMsgType = String.Empty;
		string productConfiguratorMessage = String.Empty;

		adapterQuoteAsm.CheckPrePartInfo(ref partNum, sourceTable, sourceSysRowID, out vMessage, out vSubAvail, out vMsgType, out productConfiguratorMessage);

		// GetAsmPartInfo
		SetStatusTextDirect("Processing QuoteAsm... GetAsmPartInfo");
		bool defaultRev = true;

		quoteAsmRow.BeginEdit();
		quoteAsmRow["PartNum"] = Convert.ToString(excelRow["PartNum"]);
		quoteAsmRow.EndEdit();

		adapterQuoteAsm.GetAsmPartInfo(defaultRev);
	
		// ChangeQuoteAsmblQtyPer
		SetStatusTextDirect("Processing QuoteAsm... ChangeQuoteAsmblQtyPer");
		quoteAsmRow.BeginEdit();
		quoteAsmRow["QtyPer"] = Convert.ToDecimal(excelRow["QtyPer"]);
		quoteAsmRow.EndEdit();
		adapterQuoteAsm.ChangeQuoteAsmblQtyPer();

		// Update
		SetStatusTextDirect("Processing QuoteAsm... Update");
		//quoteAsmRow.BeginEdit();
		//quoteAsmRow["AnalysisCode"] = Convert.ToString(excelRow["AnalysisCode"]);
		//quoteAsmRow["AnalysisCdDescription"] = Convert.ToString(excelRow["AnalysisCode"]);
		//<AnalysisCdDescription xmlns="http://www.epicor.com/Ice/300/BO/QuoteAsm/QuoteAsm">DRAFTING</AnalysisCdDescription>
		//quoteAsmRow.EndEdit();
		adapterQuoteAsm.Update();

		// Update
		SetStatusTextDirect("Processing QuoteAsm... Update");
		quoteAsmRow.BeginEdit();
		quoteAsmRow["AnalysisCode"] = Convert.ToString(excelRow["AnalysisCode"]);
		//quoteAsmRow["AnalysisCdDescription"] = Convert.ToString(excelRow["AnalysisCode"]);
		quoteAsmRow["RowMod"] = "U";
		quoteAsmRow.EndEdit();
		adapterQuoteAsm.Update();

		// GetDatasetForTree
		SetStatusTextDirect("Processing QuoteAsm... GetDatasetForTree");
		ipQuoteNum = quoteNum;
		ipQuoteLine = quoteLine;
		ipStartAssemblySeq = 0;
		ipCurrentAssemblySeq = 0;
		ipCompleteTree = false;
		adapterQuoteAsm.GetDatasetForTree(ipQuoteNum, ipQuoteLine, ipStartAssemblySeq, ipCurrentAssemblySeq, ipCompleteTree);

		// Print out the Latest Created QuoteAsm LastQuoteAsmAssemblySeq
		int newAssemblySeq = this.LastQuoteAsmAssemblySeq(quoteNum, quoteLine, parentAssemblySeq);
		this.SetStatusTextDirect("Excel Row Assembly Seq: " + Convert.ToString(excelRow["AssemblySeq"]) + ", New Assembly Seq: " + Convert.ToString(newAssemblySeq));
	}
}

1 Like

Thanks man, I see that you have the CheckPrePartInfo in yours, I haven’t included it in my code. Will try that.

It puzzles me to see that you only doing update, my trace says that I have to add the new record.

I solved it, the thing is that I cannot call the services within the foreach database statement, saving the data in an array and then accessing it will do the trick.