Kashiash's Blog

o programowaniu inaczej : jak zrobić i się nie narobić

Archive for Styczeń 2011

Ewidencja pojazdów – nowe tabele

Posted by kashiash w dniu 29 stycznia, 2011

Skoro ma być to ewidencja pojazdów to przydałoby się w niej przechowywać informację o wydatkach z tym pojazdem związanych.

W tym celu dodamy FuelLog oraz 2 tabele słownikowe na koncern paliwowy i rodzaj paliwa :

FuelLog
PkFuelLog KEY(Ful:Id),DUP,NOCASE
KeyVehicle KEY(Ful:Vehicle),DUP,NOCASE
KeyBrand KEY(Ful:Brand),DUP,NOCASE
KeyFuelType KEY(Ful:FuelType),DUP,NOCASE
Kolumny
Id LONG
Vehicle LONG
FillUpDate DATE
Quantity REAL
TotalCost REAL
Notes STRING(100)
StartingOdometer LONG
EndingOdometer LONG
OdometerChange LONG
Brand LONG
FuelType LONG
Brands
PkBrands KEY(Bra:Id),DUP,NOCASE
KeyBrand KEY(Bra:Brand),DUP,NOCASE
Kolumny
Id LONG
Brand STRING(51)
FuelTypes
PkFuelTypes KEY(Fty:Id),DUP,NOCASE
KeyFuelType KEY(Fty:FuelTypes),DUP,NOCASE
Kolumny
Id LONG
FuelTypes STRING(50)

Do tego określimy relacje pomiędzy tabelami :

FuelTypes <->> FuelLog

Vehicles <->> FuelLog

Brands <->> FuelLog

I W tabeli w zakładkach Validate check ustawimy odpowiednio wpisy w must be in file dla poł Vehicle, Brand i FuelType

Ustawiamy dla nich UseSpinner i DSP dla wyżej wspomnianych kolumn

 

W efekcie końcowym dostaniemy strukturę bazy jak poniżej:

Zapisujemy i generujemy kod naszej aplikacji.

Doszły nam 3 nowe tabele i potrzebujemy dla nich ikonek. Bez nich nie uda nam się uruchomić aplikacji.

Potrzebujemy brands.png, fuelstypes.png oraz fuellog.png, które należy wgrać do katalogu res/drawables.

Uruchamiamy nasza aplikację i naszym oczom powinien pojawić się następujący widok:

Jak widać zaczyna nam brakować miejsca, w pewnym stopniu pomogłoby zmniejszenie ikon z 48×48 na mniejsze, albo nie pokazywanie wszystkich tych przycisków na głównym menu aplikacji. Tym tematem zajmiemy się później, teraz popatrzmy co nam wyszło ;).

Ewidentnie mamy problem z miejscem, ale mamy w końcu nieocenionego MOBY!

W File User Options ustawiamy PromptsInLine(true) po przegenrowaniu:

To samo możemy ustawić na Vehicles : PromptsInLine(true).

W obecnej wersji aby wejść do listy z zakupami mieliśmy 2 możliwości: albo wchodzimy prosto z menu, albo z pojazdu poprzez przycisk menu.

Jeśli ustawimy UseTabHost(true) w FileUserOptions dla Vehicles, to program wygeneruje kod tak, że lista będzie widziana także na osobnej zakładce w oknie edycji pojazdu



W kolejnych krokach popracujemy nad listą danych wyswietlanych w pojazdach i logu tankowań, na razie pobawcie się nowa aplikacją androidową

Dlaczego to nie chce mi się skompilować ?

Jeśli otrzymujemy komunikat ze nasz projekt zawiera błędy i nie możemy go uruchomić zaglądamy na zakładkę PROBLEMS

poniżej przykład komunikatu na który pomaga wyczyszczenie projektu

Walkę ze wszystkimi problemami proponuje zaczynać od operacji wyczyszczenia projektu:

wybieramy Project/Clean i obserwujemy, co się wyświetla na zakładce Problems

komunikat najbardziej prawdopodobny w aplikacja wygenerowanej przez MOBY – brakuje nam ikonek.

