W poprzednim artykule obiecałem, że stworzymy w Rollbase aplikację, opierającą się o dane z bazy danych OpenEdge. Wykorzystamy do tego serwis OE, o którym pisałem w części I i w części II.
W naszej aplikacji będziemy korzystać z dwóch tablic: Customer i Order, dlatego do serwisu OE trzeba dodać obiekt (business entity) Order.
Podobnie jak dla obiektu Customer, klikamy na podkatalog AppServer i wybieramy New -> New -> Business Entity. Podajemy nową nazwę obiektu Order i klikamy Next.
W drugim kroku wybieramy aktywne połączenie z bazą danych i wybieramy tabelę Order, a następnie Finish.
Widzimy, że w podkatalogu AppServer utworzyły się pliki dla nowego zasobu, w tym plik klasy Order.cls.
Ponownie nowy obiekt biznesowy trzeba dodać do serwisu. Rozwijamy Defined Services i prawym klawiszem klikamy na Edit a następnie Next.
Na ekranie Create a Data Object service zaznaczamy Order.cls i klikamy Finish.
Po zrestartowaniu serwera aplikacji PAS możemy podejrzeć, że nowo-utworzony plik .json zawiera struktury Customer i Order.
Obiekt Order, to plik klasy oraz ProDataSet dsOrder, zawierający tablicę tymczasową ttOrder.
Żeby z serwisu OE utworzyć obiekt w Rollbase wymagane jest aby tablica tymczasowa zawierała przynajmniej jedno pole tekstowe, które posłuży do mapowania dla pola Record Name (w tablicy ttCustomer jest pole Customer.Name).
W tablicy ttOrder takiego pola nie ma, dlatego musimy je utworzyć.
Wygodnie jest posłużyć się tutaj tzw. Callback Procedure. Są to procedury podobne do trygerów w 4GL i dotyczą różnych zdarzeń w ProDataSecie (jeszcze jeden powód, dla którego warto znać ProDataSety!).
Najpierw w pliku oder.i dodamy pole OrderName typu znakowego.
Następnie w pliku Order.cls w metodzie ReadOrder dodajemy dla tablicy ttOrder Callback Procedure o nazwie AddField dla zdarzenia After-Row-Fill, która będzie wywołana po zapełnieniu każdego rekordu w tabeli tymczasowej.
Poniżej metody ReadOrder definiujemy procedurę AddField.
Każdy rekord ttOrder będzie miał tekstową wartość w polu OrderName złożoną z nr klienta i nr zamówienia.
Klasę Order.cls należy teraz skompilować (prawy klik, Compile).
Aby plik .json miał aktualną strukturę z nowym polem postępujemy podobnie jak kilka kroków powyżej.
Teraz przejdźmy do Rollbase’a.
Nasuwa się pytanie czy nie można było utworzyć jeden ProDataSet z dwoma tablicami tymczasowymi i relacją między nimi? Przecież w PDS można to zrobić bez trudu. Otóż Rollbase ma ograniczenie polegające na tym, że mapować można tylko PDS złożone z pojedynczych tablic.
Przejdźmy do ekranu Create a New Application. Kto nie pamieta jak to zrobić niech kliknie TUTAJ.
Klikamy Create from External Data. Pojawia się ekran
Musimy odszukać ścieżkę do pliku .json: [workspace]\mobile6\PASOEContent\static
oraz URI dla serwisu. Next
Chociaż podaliśmy URI dla Customera, Rollbase proponuje na podstawie pliku .json utworzenie 2 obiektów: ttCustomer, ttOrder.
Klikamy Next. Zaznaczamy pola, które maja zawierać obiekty. Trzeba poprawić pola Resource URI, bo mają niepoprawne wartości. Dla pola OrderName ustawiamy typ Record Name. Bez wybrania tego typu dla jednego pola, pojawi sie błąd. Dlatego zadaliśmy sobie wcześniej trochę trudu, aby takie pole utworzyć w ttOrder. W ttCustomer typ Record Name jest przypisany automatycznie dla pola Name.
Klikamy Create. Nasza aplikacja (nazwa mobile6Service) pojawia się na liście aplikacji.
Po wybraniu aplikacji można przeglądać rekordy ttOrders i ttCustomers. Na razie nie są one ze sobą powiązane.
Teraz zbudujemy relację między ttOrders i ttCustomers.
Wchodzimy w ustawienia aplikacji (koło zębate)
Klikamy na nazwę obiektu ttOrder
Tworzymy nowa relację klikając New OpenEdge Relationship.
Ustawiamy pole relacji CustNum
Rodzaj relacji ustawiamy na Many ttOrders to One ttCustomer.
Poniżej sa dodatkowe ustawienia. Warto m.in. mieć możliwość wstawiania ttOrders do widoków ttCustomers (przykład za chwilę). Save.
Wchodzimy ponownie w podgląd danych ttCustomers i budujemy nowy widok (Create New View).
Wybieramy pola wraz z ttOrders, które już się pojawiło na liście.
Mamy efekt końcowy, do którego dążyliśmy.