Skocz do zawartości

[Sfera] zmiana kolejności pozycji na dokumencie


Zobacz rozwiązanie Rozwiązane przez Wojciech Szopiński,

Polecane posty

Dzień Dobry,

 

Potrzebuje wg pewnych zaleceń porządkować pozycje na dokumentach sprzedażowych i zamówieniach od klientów  (seryjnie wszystkie dokumenty z danego dnia aplikacja konsolową)

 

Niestety zwykła zmiana LP na pozycjidokumentu i zapisaniu dokumentu nie powoduje, żadnych zmian - pozycje są wg starej numeracji.

 

Co powoduje takie zachowanie?

 

 

Edytowane przez Bartłomiej Warchoł
Link to postu
Przesyłam całą klasę.
Na samym dole jest metoda odpowiedzialna za zapis
internal class Dokument
    {
        private int id;
        private string symbol;
        private DokumentDS dokDs;
        private DokumentZK dokZk;
        private IZamowienieOdKlienta zk;
        private IDokumentSprzedazy ds;
        private List<Pozycja> pozycje;
        public Dokument(int id) { this.Id = id; }

        public int Id { get => id; set => id = value; }
        internal List<Pozycja> Pozycje { get => pozycje; set => pozycje = value; }
        public string Symbol { get => symbol; set => symbol = value; }
        public DokumentDS DokDs { get => dokDs; set => dokDs = value; }
        public DokumentZK DokZk { get => dokZk; set => dokZk = value; }

        public Dokument() { }
        public Dokument(int id,string symbol)   
        {
            this.Id = id; 
            this.Symbol = symbol;
            pozycje = new List<Pozycja>();
        }
        public void PobierzZSubiekta()
        {
          
            if (Symbol == "ZK")
            {
                var zamowienieKlienta = Ssfera.Sfera.ZamowieniaOdKlientow();
                dokZk = zamowienieKlienta.Dane.Pierwszy(zk => zk.Id == this.Id);
                zk = zamowienieKlienta.Znajdz(dokZk);
                foreach (var poz in dokZk.Pozycje)
                {
                    pozycje.Add(new Pozycja(poz.AsortymentWybranyId, poz.Ilosc, poz.LP,poz.AsortymentWybrany.Asortyment.Grupa.Nazwa));
                }
                porzadkujPozycje();
                ZapiszNaNowoZK();
            }
            else
            {
                var fakturySprzedazy = Ssfera.Sfera.DokumentySprzedazy();
                dokDs = fakturySprzedazy.Dane.Pierwszy(fs => fs.Id == this.Id);
                ds = fakturySprzedazy.Znajdz(dokDs);
                foreach (var poz in dokDs.Pozycje)
                {
                    pozycje.Add(new Pozycja(poz.AsortymentWybranyId, poz.Ilosc, poz.LP, poz.AsortymentWybrany.Asortyment.Grupa.Nazwa));
                }
                porzadkujPozycje();
                ZapiszNaNowoDS();
            }
            
        }
                
        public void porzadkujPozycje()
        {
            int j = 1;
            string grupa;
            for (int i = 1; i <= 9; i++)
            {
                grupa = Zasoby.Kolejnosc.ResourceManager.GetString(i.ToString());
                if (grupa == "Ważenie")
                {
                    foreach (Pozycja poz in Pozycje)
                    {
                      
                            poz.Newlp = j;
                            j++;
                        
                    }

                }
                else
                {
                    foreach (Pozycja poz in Pozycje)
                    {
                        if (poz.Grupa == grupa )
                        {
                            poz.Newlp = j;
                            j++;
                        }
                    }
                }
            }
        }

        public void ZapiszNaNowoZK()
        {
          
            foreach(var poz in dokZk.Pozycje)
            {
                foreach(var poz2 in Pozycje)
                {
                    if(poz2.Lp == poz.LP && poz2.IdAso == poz.AsortymentWybranyId)
                    {
                        poz.LP = poz2.Newlp;
                    }
                }
            }
   
            if (zk.Zapisz())
            {

     
            }
            else
            {

                zk.WypiszBledy();
      
            }
        }
        public void ZapiszNaNowoDS()
        {
 
            foreach (var poz in dokDs.Pozycje)
            {
                foreach (var poz2 in Pozycje)
                {
                    if (poz2.Lp == poz.LP && poz2.IdAso == poz.AsortymentWybranyId)
                    {
                        poz.LP = poz2.Newlp;
                        
                    }
                }
            }

            if (ds.Zapisz())
            {

           
            }
            else
            {

                ds.WypiszBledy();
    
            }
        }

 

Link to postu
  • Rozwiązanie

Pana kod zmienia LP na encji pobranej z bazy, a nie tej edytowanej przez obiekt biznesowy dokumentu (IZamowienieOdKlienta lub IDokumentSprzedazy). W tym momencie zapis obiektu nie robi nic bo nic nie zostało w nim zmienione. Pętla po pozycjach, na których chce Pan zmienić LP powinna wyglądać tak:

foreach(var poz in zk.Dane.Pozycje)
foreach (var poz in ds.Dane.Pozycje)

Poza tym jeszcze mam jedną uwagę - nigdzie nie widzę zwalniania (Dispose) obiektów biznesowych. Warto obejmować je w klauzulę using(...) lub ręcznie Dispose'ować ponieważ bez tego mamy prostą drogę do nadmiernego zużycia pamięci.

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