Skocz do zawartości

[Sfera] Dostęp do pozycji korygowane, z poziomu pozycji, w korekcie dokumentu sprzedaży

Polecane posty

Próbuje zmienić wartości na pozycjach, korekty dokumentu sprzedaży DO NIEISTNIEJĄCEGO dokumentu. Podkreślam nieistniejącego, bo pozwala mi to na modyfikacje wartości przed, ale bardzo teoretycznie. Otóż chciałbym zmienić wartości związane z ceną, dla wiersza przed korektą, i mam problem się do niego dostać. Wszystkie obiekty w pozycji, odnoszą się do pozycji korygującej dany dokument, ale nie mogę namierzyć odnośnika do pozycji korygowanej. Zakładam, że nie powinienem przeszukiwać wszystkich pozycji korygowanych i jest do niej jakiś dostęp od strony pozycji?

 

Próbowałem podejść do tematu poprzez ZnajdzPozycjeWLancuchuKorekt, ale chyba nie tędy droga, aby uzyskać tą jedną pozycję:

foreach (var pozycja in korekta.Dane.Pozycje)
{
pozycja.ZnajdzPozycjeWLancuchuKorekt(p => p.PozycjaKorygujaca.Id == pozycja.Id); // chyba nie tędy droga
}

 

Edytowane przez Radomił Ząbik
Link to postu
W dniu 29.10.2022 o 13:42, Radomił Ząbik napisał:

korekty dokumentu sprzedaży DO NIEISTNIEJĄCEGO dokumentu

W dniu 29.10.2022 o 13:42, Radomił Ząbik napisał:

nie mogę namierzyć odnośnika do pozycji korygowanej

Przecież jedno z drugim się kłóci. Skoro ma Pan korektę do nieistniejącego dokumentu to znaczy, że pozycja korygowana NIE ISTNIEJE. Trzeba modyfikować pola obiektu CenaOryginalna pozycji korekty np:

PozycjaKorekty pozycjaKorekty;
//...
pozycjaKorekty.CenaOryginalna.NettoPrzedRabatem = nowaCena;

 

  • Dziękuję 1
Link to postu

Przepraszam, założyłem odgórnie, że skoro i tak otwieram to normalnym obiektem IKorektaDokumentuSprzedazy, to tak samo normalnie powinienem podejść do tematu.

A mój błąd polegał na nie podłączeniu pozycji, przez PozycaKorekty, przez co nie pokazał się komplet danych.

Link to postu

Rozumiem. Kolekcja Pozycje przechowuje encje typu PozycjaDokumentu ponieważ jest to kolekcja wspólna dla wszystkich typów dokumentów więc faktycznie w przypadku korekt najlepiej jest z niej korzystać mniej więcej w ten sposób:

foreach (var pozycja in korekta.Dane.Pozycje.OfType<PozycjaKorekty>())

Tak samo np. dla zleceń produkcyjnych w tej kolekcji będą zarówno pozycje typu PozycjaKomplet jak i PozycjaSkladnik.

  • Lubię to 1
Link to postu

Człowiek uczy się całe życie, a Sfery, jak ma scenariusz do zrealizowania. I tak 95% rzeczy można bez problemu rozgryźć w niej czy znaleźć w dokumentacji, ale zawsze zostaje te 5%, o które muszę wam truć na forum ;)

 

Swoją drogą, w przykładzie do Sfery, chyba jedynym, "Korekta faktury sprzedaży", może warto by było zmodyfikować tak, aby był z kolekcją i adekwatnym waszym komentarzem odnośnie kolekcji? No chyba, że w tym przykładzie od razu zaczytało by się dobrze?

 

P.S. Tak też może być, czy raczej tak jak Pan wskazał? Wolę uniknąć problemu, że coś się źle zaczyta.

foreach (PozycjaKorekty pozycja in korekta.Dane.Pozycje)

 

Link to postu

