Dostęp do pól modelu danych¶
Odczyt i zapis pól bieżącego rekordu w metodach interfejsu¶
Zwykle metody operują jedynie na danych bieżącego rekordu własnego obiektu. Pozwala to na:
- sterowanie wyglądem formy w zależności od danych,
- programowej zmianie danych w edytowanym rekordzie,
Odczyt danych wygląda następująco:
string s = this.IMIE + " " + this.NAZWISKO;
Możemy także przypisywać wartość do pola:
this.NAZWA = this.IMIE + " " + this.NAZWISKO;
Jeśli w kodzie C# będziemy przypisywać wartość do takiego pola to rekord zostanie przełączony w tryb edycji, dane zostaną wpisane i pokażą się w odpowiednim polu formy, ale rekord nie zostanie zatwierdzony, dopóki operator nie naciśnie przycisku Zapisz. Aby zautomatyzować zapis rekordu, można napisać tak:
EditRecord();
this.NAZWA = this.IMIE + " " + this.NAZWISKO;
PostRecord();
Należy jednak mieć na względzie, że w Neosie starszym niż 6.0 metoda PostRecord() zawsze zwraca true, bez względu na to, czy rekord uda się zatwierdzić czy nie. Dzieje się tak, ponieważ poszczególne komendy (przejście w stan edycji, przypisanie wartości pola, zatwierdzenie rekordu) przesyłane są do klienta aplikacji w kolejce komunikatów i dopiero po zakończeniu wykonywania kodu C#, są one realizowane po stronie klienta. Jedynym sposobem zareagowania na udany i nieudany zapis rekordu jest odziedziczenie metod AfterPost() i PostFailure().
Odczyt pól pochodzących ze słownika¶
Jeśli w obiekcie biznesowym mamy pole (np. this.KLIENT), na którym zdefiniowano relację do słownika (np obiekt KLIENCI), to mamy także bezpośredni dostęp z kodu do wartości pól tego rekordu słownika, na który wskazuje słownikowane pole. Możemy je odczytać np tak:
string label = this.KLIENT_IMIE + " " + this.KLIENT_NAZWISKO;
this.KLIENT zawiera wartość pustą lub nieodpowiadającą żadnemu rekordowi ze słownika, to odwołania do pól ze słownika także zwrócą wartość pustą (konkretnie pusty ciąg znaków).
Pól pochodzących ze słowników nie można zapisywać. W trakcie edycji rekordu obiektu bazowego zmienić można jedynie wartość pola bazowego (czyli this.KLIENT), którego zmiana spowoduje, że z pól słownikowych od razu zaczniemy odczytywać wartości z właściwego rekordu ze słownika. Aby zmienić wartości w polach rekordu słownika, należy właściwy rekord słownika przełączyć w tryb edycji, dokonać zmiany i zapisać (EditRecord(); ... ; PostRecord()), lub w jakiś inny dostępny sposób (np. zapytaniem SQL).
Dostęp do pól w trakcie edycji danych¶
Jeśli bieżący rekord jest w trybie edycji to mamy zarówno dostęp do bieżącej wartości pola (this.POLE), jak również do wartości poprzedniej, czyli sprzed momentu rozpoczęcia edycji ( OldValue ). W razie potrzemy możemy porównywać te wartości, np tak:
if(this.NAZWA != this.NAZWA.OldValue) { ... }
Dzięki temu możemy w prosty sposób sprawdzić, czy w danym momencie edycji, którekolwiek pole modelu danych zmieniło swoją wartość względem tego, co było w tym polu gdy rozpoczynaliśmy edycję.
bool anythingChanged = GetAllFields().Where(x => x.OldValue!=x.Value).Any();
Porównanie wartości bieżącej z poprzednią jest czymś innym niż właściwość Changed na polu modelu danych (this.POLE.Changed). Właściwość Changed zwraca true tylko wtedy, gdy wartość danego pola właśnie w tej chwili się zmieniła i z tego powodu neos odpalił jakąś metodę C#, np metodę na widoczność, na przeliczenie, itp, np:
public string ValidateNAZWISKO()
{
if(this.IMIE.Changed || this.NAZWISKO.Changed)
return ValidatePersonalData();
return "";
}
Typy danych i formatowanie danych¶
Wszystkie pola bieżącego rekordu zwracane są typem string. Często jednak zachodzi potrzeba konwersji do innego typu. W tym celu należy korzystać z metod:
if(this.AKCEPT.ToInt() != 1)
this.WARTOSC = this.ILOSC.ToDecimal() * this.CENA.ToDecimal();
Metoda ToDecimal() przekształca do typu stałoprzecinkowego. Można też użyć metody ToDouble(), która przekształca do typu zmiennoprzecinkowego.
Jeśli pole w modelu danych zostało zdefiniowane jako COMBOBOX i posiada listę wartości, to w kodzie C# pod this.POLE widzimy wartość bazodanową pola. Do wartości wyświetlanej można się jednak dostać w następujący sposób:
string label = "Dokument jest "+this.AKCEPT.DisplayValue;
Dostęp do danych innych rekordów niż bieżący¶
Powyższy sposób wystarcza to do definiowania metod sterujących wyglądem formy, ale nie pozwala operować na danych innych niż aktualnie wyświetlane. Jeśli chciałbyś dodać lub zmodyfikować jakiś rekord całkowicie programowo bez interakcji z użytkownikiem albo wywołać jakąś złożoną operację bazodanową, wywołaj metodę logiki biznesowej własnego lub innego obiektu biznesowego, gdyż tylko w metodach logiki biznesowej możesz komunikować się bezpośrednio z bazą danych.