Przejdź do treści

Inicjalizacja, przeliczenie i walidacja pól

Inicjalizacja wartości pól

Do każdego pola modelu danych oraz parametru można podpiąć metodę na inicjalizację wartości tego pola. Dla pól modelu danych, metoda na inicjalizację każdego pola uruchamiana jest automatycznie podczas dodawania nowego rekordu (interfejsowo lub poprzez wywołanie metody NewRecord()). Dla parametrów, metoda na inicjalizację jest uruchamiana w momencie pokazywania nowego okna na ekranie.

Inicjalizację pola REF kolejną wartością z generatora wykonujemy tak:

public string InitializeREF()
{
  return GenRef();
}

Aby zainicjować pole REGDATE dzisiejszym dniem piszemy:

public string InitializeREGDATE()
{
  return DateTime.Today.ToShortDateString();
}

Aby zainicjować pole REGDATETIME aktualnym timestampem:

public string InitializeREGDATETIME()
{
  return DateTime.Now.ToString();
}

Aby zainicjować pole ostatnio zapamiętaną wartością wpisaną uprzednio przez tego samego użytkownika piszemy:

public string InitializePOLE()
{
  return this.Parameter["POLE"]; // pobierz wartość parametru
}

public bool PostRecord()
{
  this.Parameter["POLE"] = this.POLE; // zapamiętaj wartość parametru.
  return base.PostRecord();
}  

Zapamiętanie bieżącej wartości w parametrze robimy poprzez przeciążenie metody PostRecord.

