EFx - Is this a job for CallService?

Howdy,

I have a function that checks to see if I need to add a copart to a job and adds it, if so.

I’ve been using the context factory to create an erpContext.Db to get the job entry service. But now I’ve added “requires transaction” to the function header and that’s causing issues.

Is CallService a candidate here? How might it be applied?

Thanks,

Joe

The current code in a custom code block:

// check/add coparts

outTest = "";

var context = (Erp.ErpContext)Ice.Services.ContextFactory.CreateContext();
var erpContext = new Erp.Internal.Lib.CCredChk(context); // used this library/assembly only for erpContext

Erp.Contracts.JobEntrySvcContract jobEntry = Ice.Assemblies.ServiceRenderer.GetService<Erp.Contracts.JobEntrySvcContract>(erpContext.Db, true);

var dsJobEntry = new Erp.Tablesets.JobEntryTableset();

bool coPartExists = false;
string partNum = String.Empty;
string addPartList = String.Empty;
jobHasCoparts = false;
string jobHeadPartNum = "";

dsJobEntry = jobEntry.GetByID(jobNum);

//using(var txscope = IceDataContext.CreateDefaultTransactionScope())        //Start Transaction ----------------- added "requires transaction" at the function level
{
  jobHeadPartNum = "";

  var jobHead_xRow = (from row in dsJobEntry.JobHead 
  where row.Company == Session.CompanyID &&
  row.JobNum.ToUpper() == jobNum.ToUpper()
  select row).FirstOrDefault();

  if (jobHead_xRow != null)
  {
    foreach(var ud102A_xRow in (from row in Db.UD102A
    where row.Company == Session.CompanyID &&
    row.Key1 == jobNum &&
    row.Key2 == jobSeq &&
    row.Completed_c != true
    select row))
    {
      partNum = ud102A_xRow.PartNum_c;
      jobHeadPartNum = jobHead_xRow.PartNum;

      if (jobHeadPartNum.ToUpper() != partNum.ToUpper()) // job num
      { 
        var jobPart_xRow = (from row in dsJobEntry.JobPart 
        where row.Company == Session.CompanyID &&
        row.JobNum.ToUpper() == jobNum.ToUpper() &&
        row.PartNum.ToUpper() == partNum.ToUpper()
        select row).FirstOrDefault();
        
        if (jobPart_xRow != null)
        {}
        else
        {
          if (!("~"+addPartList).Contains("~"+partNum + "~"))
          addPartList += partNum + "~";
        }
      }
    }
  }

  // trim the last separator from the string
  if (addPartList.Length > 0)
  {
    if (addPartList.Substring(addPartList.Length -1 ,1) == "~")
    addPartList = addPartList.Substring(0,addPartList.Length - 1);
  }
  
  bool jobUpdated = false;
 
  if (addPartList != String.Empty)
  {
    string delimiterChar = "~";
    
    string[] stringSeparators = new string[] { delimiterChar };
    
    string[] partAry = addPartList.Split(stringSeparators,StringSplitOptions.None);
    
    foreach (string coPartNum in partAry)
    {
      jobEntry.GetNewJobPart(ref dsJobEntry,jobNum); 
      
      jobUpdated = false;
      
      var jobPart_xRow = (from row in dsJobEntry.JobPart 
      where row.Company == Session.CompanyID &&
      row.JobNum == jobNum &&
      row.RowMod == IceRow.ROWSTATE_ADDED
      select row).FirstOrDefault();
      
      if (jobPart_xRow != null)
      {
        jobPart_xRow.PartNum = coPartNum;
        jobUpdated = true;
        jobEntry.ChangeJobPartPartNum(ref dsJobEntry);
      }
      
      if (jobUpdated)
      {
        jobEntry.Update(ref dsJobEntry);
        dsJobEntry = jobEntry.GetByID(jobNum);
      }
    }
  }
  //txscope.Complete();                            //Close Transaction
 
  var jobPart_xRow2 = (from row in dsJobEntry.JobPart 
  where row.Company == Session.CompanyID &&
  row.JobNum == jobNum && 
  row.PartNum != jobHeadPartNum
  select row).FirstOrDefault();
  
  if (jobPart_xRow2 != null)
  {
    jobHasCoparts = true;
  }
}

