Skocz do zawartości

Powielanie asortymenu, przez Sferę

Polecane posty

Czy jest jakaś bezpośrednia metoda, na powielenie wybranego asortymentu, tak aby od razu można było go edytować? Na tą chwilę, jedyne co znalazłem, to metoda WypelnijNaPodstawie, więc wygląda to mniej więcej tak:

 

var asDoEdycji = asortymenty.Dane.Wszystkie().Where(a => a.Id == aid).FirstOrDefault();                    
                                      
if(asDoEdycji == null) {}
else
  {                  
  using(IAsortyment usluga = asortymenty.Utworz())
    {
    usluga.WypelnijNaPodstawie(asDoEdycji);
                      
    if(usluga.Zapisz())  {  } else { usluga.WypiszBledy(); }
    }
  }  

 

Edytowane przez Radomił Ząbik
Link to postu

Mam jeszcze dwa problemy z tematem powyżej i nie ukrywam, że potrzebowałbym pomocy. Otóż, co robię - biorę indeks asortymentu, powielam go i zmieniam na usługę - jest nam to potrzebne do obsłużenia procesów produkcyjnych u kooperantów. Więc mam powyższy kawałek kodu, po czym dokonuje zmian na usługę:

 

RodzajAsortymentu rUsluga = rodzaje.DaneDomyslne.Usluga;
...
usluga.Dane.Rodzaj = rUsluga; // zmieniamy na usługę

I wygląda na to, że nie jest to do końca prawidłowa metoda, bo mam dwa następujące problemy:

 

1. Błąd, w przypadku gdy asortyment posiadał stany minimalne lub optymalne "Dla asortymentu bez stanów magazynowych nie mogą być określone stany minimalne i optymalne w wybranych magazynach. Próbowałem je wyzerować, ale dostaję wtedy także błąd, że nie mogę ich ustawiać:

foreach(Magazyn mag in sfera.PodajObiektTypu<IMagazyny>().Dane.Wszystkie())
  {
  Console.WriteLine(mag.Adres);
  usluga.UstawStanMinimalny(mag,0);
  usluga.UstawStanOptymalny(mag,0);
  }

2. Nowe indeksy, które są teraz usługami, trafiają automatycznie do cenników, w których były wcześniej towary, a nie chciałbym aby tak się działo.

Link to postu

Ad.1 - no niestety, też na to wcześniej wpadłem, ale bez efektu. Kombinowałem też z 0 i null, bo na liście w GUI pasowałby null dla optymalnego:

usluga.WypelnijNaPodstawie(asDoEdycji); // powielamy asortyment  
                    
// stan minimalny i maksymalny
foreach(Magazyn mag in sfera.PodajObiektTypu<IMagazyny>().Dane.Wszystkie())
  {
  //Console.WriteLine(mag.Id);
  usluga.UstawStanMinimalny(mag,0);
  usluga.UstawStanOptymalny(mag,null);
  }
                    
usluga.Dane.Rodzaj = rUsluga; // zmieniamy na usługę

... efekt bez zmian:

 

usluga.PNG

 

Ad.2 - yhym, no to ok, jestem w stanie znaleźć pozycję cennika dodatkowego, ale niestety, nie znalazłem dostępu do metody Usuń:

// cenniki
foreach (PozycjaCennika poz in usluga.Dane.PozycjeCennika)
  {
  Console.WriteLine(poz.Cennik.PoziomCen.Nazwa);
  Console.WriteLine(poz.Cennik.Tytul);
  Console.WriteLine(poz.Cennik.Bazowy);
  if(poz.Cennik.Bazowy==false)
    {
    // i jaką metodą usunąć pozycję :(
    }
  } 

 

Edytowane przez Radomił Ząbik
Uzupełnienie punktu 2giego.
Link to postu

Ad1. Tak, tą metodą, udało się wyczyścić bez problemu, dziękuje!

 

Ad2. Niestety, im bardziej kombinuje, tym nie wiem jak te pozycje cennika usunąć. Chyba kwestia leży w tym, że jest to zduplikowane z poprzedniego asortymentu. Generalnie umiem dotrzeć do pozycji, ale nie udało mi się znaleźć metody na jej usunięcie, a próbowałem kilka, poniżej moje eksperymenty:

 

