List <InvItemStorageCount> AddVariants(List <InvItemStorageCount> mainList, InvStandardVariantCombi[] stds) { var itemSort = new InvItemVariantSort(); var stdSort = new InvStandardVariantCombiSort(); Array.Sort(stds, stdSort); var stdSearch = new InvStandardVariantCombi() { _LineNumber1 = float.MinValue, _LineNumber2 = float.MinValue, _LineNumber3 = float.MinValue, _LineNumber4 = float.MinValue, _LineNumber5 = float.MinValue }; var newItems = new List <InvItemStorageCount>(100); var itemSearch = new InvItemStorageCount(); string lastItem = null; foreach (var rec in mainList) { if (rec._Item == lastItem) { continue; } lastItem = rec._Item; var item = (InvItem)items.Get(lastItem); if (item?._StandardVariant == null || !item._UseVariants) { continue; } itemSearch._Item = lastItem; var stdVariant = item._StandardVariant; stdSearch._StandardVariant = stdVariant; var pos = Array.BinarySearch(stds, stdSearch, stdSort); if (pos < 0) { pos = ~pos; } while (pos < stds.Length) { var std = stds[pos++]; if (std._StandardVariant != stdVariant) { break; } itemSearch._Variant1 = std._Variant1; itemSearch._Variant2 = std._Variant2; itemSearch._Variant3 = std._Variant3; itemSearch._Variant4 = std._Variant4; itemSearch._Variant5 = std._Variant5; var itemPos = mainList.BinarySearch(itemSearch, itemSort); if (itemPos < 0) { itemPos = ~itemPos; } if (itemPos >= mainList.Count) { itemPos = mainList.Count - 1; } var found = mainList[itemPos]; if (found._Item != itemSearch._Item) // item is not in the list, or we are past item. { if (itemPos == 0) { continue; } found = mainList[itemPos - 1]; // we need to test one position before, since binarysearch will be past the item with blank variants if (found._Item != itemSearch._Item) // item is not in the list { continue; } } if (itemSort.Compare(found, itemSearch) == 0) // we have the variant combination { continue; } var newrec = new InvItemStorageCount(); newrec.SetMaster(item); newrec._Variant1 = std._Variant1; newrec._Variant2 = std._Variant2; newrec._Variant3 = std._Variant3; newrec._Variant4 = std._Variant4; newrec._Variant5 = std._Variant5; newrec._Warehouse = item._Warehouse; newrec._Location = item._Location; newItems.Add(newrec); } } if (newItems.Count > 0) { newItems.AddRange(mainList); return(newItems); } return(null); }
public async Task BindGrid(IEnumerable <PropValuePair> propValuePair) { await dgInvStockStatus.Filter(propValuePair); var mainList = (List <InvItemStorageCount>)dgInvStockStatus.ItemsSource; if (mainList == null) { return; } var search = new InvItemStorageCount(); var sort = new InvItemStorageLocalSort(); var cnt = mainList.Count; var api = this.api; if (this.items == null) { this.items = await api.LoadCache(typeof(Uniconta.DataModel.InvItem)); } if (propValuePair == null || propValuePair.Count() == 0) { var lst = new List <InvItemStorageCount>(cnt); foreach (var item in (Uniconta.DataModel.InvItem[]) this.items.GetNotNullArray) { if (item._ItemType == (byte)ItemType.Service) { continue; } var itm = item._Item; search._Item = itm; var idx = mainList.BinarySearch(search, sort); if (idx < 0) { idx = ~idx; } if (idx >= 0 && idx < cnt && mainList[idx]._Item == itm) { continue; } var r = new InvItemStorageCount(); r.SetMaster(item); lst.Add(r); } if (lst.Count > 0) { lst.AddRange(mainList); lst.Sort(sort); mainList = lst; } } if (api.CompanyEntity.ItemVariants && api.CompanyEntity._LoadVariantsInCounting) { var stds = await api.Query <InvStandardVariantCombi>(); var newList = AddVariants(mainList, stds); if (newList != null) { newList.Sort(sort); mainList = newList; } } dgInvStockStatus.ItemsSource = mainList; SerieBatch.Visible = false; batchLoaded = false; }