Informatyzacja Przedsiębiorstw Microsoft Dynamics NAV 2013 Development Environment C/AL Izabela Szczęch Informatyzacja Przedsiębiorstw Strona 1
Spis treści 1 Informacje ogólne:... 3 1.1 Zmienne... 4 1.2 C/AL Symbol Menu... 5 1.3 Pomoc kontekstowa i Debugger:... 6 1.4 Przydatne funkcje... 7 2 Przykłady... 8 2.1 Sala szkoleniowa/seminar Room... 8 2.2 Instruktor/Instructor... 10 2.3 Szkolenie/Seminar... 11 2.4 Nagłówek rejestracji szkoleń/seminar Registration Header... 12 Izabela Szczęch Informatyzacja Przedsiębiorstw Strona 2
1 Informacje ogólne: 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 C/AL Symbol Menu Kod można pisać z pomocą 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 5
1.3 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. Wywołanie F1 można pokazać wg scenariusza: o wchodzimy do kodu jakiejś tabelki o uruchamiamy C/AL. Symbol Menu (F5), wybieramy jakaś funkcję, np. VALIDATE, klikamy na nią i wyświetlamy pomoc kontekstową (F1). Debugger uruchamiamy z menu Narzędzia Debugger Debug Session (CTRL+SHIFT+F11) Izabela Szczęch Informatyzacja Przedsiębiorstw Strona 6
1.4 Przydatne funkcje Przydatne funkcje: o GET //pobiera jeden rekord po kluczu głównym (nigdy po innym atrybucie) o 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 //typowa pętla UNTIL NEXT=0 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 7
2 Przykłady 2.1 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 8
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 9
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 10
2.3 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.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 12
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 13
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 14
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 15