W tym konkretnym przypadku gdy mamy pewność, że w kolekcji encji typu PozycjaDokumentu są same encje (dziedziczące po niej) typu PozycjaKorekty - tak. Dzieje się tak gdyż jak można przeczytać np. tutaj:

Cytat

The C# compiler performs the cast implicitly for you.

Co oczywiście niesie za sobą pewne ryzyko bo już w takim przypadku:

IDokumentSprzedazy faktura;
//...
foreach (PozycjaKorekty pozycjaKorekty in faktura.Dane.Pozycje)
{

}

Otrzymamy wyjątek:

System.InvalidCastException: Nie można rzutować obiektu typu 'InsERT.Moria.ModelDanych.PozycjaDokumentu' na typ 'InsERT.Moria.ModelDanych.PozycjaKorekty'.

Gdyż nastąpiła niejawna próba rzutowania encji typu PozycjaDokumentu na typ PozycjaKorekty co jest niedozwolone. Dlatego też bezpieczniej jest, szczególnie dla przypadków gdy w kolekcji pozycji danego dokumentu mogą występować różne typy pozycji (vide wspomniane zlecenia produkcyjne) lepiej jest korzystać z metody rozszerzającej OfType<T>, która odpowiednio odfiltruje nam elementy z kolekcji wg zadanego typu. Ewentualnie samo rzutowanie można wykonać wewnątrz pętli:

foreach (PozycjaDokumentu pozycja in korekta.Dane.Pozycje)
{
	if (pozycja is PozycjaKorekty pozycjaKorekty)
	{
		// zrób coś...
	}
	else
	{
		// stało się coś dziwnego...
	}
}

 

  • Dziękuję 1
Link to postu

No dobra, jeszcze jedno pytanie w temacie korekty dokumentu nieistniejącego.

Jak w Subiekcie, zmieniam Sobie np. cenę, w pozycji oryginalnej, to po jej zatwierdzeniu, pozycje po mi się ładnie przeliczają i przede wszystkim, poprawia mi się kwota płatności. Gdy zrobię to samo sferycznie, niestety dostaje błędem płatności. Czy muszę się bawić w usuwani i dodawanie płatności, czy jest może jakaś metoda, której nie mogę wychwycić, dla pozycji korekty?

Link to postu
  • 9 miesięcy temu...

Odkopuję trochę wątek, wydawać by się można w podobnym temacie. Otóż próbuję bez skutku utworzyć Sobie KPZ i zmodyfikować pozycje. Więc tak, dodaje go:

IKorektyPrzyjecZewnetrznych korekty = sfera.PodajObiektTypu<IKorektyPrzyjecZewnetrznych>();
IPrzyjeciaZewnetrzne przyjecia = sfera.PodajObiektTypu<IPrzyjeciaZewnetrzne>();
int id = 100000;
DokumentPZ pz = przyjecia.Dane.Wszystkie().Where(p => p.Id == id).FirstOrDefault();   
using (IKorektaPrzyjeciaZewnetrznego kpz = korekty.UtworzKorektePrzyjeciaZewnetrznego(pz))
{
}

Ale gdy próbuję Sobie sprawdzić listę pozycji, aby znaleźć tą, którą chce korygować, nie ma nic:

foreach (PozycjaKorekty p in kpz.Dane.Pozycje)
{
WriteLineInfo("Pozycja: ", "" + p.AsortymentAktualny.Nazwa);
}

Ok, pomyślałem Sobie, może to że GUI wrzuca pozycje, to jakaś metoda, no jakaś jest, ale nie daje ona efektu:

kpz.WypelnijNaPodstawiePZ(pz);

No dobra, to może pozycja po pozycji się uda, i tak, jest dodało się, ale teraz mam pozycje zdublowane.