Okay, stealing a bit o’ code from klincecum:

// check/add coparts

outTest = "";

bool coPartExists = false;
string partNum = String.Empty;
string addPartList = String.Empty;
jobHasCoparts = false;
string jobHeadPartNum = "";

CallService<Erp.Contracts.JobEntrySvcContract>(jobEntry =>
{
  Erp.Tablesets.JobEntryTableset dsJobEntry = jobEntry.GetByID(jobNum);

  jobHeadPartNum = "";

  var jobHead_xRow = (from row in dsJobEntry.JobHead 
  where row.Company == Session.CompanyID &&
  row.JobNum.ToUpper() == jobNum.ToUpper()
  select row).FirstOrDefault();

  if (jobHead_xRow != null)
  {
    foreach(var ud102A_xRow in (from row in Db.UD102A
    where row.Company == Session.CompanyID &&
    row.Key1 == jobNum &&
    row.Key2 == jobSeq &&
    row.Completed_c != true 
    select row))
    {
      partNum = ud102A_xRow.PartNum_c;
      jobHeadPartNum = jobHead_xRow.PartNum;

      if (jobHeadPartNum.ToUpper() != partNum.ToUpper()) // job num
      { 
        var jobPart_xRow = (from row in dsJobEntry.JobPart 
        where row.Company == Session.CompanyID &&
        row.JobNum.ToUpper() == jobNum.ToUpper() &&
        row.PartNum.ToUpper() == partNum.ToUpper()
        select row).FirstOrDefault();
        
        if (jobPart_xRow != null)
        {}
        else
        {
          if (!("~"+addPartList).Contains("~"+partNum + "~"))
          addPartList += partNum + "~";
        }
      }
    }
  }

  // trim the last separator from the string
  if (addPartList.Length > 0)
  {
    if (addPartList.Substring(addPartList.Length -1 ,1) == "~")
    addPartList = addPartList.Substring(0,addPartList.Length - 1);
  }
  
  bool jobUpdated = false;
 
  if (addPartList != String.Empty)
  {
    string delimiterChar = "~";
    
    string[] stringSeparators = new string[] { delimiterChar };
    
    string[] partAry = addPartList.Split(stringSeparators,StringSplitOptions.None);
    
    foreach (string coPartNum in partAry)
    {
      jobEntry.GetNewJobPart(ref dsJobEntry,jobNum); 
      
      jobUpdated = false;
      
      var jobPart_xRow = (from row in dsJobEntry.JobPart 
      where row.Company == Session.CompanyID &&
      row.JobNum == jobNum &&
      row.RowMod == IceRow.ROWSTATE_ADDED
      select row).FirstOrDefault();
      
      if (jobPart_xRow != null)
      {
        jobPart_xRow.PartNum = coPartNum;
        jobUpdated = true;
        // is already 'added' jobPart_xRow.RowMod = IceRow.ROWSTATE_UPDATED; 
        jobEntry.ChangeJobPartPartNum(ref dsJobEntry);
      }
      
      if (jobUpdated)
      {
        jobEntry.Update(ref dsJobEntry);
        dsJobEntry = jobEntry.GetByID(jobNum);
      }
    }
  }
 
  var jobPart_xRow2 = (from row in dsJobEntry.JobPart 
  where row.Company == Session.CompanyID &&
  row.JobNum == jobNum && 
  row.PartNum != jobHeadPartNum
  select row).FirstOrDefault();
  
  if (jobPart_xRow2 != null)
  {
    jobHasCoparts = true;
  }
});

Addendum: How would one ignore the facade when using CallService in this manner?

Thanks,

Joe

Did you found answer?

1 Like