Metody na inicjalizację są wykonywane zarówno dla źródeł danych interfejsowych (powołanych przez otworzenie okna) jak i dla źródeł danych programowych (przez utworzenie obiektu biznesowego w kodzie C#).

W metodzie na inicjalizację nie powinno się korzystać z innych pól, których wartości również inicjalizujemy przez metodę na inicjalizację, ponieważ w takiej sytuacji nie wiadomo w jakiej kolejności te metody zostaną wykonane. Jeśli zachodzi taka potrzeba, inicjalizacji pola na podstawie wartości innego pola inicjalizowanego metodą na inicjalizację możemy dokonać wykorzystując metodę na przeliczenie.

Załóżmy, że mamy sytuację, w której mamy: * Obiekt słownika o nazwie SLOWNIK posiadający pole SYMBOL, będące kluczem głównym, i pole NAZWA * Obiekt TEST posiadający pola POLE1 oraz POLE2 * POLE1 obiektu TEST posiada relację do słownika SLOWNIK, poprzez pole łącznikowe SYMBOL * Inicjalizujemy pole POLE1 metodą InitializePOLE1() * Chcemy zainicjalizować POLE2 wartością ze słownika z pola NAZWA

Nie możemy dokonać inicjalizacji pola POLE2 następującą metodą:

// To błędny sposób. Ta metoda nie zadziała prawidłowo
public string InitializePOLE2()
{
  return POLE1_NAZWA;
}

W takiej sytuacji, zamiast tego, powinniśmy wykorzystać metodę na przeliczenie. Taka metoda mogłaby wyglądać następująco:

public string CalculatePOLE2()
{
  // Sprawdzamy, czy znajdujemy się w trybie dodawania nowego rekordu, ponieważ metoda na przeliczenie zostaje uruchomiona również w trybie edycji "E"
  if (this.State == "I")
  {
    return POLE1_NAZWA;
  }
  // Jeśli nie jesteśmy w trybie dodawania nowego rekordu, zwracamy null, co sprawi, że bieżąca wartość pola POLE2 nie zostanie zmieniona
  return null;
}

Metoda CalculatePOLE2() zostanie uruchomiona automatycznie, po tym jak wartość pola POLE1 zmieni się w wyniku metody na inicjalizację InitializePOLE1(), więc będziemy wtedy pewni, że ustawiamy wartość pola POLE2 na podstawie istniejących danych.

Przeliczenie wartości pól

Pola modelu danych lub parametry, których wartość zależy od innych pól możemy przeliczyć na jeden z dwóch sposobów:

  1. Ustawiamy jego wartość wprost w jakiejś metodzie, np tak: this.NAZWA = this.IMIE + " " + this.NAZWISKO;
  2. Tworzymy metodę na przeliczenie wartości pola i podpinamy ją w modelu danych. W tym przypadku metoda może wyglądać tak:
public string CalculateNAZWA()
{
  return this.IMIE + " " + this.NAZWISKO;
}

Pierwsze podejście stosujemy wtedy, gdy pole ustawiamy daną wartością sporadycznie lub wyjątkowo w danej sytuacji, w której akurat wykonuje się ten kod. Podejście drugie stosujemy wtedy, gdy przeliczenie pola jest pewną stale obowiązującą regułą. Np jeśli NAZWA zawsze powinna zostać złożona z imienia i nazwiska, to powinniśmy naliczać ją poprzez metodę na przeliczenie.

Metody na przeliczenie uruchamiane są automatycznie, gdy zmieni się dowolne pole, od którego zależy kod tej metody. Dla pól modelu danych uruchamiane są tylko wtedy, gdy rekord jest w trybie edycji lub dodawania nowego rekordu. Chodzenie kursorem po rekordach w gridzie nie powoduje odpalania metod na przeliczenie. Dlatego te metody nie służą na pewno do tworzenia dodatkowych kolumn autowyliczalnych.

Dla parametrów, metody na przeliczenie uruchamiane są niezależnie od tego, czy źródło danych jest w tryie przeglądania, czy edycji. Dlatego uruchamiane są częściej, nawet w momencie pokazywania okna na ekranie. Warto się upewnić, czy w treści metody na przeliczenie warto uwzględnić warunek: if(this.State=="E") ....

Jeśli metoda na przeliczenie uruchamia inne metody, to pola i parametry użyte w tych metodach rozszerzają listę pól i parametrów, których zmiana wpływa na to, że neos automatycznie uruchomi metodę na przeliczenie. Zatem błędem jest wywoływanie w metodzie na przeliczenie innych, zwłaszcza długich i ciężkich metod, które odwołują się do dużej liczby pól lub parametrów.

Jeśli w wyniku metody na przeliczenie chcemy pozostawić bieżącą wartość tego pola, to metoda powinna zwrócić null.

Metody na przeliczenie nie są wykonywane dla źródeł danych programowych (źródeł danych powołanych przez utworzenie obiektu biznesowego w kodzie C#).

Walidacja pól

Do walidacji pól modelu danych lub parametrów służy metoda na walidację. Metodę taką podpina się do pola modelu danych lub parametru w definicji obiektu biznesowego. Jeśli metoda na walidację zwróci pusty ciąg znaków, oznacza to, że walidacja przebiegła poprawnie. Jeśli zwróci niepusty ciąg znaków, to znaczy, że walidacja się nie udała, przy polu zostanie wyświetlony czerwony znaczek a ciąg znaków zwrócony przez tą metodę zostanie wyświetlony w formie komunikatu w kształcie dymka. Przykład metody na walidację wygląda tak:

public string ValidateSYMBOL()
{
  if(this.SYMBOL.Empty)
    return "Symbol nie może być pusty";
  return "";    
}

Metoda na walidację uruchamiana jest automatycznie, gdy zmieni się dowolne pole, do którego odwołuje się kod tej metody. Dzięki temu interfejs GUI natychmiastowo reaguje na to, czy pola zawierają poprawne wartości, czy nie. Przy czym metody dla pól danych uruchamiane są tylko wtedy, gdy istnieje jakikolwiek rekord w dziedzinie.

Metoda na walidację odpala się zarówno dla rekordów w trybie dodawania, edycji jak i przeglądania. Dzięki temu można zwalidować pola na oknie zaraz po wyświetleniu okna, zanim przejdziemy do trybu edycji i zaczniemy coś wpisywać. W związku z tym należy uważać na to, że metody na walidacje uruchamiają się także wtedy, gdy jedynie przeskakujemy między rekordami w gridzie. Aby uchronić się przed tym, można na początku metody na walidację użyć warunku if(this.State!="B") ....

Metoda walidująca jedno pole może zależeć od wielu pól. Np jeśli chcemy aby adres dostawy był wypełniony, ale tylko wtedy gdy użytkownik zaznaczył pole, że adres dostawy jest inny niż adres nabywcy, to metodę na walidację można napisać tak:

public string ValidateShippingAddress()
{
  if(this.SHIPTOOTHERADDRESS==1 && this.SHIPPINGADDRESS.Empty)
    return "Podaj adres dostawy";
  return "";    
}
Jeśli metoda na walidację uruchamia inne metody, to pola i parametry użyte w tych metodach rozszerzają listę pól i parametrów, których zmiana wpływa na to, że neos automatycznie uruchomi metodę na walidację. Zatem błędem jest wywoływanie w metodzie na walidację innych, zwłaszcza długich i ciężkich metod, które odwołują się do dużej liczby pól lub parametrów.

Wszystkie metody walidujące pola danych danego obiektu biznesowego są uruchamiane ponownie w trakcie zatwierdzania rekordu (interfejsowo lub poprzez programowe wywołanie metody PostRecord()). Z komunikatów o błędach walidacji tworzony jest jeden wspólny komunikat. Jeśli choć jedna metoda walidująca zwróciła błąd walidacji, to nie da się zatwierdzić zmian w takim rekordzie, a metoda PostRecord() zwraca false.

Metody na walidację nie są wykonywane dla źródeł danych programowych (źródeł danych powołanych przez utworzenie obiektu biznesowego w kodzie C#).