int posid = 100000;
PozycjaDokumentu pozycjaPZ = pz.Pozycje.Where(p => p.Id == posid).FirstOrDefault();
PozycjaKorekty pozycja = kpz.Pozycje.DodajPozycjeKorektyNaPodstawieInnejPozycji(pozycjaPZ, pozycjaPZ.AsortymentAktualny, pozycjaPZ.Ilosc, pozycjaPZ.JednostkaMiaryAs, magazyn);
                    

No i tym sposobem skończyły mi się pomysły. Jakieś sugestie, co robię źle?

Link to postu

W interfejsie udostępnionym pod kpz.Pozycje jest wiele metod korygujących pozycję PZ: KorygujPozycjeWedlugId, KorygujPozycjeWedlugLp, SprobujKorygowacPozycjeWedlugId, SprobujKorygowacPozycjeWedlugLp oraz metody Dodaj przyjmujące w parametrze pozycję korygowaną - do wyboru do koloru :)
 

Cytat

gdy próbuję Sobie sprawdzić listę pozycji, aby znaleźć tą, którą chce korygować, nie ma nic

Samo utworzenie korekty do dokumentu (z wyłączonym zwracaniem całości w konfiguracji) nie dodaje pozycji, dlatego na takim świeżym dokumencie nie ma nic.

 

Cytat

Ok, pomyślałem Sobie, może to że GUI wrzuca pozycje, to jakaś metoda, no jakaś jest, ale nie daje ona efektu

Metoda WypelnijNaPodstawiePZ koryguje pozycje na podstawie rozbieżności na PZ, ale faktycznie zabrakło takiej informacji w dokumentacji.
 

Cytat

No dobra, to może pozycja po pozycji się uda, i tak, jest dodało się, ale teraz mam pozycje zdublowane.

Metoda DodajPozycjeKorektyNaPodstawieInnejPozycji jest wykorzystywana przez lookup asortymentu ostatnio sprzedanego, ale dodaje ona tylko jedną pozycję, więc ciężko mi powiedzieć dlaczego u Pana pozycje są zdublowane.

Link to postu

Ok, a z czego wynika to, że jak nie dodam żadnej pozycji, nie użyję żadnej funkcji je wczytujących, poza wskazaniem w metodzie utwórz oryginalnego dokumentu, po zapisaniu, w samym Subiekcie te pozycje są. Są one dodawane potem czy to jest jakieś po prostu rzutowanie pozycji z oryginału?

Link to postu

Ok, więc KorygujPozycjeWedlugId działa jak marzenie. Jako, że korzystam z partii i rozbicia, to czy istnieje ryzyko, że jeśli wywołam tą metodę, bez wskazania nowej ilośći, domyślnie wybierze mi jakieś partie? Teoretycznie chyba nie powinno?

Link to postu
Cytat

Ok, a z czego wynika to, że jak nie dodam żadnej pozycji, nie użyję żadnej funkcji je wczytujących, poza wskazaniem w metodzie utwórz oryginalnego dokumentu, po zapisaniu, w samym Subiekcie te pozycje są. Są one dodawane potem czy to jest jakieś po prostu rzutowanie pozycji z oryginału?

Zgadza się. Pozycje na korekcie są wirtualne, dopiero po zmianie jakiegoś pola (np. ceny, ilości) tworzona jest rzeczywista pozycja korekty. Teraz chyba rozumiem, że pisząc o duplikatach miał Pan na myśli, że pozycje były zdublowane na formatce? Czyli w rzeczywistości dodała się jedna pozycja, po prostu ta druga była wirtualną pozycją korekty :)

 

Cytat

Ok, więc KorygujPozycjeWedlugId działa jak marzenie. Jako, że korzystam z partii i rozbicia, to czy istnieje ryzyko, że jeśli wywołam tą metodę, bez wskazania nowej ilośći, domyślnie wybierze mi jakieś partie? Teoretycznie chyba nie powinno?

Nie powinno. Wywołanie tej metody bez podania ilości po prostu "urzeczywistnia" pozycję korekty, nic nie jest korygowane z automatu.

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