Wgrywamy o wymaganej nazwie do katalogu res/drawables i powinno być po sprawie

Posted in Android, Clarion, MOBY | Leave a Comment »

Wykaz Opcji użytkownika

Posted by kashiash w dniu 28 stycznia, 2011

 

 

Definiowane dla każdej z tabel: %FileUserOptions

 

User option

Typ

Opis

 

UseTabHost

boolean

Okienko Edycji danej tabeli będzie miało zakładki na których będą wyświetlane dane z tabeli podrzędnych (Child Tables)

Użyteczne dla tabel posiadających tabele podrzędne

NOPOPULATE

boolean

Nie zostanie utworzone odwołanie do tabeli z głównego okna aplikacji

Kod procedur jest generowany, dostęp do tych procedur jest z innych procedur np. jako tabele podrzędne w relacji lub służące do wyboru z listy

FreezeList

boolean

Wyłącza generowanie kodu procedury wyświetlającej listę rekordów

Zapobiega nadpisaniu ręcznie dokonanych zmian

FreezeEdit

boolean

Wyłącza generowanie kodu procedury Edycji rekordów

 

FreezeListLayout

boolean

Wyłącza generowanie definicji interfejsu użytkownika dla listy rekordów

 

FreezeEditLayout

boolean

Wyłącza generowanie definicji interfejsu użytkownika dla edycji rekordów

 

FreezeTabHost

boolean

Wyłącza generowanie kodu procedury wyświetlającej obsługującej wywołania z zakładek

 

ALTERNATELAYOUT

number

Generator użyje predefiniowanego wyglądu UI dla listy

Szczegóły w rozdziale dotyczącym alternatywnych UI

LeftIconField

string

Określamy jakie pole będzie użyte do określenia jaka ikonka jest wyświetlana po lewej stronie

Informacja dodatkowa dla ALTERNATELAYOUT

RightIconField

string

Określamy jakie pole będzie użyte do określenia jaka ikonka jest wyświetlana po prawej stronie

Informacja dodatkowa dla ALTERNATELAYOUT

UpTextField

string

Określamy jakie pole będzie wyświetlane w górnym tekście

Informacja dodatkowa dla ALTERNATELAYOUT

LoTextField

string

Określamy jakie pole będzie wyświetlane w dolnym tekście

Informacja dodatkowa dla ALTERNATELAYOUT

 

 

Definiowane dla każdej kolumny: %FieldUserOptions

 

LOOKUP

string

Wpisz do tego pola wynik wyrażenia po pobraniu tabel będących w relacji. (Na początku procedury oraz po każdym wybraniu rekordu z listy lub spinner’a)

PostalCodesRecord.getCity()

LOOKUPCONDITION

string

Warunek, kiedy wyrażenie ma być wywołane

Przypisanie wartości null do kontrolki wywołuje wyjątek, użyteczne aby sprawdzać czy wyliczona wartość jest poprawna

EVALUATE

string

Wpisz wynik wrażenia do tego pola

InvItemsRecord.getPrice() * InvItemsRecord.getQuantity() * ( 1 – InvItemsRecord.getDiscount()/100)

EVALUATECONDITION

string

Warunek kiedy wyrażenie z Evaluate będzie wyliczane i wpisane

InvItemsRecord.getPrice() != null && InvItemsRecord.getQuantity() != null

UseSpinner

Boolean

Jeśli po polu jest relacja (M:1)do tabeli nadrzędnej, to do wyboru rekordu użyty będzie Spinner – odpowiednik clarionowego FileDrop

To pole musi być w relacji do PK innej tabeli oraz w Validate Checks należy określić tabelę w Must be in File

DSP

string

Zamiast ID będzie wyświetlana wartość z podanego pola z tabeli nadrzędnej

Należy zdefiniować klucz w tabeli nadrzędnej zawierający pole podane w dsp

FILTERCONDITION

string

Do listy/ spinnera z rekordami tabeli nadrzędnej użyty zostanie filtr zdefiniowany w FilterExpression jeśli spełniony będzie podany tu warunek.

