Skocz do zawartości

[Sfera] WPF/Wstępne uzupełnienie tworzonego obiektu, z zapisaniem w oknie

Polecane posty

W związku z rozbudową SDK w wersji 40, postanowiłem trochę poeksperymentować z aplikacjami WPF. Zastanawia mnie, czy istniej możliwość w tego rodzaju aplikacji, wstępnego uzupełnienia obiektu, np. faktury zakupu, otwarcia go w oknie i dopiero w tym oknie zapisania go? Kombinowałem na chłopski rozum, ale do niczego nie dotarłem, a dokumentacja i forum odnośnie WPF, jest bardzo mało wpisów:

IDokumentyZakupu dokumentyZakupu = ViewModel.UchwytDoSfery.PodajObiektTypu<IDokumentyZakupu>();
Konfiguracja konfFZ = ViewModel.UchwytDoSfery.PodajObiektTypu<IKonfiguracje>().DaneDomyslne.FakturaZakupuVAT;
using (IDokumentZakupu fz = dokumentyZakupu.Utworz(konfFZ))
  {
  var okno = ViewModel.UchwytDoSfery.PodajObiektTypu<IDokumentZakupuOkno>();
  DokumentDZ fakturaZakupu = okno.Popraw(fz.Dane);
  }

 

Link to postu

Ale z czym dokładnie ma Pan problem? W metodzie Popraw okna trzeba podać obiekt biznesowy dokumentu (w Pana przypadku "fz"), metoda nic nie zwraca tylko blokuje wykonanie Pana aplikacji do momentu zamknięcia okna. Po zamknięciu okna można dalej operować na obiekcie biznesowym.

Link to postu

Chciałbym utworzyć dokument FZ, wstępnie go uzupełnić, a potem otworzyć okno - z nie zapisanym jeszcze - dokumentem FZ, celem sprawdzenia przez użytkownika i zapisania. Więc podstawowe pytanie jest, czy tak się w ogóle da?

Jeśli tak, to jak utworzyć taki dokument, bo podszedłem do tego jak w zwykłej Sferze, a nie okienkowej, a przykłady, które są w dokumentacji, pokazują działania na już utworzonych wcześniej obiektach. Drobne nakierowanie i pewnie Sobie poradzę :)

 

Link to postu

No czyli tak jak Pan robił tylko w metodzie Popraw podaje Pan "fz" (obiekt biznesowy dokumentu), metoda nic nie zwraca więc nie przypisuje Pan jej wyniku do niczego, a po zamknięciu okna program przechodzi do kolejnej linii i albo ma Pan w tym momencie zapisany dokumentu, albo jeśli użytkownik anulował zapis to dokument dalej jest niezapisany.

Link to postu
24 minuty temu, Wojciech Szopiński napisał:

metoda nic nie zwraca więc nie przypisuje Pan jej wyniku do niczego

Jeśli nagłówek metody jest w postaci:

void MojaMetoda(object parametr);

To nie można z niej skorzystać tak:

var wynik = MojaMetoda(new object());

Ponieważ ona nic nie zwraca.

Link to postu

Ok, za mocno się zasugerowałem, że musi być wskazany. Czyli tutaj jest po prostu, tak:

IDokumentyZakupu dokumentyZakupu = ViewModel.UchwytDoSfery.PodajObiektTypu<IDokumentyZakupu>();
Konfiguracja konfFZ = ViewModel.UchwytDoSfery.PodajObiektTypu<IKonfiguracje>().DaneDomyslne.FakturaZakupuVAT;
using (IDokumentZakupu fz = dokumentyZakupu.Utworz(konfFZ))
  {
  var okno = ViewModel.UchwytDoSfery.PodajObiektTypu<IDokumentZakupuOkno>();
  okno.Popraw(fz);
  }

Metoda nic nie zwraca, a gdybym chciał się dowiedzieć, jaki dokument FZ dodałem, np. aby pokazać użytkownikowi jego numer, to jest jakaś opcja na to?

