Informatyzacja Przedsiębiorstw Microsoft Dynamics NAV 2016 Development Environment C/AL Izabela Szczęch Informatyzacja Przedsiębiorstw Strona 1
Plan zajęć 1 Informacje ogólne dotyczące środowiska deweloperskiego C/SIDE... 3 1.1 Zmienne... 4 1.2 Funkcje... 5 1.3 C/AL Symbol Menu... 8 1.4 Pomoc kontekstowa i Debugger... 9 1.5 Przydatne funkcje... 10 2 Przykłady kodu w tabelach... 11 2.1 Szkolenie/Seminar... 11 2.2 Instruktor/Instructor... 12 2.3 Sala szkoleniowa/seminar Room... 13 2.4 Nagłówek rejestracji szkoleń/seminar Registration Header... 15 Izabela Szczęch Informatyzacja Przedsiębiorstw Strona 2
1 Informacje ogólne dotyczące środowiska deweloperskiego C/SIDE Kod piszemy zwykle w wyzwalaczach (triggerach) tabel. Przez Object Designera wybieramy obiekt, np. tabelę Instructor, klikamy F9 (Widok C/AL Code) i znajdujemy się w wyzwalaczach. Na początku umieszczone są wyzwalacze dotyczące ogólnie tabeli (obiektu), dalej poszczególnych pól. Przykład kodu: Izabela Szczęch Informatyzacja Przedsiębiorstw Strona 3
1.1 Zmienne Zmienne lokalne i globalne ustawiamy w menu Widok C/AL Globals albo Widok C/AL Locals Jako zmienne globalne najczęściej definiuje się stałe tekstowe (Text Constants), w których umieszcza się wielojęzyczne treści komunikatów (np. komunikatów o błędzie). Przykład: Przydatne będą zmienne lokalne typu Rekord odwołujące się do tabel. Przykład: Izabela Szczęch Informatyzacja Przedsiębiorstw Strona 4
1.2 Funkcje Własne funkcje (np. w ramach Codeunit ów) tworzy się jako zmienne globalne (menu Widok C/AL Globals). Jeśli funkcja ma mieć jakiś parametr wejściowy, definiuje się go poprzez przycisk Locals. Parametry mogą być przekazywane przez wartość albo referencję (jeśli zaznaczona jest opcja Var ). Przykład: Izabela Szczęch Informatyzacja Przedsiębiorstw Strona 5
Domyślnie, utworzone funkcje są widoczne tylko w obiekcie (np. Codeunicie) i nie można się do nich odwołać z innego miejsca. Funkcje mają wówczas ustawioną własność Local na Yes, a ich definicja poprzedzona jest słowem Local : Aby z innego obiektu można było dowołać się do funkcji zdefiniowanej wewnątrz np. Codeunit u trzeba ustawić jej własność Local na No : Wówczas można uruchomić funkcję zdefiniowaną w Codeunicie np. spod Akcji na page u. Izabela Szczęch Informatyzacja Przedsiębiorstw Strona 6
Przykład: Funkcja CreateSalesInvoice w Codeunicie Seminar Management (50010) ma ustawioną własność Local na No. W akcji page a Seminar Registration Card (50040) zdefiniowana została zmienna globalna odwołująca się do Codeunit u 50010. Pozwala to na wywołanie funkcji CreateSalesInvoice w triggerze OnAction tej akcji. Izabela Szczęch Informatyzacja Przedsiębiorstw Strona 7
1.3 C/AL Symbol Menu Podczas pisania kodu wyświetlane są podpowiedzi. Ewentualnie można też korzystać z C/AL Symbol Menu (F5 lub menu Widok C/AL Symbol Menu). Przykład z listą pól zmiennej Resource: Przykład z wywołaniem funkcji TESTFIELD dla zmiennej Seminar. Na dole pokazane są parametry funkcji. Izabela Szczęch Informatyzacja Przedsiębiorstw Strona 8
1.4 Pomoc kontekstowa i Debugger W czasie pisania kodu pod klawiszem F1 jest dostępna pomoc kontekstowa m.in. z przykładami wywołania funkcji, opisami parametrów, polami tabel i zmiennych. Debugger uruchamiamy z menu NarzędziaDebuggerSesja debugowania... (SHIFT +CTRL +F11) Izabela Szczęch Informatyzacja Przedsiębiorstw Strona 9
1.5 Przydatne funkcje Przydatne funkcje: GET //pobiera jeden rekord po kluczu głównym (nigdy po innym atrybucie) RESET //zdejmuje filtry SETRANGE //ustawia filtry; najlepiej filtrować po jakimś kluczu, więc przed SETRANGE często pojawia się też SETCURRENTKEY FINDFIRST/FINDSET //pobiera jeden lub wiele rekordów REPEAT UNTIL NEXT=0 //typowa pętla Różnica między zwykłym podstawieniem, a funkcją VALIDATE Name := Seminar.Name //pod pole Name zostanie podstawiona wartość pola Name ze zmiennej Seminar VALIDATE(Name, Seminar.Name) //po podstawieniu pod Name wartości pola Name ze zmiennej Seminar, zostanie wywołany trigger On Validate w polu Name. Różnica między Triggerami OnLookUp i OnValidate OnLookUp jest wywoływany przed modyfikacją rekordu, można w nim zamieścić np. jakieś filtrowanie. OnValidate jest wywoływany po podstawieniu, po modyfikacji rekordu. Izabela Szczęch Informatyzacja Przedsiębiorstw Strona 10
2 Przykłady kodu w tabelach 2.1 Szkolenie/Seminar 1. Należy oprogramować następujące pola: Name kiedy użytkownik wprowadzi lub zmieni pole Name to należy uzupełnić pole Search Name (wielkie litery) Last Date Modified kiedy rekord zostanie zmodyfikowany automatycznie należy uzupełnić to pole datą roboczą Izabela Szczęch Informatyzacja Przedsiębiorstw Strona 11
2.2 Instruktor/Instructor 1. Należy oprogramować następujące pola: Resource No. po wybraniu numeru zasobu, system ma uzupełnić pole Name tylko w przypadku, gdy wartość pola Worker/Subcontractor to Worker Funkcja GET pobierze jeden rekord ze zmiennej (tutaj lokalnej) Resource po kluczu głównym. Zatem będzie to rekord, dla którego klucz główny przyjmuje taką wartość jak pole Resource No. w aktualnym rekordzie tabeli Instructor. Zapis Worker/Subcontractor = Worker/Subcontractor ::Worker to sprawdzenie czy pole Worker/Subcontractor przyjęło wartość Worker. Alternatywnie zamiast IF Worker/Subcontractor = Worker można to ustawić w warunkowym łączeniu tabel we własnościach tabeli Instructor: Izabela Szczęch Informatyzacja Przedsiębiorstw Strona 12
2.3 Sala szkoleniowa/seminar Room 1. Należy oprogramować następujące pola: Post Code po wybraniu kodu pocztowego system ma uzupełnić pole City Wystarczy przekleić wywołanie standardowej funkcji np. z tabeli 18 Customer : Dla zmiennej rekordowej PostCode wywołujemy funkcję ValidatePostCode z parametrami City i Post Code, Country/Region Code (które są atrybutami w naszym aktualnym rekordzie, czyli w Seminar Room). Pola County nie ma w aktualnym rekordzie, więc możemy stworzyć tekstową zmienną lokalną County, którą ustawimy na pustą wartość. Izabela Szczęch Informatyzacja Przedsiębiorstw Strona 13
Aby podejrzeć definicję funkcji ValidatePostCode klikamy prawym przyciskiem myszy w miejscu jej wywołania i klikamy Go To Definition. Izabela Szczęch Informatyzacja Przedsiębiorstw Strona 14
2.4 Nagłówek rejestracji szkoleń/seminar Registration Header 1. Należy oprogramować następujące pola: Seminar Code kiedy użytkownik wybierze kod szkolenia, powinny zostać uzupełnione pola: Seminar Name, Seminar Duration, Minimum Participants, Maximum Participants, Seminar Price. Można wybrać tylko szkolenie, które nie jest zablokowane. Funkcja GET pobierze jeden rekord ze zmiennej Seminar, który ma klucz główny o wartości takiej jak Seminar Code z tabeli Seminar Registration Header. Funkcja TESTFIELD sprawdzi, czy dla rekordu Seminar pole Blocked ma wartość FALSE (w zmiennych typu Boolean są wartości yes/no, ale w kodzie piszemy true/false!). Jeśli nie ma takiej wartości, to zostanie wyświetlony domyślny systemowy komunikat. To jest komunikat systemowy, nieustawialny co do treści, ale wielojęzyczny. Izabela Szczęch Informatyzacja Przedsiębiorstw Strona 15
Jeśli szkolenia zablokowane nie mogą być wybierane, to trzeba to zrobić przez funkcję TESTFIELD, a nie przez pokazany poniżej filtr do tabeli. Byłby to filtr po atrybucie innym niż klucz główny, a zatem takie przefiltrowanie tabeli by strasznie spowalniało przetwarzanie. Poza tym, przy takim filtrowaniu tabeli użytkownik nie widziałby w ogóle na liście zablokowanych szkoleń. On je musi widzieć, ale nie może ich wybierać. Izabela Szczęch Informatyzacja Przedsiębiorstw Strona 16
2. Pole Seminar Code można zmienić (czyli wybrać inną wartość) tylko, gdy wiersze rejestracji szkolenia nie zostały jeszcze zarejestrowane. Izabela Szczęch Informatyzacja Przedsiębiorstw Strona 17
Funkcja RESET zdejmuje wszystkie filtry ze zmiennej rekordowej jakie ewentualnie mogły gdzieś wcześniej pojawić się w kodzie. Funkcja SETRANGE wyfiltruje nam tylko te rekordy ze zmiennej SeminarRegLine, które mają taki SeminarRegLine."Seminar Registration No." jak aktualny numer rejestracji szkolenia. Funkcja FINDFIRST pobiera pierwszy rekord z przefiltrowanej przez SETRANGE zmiennej. Równie dobrze w tym przykładzie można by wykorzystać funkcję FINDSET, która pobiera od razu cały zbiór (a dokładnie pierwsze 500 rekordów i jak po nich przeiteruje, to następne 500 i tak aż przejdzie po całym zbiorze). Funkcja NEXT pobiera następny rekord. Izabela Szczęch Informatyzacja Przedsiębiorstw Strona 18