Skocz do zawartości

Sfera zdarzeniowa - ustawienie blokady gdy zamówienie (nowe) jest tworzone w przedziale godzinowym.

Polecane posty

Dzień Dobry,

 

Natknąłem się z problemem podczas tworzenia blokady dodawania zamówienia od klientów w zadanych godzinach.
Samo rozszerzenie robiłem na podstawie innego tego typu blokady, która działa w tym momencie poprawnie (ctrl+c ctrl+v z zmienionym warunkiem blokady oraz treść blokady).

 

Nie jestem w tym momencie pewny co może być powodem niedziałania blokady.

 

 

using InsERT.Moria.Asortymenty;
using InsERT.Moria.Dokumenty.Logistyka;
using InsERT.Moria.ModelDanych;
using InsERT.Moria.Narzedzia.PolaWlasne2;
using InsERT.Moria.Rozszerzanie;
using System;
using System.Diagnostics;

namespace ZamowieniaSprawdzenieGodzin
{
    public class ZamowienieGodzinySferaZdarzeniowaPlugin : KlientSferyZdarzeniowej<IZamowienieOdKlienta>
    {
       
        public override void PrzedZapisemObiektu(IKontekstZdarzeniaPrzedZapisemObiektu<IZamowienieOdKlienta> kontekst)
        {
            //string polePodmiotu = "";
            //string polePodmiotu2 = "";
            //string poleZamowienia = "";
            base.PrzedZapisemObiektu(kontekst);
           
            // WalidujTrasy(kontekst, kontekst.ObiektBiznesowy.Dane);
            DokumentZK zk = new DokumentZK();
            zk = kontekst.ObiektBiznesowy.Dane;


            //var tmp = zk.PobierzEncjeZaawansowanychPolWlasnych();
           
            if (DateTime.Now.Hour < 14 || DateTime.Now.Hour > 15)
            {
                WalidujGodzine(kontekst, zk);
           
            }else
            {
                kontekst.UsunWszystkieBledyIOstrzezenia(zk, nameof(zk.NumerWewnetrzny.PelnaSygnatura));
            }
        }
        private void WalidujGodzine(IKontekstZdarzeniaZWalidacja kontekst, DokumentZK zk)
        {
            kontekst.UsunBlad(zk);
            kontekst.DodajBlad("Zamówienia możemy wystawiać tylko między 8 a 17",nameof(zk.NumerWewnetrzny.PelnaSygnatura));
        }
    }
}

 

Link to postu

Dobrze Pan sprawdził warunek? Sugerowałbym bym pododawać Sobie ślady, poprzez Debug.WritelLine(), najlepiej też z wartościami zmiennych, po czym w Visual Studio, z menu Debuguj, wybrać Podłącz do procesu, podpiąć się do Subiekta, przeklikać scenariusz i zobaczyć, gdzie coś uciekło.

 

Link to postu

Tak, po zerknięciu:

- nie wiem, czy podłączać się pod numer zamówienia, jako miejsce błędu - ten numer powstanie dopiero w trakcie zapisywania

- metoda DodajBlad, nie wskazuje dokładnie wybranego obiektu

Poniżej, skromniejszy, działający kod:

public override void PrzedZapisemObiektu(IKontekstZdarzeniaPrzedZapisemObiektu<IZamowienieOdKlienta> kontekst)
{
DokumentZK zk = kontekst.ObiektBiznesowy.Dane;
Debug.WriteLine("Zapisywanie: "+ zk.DataWprowadzenia);
Debug.WriteLine("Godzina: " + DateTime.Now.Hour);
if (DateTime.Now.Hour >= 8 && DateTime.Now.Hour <= 9)
  {
  Debug.WriteLine("Usuwanie błędu.");
  kontekst.UsunBlad(zk, nameof(DokumentZK.Uwagi));
  }
else
  {
  Debug.WriteLine("Dodawanie błędu.");
  kontekst.UsunBlad(zk, nameof(DokumentZK.Uwagi));
  kontekst.DodajBlad("Zamówienia można wystawiać tylko między 8, a 9.", zk, nameof(DokumentZK.Uwagi));
  }
}

A po wywaleniu Debugu:

public override void PrzedZapisemObiektu(IKontekstZdarzeniaPrzedZapisemObiektu<IZamowienieOdKlienta> kontekst)
{
DokumentZK zk = kontekst.ObiektBiznesowy.Dane;
if (DateTime.Now.Hour >= 8 && DateTime.Now.Hour <= 9) kontekst.UsunBlad(zk, nameof(DokumentZK.Uwagi));
else 
  {
  kontekst.UsunBlad(zk, nameof(DokumentZK.Uwagi));
  kontekst.DodajBlad("Zamówienia można wystawiać tylko między 8, a 9.", zk, nameof(DokumentZK.Uwagi));
  }
}

 

