Skocz do zawartości

[Sfera] Modyfikacja pola MiejsceDostawy na dokumencie handlowym

Polecane posty

Tworzyłem dokumenty sprzedaży na bazie dokumentów ZK. Jednak przez pomyłkę przekazywałem tam błędne pole MiejsceDostawyTyp oraz nie przekazywałem pola MiejsceDostawy.
 
Chciałem dokonać edycji takich dokumentów handlowych i ustawić te wartości na poprawne na podstawie ZK.
Fragment kodu:
 
 sfera.ZalogujOperatora(nexouser, nexopassword);

var zamowieniaDane = sfera.PodajObiektTypu<IZamowieniaOdKlientow>().Dane.Wszystkie();
var dokumentySprzedazy = sfera.PodajObiektTypu<IDokumentySprzedazy>();
 

 int zkId = 11111;
 int dokumentSprzedazyId = 222222;
 DokumentZK zk = null;
zk = zamowieniaDane.Where(z => z.Id == zkId).FirstOrDefault();

DokumentDS fs = dokumentySprzedazy.Dane.Wszystkie().Where(d => d.Id == dokumentSprzedazyId).First();
 using (IDokumentSprzedazy ds = dokumentySprzedazy.Znajdz(fs))
 {
            ds.Dane.MiejsceDostawy = zk.MiejsceDostawy;
             ds.Dane.MiejsceDostawyTyp = zk.MiejsceDostawyTyp;
             ds.Zapisz();

 }
 
Gdy próbowałem dokonać edycji tylko
ds.Dane.MiejsceDostawyTyp = zk.MiejsceDostawyTyp;
to kończyło się to sukcesem.
 
