Der Wert eines einzelnen Felds wird beim Cache-Update nicht aktualisiert

Sep 11 2020

Ich versuche, einen INKitRegisterArtikel einzufügen . Hier ist der Code:

KitAssemblyEntry kitGraph = CreateInstance<KitAssemblyEntry>();
INKitRegister kit = new INKitRegister();
kitGraph.Document.Current = kit;
kitGraph.Document.Cache.SetValueExt<INKitRegister.inventoryID>(kit, mixQLine.InventoryID);
// This line is not working 
kitGraph.Document.Cache.SetValueExt<INKitRegister.locationID>(kit, 
scales.LocationID);
kitGraph.Document.Cache.SetValueExt<INKitRegister.uOM>(kit, mixQLine.Uom);
kitGraph.Document.Cache.SetValueExt<INKitRegister.qty>(kit, mixQLine.Qty);
kit = kitGraph.Document.Cache.Update(kit) as INKitRegister;
kitGraph.Actions.PressSave();

Wenn ich das InventoryItem manuell so konfiguriere, dass ein Standardspeicherort zugewiesen wird, wird das Element für alle anderen Felder ordnungsgemäß eingefügt. Andernfalls wird der folgende Fehler ausgegeben:

Fehler: Das Einfügen des Datensatzes 'IN Kit Split' hat mindestens einen Fehler ausgelöst. Bitte überprüfen Sie die Fehler.

Was mache ich falsch?

'Die Fehler':

9/11/2020 2:36:26 PM Fehler: Fehler: Das Einfügen des Datensatzes 'IN Kit Split' hat mindestens einen Fehler ausgelöst. Bitte überprüfen Sie die Fehler. bei PX.Data.PXUIFieldAttribute.CommandPreparing (PXCache-Absender, PXCommandPreparingEventArgs e) bei PX.Data.PXCache.OnCommandPreparing (Zeichenfolgenname, Objektzeile, Objektwert, PXDBOperation-Operation, Typentabelle, Feldbeschreibung & Beschreibung) (PXCache-Absender, Objektzeile) bei PX.Data.PXCache.PersistInserted (Objektzeile, Boolean bypassInterceptor) bei PX.Data.PXCache.Persist (PXDBOperation-Operation) bei PX.Data.PXGraph.Persist (Typ cacheType, PXDBper) PX.Data.PXGraph.Persist () bei PX.Data.PXSave.d__2.MoveNext () bei PX.Data.PXAction.d__28.MoveNext () bei PX.Data.PXAction.d__28.MoveNext () bei PX.Web. UI.PXBaseDataSource.tryExecutePendingCommand (String viewName, String [] sortcolumns, Boolean [] Abfahrten, Object [] -Suchen, Object [] -Parameter, PXFilterRow [] -Filter, DataSourceSelectArguments-Argumente, Boolean & closeWindowRequired, Int32 & adapterStartRowRowRow .UI.PXBaseDataSource.ExecuteSelect (String viewNa me, DataSourceSelectArguments-Argumente, PXDSSelectArguments-Argumente)

Antworten

1 BrianStevens Sep 13 2020 at 18:10

Die Verwendung von SetValueExt sieht korrekt aus, vorausgesetzt, mixQLine und scale sind beide nicht null, wobei die referenzierten Felder auch nicht null sind. Sie sollten jedoch die Schaltfläche "Einfügen" über Document.Insert (Kit) simulieren . um Ihr neues INKitRegister einzufügen. Manchmal müssen Sie vor dem Einfügen einige Werte in den Datensatz eingeben (z. B. bei der Eingabe von SOType durch Kundenaufträge), aber in den meisten Fällen musste ich dies nicht tun. Wenn Ihr Datensatz vorhanden ist, suchen Sie normalerweise nach dem Datensatz über:

Document.Current = Document.Search<keyField>(keyValue);

Durch die Verwendung der Einfügemethode in der Ansicht wird sichergestellt, dass der Datensatz mit allen richtigen Ereignissen erstellt wird, die im Diagramm ausgelöst werden. Ich gehe davon aus, dass dies das zugrunde liegende Problem ist, obwohl Sie möglicherweise eine Zwischenaktualisierung des Caches benötigen, bevor Sie bestimmte Felder festlegen. (Wenn der Speicherort beispielsweise an die Inventar-ID gebunden ist, müssen Sie wahrscheinlich den Cache mit der Inventar-ID aktualisieren, damit der DAC den Selektor aktualisiert und die für den Artikel geltenden Speicherorte abruft.)

Ungetestet, aber so würde ich es machen.

KitAssemblyEntry kitGraph = CreateInstance<KitAssemblyEntry>();

INKitRegister kit = new INKitRegister();
// Sometimes need to set initial values here
kit = kitGraph.Document.Insert(kit);

kitGraph.Document.Cache.SetValueExt<INKitRegister.inventoryID>(kit, mixQLine.InventoryID);

//May need to do an interim update on the cache after setting certain fields
kit = kitGraph.Document.Update(kit);

kitGraph.Document.Cache.SetValueExt<INKitRegister.locationID>(kit, scales.LocationID);
kitGraph.Document.Cache.SetValueExt<INKitRegister.uOM>(kit, mixQLine.Uom);
kitGraph.Document.Cache.SetValueExt<INKitRegister.qty>(kit, mixQLine.Qty);

////////////////////////////////
//Alternate way to to set values
kit.InventoryID = mixQLine.InventoryID;

//May need to do an interim update on the cache after setting certain fields
kit = kitGraph.Document.Update(kit);

kit.LocationID = scales.LocationID;
kit.Qty = mixQLine.Qty;
kit.UOM = mixQLine.Uom;
////////////////////////////////

kit = kitGraph.Document.Update(kit);
kitGraph.Actions.PressSave();
NaveenB Sep 25 2020 at 17:07

Ich habe den folgenden Code für eines meiner Projekte verwendet und er funktioniert wie erwartet. Dieser Code könnte für Sie hilfreich sein.

  KitAssemblyEntry kitGraph = PXGraph.CreateInstance<KitAssemblyEntry>();
                INKitRegister objkitregister = PXCache<INKitRegister>.CreateCopy(kitGraph.Document.Insert(new INKitRegister()));
                objkitregister.InventoryID = kitspecifications.KitInventoryID;
                objkitregister.KitRevisionID = SOKitRevisionID;
                objkitregister.Hold = false;
                objkitregister.Qty = Requiredkitqty;
                objkitregister = kitGraph.Document.Update(objkitregister);                   
                kitGraph.Save.Press();
                if (kitGraph.Actions.Contains("Release"))
                {
                    kitGraph.Actions["Release"].Press();
                }