mCityText.getText().toString().length() !=0

FILTEREXPRESSION

string

Wyrażenie filtrujące rekordy w tabeli nadrzędnej lub spinnerze

” City LIKE \”” + mCityText.getText().toString()+”%\””

READONLY

Boolean

Pole będzie w trybie ReadOnly.

 

HINT

string

Definiuje tekst wyświetlany w kontrolce jeśli jest pusta

 
       

ActionButtonCode

 

Kod w języku JAVA wywoływany po naciśnięciu przycisku

 

ActionButton

string

Obok kontrolki dodawany jest dodatkowy przycisk pozwalający wywołać kod zdefiniowany w ActionButtonCode

Należy wpisać tekst wyświetlający się na przycisku

ActionButtonIcon

string

Nazwa ikonki wyświetlanej na przycisku.

Plik z ikonką musi być w katalogu /res/drawables

PhoneButton

Boolean

Generator

 

NOPOPULATEONEDIT

Boolean

Pole nie pojawi się na oknie Edycji

 

NOPOPULATEONLIST

Boolean

Pole nie pojawi się na oknie z lista rekordów

 

UPDATECONTROLS

Boolean

Po zmianie wartości pola zostaną wykonane przeliczenia zdefiniowane w LOOKUP oraz EVALUATE

 

SPINNABLE

Boolean

Dodaje w UI dwa przyciski pozwalające zmniejszać/zwiększać wartość pola – odpowiednik strzałek w clarionowej kontrolce spin entry

 

 

Posted in Uncategorized | Leave a Comment »

System Ewidencji pojazdów … zabawy ciąg dalszy

Posted by kashiash w dniu 28 stycznia, 2011

 

Jeśli pobawiłeś się wygenerowana aplikacja zapewne zauważyłeś, że można zrobić ciekawy wpis w bazie pojazdów np. Wybrać samochód Citroen Passat, albo Volkswagen XM. Tak źle, a tak już bluźnierstwo 😉

Trzeba przekazać informację do Spinnera wyświetlającego Modele, jaka markę ma wyświetlać. Do tego służą 2 kolejne FieldUserOption w dct:

FILTERCONDITION – opcja która pozwala nam określić kiedy filtr ma być stosowany. W naszym przypadku wtedy gdy mamy wpisanego producenta:

VehiclesRecord.getMake() !=0

Oraz wyrażenie budujące fragment klauzuli where w zapytaniu pobierającym dane z SQLLite FILTEREXPRESSION. W naszym przypadku producent modelu ma być równy producentowi wybranemu na ekranie:

„models.make = ” + VehiclesRecord.getMake()

 

 

Dodatkowo po zmianie modelu należy wywołać metodę, która załaduje na nowo rekordy do spinnera z modelami, użyjemy do tego opcji OnAccepted

A procedura ładująca dane to LoadModel_Spinner()

 

 

Zapisujemy dct ,otwieramy app – generujemy kod, który następnie kompilujemy w Eclipsie

W efekcie dostajemy :


 

Dla Ciekawskich

 

Co zmieniły nasze ustawienia ? Wpis OnAccepted spowodował doanie metody:

        Make_Spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override

            public
void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {

                VehiclesRecord.setMake(id) ;

                LoadModel_Spinner();

 

            }

 

            @Override

            public
void onNothingSelected(AdapterView<?> parentView) {

                // your code here

            }

        });

 

Zaś wpis FILTERCONDITION i FILTEREXPRESSION genruja taki kod:

 

    private