Edytowane przez Radomił Ząbik
  • Dziękuję 1
Link to postu

Podczas debugowania warunek został spełniony i aplikacja przeszła do metody dodającej błąd - i nic się nie stało - zapis dokumentu został umożliwiony,

 

Zastosowałem się jeszcze do porady subiekta i do parametrów metody DodajBlad dodałem odwołanie do encji. 

 

kontekst.DodajBlad("Zamówienia możemy wystawiać tylko między 8 a 17",zk,nameof(zk.NumerWewnetrzny.PelnaSygnatura));

 

Edit - widzę, że Pan również ten błąd zauważył.

Z tym odwołaniem to numeru zamówienia to racja, że dodaję się dopiero w trakcie zapisywania, jednak mimo wszystko i tak rozszerzenie działa.

 

Jaki to może mieć wpływ w takim razie na samo działania rozszerzenia?

Edytowane przez Paweł Jeliński
Link to postu
13 godzin temu, Paweł Jeliński napisał:

Zastosowałem się jeszcze do porady subiekta i do parametrów metody DodajBlad dodałem odwołanie do encji. 

I to było clue problemu - błędy dodaje się na całe encje bądź na poszczególne pola encji, ale zawsze to jakaś konkretna encja musi ten błąd/ostrzeżenie "otrzymać". Pana kod próbował dodawać błąd do obiektu typu string.

13 godzin temu, Paweł Jeliński napisał:

Z tym odwołaniem to numeru zamówienia to racja, że dodaję się dopiero w trakcie zapisywania, jednak mimo wszystko i tak rozszerzenie działa.

Jaki to może mieć wpływ w takim razie na samo działania rozszerzenia?

13 godzin temu, Radomił Ząbik napisał:

Ja bym podłączył się do innego pola, ja testowałem na Uwagi, ale można by spróbować z Datą, lub czymś innym.

Podanie nazwy pola nie jest obowiązkowe, co więcej można tam podać nawet nazwę pola, które nie istnieje w modelu danych. Podanie nazwy pola jest tylko wskazówką dla interfejsu użytkownika gdzie dany błąd ma się "podpiąć". W przypadku gdy np. rozwiązanie sferyczne ma swój własny interfejs użytkownika to można tam podawać swoje nazwy kontrolek, do których chcemy "podpiąć" komunikaty. W przypadku pola numeru dokumentu to użycie:

nameof(zk.NumerWewnetrzny.PelnaSygnatura)

powoduje, że błąd podpina się pod pole "PelnaSygnatura", a do takiego pola nie ma nigdzie w interfejsie bezpośredniego odwołania i błąd/ostrzeżenie nie podpina się pod żadną kontrolkę, ale wystarczy podpiąć błąd pod:

nameof(zk.NumerWewnetrzny)

I komunikat zostanie podłączony do kontrolki numeru dokumentu.

Link to postu
2 godziny temu, Wojciech Szopiński napisał:

Podanie nazwy pola nie jest obowiązkowe, co więcej można tam podać nawet nazwę pola, które nie istnieje w modelu danych. Podanie nazwy pola jest tylko wskazówką dla interfejsu użytkownika gdzie dany błąd ma się "podpiąć".

Czyli można spokojnie używać własnych nazw, np. w tym przypadku wpisać własny string "walidacja_godziny" i wtedy mamy pewność, że nie pokłócimy się z ewentualnymi "waszymi" błędami - w sensie jest to taki identyfikator błędu? Oczywiście jak podam wasz obiekt, to zaznaczy mi pole w formularzu.

Link to postu
17 minut temu, Radomił Ząbik napisał:

Czyli można spokojnie używać własnych nazw

Dokładnie tak.

17 minut temu, Radomił Ząbik napisał:

wtedy mamy pewność, że nie pokłócimy się z ewentualnymi "waszymi" błędami

Nic się tu nie pokłóci - jeśli załóżmy dodamy swoją własną walidację numeru oryginału dokumentu (bo np. chcemy żeby numer oryginału zawsze miał 20 znaków), dodamy błąd na pole nameof(Dokument.NumerZewnetrzny) to nasz błąd pojawi się na formatce dokumentu, będzie przypięty do kontrolki numeru oryginału, a pozostałe walidacje wynikające z biznesu nexo (numer oryginału nie może być pusty,  istnieje już dokument z tym samym numerem XXX) również się uruchomią i podepną do tej samej kontrolki. Tak jak napisałem - pole jest wskazówką dla interfejsu i nie tylko, w jakim obszarze danego obiektu jest problem. Równie dobrze można błędy/ostrzeżenia dodawać w ogóle bez podawania pola i to też będzie działać.

22 minuty temu, Radomił Ząbik napisał:

w sensie jest to taki identyfikator błędu?

Nie - jak napisałem wyżej - jest to wskazanie, której części obiektu dotyczy błąd.

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