Radomił Ząbik 308 Napisano 9 Marca 2021 Udostępnij Napisano 9 Marca 2021 w [Sfera] Masowe modyfikowanie pozycji cennika Przygotowałem Sobie uniwersalną funkcję do modyfikowania cennika - dodawanie, aktualizowanie i usuwanie jego pozycji, z wskazaniem progów. Wszystko z osobna Sobie spokojnie działało, ale jak jednocześnie na cenniku aktualizuję i dodaje asortymenty, to dodawanie nie dodaje pozycji. Kombinowałem już ze wszystkim - inne nazwy zmiennych, podczytywanie nawet asortymentu na inną zmienną. Bez efektu. Ostatecznie, po dodaniu zapisywania cennika, co pozycję, dostałe błąd ... Cytat Wartość nie może być zerowa ... tyle, że wszystkie wartości są, a jak tym samym kodem, z wykomentowanyną aktualizacją zrobię, to wszystko się pięknie dodaje. Może powinienem coś wywołać? W dokumentacji nic już więcej nie znalazłem. Kod: // pobranie danych podstawowych ICenniki menadzerCennikow = sfera.PodajObiektTypu<ICenniki>(); IAsortymenty asortymenty = sfera.PodajObiektTypu<IAsortymenty>(); int id; id = results.id; var cennikDoEdycji = menadzerCennikow.Dane.Wszystkie().Where(c => c.Id == id).First(); using(ICennik cennik = menadzerCennikow.Znajdz(cennikDoEdycji)) // edytujemy cennik { Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")+" - edytowanie: "+cennik.Dane.Tytul); // przetwarzanie pozycji foreach(var pos in results.pos) { int posid = pos.posid; int good = pos.good; int range = pos.range; decimal buy = pos.buy; decimal sale = pos.sale; if(pos.type=="delete") { Asortyment asortymentD = asortymenty.Dane.Wszystkie().Where(a => a.Id == good).FirstOrDefault(); Console.WriteLine("- usuwanie "+asortymentD.Symbol); var pozycja = cennik.Pozycje.ZnajdzPozycjeCennika(asortymentD).Where(p => p.Id == posid).FirstOrDefault(); cennik.Pozycje.Usun(pozycja); } if(pos.type=="update") { Asortyment asortymentU = asortymenty.Dane.Wszystkie().Where(a => a.Id == good).FirstOrDefault(); Console.WriteLine("- aktualizowanie "+asortymentU.Symbol); var pozycjaU = cennik.Pozycje.ZnajdzPozycjeCennika(asortymentU).Where(p => p.Id == posid).FirstOrDefault(); pozycjaU.RozpocznijEdycje(); pozycjaU.CenaBazowa = buy; pozycjaU.CenaBrutto = sale*((100+asortymentU.StawkaVatSprzedaz.Stawka)/100); pozycjaU.CenaNetto = sale; //pozycjaU.PrzeliczPozycje(); pozycjaU.ZakonczEdycje(); } if(pos.type=="add") { Asortyment asortymentA = asortymenty.Dane.Wszystkie().Where(a => a.Id == good).FirstOrDefault(); Console.WriteLine("- dopisywanie "+asortymentA.Symbol); var pozycjaA = cennik.Pozycje.Dodaj(asortymentA); pozycjaA.RozpocznijEdycje(); pozycjaA.CenaBazowa = buy; pozycjaA.CenaBrutto = sale*((100+asortymentA.StawkaVatSprzedaz.Stawka)/100); pozycjaA.CenaNetto = sale; pozycjaA.IloscMinAsortymentu = range; //pozycjaA.PrzeliczPozycje(); pozycjaA.ZakonczEdycje(); } cennik.Zapisz(); } // zapisanie cennika cennik.Zapisz(); } Pełny błąd: System.ArgumentNullException: Wartość nie może być zerowa. Nazwa parametru: obiektZrodlowy w InsERT.Moria.Narzedzia.TraversalNode.Klonuj(Object obiektZrodlowy, Object obiektDocelowy, Boolean& wymagaSponsorowaniaKlonowanego) w InsERT.Moria.Narzedzia.KoordynatorUproszczonychPozycji`4.KlonujObiekt(UnitOfWork unitOfWork, IUproszczonaPozycja`3 pozycja) w InsERT.Moria.Narzedzia.KoordynatorUproszczonychPozycji`4.RozpocznijEdycje(UnitOfWork unitOfWork, IUproszczonaPozycja`3 pozycja, Boolean deferred) w InsERT.Moria.Narzedzia.UproszczonaPozycja`3.RozpocznijEdycje(UnitOfWork unitOfWork, Boolean deferred) w InsERT.Moria.Narzedzia.UproszczonaPozycja`3.RozpocznijEdycje(UnitOfWork unitOfWork) w InsERT.Moria.Narzedzia.UproszczonaPozycja`3.RozpocznijEdycje() w InsERT.Moria.CennikiICeny.KoordynatorUproszczonychPozycjiCennika.<>c.<WalidujUnikalnoscPozycjiCennika>b__50_4(IUproszczonaPozycjaCennika p) w System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() w System.Linq.Buffer`1..ctor(IEnumerable`1 source) w System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) w InsERT.Moria.CennikiICeny.KoordynatorUproszczonychPozycjiCennika.WalidujUnikalnoscPozycjiCennika() w InsERT.Moria.CennikiICeny.KoordynatorUproszczonychPozycjiCennika.ObsluzZapisywanie(CancelEventArgs args) w InsERT.Moria.CennikiICeny.CennikBO.ChangesSaving(CancelEventArgs args) w InsERT.Moria.CennikiICeny.CennikBO.ChangesSavingCore(CancelEventArgs args) w InsERT.Mox.BusinessObjects.BusinessObject`3.<>c__DisplayClass186_0.<HandleBeforeSavingChanges>b__0() w InsERT.Mox.Aop.RuntimeWeavedJoinpoint.Proceed() w InsERT.Moria.Vendero.Aspekty.PowiadamianieOZmianachVendero.Execute(IJoinpoint joinpoint) w InsERT.Mox.Aop.RuntimeWeavedJoinpoint.Proceed() w InsERT.Mox.NaglowkiObiektow.FreeformRelationshipCleanupAspect.Execute(IJoinpoint joinpoint) w InsERT.Mox.Aop.RuntimeWeavedJoinpoint.Proceed() w InsERT.Mox.NaglowkiObiektow.WypelnianieNaglowkow.Execute(IJoinpoint joinpoint) w InsERT.Mox.Aop.RuntimeWeavedJoinpoint.Proceed() w InsERT.Mox.DataExtensions.RequiredFieldsGuardAspect.Execute(IJoinpoint joinpoint) w InsERT.Mox.Aop.RuntimeWeavedJoinpoint.Proceed() w lTU=.JjY=.MTY=(Object& instance, Object[] methodArgs, Boolean isNullNullable, MethodBase methodBase, Boolean isVirtualCall) w lTU=.4UU=.5EU=(zDU= ) w lTU=.ljY=.mTY=(zDU= ctx) w lTU=.ljY=.mTY=(zDU= ctx) w VMRuntime.Libraries.CSVMRuntime.SzY=(FDY= vmMethod, zDU= ctx) w VMRuntime.Libraries.CSVMRuntime.SjY=(Assembly asm, String id, Object[] args) w VMRuntime.Libraries.CSVMRuntime.RunMethod(String id, Object[] args) w InsERT.Mox.Security.ReadOnly.ReadOnlySaveChangesBlocker.Execute(IJoinpoint joinpoint) w InsERT.Mox.Aop.RuntimeWeavedJoinpoint.Proceed() w InsERT.Mox.Aop.RuntimeWeavedJoinpoint.ApplyAdvice(IEnumerable`1 advice, Action coreOperation) w InsERT.Mox.Aop.Weaver.RuntimeWeave(RuntimeWeavedJoinpoint joinpoint, Action coreOperation) w InsERT.Mox.BusinessObjects.BusinessObject`3.HandleBeforeSavingChanges(Object sender, CancelEventArgs args) w InsERT.Mox.Work.UnitOfWork.PublishBeforeSavingChangesNotification() w InsERT.Mox.Work.UnitOfWork.SaveChanges1(Boolean& saveRequestVetoed, Boolean& changesWereSaved) w InsERT.Mox.Work.UnitOfWork.SaveChanges() w InsERT.Mox.BusinessObjects.BusinessObject`3.Zapisz() w SynchronousSocketListener.StartListening() w c:\mocujemy_nexo\Mocujemy\Program.cs:wiersz 958 W ramach testów, wcześniej udało mi się jeszcze bardziej dziwny błąd uzyskać: System.Data.Entity.Core.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Some part of your SQL statement is nested too deeply. Rewrite the query or break it up into smaller queries. w System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) w System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) w System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) w System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) w System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() w System.Data.SqlClient.SqlDataReader.get_MetaData() w System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted) w System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, Boolean inRetry, SqlDataReader ds, Boolean describeParameterEncryptionRequest) w System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry) w System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) w System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) w System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) w System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) w System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior, ObjectContext objectContext) --- Koniec śladu stosu wyjątków wewnętrznych --- w System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior, ObjectContext objectContext) w System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues) w System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) w System.Data.Entity.Core.Objects.ObjectQuery`1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__26_0() w System.Lazy`1.CreateValue() w System.Lazy`1.LazyInitValue() w System.Lazy`1.get_Value() w System.Data.Entity.Internal.LazyEnumerator`1.MoveNext() w System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) w System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) w InsERT.Moria.CennikiICeny.KoordynatorUproszczonychPozycjiCennika.UtworzUproszczonePozycjeInternal(IQueryable`1 query) w InsERT.Moria.CennikiICeny.KoordynatorUproszczonychPozycjiCennika.UtworzUproszczonePozycje(IQueryable`1 query) w InsERT.Moria.Narzedzia.KoordynatorUproszczonychPozycji`4.PodajPozycje() w InsERT.Moria.Narzedzia.KoordynatorUproszczonychPozycjiZAsortymentem`4.DodajWUoW(UnitOfWork unitOfWork, IEnumerable`1 paczka, Action`1 dodatkoweWypelnianie, Func`2 dodanoPozycjeCallback, Boolean dodajNowaGdyIstnieje) w InsERT.Moria.Narzedzia.KoordynatorUproszczonychPozycjiZAsortymentem`4.<>c__DisplayClass3_0.<Dodaj>b__1(IEnumerable`1 paczka) w InsERT.Moria.Narzedzia.KoordynatorUproszczonychPozycji`4.WykonajGrupowaOperacjeZPaczkowaniem[T](IEnumerable`1 kolekcjaDoPaczkowania, Action`1 akcjaDlaPaczki) w InsERT.Moria.Narzedzia.KoordynatorUproszczonychPozycjiZAsortymentem`4.<>c__DisplayClass3_0.<Dodaj>b__0() w InsERT.Moria.Narzedzia.KoordynatorUproszczonychPozycji`4.WykonajZWylaczynymiZdarzeniamiZmianKolekcjiOperacjiEdycji(Action akcja) w InsERT.Moria.Narzedzia.KoordynatorUproszczonychPozycjiZAsortymentem`4.Dodaj(IEnumerable`1 idAsortymentow, Func`4 aktualizatorPostepu, Action`1 dodatkoweWypelnianie, Boolean dodajNowaGdyIstnieje) w InsERT.Moria.Narzedzia.KoordynatorUproszczonychPozycjiZAsortymentem`4.Dodaj(IEnumerable`1 idAsortymentow, Func`4 aktualizatorPostepu, Action`1 dodatkoweWypelnianie) w InsERT.Moria.CennikiICeny.CennikBO.Dodaj(IEnumerable`1 listaIdAsortymentow, Func`4 aktualizatorPostepu, Action`1 dodatkoweWypelnianie) w InsERT.Moria.CennikiICeny.CennikBO.InsERT.Moria.CennikiICeny.ICennikPozycje.Dodaj(Int32 asortymentId) w InsERT.Moria.CennikiICeny.CennikBO.InsERT.Moria.CennikiICeny.ICennikPozycje.Dodaj(Asortyment asortyment) w SynchronousSocketListener.StartListening() w c:\mocujemy_nexo\Mocujemy\Program.cs:wiersz 946 Link to postu
Mateusz Matuszewski 91 Napisano 10 Marca 2021 Udostępnij Napisano 10 Marca 2021 w [Sfera] Masowe modyfikowanie pozycji cennika Pozycje nie dodają się, bo prawdopodobnie cennik się w ogóle nie zapisuje. Na podstawie callstacka mogę stwierdzić, że w cenniku znajdują się nieunikalne pozycje (z identyczną jednostką i progiem sprzedaży), co uniemożliwia jego zapis. Wyjątek leci właśnie podczas dodawania na pozycje błędu o nieunikalności, i jest on spowodowany tym, że jedna z takich nieunikalnych pozycji została prawdopodobnie wyedytowana w innym miejscu (np. na innym stanowisku), więc zmienił się jej identyfikator w bazie danych (o czym nie wie edytowany cennik, ponieważ zakończenie edycji pozycji ją odblokowuje). Link to postu
Radomił Ząbik 308 Napisano 10 Marca 2021 Autor Udostępnij Napisano 10 Marca 2021 w [Sfera] Masowe modyfikowanie pozycji cennika Godzinę temu, Mateusz Matuszewski napisał: Pozycje nie dodają się, bo prawdopodobnie cennik się w ogóle nie zapisuje. Tak zgadza się, jak jednocześnie aktualizuję i dodaję, to cennik się nie zapisuje. Godzinę temu, Mateusz Matuszewski napisał: Na podstawie callstacka mogę stwierdzić, że w cenniku znajdują się nieunikalne pozycje (z identyczną jednostką i progiem sprzedaży), co uniemożliwia jego zapis. No dobrze, to czemu jak dokładnie tym samym kodem, puszczę osobno aktualizowanie, osobno dodawanie i osobno usuwanie, to wszystkie dane się przetwarzają i zapisują bez problemów? Dodatkowo, nawet wyrzuciłem wszystkie progi danego asortymentu, więc poza progiem 0, który jest nieusuwalny, wszystkie dodawałem i błąd nadal występował. Czy po prostu olać problem i jak działa osobno to działa, chociaż nie ukrywam, że dla celów wydajnościowych, lepiej raz edytować cennik, niż 3 razy. Link to postu
Mateusz Matuszewski 91 Napisano 10 Marca 2021 Udostępnij Napisano 10 Marca 2021 w [Sfera] Masowe modyfikowanie pozycji cennika Proszę spróbować posortować dane wejściowe żeby najpierw wykonały się wszystkie dodawania, a dopiero później edycje. Może to rozwiąże problem. 2 godziny temu, Radomił Ząbik napisał: Czy po prostu olać problem i jak działa osobno to działa, chociaż nie ukrywam, że dla celów wydajnościowych, lepiej raz edytować cennik, niż 3 razy. Nie zawsze edycja większej ilości pozycji za jednym zamachem będzie szybsza, pozycje cennika z poziomu UI właśnie ze względów wydajnościowych są edytowane w mniejszych paczkach po 200. Link to postu
Radomił Ząbik 308 Napisano 10 Marca 2021 Autor Udostępnij Napisano 10 Marca 2021 w [Sfera] Masowe modyfikowanie pozycji cennika 3 minuty temu, Mateusz Matuszewski napisał: Nie zawsze edycja większej ilości pozycji za jednym zamachem będzie szybsza, pozycje cennika z poziomu UI właśnie ze względów wydajnościowych są edytowane w mniejszych paczkach po 200. No ok, to zostanę przy obecnej wersji, puszczania osobno procesów, jeśli działa Ale generalnie sugeruje Pan, aby limitować pakiety do 200? Rzeczywiście w innym rozwiązaniu, zauważyłem diametralne spowolnienie, w sumie z dokumentami, jak jest więcej niż 100pozycji, to też jest tragedia. Link to postu
Mateusz Matuszewski 91 Napisano 10 Marca 2021 Udostępnij Napisano 10 Marca 2021 w [Sfera] Masowe modyfikowanie pozycji cennika Moja poprzednia wypowiedź była znacznym uproszczeniem, ale już śpieszę z wyjaśnieniami. Z pozycjami cennika sprawa jest trochę bardziej skomplikowana, ponieważ są one osobnymi obiektami biznesowymi, które podczas edycji cennika są edytowane w oddzielnych kontekstach. Wywołanie ZakonczEdycje na pozycji cennika powoduje zapis tej pozycji do bazy (przy zapisie cennika metoda wywoływana jest na wszystkich "otwartych" do edycji pozycjach). Nie ma więc większego znaczenia czy cennik zostanie zapisany jeden raz czy sto razy, bo i tak do bazy pójdzie tyle zapisów ile było wyedytowanych pozycji. W celu optymalizacji tego procesu z poziomu UI edytujemy pozycje w paczkach, żeby zamiast 200 zapisów do bazy szedł tylko jeden. Niestety na obecną chwilę w API cenników brakuje metod do zbiorczej edycji, ale zapisuję żeby je udostępnić. Jeśli nic nie stanie na przeszkodzie to udostępnimy je w wersji 35. 1 Link to postu
Radomił Ząbik 308 Napisano 13 Września 2021 Autor Udostępnij Napisano 13 Września 2021 w [Sfera] Masowe modyfikowanie pozycji cennika Troszkę odgrzebię temat, ale nie ma sensu zakładać od nowa. Mam jakiś dziwny problem z uzupełnianiem cenników Sferycznie. Ogólnie kod wcześniej wspomniany po rozdzieleniu procesów, radzi Sobie prawidłowo z uzupełnianiem cenników, a właściwie radził. Postanowiono go użyć do uzupełniania cenników dodatkowych. Skrypt działa, cenniki uzupełnia, ale wprowadzone ceny nie podkładają się same np. w ZK, przypisanym do klienta. Co ciekawe, wejście w cennik, drobna manipulacja na pozycji i zapisanie go ponownie rozwiązuje problem. Pytanie więc, czy w przypadku cenników dodatkowych, powinienem użyć jakieś dodatkowej metody w kodzie poniżej? ICenniki menadzerCennikow = sfera.PodajObiektTypu<ICenniki>(); IAsortymenty asortymenty = sfera.PodajObiektTypu<IAsortymenty>(); int id; id = results.id; var cennikDoEdycji = menadzerCennikow.Dane.Wszystkie().Where(c => c.Id == id).First(); using(ICennik cennik = menadzerCennikow.Znajdz(cennikDoEdycji)) // edytujemy cennik { Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd H:mm:ss")+" - edytowanie: "+cennik.Dane.Tytul); // przetwarzanie pozycji foreach(var pos in results.pos) { int posid = pos.posid; int good = pos.good; int range = pos.range; decimal buy = pos.buy; decimal sale = pos.sale; if(pos.type=="delete") { Asortyment asortymentD = asortymenty.Dane.Wszystkie().Where(a => a.Id == good).FirstOrDefault(); Console.WriteLine("- usuwanie "+asortymentD.Symbol); var pozycja = cennik.Pozycje.ZnajdzPozycjeCennika(asortymentD).Where(p => p.Id == posid).FirstOrDefault(); cennik.Pozycje.Usun(pozycja); } if(pos.type=="update") { Asortyment asortymentU = asortymenty.Dane.Wszystkie().Where(a => a.Id == good).FirstOrDefault(); Console.WriteLine("- aktualizowanie "+asortymentU.Symbol); var pozycjaU = cennik.Pozycje.ZnajdzPozycjeCennika(asortymentU).Where(p => p.Id == posid).FirstOrDefault(); pozycjaU.RozpocznijEdycje(); pozycjaU.CenaBazowa = buy; pozycjaU.CenaKalkulacyjna = buy; pozycjaU.CenaBrutto = sale*((100+asortymentU.StawkaVatSprzedaz.Stawka)/100); pozycjaU.CenaNetto = sale; pozycjaU.ZakonczEdycje(); } if(pos.type=="add") { Asortyment asortymentA = asortymenty.Dane.Wszystkie().Where(a => a.Id == good).FirstOrDefault(); Console.WriteLine("- dopisywanie "+asortymentA.Symbol); var pozycjaA = cennik.Pozycje.Dodaj(asortymentA); pozycjaA.RozpocznijEdycje(); pozycjaA.CenaBazowa = buy; pozycjaA.CenaKalkulacyjna = buy; pozycjaA.CenaBrutto = sale*((100+asortymentA.StawkaVatSprzedaz.Stawka)/100); pozycjaA.CenaNetto = sale; pozycjaA.IloscMinAsortymentu = range; pozycjaA.ZakonczEdycje(); } //cennik.Zapisz(); } // zapisanie cennika cennik.Zapisz(); } Link to postu
Mateusz Matuszewski 91 Napisano 14 Września 2021 Udostępnij Napisano 14 Września 2021 w [Sfera] Masowe modyfikowanie pozycji cennika Nie powtarzamy tego problemu. Jakie są konkretne wartości pól range, buy, sale, type w przypadku których nie działa? Czy nie działa dla wszystkich pozycji czy tylko dla niektórych? Czy jest to cennik uzupełniający do cennika głównego czy indywidualny dla klienta? Czy zaczyna działać po jakiejkolwiek manipulacji na pozycji cennika czy po jakiejś konkretnej? Link to postu
Radomił Ząbik 308 Napisano 14 Września 2021 Autor Udostępnij Napisano 14 Września 2021 w [Sfera] Masowe modyfikowanie pozycji cennika 1 godzinę temu, Mateusz Matuszewski napisał: Jakie są konkretne wartości pól range, buy, sale, type w przypadku których nie działa? [function] => updatePriceList [id] => 100000 [pos] => Array ( [0] => Array ( [type] => add [good] => 113154 [posid] => 0 [buy] => 0.5203 [range] => 100 [sale] => 1.052 ) [1] => Array ( [type] => add [good] => 113154 [posid] => 0 [buy] => 0.5203 [range] => 500 [sale] => 0.9995 ) [2] => Array ( [type] => add [good] => 113154 [posid] => 0 [buy] => 0.5203 [range] => 1000 [sale] => 0.9495 ) Type jest pozostałością pierwszej wersji, która miała obsługiwać wszystkie metody na raz, czyli dodawanie, aktualizacje i usuwanie. Jak już wcześniej rozmawialiśmy, to nie działało i dlatego jednocześnie idą rekordy jednego typu. Nie działa cały cennika, więc wrzucam pierwszy lepszy kawałek kodu. 1 godzinę temu, Mateusz Matuszewski napisał: Czy nie działa dla wszystkich pozycji czy tylko dla niektórych? Nie działa dla wszystkich, ale po edycji jednej pozycji, zaczyna działać. 1 godzinę temu, Mateusz Matuszewski napisał: Czy jest to cennik uzupełniający do cennika głównego czy indywidualny dla klienta? Cennik dodatkowy, bez powiązania z cennikiem główny, ale przypisany do klienta. 1 godzinę temu, Mateusz Matuszewski napisał: Czy zaczyna działać po jakiejkolwiek manipulacji na pozycji cennika czy po jakiejś konkretnej? Próby były na edycji ceny sprzedaży, na dowolnej pozycji i zapisanie cennika. Link to postu
Mateusz Matuszewski 91 Napisano 14 Września 2021 Udostępnij Napisano 14 Września 2021 w [Sfera] Masowe modyfikowanie pozycji cennika Czy po "naprawieniu" takiego cennika przez UI, a następnie dodaniu kolejnych pozycji sferycznie problem powraca? A może występuje tylko dla nowych pozycji? Czy sam cennik dodawany był sferycznie czy z UI? Jeśli sferycznie to przyda się kod rozwiązania (może być na priv). Link to postu
Radomił Ząbik 308 Napisano 14 Września 2021 Autor Udostępnij Napisano 14 Września 2021 w [Sfera] Masowe modyfikowanie pozycji cennika 8 minut temu, Mateusz Matuszewski napisał: Czy po "naprawieniu" takiego cennika przez UI, a następnie dodaniu kolejnych pozycji sferycznie problem powraca? Akurat takiego scenariusza nie było. W cenniku głównym, gdzie było importowane wiele plików nie występował problem. 9 minut temu, Mateusz Matuszewski napisał: A może występuje tylko dla nowych pozycji? Teoretycznie wszystkie są nowe, w przypadku tych z problemami. 9 minut temu, Mateusz Matuszewski napisał: Czy sam cennik dodawany był sferycznie czy z UI? Cennik jest tworzony w UI, potem w narzędziu do importu wskazuje się cennik, którego ID jest przekazywane i wybierane na początku kodu. Tutaj może rzeczywiście jest coś nie tak po stronie użytkowników, tworzących cenniki, tylko co. 11 minut temu, Mateusz Matuszewski napisał: Jeśli sferycznie to przyda się kod rozwiązania (może być na priv). Sferycznie uzupełnianie są pozycje, kodem, który wstawiałem. Link to postu
Radomił Ząbik 308 Napisano 1 Listopada 2021 Autor Udostępnij Napisano 1 Listopada 2021 w [Sfera] Masowe modyfikowanie pozycji cennika Jakieś pomysły w temacie? Może baza do analizy. Coraz częściej są sytuacje, że w cenniku widać ceny ładnie, razem z progami, a na dokumentach nie są wczytywane. Link to postu
Mateusz Matuszewski 91 Napisano 2 Listopada 2021 Udostępnij Napisano 2 Listopada 2021 w [Sfera] Masowe modyfikowanie pozycji cennika Nie udało nam się powtórzyć problemu. Prosimy o dane do analizy (z uszkodzonym cennikiem), może uda się coś ustalić. Link to postu
Przemysław Werner 394 Napisano 2 Listopada 2021 Udostępnij Napisano 2 Listopada 2021 w [Sfera] Masowe modyfikowanie pozycji cennika Dane proszę przesłać przez formularz kontaktowy kontynuując korespondencję z InsERT pod numerem zgłoszenia INS-287038. W jaki sposób wysłać bazę danych do firmy InsERT? Link to postu
Radomił Ząbik 308 Napisano 17 Grudnia 2021 Autor Udostępnij Napisano 17 Grudnia 2021 w [Sfera] Masowe modyfikowanie pozycji cennika Witam, to znowu ja Proszę o info, czy w przypadku takiego kodu ... int posid = pos.posid; int good = pos.good; int range = pos.range; decimal buy = pos.buy; decimal sale = pos.sale; if(pos.type=="update") { Asortyment asortymentU = asortymenty.Dane.Wszystkie().Where(a => a.Id == good).FirstOrDefault(); Console.WriteLine("- aktualizowanie "+asortymentU.Symbol); var pozycjaU = cennik.Pozycje.ZnajdzPozycjeCennika(asortymentU).Where(p => p.Id == posid).FirstOrDefault(); pozycjaU.RozpocznijEdycje(); pozycjaU.CenaBazowa = buy; pozycjaU.CenaKalkulacyjna = buy; pozycjaU.CenaBrutto = sale*((100+asortymentU.StawkaVatSprzedaz.Stawka)/100); pozycjaU.CenaNetto = sale; pozycjaU.ZakonczEdycje(); } ... znaczenie ma ilość miejsc po przecinku? Właśnie walczyłem z klientem, jego plik nie chciał się wczytać, a po zmianie zaokrąglenia do 4 miejsc po przecinku, udało się go zaczytać - wcześniej zdarzały się pozycje z 5 miejscami po przecinku. Funkcja zwracała pusty błąd. Może powinienem to zaokrąglać, do jakieś ustalonej precyzji ceny, tylko jak? Link to postu
Wojciech Szopiński 227 Napisano 20 Grudnia 2021 Udostępnij Napisano 20 Grudnia 2021 w [Sfera] Masowe modyfikowanie pozycji cennika W dniu 17.12.2021 o 12:48, Radomił Ząbik napisał: znaczenie ma ilość miejsc po przecinku? Tak, oczywiście. Jeśli przykładowo w pole CenaBrutto pozycji cennika wpiszemy 15.12345, a precyzja ceny w konfiguracji waluty cennika będzie ustawiona na 2 to taka zmiana się nie zapisze. W dniu 17.12.2021 o 12:48, Radomił Ząbik napisał: Może powinienem to zaokrąglać, do jakieś ustalonej precyzji ceny, tylko jak? pozycjaU.CenaNetto = Math.Round(sale, cennik.Waluta.PrecyzjaCeny, MidpointRounding.AwayFromZero); W dniu 17.12.2021 o 12:48, Radomił Ząbik napisał: Funkcja zwracała pusty błąd. Przy zapisie cennika również nie było żadnego błędu? Link to postu
Radomił Ząbik 308 Napisano 20 Grudnia 2021 Autor Udostępnij Napisano 20 Grudnia 2021 w [Sfera] Masowe modyfikowanie pozycji cennika W dniu 20.12.2021 o 08:36, Wojciech Szopiński napisał: Tak, oczywiście. Jeśli przykładowo w pole CenaBrutto pozycji cennika wpiszemy 15.12345, a precyzja ceny w konfiguracji waluty cennika będzie ustawiona na 2 to taka zmiana się nie zapisze. Czy to się pojawiło wraz z zmianami wprowadzonymi parę wersji temu, dotyczącymi precyzji ceny? Patrzę na przykład w dokumentacji, że to tam jest, aż dziwne gdybym to parę lat temu pominął W dniu 20.12.2021 o 08:36, Wojciech Szopiński napisał: Przy zapisie cennika również nie było żadnego błędu? Mam podpięte na końcu WypiszBledy i ale nie zwraca mi nic do zmiennej globalnej, w której to trzymam, a błąd jest, bo wysypuje się na Zapisz. Aczkolwiek, nie obserwowałem na żywo aplikacji, czy może wypisuje jakieś błędy już na poziomie działania na pozycji, ale wydaje mi się, że ten problem ciągnie mi się jakiś czas i jak wcześniej sprawdzałem, też nic nie było. Link to postu
Wojciech Szopiński 227 Napisano 20 Grudnia 2021 Udostępnij Napisano 20 Grudnia 2021 w [Sfera] Masowe modyfikowanie pozycji cennika W dniu 20.12.2021 o 09:30, Radomił Ząbik napisał: Czy to się pojawiło wraz z zmianami wprowadzonymi parę wersji temu, dotyczącymi precyzji ceny? Nie wiem jakie zmiany ma Pan na myśli gdyż precyzja ceny w konfiguracji walut pojawiła się dawno temu. A sama walidacja precyzji ceny z precyzją określoną w walucie z tego co mi się wydaje istniała od początku nexo (wcześniej sprawdzana była po prostu precyzja waluty). W dniu 20.12.2021 o 09:30, Radomił Ząbik napisał: Mam podpięte na końcu WypiszBledy i ale nie zwraca mi nic do zmiennej globalnej, w której to trzymam, a błąd jest, bo wysypuje się na Zapisz. Aczkolwiek, nie obserwowałem na żywo aplikacji, czy może wypisuje jakieś błędy już na poziomie działania na pozycji, ale wydaje mi się, że ten problem ciągnie mi się jakiś czas i jak wcześniej sprawdzałem, też nic nie było. Sprawdzimy i jeśli komunikowanie o błędach w tym przypadku faktycznie coś pomija to poprawimy. Link to postu
Wojciech Szopiński 227 Napisano 21 Grudnia 2021 Udostępnij Napisano 21 Grudnia 2021 w [Sfera] Masowe modyfikowanie pozycji cennika W dniu 20.12.2021 o 09:30, Radomił Ząbik napisał: Mam podpięte na końcu WypiszBledy i ale nie zwraca mi nic do zmiennej globalnej, w której to trzymam, a błąd jest, bo wysypuje się na Zapisz. Przeanalizowałem temat i jednak wydaje się, że wszystko jest w porządku. Problem w tym, że Pański kod zapewne wywołuje wypisz błędy na obiekcie biznesowym cennika (ICennik). W przypadku uproszczonych pozycji cennika każda operacja edycji tworzy osobny obiekt biznesowy pozycji cennika (IPozycjaCennika) i to on dostarcza błędy walidacji dla każdej z nich. W pierwszej kolejności można więc sprawdzić co zwraca metoda kończąca edycję pozycji i od razu wypisać/zapamiętać jej błędy: bool edycjaUdana = pozycjaU.ZakonczEdycje(); if (!edycjaUdana) { // ObiektBiznesowy jest typu IPozycjaCennika pozycjaU.ObiektBiznesowy.WypiszBledy(); } Jeśli ZakonczEdycje zwróci wartość False to pozycja dalej jest w trybie edycji. Można wtedy również anulować operację edycji: pozycjaU.AnulujEdycje(); Wtedy mimo błędnie zmodyfikowanych pozycji cennika zapis całego cennika powiedzie się. Jeśli przy zapisie cennika będą istniały pozycje, których edycja nie została zakończona (ponieważ kod nie wywołał metody ZakonczEdycje bądź metoda ta zwróciła False) to zapis całego cennika próbuje je zapisać raz jeszcze. Jeśli to się nie uda to zapis całego cennika nie powodzi się. Można wtedy odfiltrować pozycje z niezakończoną edycją i dla nich np. wypisać błędy: ICennik cennikBo = null; // ... foreach (IUproszczonaPozycjaCennika pozycja in cennikBo.Pozycje.Wszystkie.Where(p => p.CzyAktualnieEdytowana)) { pozycja.ObiektBiznesowy.WypiszBledy(); } Ewentualnie żeby nie było konieczności odwoływania się do wszystkich pozycji można "po drodze" zapamiętywać sobie pozycje, które się nie zapisały do jakiejś wewnętrznej struktury (np. listy). 1 Link to postu
Radomił Ząbik 308 Napisano 21 Grudnia 2021 Autor Udostępnij Napisano 21 Grudnia 2021 w [Sfera] Masowe modyfikowanie pozycji cennika W dniu 21.12.2021 o 10:00, Wojciech Szopiński napisał: Problem w tym, że Pański kod zapewne wywołuje wypisz błędy na obiekcie biznesowym cennika (ICennik). Ok, czyli tutaj jest mój błąd. Dziękuje za pełne sprecyzowanie problemu, wdrażam porady Link to postu
Polecane posty