void LoadModel_Spinner() {

 

        if (Models_Cursor !=null) {

            stopManagingCursor(Models_Cursor);

            Models_Cursor.close();

        }    

 

        if (VehiclesRecord.getMake() !=0) {

            Models_Cursor = ModelsxDbAdapter.getAll(„models.make = „ + VehiclesRecord.getMake(),null);

        } else {

            Models_Cursor = ModelsxDbAdapter.getAll(null,null);

        }


Posted in Uncategorized | Leave a Comment »

System zarządzania pojazdami – Tutorial II

Posted by kashiash w dniu 25 stycznia, 2011

 

 

Tym razem zrobimy bardziej rozbudowana aplikację, gdzie spróbuję przedstawić większość możliwości MOBY I.

 

Zrobimy system ewidencji pojazdów, wydatków z nimi związanych, rejestru napraw itp. W tej części skupimy się jedynie na kartotece pojazdy i kartotekami słownikowymi związanymi z pojazdem.

 

Zakładamy nowe dct, w nim nowa tabele, która nazywamy Vehicles

Id

LONG

ModelYear

LONG

Odmoter

LONG

Make

LONG

Model

LONG

Color

LONG

PlateNo

STRING(20)

RegistrationNo

STRING(20)

Renewal

DATE

TireSize

STRING(20)

   

Oraz kilka indeksów:

PkVehicles

KEY(Veh:Id),DUP,NOCASE !By #

KeyMake

KEY(Veh:Make),DUP,NOCASE !By Make

KeyModel

KEY(Veh:Model),DUP,NOCASE !By Model

KeyColor

KEY(Veh:Color),DUP,NOCASE !By Color

 

Teraz definiujemy tabelę

Colors

Id

LONG

Color

STRING(20)

   

PkColors

KEY(Col:Id),DUP,NOCASE

KeyColor

KEY(Col:Color),DUP,NOCASE

 

Makes

Id

LONG

Make

STRING(20)

   

PkMakes

KEY(Id),DUP,NOCASE

KeyMake

KEY(Make),DUP,NOCASE !By Make Name

 

Models

Id

LONG

Make

LONG

Model

STRING(20)

   

PkModels

KEY(Mod:Id),DUP,NOCASE

KeyMake

KEY(Mod:Make),DUP,NOCASE

keyModel

KEY(Mod:Model),DUP,NOCASE

 

Teraz zdefinujemy relacje pomiędzy tabelami. Nazwy kolumn sa na tyle jednoznaczne, że nie będę się rozpisywał, tym bardziej ze wszystkie pliki źródłowe są do pobrania

 

Makes <->> Models

Models <->> Vehicles

Colors <->> Vehicles

Makes <->> Vehicles

 

Teraz w tabeli Models wchodzimy do kolumny Make na zakładke Validate Checks, zaznaczamy Must be in Table i wybieramy Makes

 

 

Teraz podobna operacje przeprowadzamy w tabeli Vehicles dla kolumn: Make Model i Color

Na obecnym etapie nasz baza danych powinna wyglądać tak:

W tym momencie przerwiemy tymczasowo definiowanie naszego dct i wygenerujemy początkową wersje naszej aplikacji:

(poniższe kroki są dokładnie opisane we wcześniejszym tutorialu, wiec nie będę ich dokładnie opisywał)

  1. Zapisujemy dct
  2. Tworzymy puste APP z wyżej utworzonym dct
  3. W app wywołujemy UTILITY Template (Ctrl-U)
  4. Wybieramy Clarion2Android, pozostawiamy ustawienia domyślne i naciskamy OK
  5. W eclipse otwieramy nowy projekt (New Android Project)
  6. Wybieramy Create project from existing source i wskazujemy na katalog wygenerowany w kroku 4 i naciskamy Finish
  7. (Jest to podkatalog o takiej samej nazwie jak plik app, w katalogu gdzie mamy app i dct)

 

Wybieramy na oknie nawigator nasz projekt, w menu eclipsa wybieramy project/clean

 

 

Operacja ta ma na celu odbudowanie przez eclipsa wszystkich potrzebnych plików w projekcie

Teraz należy do katalogu res/drawables wgrać wszystkie potrzebne ikonki:

 

Po wrzuceniu wszystkich ikonek wybieramy z menu Run as Android project i czekamy na uruchomienie emulatora (trwa nawet 2 minuty, w zależności od komputera na jakim pracujecie)

W przypadku otrzymania komunikatu, że projekt zawiera błędy sprawdzamy czy na pewno wgraliśmy wszystkie ikonki i ewentualnie wybierzmy jeszcze raz z menu project/clean/vehicles

Na ekranie emulatora powinien pojawić nam się następujący widok:

Klikamy na Vehicles, pojawi się pusta lista, naciskamy menu i Add

Pojawi się ekran wprowadzania danych o pojeździe:


Naciskamy przycisk … przy polu Make, który wywoła liste producentów – na razie pustą.

Na tej liście naciskamy Menu i Add i jesteśmy na ekranie wpisywania danych producenta.

 

 

Dopisujemy dane kilku producentów i naciskając przycisk Back wacamy do menu głównego programu

Następnie wybieramy Models

Dopisujemy model samochodu np. Golf


 

Dopieszczanie interfejsu

Jak widać na powyższym ekranie nie wygląda zbyt elegancko, zamiast ID producenta chcielibyśmy widzieć jego nazwę

Do tego służy Opcja DSP od Display (niestety słowo display jest używane prze jakies szablony SV i clarion zachowuje się przy nim niedeterministycznie )

Wracamy do DCT, do tabeli Models do kolumny Make i dodajemy w opcjach : DSP(Kolumna z nazwa producenta)

Idziemy za ciosem i w tabeli Vehicles dodajemy DSP dla pól: Make, Model i Color

 

 

Idziemy za ciosem i w tabeli Vehicles dodajemy DSP dla pól: Make, Model i Color

Ważne jest aby dla tabel słownikowych dla pól wskazanych w dsp były zdefiniowane indeksy

KeyNazwaPola (WIELKOŚĆ LITER ISTOTNA !)np. KeyMake w tabeli producentów.

 

Otwieramy app i ponownie uruchamiamy Template Clarion2Android, następnie w eclipse naciskamy F5 – wymuszając na eclipsie odświeżenie źródeł

Uruchamiamy nasz projekt i teraz jak wejdziemy na listę modeli, a następnie na edycje danych modelu, otrzymujemy taki efekt jak poniżej.


W pole make możemy teraz wpisać nazwę producenta lub jego Id a aplikacja go znajdzie, możemy go tez wybrać z listy klikając na przycisk „…”

 

Jest lepiej, ale o ile takie rozwiązanie wystarczało w clarionie, to w androidzie jest nieco staroświeckie, zamienimy pole producenta z przyciskiem wyboru na Spinner. Spinner to odpowiednik clarionowej kontrolki File Drop.

Wracamy do dct do tabeli Models i w kolumnie Make w opcja dopisujemy UseSpinner(true)

 

To samo możemy zrobić w Vehicles dla Make, Model i Color

 

Generujemy projekt na nowo, odświeżamy go w Eclipse i uruchamiamy,

Po wejściu do edycji modelu naszym pięknym oczom ukazuje się następujący ekran:

A jeśli zadaliśmy sobie trud ustawienia UseSpinner dla Vehicles to w edycji pojazdu mamy taki widoczek:

 

Wystarczy tej rozkoszy clarionowo androidowej na dzisiaj, ciąg dalszy wkrótce

Posted in Uncategorized | Leave a Comment »

MOBY Notepad example

Posted by kashiash w dniu 21 stycznia, 2011

Na stronie Android Developers jest tutorial jak zrobić prosta aplikację. Dla zainteresowanych tu:

http://developer.android.com/guide/tutorials/notepad/index.html

Przeszedłem tego tutoriala, zabrało mi to ok 2 godzin (trochę walczyłem z błędami jakie popełniłem podczas pisania kodu). Podobno to nawet niezły wynik jak na kogoś kto nigdy nc w javie nie napisał.

Poniżej tutorial jak zrobić to w MOBY. Dla porównania: średnio rozwinięta osoba robiła to 15 minut 😉 w tym najwięcej czasu pochłonęło znalezienie odpowiednich ikonek.

W dct tworzymy prosta tabele, nazywamy ją Notepad, definiujemy następujące pola:

Id LONG ! ważne Nazwa tego pola musi być dokładnie jak podana (id, ID iD są niepoprawne)

Title STRING(20)

Notes STRING(20)

NoteDate DATE ! w Initial value wpisujemy clarion.today()

Zakładamy indeksy

PkNotes (Id)

KeyTitle(Title) ! warto dodać opis – generator użyje go w aplikacji zamiast nazwy klucza

Zapisujemy DCT, tworzymy pusta aplikację o nazwie Notepad dla której wybieramy wcześniej stworzone dct

Po otwarciu app uruchamiamy Utility template Clarion2Android i naciskamy OK

Wartości domyślne są odpowiednie dla generowanej aplikacji, dlatego nie modyfikujemy ich. W dalszej części dokumentacji będzie opisane do czego odpowiednie opcję służą.

W tym czasie zostanie wygenerowany nasz projekt androidowi, który należy skompilować. W tym przypadku użyjemy do tego Eclipse.

Wybieramy File/ New/ Project na oknie wybieramy Android Project. Wybieramy Create project from existing source. W polu Location podajemy ścieżkę do wygenerowanego przez szablon katalogu. I Naciskamy Finish.

Nasz projekt potrzebuje kilka ikon, które należy wgrac do katalogu res\drawable

Wszystkie ikony I obrazki powinny mieć nazwy pisane małymi literami.

flip.png – jest to domyślny plik tła dla wszystkich okien, jeśli podczas generowania podałeś inną nazwę, to należy wgrać odpowiedni plik.

Dla każdej tabeli w zdefiniowanej projekcie potrzebna jest ikonka o takiej samej nazwie jak tabela. W tym przypadku notepad.png oraz ikonke aplikacji która nazywa się application.png

Dodatkowo każdy projekt potrzebuje takich ikon:

ic_menu_preferences.png, ic_menu_add.png, ic_menu_search.png, dialog_alert.png, ic_menu_close_clear_cancel.png, ic_menu_save.png, exchange.png, ic_menu_delete.png

Po wgraniu ikon w Eclipse wybieramy Project /Clean wskazujemy nasz projekt i naciskamy OK. Opcja ta służy do usuwania plików tymczasowych projektu, ale jednocześnie wymusza na eclipse wygenerowaniu wszystkich wymaganych przez niego plików.

Nastepnie wybieramy: RUN/ Run as android application. W tym czasie Eclipse weryfikuje nasza aplikacje I uruchamia emulator. W zależności od prędkości komputera emulator uruchamia się od 40 sekund do ponad 2ch minut. Podczas dalszej pracy nie zamykaj emulatora dzięki temu oszczędzisz czas jaki jest potrzebny na jego uruchomienie. Po uruchomieniu zobaczysz ekran startowy jak poniżej, przesuń myszką pasek z zieloną kłódka w prawo, co spowoduje odblokowanie ekranu.

I naszym oczom pokaże się aplikacja w androidzie

Wybieramy Browse Notepad, pojawia się puste okienko gdzie będziemy widzieć wpisane notatki. Wybieramy klawisz Menu na oknie emulatora i wybieramy Add, pojawia się ekran gdzie możemy wpisać notatkę.

Posted in Android, MOBY | Leave a Comment »

Opcja dzwonienia na numer z kontrolki Text Edit : PhoneButton Option

Posted by kashiash w dniu 20 stycznia, 2011

Dodaliśmy w MOBY możliwość dodania przycisku do dzwonienia na numer wpisany w polu. Wystarczy w UserOptions dodać PhoneButton (True)

Dzięki temu wpisowi generator w kodzie doda taki wpis:

[java]

mTelefonText = (EditText) findViewById(R.id.autologTelefon);

Button CallPhoneTelefon = (Button)findViewById(R.id.CallPhoneTelefon );

CallPhoneTelefon.setOnClickListener(new OnClickListener(){

public
void onClick(View arg1){

String toDial=„tel:”+mTelefonText.getText().toString();

if (toDial.length()>4) {

startActivity(new Intent(Intent.ACTION_DIAL,Uri.parse(toDial)));

}

}

});

[/java]

Co w efekcie da nam w aplikacji:


I po naciśnięciu przycisku ze słuchawką


Posted in Android, Clarion, MOBY | Leave a Comment »