foreach (PozycjaCennika poz in usluga.Dane.PozycjeCennika) // listuję pozycje cennika dla zduplikowanego asortymentu
  {
  if(poz.Cennik.Bazowy==false) // szukam pozycji, która jest w cenniku dodatkowym, głównych nie ruszam
    {
    // Console.WriteLine(poz.Cennik.Tytul); // weryfikacja tytułu cennika do usunięcia
                        
    var cennikDoEdycji = menadzerCennikow.Dane.Wszystkie().Where(c => c.Id == poz.Cennik.Id).First();                
    using (ICennik cennik = menadzerCennikow.Znajdz(cennikDoEdycji))
      {
      // IUproszczonaPozycjaCennika pozycja = cennik.Pozycje.ZnajdzPozycjeCennika(usluga); 
      // podjąłem próbę znalezienia pozycji, ale nie przyjmuje tutaj tego nowego asorymentu w żadnej kombinacji
      // cennik.Pozycje.Usun();
      // jest metoda na usunięcia, ale potrzebuje typu IUproszczonaPozycjaCennika
      }
    
    }
  } 

 

Link to postu

Przed usuwaniem pozycji z cennika ta nowa usługa musi zostać zapisana, dopiero wtedy ją znajdzie. Wykonywane jest zapytanie w bazie danych, gdzie jeszcze nie ma tej niezapisanej usługi.

Są jednak jakieś problemy z obiektowym usuwaniem pozycji cennika w takiej sytuacji, bo to sprawdziłem. Proponuję to zrobić bezpośrednio w SQL, oczywiście po zapisaniu usługi:

var dbcFactory = sfera.PodajObiektTypu<IDbConnectionFactory>();
using (var connection = dbcFactory.CreateConnection(DbConnectionFlags.NoPooling | DbConnectionFlags.NoEnlist))
using (DbCommand command = connection.CreateCommand())
{
    try
    {
        connection.Open();
        command.CommandText = string.Format(
            "DELETE pc FROM ModelDanychContainer.PozycjeCennika AS pc " +
            "INNER JOIN ModelDanychContainer.Cenniki AS cen ON pc.Cennik_Id=cen.Id " +
            "WHERE Asortyment_Id={0:d} AND cen.Bazowy=0", usluga.Dane.Id);
        command.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
        Console.WriteLine("Wystąpił problem:\n{0}", ex.Message);
    }
}

 

Link to postu

Jeszcze dla kompletu metoda obiektowa:

ICenniki cenniki = sfera.PodajObiektTypu<ICenniki>();
foreach (Cennik dodatkowy in usluga.Dane.PozycjeCennika.Select(p => p.Cennik).Distinct())
{
    ICennik dodatkowyBo = cenniki.Znajdz(dodatkowy);
    foreach (IUproszczonaPozycjaCennika uprPozCen in dodatkowyBo.Pozycje.Wszystkie.Where(p => p.IdAsortymentu == usluga.Dane.Id))
        dodatkowyBo.Pozycje.Usun(uprPozCen);
    if (!dodatkowyBo.Zapisz())
        dodatkowyBo.WypiszBledy();
}

 

Link to postu
  • 2 miesiące temu...

Nie można ustawiać innego niż Brak. Brak można ustawić. :) Najlepiej zrobić to z wykorzystaniem odpowiedniego typu wyliczeniowego (patrz dokumentacja).

Z drugiej jednak strony ta właściwość jest poprawnie wypełniana w przypadku inicjowania danymi z szablonu (tak jak to się dzieje w UI) i nie ma potrzeby ustawiania ponownie:

var towary = sfera.PodajObiektTypu<IAsortymenty>();

using (var usluga = towary.Utworz())
{
  usluga.WypelnijNaPodstawieSzablonu(sfera.PodajObiektTypu<ISzablonyAsortymentu>().DaneDomyslne.Usluga);
  usluga.Dane.SposobRozbiciaNaPartie = (byte)SposobRozbiciaNaPartie.Brak; // to jest już niepotrzebne
  usluga.AutoSymbol();

  if (!usluga.Zapisz())
    usluga.WypiszBledy();
}

 

Edytowane przez Jarek K.
Link to postu
×
×
  • Dodaj nową pozycję...