KORPORACYJNE SYSTEMY ZARZĄDZANIA INFORMACJĄ Wykład 4 Katedra Inżynierii Komputerowej Jakub Romanowski jakub.romanowski@kik.pcz.pl
Operacje na tabelach C/AL Poniższe funkcje odpowiadają za operacje modyfikacji rekordów bazy danych INSERT MODIFY MODIFYALL DELETE DELETEALL
Operacje na tabelach C/AL Niektóre z tych funkcji zwracają wartości logiczne bool Warto sprawdzać warunkiem IF poprawność wykonania we wszystkich możliwych funkcjach W wypadku braku obsługi wykonania tych funkcji program zakończy działanie przez błąd
Funkcja INSERT Służy do dodawania rekordów do tabel Składnia jest następująca: [Ok :=] Record.INSERT([RunTrigger]) Aby dodać rekord musimy zadeklarować zmienną typu Record oraz nadać jej podtyp, którym jest nazwa tabeli do, której dodajemy wpis
Funkcja INSERT przykład (1) Customer.INIT; Customer."No." := '4711'; Customer.Name := 'Andrew Dixon'; Customer.INSERT; Powyższy przykład dodaje wpis z określonymi wartościami, wszystkie pozostałe o ile istnieją będą zainicjowane wartościami domyślnymi
Funkcja INSERT przykład (2) Jeśli pole No. jest kluczem głównym to jest zarazem unikatowe. W wypadku gdy nie istnieje wpis o takim No. rekord będzie dodany poprawnie W wypadku gdy wpis o takim No. jest już zawarty w tabeli otrzymamy komunikat o błędzie, który należy odpowiednio obsłużyć
Funkcja MODIFY Modyfikuje istniejące już rekordy tabeli Składnia: [Ok :=] Record.MODIFY([RunTrigger]) Ta funkcja zwraca wartość Bool. Jeśli rekord jest poprawnie zmodyfikowany zwraca TRUE w przeciwnym wypadku rezultatem wykonania jest FALSE
Funkcja MODIFY przykład Customer.GET('4711'); Customer.Name := 'Richard Roe'; Customer.MODIFY; Powyższy przykład pokazuje zmianę pola Name użytkownika o numerze 4711 Taka operacja wymaga utworzenia zmiennej typu Record oraz podtypu, którym jest nazwa tabeli, na której operujemy
Funkcja MODIFYALL(1) Funkcja MODIFYALL wykonuje operacje zbiorowe Składnia: Record.MODIFYALL(Field, NewValue [, RunTrigger]) Funkcja ta używa bieżącego filtra co oznacza, że operuje na grupie rekordów określonych filtrem
Funkcja MODIFYALL(2) Funkcja MODIFYALL nie zwraca żadnej wartości co za tym idzie nie powoduje błędu programu w momencie gdy pobrany zbiór rekordów jest pusty W celu stworzenia zbioru do modyfikacji należy stworzyć zmienną typu Record oraz podtypu, którym jest nazwa tabeli, na której rekoordach dokonujemy zmian
Funkcja MODIFYALL przykład Customer.SETRANGE("Salesperson Code",'PS','PS'); Customer.MODIFYALL("Salesperson Code",'JR'); W powyższym przykładzie SETRANGE wybier sprzedawców na podstawie kodu PS MDIFYALL dokonuje zmiany kodu sprzedawcy w wybranej grupie z PS na JR
Funkcja DELETE Funkcja DELETE usuwa rekord z wybranej tabeli Składnia: [Ok :=] Record.DELETE([RunTrigger]) Rekord, który chcemy usunąć musi być określony kluczem głównym Funkcja DELETE nie bierze pod uwagę filtrów
Funkcja DELETE przykład Customer."No." := '4711'; Customer.DELETE; Przykład przedstawia usuwanie klienta o No. równym 4711 Aby dokonywać operacji usuwania należy stworzyć zmienną typu Record i podtypu, którym jest nazwa tabeli
Funkcja DELETE uwagi Funkcja ta zwraca wartość typu Bool i z uwagi na to należy zastosować obsługę wyjątku gdy nie zostanie odnaleziony rekord do usunięcia (zwróci FALSE) W wypadku odnalezienia rekordu do usunięcia funkcja zwraca TRUE
Funkcja DELETE scenariusz (1) Trzy kroki, które należy wykonać używając funkcji DELETE: Pobieramy rekord z bazy danych Dokonujemy wszelkich kontroli i sprawdzenia warunków czy dany rekord może zostać usunięty Jeśli w poprzednim kroku nie ma zastrzeżeń usuwamy rekord
Funkcja DELETE scenariusz (2) Szereg sprawdzeń ma na celu uniknięcie kolizji w operacjach na rekordach i tabelach W systemie, na którym pracuje wiele osób istnieje duże ryzyko, że ktoś zmodyfikuje nasz rekord lub nawet usunie go w trakcje naszych operacji co spowoduje przerwanie programu zakończone błędem W systemach używanych przez wiele osób jednocześnie można zastosować funkcję LOCKTABLE
Funkcja DELETEALL (1) Funkcja DELETEALL usuwa zestawy rekordów określone poprzez filtry W wypadku braku filtrów funkcja ta usunie wszystkie rekordy z tabeli, na której jej używamy Składnia: Record.DELETEALL([RunTrigger])
Funkcja DELETEALL (2) Działanie tego typu wymaga stworzenia zmiennej typu Record i podtypu o nazwie przetwarzanej tabeli Poniższy przykład usuwa wszystkie rekordy gzie kod sprzedawcy to PS Przykład: Customer.SETRANGE("Salesperson Code", 'PS', 'PS'); Customer.DELETEALL;
Funkcja DELETEALL (3) Kiedy używamy funkcji DELETEALL wywoływany jest trigger dla tabeli na której działamy a wartości do usunięcia przechowywane są w kopii(zmiennej) automatycznie tworzonej przez C/AL. Jeśli chcemy kontrolować poprawność usuwania rekordów uzyskując rezultat TRUE/FALSE należy używać funkcji DELETE w pętli
Funkcja LOCKTABLE Służy do bezpiecznych operacji na tabelach Blokuje tabelę na czas wykonania operacji na niej Składni: Record.LOCKTABLE([Wait] [, VersionCheck])
Funkcja LOCKTABLE schemat
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