I am putting a code wall of the complete code at the bottom of the post, but I will attempt to highlight what I think is important.
I am trying to add some columns to the New PO Suggestions landing page via Erp.BO.POSugg.GetRowsPlant
I have been able to add a few columns and so I began to code for the information I wanted
PartVendorDtls is a LINQ query that pulls in Company Part Plant data and some additional information building
var PartVendorDtls = ( from in join ...
select new
{
sugPoDtl.Company,
sugPoDtl.Plant,
sugPoDtl.PartNum,
SuggestedVendor {},
PrimaryVendor {},
AlternateVendor {},
}).Distinct().ToList();
/* This seems to work as intended */
// var poSummaryData = new List<object>(); // Create a list to store the PO summary data
List<object> poSummaryData = new List<object>();
foreach (var Part in PartVendorDtls)
{
var partnum = Part.PartNum;
var plant = Part.Plant;
var company = Part.Company;
/* redacted */
var partPOData = (
/* perform some PO aggregate calculations */
}).ToList();
poSummaryData.AddRange(partPOData);
}
/* This seems to complete with data but does not appear to properly set properties*/
var ttAltVendorDtl = (from sugPoDtl in result.SugPoDtl
join poSugDtl in Db.SugPoDtl on sugPoDtl.SugNum equals poSugDtl.SugNum
join partdtl in poSummaryData on new { Company = sugPoDtl.Company, Plant = poSugDtl.Plant, PartNum = poSugDtl.PartNum }
equals new { Company = (string)((dynamic)partdtl).Company, Plant = (string)((dynamic)partdtl).Plant, PartNum = (string)((dynamic)partdtl).PartNum }
select new
{
sugPoDtl,
partdtl
}).ToList();
/* I can force a join here by explicitly declaring type*/
foreach (var item in ttAltVendorDtl)
{
var sugPoDtlRow = item.sugPoDtl;
var partPlantRow = item.partPlant;
var primaryVendorRow = item.primaryVendor;
sugPoDtlRow["PrimaryVendorNum"] = primaryVendorRow.VendorNum;
};
This code generates the following error
<anonymous type: SugPoDtlRow sugPoDtl, object partdtl>’ does not contain a definition for ‘primaryVendor’ and no accessible extension method ‘primaryVendor’ accepting a first argument of type ‘<anonymous type: SugPoDtlRow sugPoDtl, object partdtl>’ could be found (are you missing a using directive or an assembly reference?)
I am trying to avoid creating a public class, but I will if I have to make this work.
If anyone has suggestions I would appreciate them.
Thanks,
and here is the complete code:
/* Alternate Vendor
**********************************
**********************************
Author: Kevin Barrow
Last Update: 04/02/2023
**********************************
**********************************
*/
var PartVendorDtls = ( from sugPoDtl in result.SugPoDtl
join PartPlant in Db.PartPlant on new { sugPoDtl.Company, sugPoDtl.Plant, sugPoDtl.PartNum } equals new { PartPlant.Company, PartPlant.Plant, PartPlant.PartNum }
join SuggVendor in Db.Vendor on new { sugPoDtl.Company, sugPoDtl.VendorNum } equals new { SuggVendor.Company, SuggVendor.VendorNum }
// Perform left join with PrimVendor
join PrimVendor in Db.Vendor on new { sugPoDtl.Company, VendorNum = PartPlant.VendorNum } equals new { PrimVendor.Company, PrimVendor.VendorNum } into PrimaryVendorGroup
from PrimaryVendor in PrimaryVendorGroup.DefaultIfEmpty() // Perform the left join and retrieve the results into PrimVendor
// Perform left join with AlternateVendor
join AlternateVendor in Db.Vendor on new { Company = Session.CompanyID, VendorID = PartPlant.SecVendorID_c } equals new { AlternateVendor.Company, AlternateVendor.VendorID } into AltVendorGroup
from AltVendor in AltVendorGroup.DefaultIfEmpty()
select new
{
sugPoDtl.Company,
sugPoDtl.Plant,
sugPoDtl.PartNum,
SuggestedVendor = new
{
VendorNum = SuggVendor.VendorNum,
VendorID = SuggVendor.VendorID,
VendorName = SuggVendor.Name,
},
PrimaryVendor = new
{
VendorNum = PrimaryVendor?.VendorNum,
VendorID = PrimaryVendor?.VendorID,
VendorName = PrimaryVendor?.Name,
LeadTime = PartPlant?.LeadTime,
MinOrderQty = PartPlant?.MinOrderQty
},
AlternateVendor = new
{
VendorNum = AltVendor?.VendorNum,
VendorID = AltVendor?.VendorID,
VendorName = AltVendor?.Name,
Freq = PartPlant?.SVFreq_c,
LeadTime = PartPlant?.SVLeadTime_c,
Quota = PartPlant?.SVQuota_c,
MinOrderQty = PartPlant?.SVMOQ_c
}
}).Distinct().ToList();
// var poSummaryData = new List<object>(); // Create a list to store the PO summary data
List<object> poSummaryData = new List<object>();
foreach (var Part in PartVendorDtls)
{
var partnum = Part.PartNum;
var plant = Part.Plant;
var company = Part.Company;
var firstDayOfYear = new DateTime(DateTime.Now.Year, 1, 1);
var lastNonPrimaryPODate = new DateTime();
var PrimaryVendorRow = Part.PrimaryVendor;
var PrimaryVendorNum = PrimaryVendorRow.VendorNum;
var AlternateVendorRow = Part.AlternateVendor;
var AlternateVendorNum = AlternateVendorRow.VendorNum;
var SuggestedVendorRow = Part.SuggestedVendor;
var SuggVendorNum = SuggestedVendorRow.VendorNum;
var partPOData = (from POHeader in Db.POHeader
join PODetail in Db.PODetail on new { Company = Session.CompanyID, PONum = POHeader.PONum } equals new { Company = PODetail.Company, PONum = PODetail.PONUM }
join PORel in Db.PORel on new { Company = PODetail.Company, PONum = PODetail.PONUM, POLine = PODetail.POLine } equals new { Company = PORel.Company, PONum = PORel.PONum, POLine = PORel.POLine }
where POHeader.Approve == true
&& POHeader.Company == company
&& PORel.Plant == plant
&& PODetail.PartNum == partnum
group new { POHeader, PODetail, PORel } by new { POHeader.Company, PORel.Plant, PODetail.PartNum } into g
select new
{
Company = g.Key.Company,
Plant = g.Key.Plant,
PartNum = g.Key.PartNum,
SuggestedVendor = SuggestedVendorRow,
PrimaryVendor = PrimaryVendorRow,
AlternateVendor = AlternateVendorRow,
LastPODate = g.Max(x => x.POHeader.OrderDate),
Total_PO_YTD = g.Where(x => x.POHeader.OrderDate >= firstDayOfYear )
.Select(x => x.POHeader.PONum)
.Distinct()
.Count(),
Primary_PO_YTD = g.Where(x => x.POHeader.OrderDate >= firstDayOfYear && (x.POHeader.VendorNum == PrimaryVendorNum))
.Select(x => x.POHeader.PONum)
.Distinct()
.Count(),
Alternate_PO_YTD = g.Where(x => x.POHeader.OrderDate >= firstDayOfYear && (x.POHeader.VendorNum == AlternateVendorNum))
.Select(x => x.POHeader.PONum)
.Distinct()
.Count(),
OtherVendor_PO_YTD = g.Where(x => x.POHeader.OrderDate >= firstDayOfYear && (x.POHeader.VendorNum != PrimaryVendorNum) && (x.POHeader.VendorNum != AlternateVendorNum))
.Select(x => x.POHeader.PONum)
.Distinct()
.Count(),
LastNonPrimaryPODate = g.Where(x => x.POHeader.OrderDate >= firstDayOfYear && (x.POHeader.VendorNum != PrimaryVendorNum))
.OrderByDescending(x => x.POHeader.OrderDate)
.Select(x => x.POHeader.OrderDate)
.FirstOrDefault(),
ConsecutivePrimaryPO = g.Select(x => new
{
Date = x.POHeader.OrderDate,
VendorNum = x.POHeader.VendorNum,
PrimaryVendor = PrimaryVendorNum
})
.Where(x => x.Date >= firstDayOfYear && x.Date >= lastNonPrimaryPODate)
.OrderBy(x => x.Date)
.ToList()
}).ToList();
poSummaryData.AddRange(partPOData);
}
var ttAltVendorDtl = (from sugPoDtl in result.SugPoDtl
join poSugDtl in Db.SugPoDtl on sugPoDtl.SugNum equals poSugDtl.SugNum
join partdtl in poSummaryData on new { Company = sugPoDtl.Company, Plant = poSugDtl.Plant, PartNum = poSugDtl.PartNum }
equals new { Company = (string)((dynamic)partdtl).Company, Plant = (string)((dynamic)partdtl).Plant, PartNum = (string)((dynamic)partdtl).PartNum }
/* join partdtl in poSummaryData on new { Company = Session.CompanyID, poSugDtl.Plant, poSugDtl.PartNum } equals new { Company = partdtl.Company, partdtl.Plant, partdtl.PartNum }*/
select new
{
sugPoDtl,
partdtl
}).ToList();
foreach (var item in ttAltVendorDtl)
{
var sugPoDtlRow = item.sugPoDtl;
var PrimaryVendorRow = item.partdtl.PrimaryVendor;
var AltVendorRow = item.partdtl.AlternateVendor;
/*
// Access fields directly from item
sugPoDtlRow["PrimaryVendorNum"] = primaryVendorRow.VendorNum;
sugPoDtlRow["PrimaryVendorID"] = primaryVendorRow.VendorID;
sugPoDtlRow["PrimaryVendorName"] = primaryVendorRow.Name;
if (altVendorRow != null)
{
sugPoDtlRow["AltVendorNum"] = altVendorRow.VendorNum;
sugPoDtlRow["AltVendorID"] = altVendorRow.VendorID;
sugPoDtlRow["AltVendorName"] = altVendorRow.Name;
sugPoDtlRow["AltVendFrequency"] = partPlantRow.SVFreq_c;
sugPoDtlRow["AltVendLeadTime"] = partPlantRow.SVLeadTime_c;
sugPoDtlRow["AltVendQuota"] = partPlantRow.SVQuota_c;
sugPoDtlRow["AltVendMOQ"] = partPlantRow.SVMOQ_c;
}
/* */
};