KORPORACYJNE SYSTEMY ZARZĄDZANIA INFORMACJĄ Wykład 3 Katedra Inżynierii Komputerowej Jakub Romanowski jakub.romanowski@kik.pcz.pl
POBIERANIE DANYCH C/AL Poniższe funkcje używane są do operacji pobierania i szukania rekordów w bazie danych: GET FIND NEXT Są to jedne z najczęściej używanych funkcji w C/AL. Istotne jest aby znać różnice między funkcjami GET i FIND, oraz jak używać funkcji NEXT w połączeniu z FIND.
Funkcja GET (1) GET pobiera jeden rekord z tabeli bazy na podstawie klucza głównego GET ma następującą składnie: [Ok :=] Record.GET([Value],...) np.: waluta.get('10'); gdzie rezultatem będzie rekord dla waluty o identyfikatorze 10 będącym zarazem kluczem głównym
Funkcja GET (2) Funkcja GET wymaga sprawdzenia poprawności wykonania jak w poniższym przykładzie: IF waluta.get('10') THEN... // Operacje dla poprawnego pobrania rekordu. ELSE... // Obsługa błędu. W przeciwnym wypadku otrzymamy błąd w czasie wykonywania programu.
Funkcja GET (3) Funkcja GET nie stosuje żadnych filtrów wyszukiwania. Działa niezależnie od ewentualnie narzucanych filtrów i nie modyfikuje ich Zawsze przeszukuje wszystkie rekordy przeszukiwanej tabeli
Funkcja FIND (1) Funkcja ta dokonuje przeszukiwania tabeli na podstawie wartości przechowywanych w kluczach. FIND ma następująca składnie: Ok := Record.FIND([Which]) np.: waluta.find('-'); Rezultatem powyższej instrukcji będą wszystkie rekordy przeszukiwanej tabeli ze względu na warunek wyszukiwania '-'.
Funkcja FIND (2) Istotne różnice między FIND i GET FIND używa bieżących filtrów wyszukiwania FIND umożliwia wyszukiwania rekordów na podstawie mniejszej, większej lub równej wartości w stosunku do podanej jako warunek wyszukiwania FIND pozwala na pobierania pierwszego lub ostatniego rekordu oraz uzależnienia rezultatu wyszukiwania od kolejności sortowania
Funkcja NEXT NEXT używany jest zwykle w połączeniu z FIND do poruszania się po rekordach pobranych z bazy. Składnia funkcji NEXT: Steps := Record.NEXT([Steps]) Powyższy przykład przedstawia użycie funkcji NEXT do przejścia do rekordu o indeksie Steps Funkcja FIND automatycznie ustawia automatycznie indeks rekordów na początek pobranych rekordów NEXT pozwala na przemieszczanie się po rekordach od początku do końća W momencie wyczerpania rekordów NEXT zwraca wartość 0 FIND('-'); REPEAT // operacje na rekordach UNTIL NEXT = 0;
Ograniczenia do funkcji FIND Zestaw funkcji do filtrowania rekordów pobieranych z FIND SETCURRENTKEY SETRANGE SETFILTER GETRANGEMIN GETRANGEMAX
Funkcja SETCURRENTKEY Składnia: [Ok :=] Record.SETCURRENTKEY(Field1, [Field2],...) Działanie SETCURRENTKEY Nieaktywne pola są ignorowane Kiedy szukamy klucza pierwsze wystąpienie jest wybierane co oznacza, że wybierając przykładowo zależność od jednego pola możemy uzyskać błędne wyniki w momencie gdy klucz główny to zbiór pól w tabeli (Więcej niż jedno pole składa się na PK) Jeśli nie będzie znaleziony żaden z kluczy, które określiliśmy zostanie zwrócona wartość FALSE oraz wystąpi błąd programu. Należy pamiętać o instrukcji obsługi błędu
Funkcja SETRANGE (1) Jest to prosty filtr odpowiadający instrukcją warunków wyboru rekordów z języka SQL Składnia: Record.SETRANGE(Field [,From-Value] [,To-Value]); np.: Record.SETRANGE("No.",'10000','90000');
Funkcja SETRANGE (2) SETRANGE usuwa wszystkie poprzednie filtry i stosuje tylko ten ustalony w tej funkcji czyli przedział od. do Jeśli nie podamy przedziałów od do SETRANGE mimo wszystko usunie ustalane wcześniej filtry Jeśli ustalimy jedynie wartość od to wartość zakresu do przejmuje wartość od
Funkcja SETFILTER (1) SETFILTER ustawia filtr w bardziej generalny sposób niż SETRANGE Składnia: Record.SETFILTER(Field, String [, Value],...]; gdzie Field oznacza pole, które chcemy filtrować, a String to wyrażenie filtrujące
Funkcja SETFILTER (2) Pole String może zawierać parametry %1 czy %2 którym odpowiadają odpowiednie zmienne podane w parametrze Value Przykłady: Customer.SETFILTER("No.", '>10000 & <> 20000'); Customer.SETFILTER("No.",'>%1&<>%2', Value1, Value2);
Funkcja GETRANGEMIN Funkcja ta pobiera minimalną wartość dla zastosowanego filtra Składnia: Record.GETRANGEMIN(Field); W momencie gdy filtr ustawiony przykładowo za pomocą SETFILTER jest błędnie skonstruowane (zły warunek wyszukiwania) GETRANGE zwróci błąd i przerwie działanie programu Przykład: BottomValue := Customer.GETRANGEMIN("No.");
Funkcja GETRANGEMAX Jest odpowiednikiem GETRANGEMIN dla pobrania wartości maksymalnej Składnia oraz pozostałe zasady używania są identyczne jak w GETRANGEMIN
PRZYKŁAD Przykład obejmuje tabelę Language z demonstracyjnej bazy CRONUS NAGLOWEK:= 'Szukam jezyka BGR '; //MESSAGE(naglowek); singleitem.get('bgr'); NAGLOWEK := NAGLOWEK + singleitem.name; //MESSAGE(singleItem.Name); singleitem.find('-'); REPEAT symbol:= singleitem."windows Language ID"; MESSAGE(singleItem.Name + '%1', symbol); singleitem.next(); UNTIL NEXT = 0;
PRZYKŁAD dodatkowe informacje Okno Properties dla TextBox i przypisanie tekstu do TextBox-a
Zadanie (1) Tabela do zadania : Currency Exchange Rate Id tabeli to 303 1. Pobrać do zmiennych wartości maksymalne i minimalne i wpisać kod walut(currency Code) oraz wartość do TextBox-a dla pola Relational Exch_ Rate Amount 2. Pobrać wszystkie rekordy z określonej tabeli i analizując każdy kolejny sprawdzać czy jest wyżej wybranym minimum lub maksimum. Jeśli tak zasygnalizować to poprzez MESSAGE() w formie max/min to: KOD_WALUTY zarówno dla max. i min.
Zadanie (2) 3. Pobrać wszystkie rekordy i zasygnalizować MESSAGE wystąpienie rekordu dla kodu USD i EUR podając komunikat Wystapil KOD 4. Przetestować działanie funkcji SETRANGE dla pola Relational Exch_ Rate Amount wybierając wartości od 1 do 20 (Decimal) i wyświetlić kolejno za pomocą MESSAGE 5. Zbadać działanie funkcji SETCURRENTKEY (nie)ustawiając odpowiedni klucz/e dla wyżej wykonywanych zapytań
Zadanie - tabela
Bibliografia Microsoft Dynamics NAV 2005 Application Designer s Guide Microsoft Dynamics NAV Programming Guide Microsoft Official Training Materials for Microsoft Dynamics C/AL. Functions http://msdn.microsoft.com/enus/library/dd355277.aspx