Link to postu
54 minuty temu, Wojciech Szopiński napisał:

po zamknięciu okna program przechodzi do kolejnej linii i albo ma Pan w tym momencie zapisany dokumentu, albo jeśli użytkownik anulował zapis to dokument dalej jest niezapisany

 Po zamknięciu okna program przejdzie do następnej linii po:

okno.Popraw(fz);

I w tym miejscu w obiekcie "fz" ma Pan zmiany wprowadzone zmiany na formatce.

Link to postu

Ok, racja, wcześniej mnie zmylił wyjątek bo powieliłem fz.Zapisz().

No dobra, skoro okno.Popraw() nic nie zwraca, niezależnie, czy kliknąłem Zapisz czy Anuluj, to czy poza sprawdzeniem np. istnienia numeru, jest jakaś metoda na wykrycie, czy użytkownik zapisał, czy anulował jednak dodawanie?

Link to postu

Ok, bo nie chciałem wstawić "brzydkiego" rozwiązania, dla potomnych ;)

 

Więc dla potomnych, poniższy kod można podstawić pod szablon aplikacji WPF, dostępny od wersji 40 i odpowiednio dostosować do Swoich potrzeb, czy dokumentów ;)

 

if (ViewModel.UchwytDoSfery != null)
{
IPodmioty podmioty = ViewModel.UchwytDoSfery.PodajObiektTypu<IPodmioty>();
IAsortymenty asortyment = ViewModel.UchwytDoSfery.PodajObiektTypu<IAsortymenty>();
IDokumentyZakupu dokumentyZakupu = ViewModel.UchwytDoSfery.PodajObiektTypu<IDokumentyZakupu>();
Konfiguracja konfFZ = ViewModel.UchwytDoSfery.PodajObiektTypu<IKonfiguracje>().DaneDomyslne.FakturaZakupuVAT;

using (IDokumentZakupu fz = dokumentyZakupu.Utworz(konfFZ))
  {
  Magazyn mag = ViewModel.UchwytDoSfery.PodajObiektTypu<IMagazyny>().Dane.Wszystkie().Where(m => m.Id == 100000).FirstOrDefault();
  fz.Dane.Magazyn = mag;
  var klient = podmioty.Dane.Wszystkie().Where(p => p.Id == 100027).FirstOrDefault();
  fz.Dane.Podmiot = klient;
  Asortyment a = asortyment.Dane.Wszystkie().Where(t => t.Id == 100000).First();
  var poz = fz.Pozycje.Dodaj(a, 100, a.JednostkaSprzedazy);
  poz.Cena.NettoPoRabacie = 9.99m;
  fz.Przelicz();
  var okno = ViewModel.UchwytDoSfery.PodajObiektTypu<IDokumentZakupuOkno>();
  okno.Popraw(fz);
  if(fz.Dane.NumerWewnetrzny.PelnaSygnatura!="") MessageBox.Show("Dodano fakturę zakupu: "+"\n"+fz.Dane.NumerWewnetrzny.PelnaSygnatura);
  }
} 

 

  • Lubię to 2
Link to postu

Tutaj zamiast:

if(fz.Dane.NumerWewnetrzny.PelnaSygnatura!="")

Napisałbym:

if(!string.IsNullOrEmpty(fz.Dane.NumerWewnetrzny.PelnaSygnatura))

Bo Pana warunek dla null'a założy, że dokument został zapisany.

 

Dodatkowo można jeszcze skorzystać z własności Zmodyfikowany:

if (fz.Zmodyfikowany)
{
	// nie zapisano obiektu
}
else
{
	// zapisano obiekt
}

Chciałbym jeszcze sprostować to co napisałem na początku:

2 godziny temu, Wojciech Szopiński napisał:

Po zamknięciu okna można dalej operować na obiekcie biznesowym.

Jednak NIE da się po zamknięciu okna operować na uprzednio wyświetlanym obiekcie biznesowym - należy go załadować ponownie.

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