Jednak dodanie   ds.Dane.MiejsceDostawy = zk.MiejsceDostawy; powoduje błąd:
System.InvalidCastException: Unable to cast object of type 'InsERT.Moria.ModelDanych.DokumentZK' to type 'InsERT.Moria.ModelDanych.DokumentHandlowy'.
   at InsERT.Moria.Dokumenty.Logistyka.DokumentSprzedazyBO.WalidujTypTowaruISprzedazZaliczkowa(PozycjaDokumentu pozycjadokumentu)
   at InsERT.Moria.Dokumenty.Logistyka.DokumentSprzedazyBO.TypTowaruOfPozycjaDokumentuValidating(PozycjaDokumentu pozycjadokumentu)
   at InsERT.Moria.Dokumenty.Logistyka.DokumentSprzedazyBO.ScalarPropertyValidatingInternal(Object entity, String propertyName, String methodNameSuffix)
   at InsERT.Moria.Dokumenty.Logistyka.DokumentSprzedazyBO.PozycjaDokumentuValidating(Object entity)
   at InsERT.Moria.Dokumenty.Logistyka.DokumentSprzedazyBO.EntityValidatingCore(Object entity)
   at InsERT.Mox.BusinessObjects.BusinessObject`3.<>c__DisplayClass219_0.<ValidateDataObjectPrivate>b__0()
   at InsERT.Mox.Aop.RuntimeWeavedJoinpoint.Proceed()
   at InsERT.Mox.DataExtensions.DisabledPropertiesValidationAspect.Execute(IJoinpoint joinpoint)
   at InsERT.Mox.Aop.RuntimeWeavedJoinpoint.Proceed()
   at InsERT.Mox.DataExtensions.ObsoleteExtensionNotificationAspect.Execute(IJoinpoint joinpoint)
   at InsERT.Mox.Aop.RuntimeWeavedJoinpoint.Proceed()
   at InsERT.Mox.Aop.Weaver.RuntimeWeave(RuntimeWeavedJoinpoint joinpoint, Action coreOperation)
   at InsERT.Mox.BusinessObjects.BusinessObject`3.ValidateDataObjectPrivate(Object dataObject)
   at InsERT.Mox.BusinessObjects.BusinessObject`3.<>c__DisplayClass209_0.<AfterRelatedCollectionRefreshPrivate>b__2(Object e)
   at InsERT.Mox.DataAccess.DataDomain.TraverseDataCore(Object dataObject, Func`2 searchFunc, ISet`1 traversed, RelationshipTraversalInfo cameFrom)
   at InsERT.Mox.DataAccess.DataDomain.TraverseData(Object node, Func`2 searchFunction, ISet`1 traversedNodes)
   at InsERT.Mox.BusinessObjects.BusinessObject`3.AfterRelatedCollectionRefreshPrivate(Object entity, RelationshipChangedEventArgs args)
   at InsERT.Mox.BusinessObjects.BusinessObject`3.InsERT.Mox.DataAccess.IDataEventsSink.OnRelationshipChanged(Object affectedDataObject, RelationshipChangedEventArgs args)
   at InsERT.Mox.DataAccess.EntityFramework.EntityDataObjectBase.CallRelationshipChangedOnSponsorWithCorrectLazyLoadingSetting(IDataEventsSink sponsor, RelationshipChangedEventArgs args)
   at InsERT.Mox.DataAccess.EntityFramework.EntityDataObjectBase.HandleImplicitAssociationChange[T](EntityCollection`1 collection, CollectionChangeEventArgs args, String collectionPropertyName)
   at InsERT.Moria.ModelDanych.Dokument.HandlePozycjeRelatedEndAssociationChanged(Object sender, CollectionChangeEventArgs e)
   at System.Data.Entity.Core.Objects.DataClasses.EntityCollection`1.OnAssociationChanged(CollectionChangeAction collectionChangeAction, Object entity)
   at System.Data.Entity.Core.Objects.DataClasses.EntityCollection`1.Load(List`1 collection, MergeOption mergeOption)
   at System.Data.Entity.Core.Objects.DataClasses.EntityCollection`1.Load(MergeOption mergeOption)
   at InsERT.Mox.DataAccess.EntityFramework.EntityDataObjectBase.LoadRelatedEnd(RelatedEnd end)
   at InsERT.Mox.DataAccess.EntityFramework.EntityDataObjectBase.WrappedEntityCollection`1.EnsureUnderlyingEntityCollection(Boolean load)
   at InsERT.Mox.DataAccess.EntityFramework.EntityDataObjectBase.WrappedEntityCollection`1.GetEnumerator()
   at System.Linq.Enumerable.All[TSource](IEnumerable`1 source, Func`2 predicate)
   at InsERT.Moria.Dokumenty.Logistyka.AutomatyzacjaStatusow.AkcjaZmianyStatusuRealizowanegoZK.CzyZamowienieJestWPelniZrealizowane(DokumentZK zk, Boolean wyliczanieBezWzlgeduNaSkutekDostepne)
   at InsERT.Moria.Dokumenty.Logistyka.AutomatyzacjaStatusow.AkcjaZmianyStatusuRealizowanegoZK.Wykonaj(UnitOfWork unitOfWork, Dokument edytowanyDokument, ZmienStatusDelegate zmienStatus)
   at InsERT.Moria.Dokumenty.Logistyka.AutomatyzacjaStatusow.KoordynatorAutomatyzacjiStatusow.WykonajAkcje(Dokument edytowanyDokument, AkcjaAutomatyzacjiStatusu akcja)
   at InsERT.Moria.Dokumenty.Logistyka.AutomatyzacjaStatusow.KoordynatorAutomatyzacjiStatusow.Dokument_ChangesSaving(Dokument dokument)
   at InsERT.Moria.Dokumenty.Logistyka.DokumentPart.ChangesSaving(IBusinessObject businessObject, CancelEventArgs args, Dokument dokument)
   at InsERT.Moria.Dokumenty.Logistyka.DokumentSprzedazyBO.ChangesSaving(CancelEventArgs args)
   at InsERT.Moria.Dokumenty.Logistyka.DokumentSprzedazyBO.ChangesSavingCore(CancelEventArgs args)
   at InsERT.Mox.BusinessObjects.BusinessObject`3.<>c__DisplayClass188_0.<HandleBeforeSavingChanges>b__0()
   at InsERT.Mox.Aop.RuntimeWeavedJoinpoint.Proceed()
   at InsERT.Moria.SladRewizyjny.ChangesSavingObiektuAdvice.<>c__DisplayClass2_0.<Execute>b__0()
   at InsERT.Moria.Narzedzia.Prywatne.NarzedziaMoriowe.WykonajZWlaczonaFlaga(Action akcja, Boolean& flaga)
   at InsERT.Moria.SladRewizyjny.SladRewizyjny.ToNieJestPierwszorzednaModyfikacja(Action akcja)
   at InsERT.Moria.SladRewizyjny.ChangesSavingObiektuAdvice.Execute(IJoinpoint joinpoint)
   at InsERT.Mox.Aop.RuntimeWeavedJoinpoint.Proceed()
   at InsERT.Moria.Vendero.Aspekty.PowiadamianieOZmianachVendero.Execute(IJoinpoint joinpoint)
   at InsERT.Mox.Aop.RuntimeWeavedJoinpoint.Proceed()
   at InsERT.Moria.Dokumenty.Logistyka.Realizacje.AspektRealizacjiPozycji.Execute(IJoinpoint joinpoint)
   at InsERT.Mox.Aop.RuntimeWeavedJoinpoint.Proceed()
   at InsERT.Mox.NaglowkiObiektow.FreeformRelationshipCleanupAspect.Execute(IJoinpoint joinpoint)
   at InsERT.Mox.Aop.RuntimeWeavedJoinpoint.Proceed()
   at InsERT.Mox.NaglowkiObiektow.WypelnianieNaglowkow.Execute(IJoinpoint joinpoint)
   at InsERT.Mox.Aop.RuntimeWeavedJoinpoint.Proceed()
   at InsERT.Mox.DataExtensions.RequiredFieldsGuardAspect.Execute(IJoinpoint joinpoint)
   at InsERT.Mox.Aop.RuntimeWeavedJoinpoint.Proceed()
   at lTU=.JjY=.MTY=(Object& instance, Object[] methodArgs, Boolean isNullNullable, MethodBase methodBase, Boolean isVirtualCall)
   at lTU=.dUY=.eEY=(zDU= )
   at lTU=.ljY=.mTY=(zDU= ctx)
   at lTU=.ljY=.mTY=(zDU= ctx)
   at VMRuntime.Libraries.CSVMRuntime.SzY=(FDY= vmMethod, zDU= ctx)
   at VMRuntime.Libraries.CSVMRuntime.SjY=(Assembly asm, String id, Object[] args)
   at VMRuntime.Libraries.CSVMRuntime.RunMethod(String id, Object[] args)
   at InsERT.Mox.Security.ReadOnly.ReadOnlySaveChangesBlocker.Execute(IJoinpoint joinpoint)
   at InsERT.Mox.Aop.RuntimeWeavedJoinpoint.Proceed()
   at InsERT.Mox.Aop.Weaver.RuntimeWeave(RuntimeWeavedJoinpoint joinpoint, Action coreOperation)
   at InsERT.Mox.BusinessObjects.BusinessObject`3.HandleBeforeSavingChanges(Object sender, CancelEventArgs args)
   at InsERT.Mox.Work.UnitOfWork.PublishBeforeSavingChangesNotification()
   at InsERT.Mox.Work.UnitOfWork.SaveChanges1(Boolean& saveRequestVetoed, Boolean& changesWereSaved)
   at InsERT.Mox.Work.UnitOfWork.SaveChanges()
   at InsERT.Mox.BusinessObjects.BusinessObject`3.Zapisz()
 
 
Bardzo prosimy o wskazówkę jak poprawić ten błąd.
Link to postu

Jeśli w polu MiejsceDostawyTyp jest ustawiona wartość 64 ((byte)InsERT.Moria.Dokumenty.Logistyka.MiejsceDostawyTyp.Reczny) to encja typu AdresHistoria przechowująca dane o adresie dostawy jest kontrolowana (tworzona i zapisywana) przez obiekt dokumentu i nie można jej wprost przepisywać pomiędzy dokumentami. Należy przepisać poszczególne dane z adresu dostawy na źródłowym dokumencie. Zamiast:

ds.Dane.MiejsceDostawy = zk.MiejsceDostawy; 

Należy zrobić to tak:

if (ds.Dane.MiejsceDostawy == null)
	ds.Dane.MiejsceDostawy = new AdresHistoria();
// linie powyżej NIE są konieczne ponieważ zmiana MiejsceDostawyTyp na Reczny
// powinno utworzyć encję AdresHistoria i powiązać ją z własnością MiejsceDostawy
// ale dla bezpieczeństwa warto to sprawdzić przed przepisywaniem adresu
ds.Dane.MiejsceDostawy.Nazwa = zk.MiejsceDostawy.Nazwa;
ds.Dane.MiejsceDostawy.Linia1 = zk.MiejsceDostawy.Linia1;
ds.Dane.MiejsceDostawy.Linia2 = zk.MiejsceDostawy.Linia2;
ds.Dane.MiejsceDostawy.Linia3 = zk.MiejsceDostawy.Linia3;
ds.Dane.MiejsceDostawy.LiniaCalosc = zk.MiejsceDostawy.LiniaCalosc;
ds.Dane.MiejsceDostawy.Panstwo = zk.MiejsceDostawy.Panstwo;

W przypadku gdy MiejsceDostawyTyp jest ustawiony na wartość inną niż Reczny wtedy adres dostawy jest przechowywany w polu MiejsceDostawyZewnetrzne co oznacza, że adres dostawy jest pobrany z zewnętrznego obiektu (np. klient na dokumencie) i wtedy można przepisywać adresy między dokumentami.

Link to postu
×
×
  • Dodaj nową pozycję...