Skocz do zawartości

[Sfera] Masowe modyfikowanie pozycji cennika

Polecane posty

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

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
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

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
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

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.

  • Dziękuję 1
Link to postu
  • 6 miesięcy temu...

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

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
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
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
  • 1 miesiąc temu...
  • 1 miesiąc temu...

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
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
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
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
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).

  • Dziękuję 1
Link to postu
×
×
  • Dodaj nową pozycję...