Dzisiaj połaczymy sie aplikacja w go z MS SQL.
Trzeba pobrać driver sql
go get github.com/denisenkom/go-mssqldb
przykład, który pobiera dane z tabeli:
_, err = condb.Exec("update klienci set Uwagi = 'ABC' where Data is not null")
Posted by kashiash w dniu 18 grudnia, 2017
Dzisiaj połaczymy sie aplikacja w go z MS SQL.
Trzeba pobrać driver sql
go get github.com/denisenkom/go-mssqldb
przykład, który pobiera dane z tabeli:
_, err = condb.Exec("update klienci set Uwagi = 'ABC' where Data is not null")
Posted in Go, SQL, Uncategorized | Leave a Comment »
Posted by kashiash w dniu 9 grudnia, 2017
Jakiś czas temu uświadomiłem sobie ze na Clarionie świat programistyczny się nie kończy i jednak pozostawanie przy samym Clarionie ogranicza mnie i to mocno. Oczywiście nadal pozostaje leniwym programista i nie chce i się należeć do grupy, która zajmuje się klepaniem nudnych CRUD’ów.
Rozwinę moje przemyślenia najprawdopodobniej w innym wpisie, teraz skupie się nad językiem Go (Golang).
Gdzieś w internetach znalazłem takie porównanie gdzie była porównywana wydajność aplikacji napisanych w różnych językach w porównaniu do C++ i w czołowce pojawił sie język go odstając nieco od .Net core a bijąc na głowe Javy, Pythony itp. Język kompilowany jest do żywego exe bez żadnych jitów i zgrzytów w dodatku do pojedynczego pliku gdzie jest wszystko.
W 2 wieczory na sucho wchłonołem 2 książeczki/broszurki na temat tego języka. Przy okazji polecam ebooki z Syncfusion, są za free i w miarę skompresowany sposób próbują nam przedstawić różne tematy ze świata programowania https://www.syncfusion.com/resources/techportal/ebooks.
Więc poczytałem sobie o tym Golang (skrót od Go language – gdybyśmy wyszukiwali po samym go to w wynikach dostalibyśmy jakieś bzdetne artykuły np z pudelka czy innego pająka). Oczywiście rozleniwiony różnymi IDE programowanie w vi i kompilowanie w sesji terminalowej podobała mi się podczas kilku pierwszych przykładów i potem mocno zniechęciła.
Poświęciłem troche czasu na poczytanie czego można użyć. Wybór był zdecydowanie większy niż w przypadku Clariona ;). Pod testach kilku wariantów padło na Visual Studio Code (Atom za wolny, Sublime i Notepad++ nie obsługują debuggera, Vime jest dla masochistów z większym odchyłem niż ja, a GoIde kosztuje więcej niż skrzynka Wilgoci Wąwozu prosto z Majdanu Starego k/Wojsławic i w dodatku chciała ode mnie jakiejś konfiguracji innymi słowy nie działała).
Z tym Visual Studio Code tez prosto nie było, opisów w sieci jest od groma, ale albo nie napisali albo ja zbyt nieuważnie czytałem. Za cholrę nie chaiło mi to działać. Dopiero jak zajrzałem w logi to okazało się, że brakuje mi git’a. Trzeba go zainstalować i dodatkowo wskazać ścieżkę do katalogu z gitem w zmiennych środowiskowych.
Kroki jakie należy wykonać:
go get -v -u github.com/peterh/liner github.com/derekparker/delve/cmd/dlv
go get -u -v github.com/nsf/gocode
go get -u -v github.com/rogpeppe/godef
go get -u -v github.com/golang/lint/golint
go get -u -v github.com/lukehoban/go-find-references
go get -u -v github.com/lukehoban/go-outline
go get -u -v sourcegraph.com/sqs/goreturns
go get -u -v golang.org/x/tools/cmd/gorename
go get -u -v github.com/tpng/gopkgs
go get -u -v github.com/newhook/go-symbols
i włala … można zacząć zabawę!
świetne źródło przykładów:
Oficjalna dokumentacja
Gdyby były problemy z debugowaniem to odsyłam tutaj:
https://github.com/derekparker/delve/tree/master/Documentation/installation
na syncfusion sa 2 książeczki:
https://www.syncfusion.com/resources/techportal/details/ebooks/Go_Succinctly
https://www.syncfusion.com/resources/techportal/details/ebooks/Go_Web_Development
jak narazie 2 rzeczy mnie zainteresowły w tym języku :
Posted in Go, Programowanie po pogańsku | Leave a Comment »
Posted by kashiash w dniu 3 marca, 2015
I z rozpędu kolejny babolik własnej produkcji:
Pojawia się wtedy gdy próbuję użyć {prop:sql} na strukturach gdzie liczba/typy/kolejność kolumn w dct różnią się od tego co jest w SQL. W tym przypadku zrobiłem małe sprzątanie w dct, a sql-owe odłożyłem sobie na ” jak będę miał większe moce przerobowe”.
Zapomniałem jednak, że kiedyś pod wpływem „eksplozji chęci bycia cool, maczo programowania itd” popełniłem taki kod:
faktury{PROP:SQL} = 'select * from faktury where ....
loop until Access:Faktury.Next()
...
...
…i dopóki dct było zgodne z SQL, to ten trik dawał ogromny zysk wydajnościowy, a jednocześnie był miną przeciw-programistyczną na którą zgodnie z prawem Murphy’ego, się nadziałem. I taką został – posprzątałem w SQL.
Posted in Uncategorized | Otagowane: clarion, Programistyczne Faule, sql | Leave a Comment »
Posted by kashiash w dniu 3 marca, 2015
Od czasu do czasu, po kolejnym grzebnięciu w kodzie pojawiają się dziwne komunikaty błędów. Praktycznie za każdym razem przypominam sobie, że miałem z czymś takim do czynienia, że znalazłem rozwiązanie, ale już nie pamiętam. Następuje proces przeszukiwania Google, który jak zwykle charakteryzuje się tym, że niby tematów podobnych jest mnóstwo, ale to tylko takie „akademickie” pitolenie, z którego niewiele wynika.
Najchętniej znalazłbym własną odpowiedź: jak sobie poradziłem poprzednim razem. I temu służy ten wpis.
Błąd (01S01) czyli SQL fractional truncation, występuje w przypadku moich programów gdy pobieram typ DATE (w dct) z SQL gdzie jest on DateTime i w cześć bitów zawierającej Time są wartości rożne od 0. Najczęściej występuje to wtedy gdy dokonam update tej daty w SQL np funkcja getdate(), bez przycięcia części związanej z czasem:
Wtedy wystarczy zwykły update:
update[RejestrZdarzen]
set data = cast(cast(data as int) as datetime)
where data <> cast(cast(data as int) as datetime)
i pozamiatane. Oczywiście można dyskutować , że skoro w SQL jest DateTime, to w DCT tez tak powinno być, ale to rozwiązanie ma też kilka wad, które irytują mnie niekiedy bardziej niz powyższe.
Okazuję się, że w przypadku samego pola typu Time w clarionie, w SQL po konwersji np FM3 to pole tez jest DateTime i tez jest mały problem bo SQL potrafi zapamiętać tam więcej niż clarion, co w konsekwencji też wywoła powyższy błąd w aplikacji clarionowej.
prostowanie polega na wycięciu części z tysiecznymi np tak:
update[RejestrZdarzen]
set czas = cast(czas as char(19))
where ...
Może się jednak przekonam na używanie grup DateTime …
Posted in Uncategorized | Otagowane: clarion, Programistyczne Faule, sql | Leave a Comment »
Posted by kashiash w dniu 11 lutego, 2011
Tutorial II: Vehicle Management System – Part 3: New Tables
In such a vehicle management system, an information about expenses is usually very useful.
To implement it, let’s add a FuelLog and two dictionary tables about fuel provider company and fuel type. To do so, please follow the table:
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 |
Columns |
|
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 |
Columns |
|
Id |
LONG |
FuelTypes |
STRING(50) |
In addition, define relations between the tables:
FuelTypes <->> FuelLog
Vehicles <->> FuelLog
Brands <->> FuelLog
For the newly created FuelLog table, set must be in file for the fields Vehicle, Brand i FuelType. (this should be done in the Validity Checks tabs)
Then, set for these columns UseSpinner and DSP.
Finally, we’ll obtain a following database structure:
Let’s save the application and generate code.
We have 3 new tables, so we need new icons for them. Without them, the application will not run.
We need brands.png, fuelstypes.png and fuellog.png, to be added to the res/drawables folder.
After starting the generated application we should see:
As you see, we are running out of space. Making icons smaller than 48×48 would help to some extent,. We could also stop showing all these buttons in the main menu.
But, so far, look what more came out from our efforts:
There is surely a problem with space, but MOBY will help us!
In File User Options set PromptsInLine(true) . After regenerating:
The same can be set for Vehicles: PromptsInLine(true).
In the current version, there are 2 posssiblities to get into the fuel log: either directly from the main menu or from the menu key in the vehicle screen.
When we set UseTabHost(true) in FileUserOptions for Vehicles, the application will generate code so, that the list will be accessible also from a separate tab in the vehicle screen.
In the subsequent steps, we’ll work on more lists to be displayed for vehicles and on the fuel log. So far play with the application as is.
When we get a message in Eclipse that our project has errors and can’t be started, check the PROBLEMS tab.
Here an example of a message. In this case cleaning the project is sufficient to get it right.
We recommend to start any attempts in this way. Simply select Project/Clean and look what is displayed in the Problems tab.
In addition, it is good to know that common error in a MOBY application is caused by the lack of required icons.
Simply add the icons with required names to the res/drawables folder and the issue should be solved.
Posted in Uncategorized | Leave a Comment »
Posted by kashiash w dniu 6 lutego, 2011
Clarion posiada możliwość deklaracji kontroli poprawności danych
Na zakładce Validate Fields możemy wybrać kilka opcji. MOBY korzysta z niektórych z nich:
MUST BE IN TABLE – oznacza ze wartość z tej kolumny musi znajdować się w tabeli w relacji. MOBY pilnuje zaraz po wprowadzeniu wartości czy jest poprawna
CANNOT BE ZERO OR BLANK – w polu musi być cokolwiek wpisane
MUST BE IN RANGE – wartość musi znajdować się w wartościach podanych w tej opcji
Dodatkowo można wypełnić opcje VALIDATE i wpisać w niej wyrażenie logiczne zgodne z syntaktyka języka JAVA, które musi być spełnione, aby można było zapisać dane.
Posted in Android, Clarion, MOBY | Leave a Comment »
Posted by kashiash w dniu 6 lutego, 2011
Standardowo clarion ma cos takiego jak Formuły, gdzie możesz zdecydować co ma być liczone , jak i kiedy. Niestety zrobienie tego w DCT jest dużo trudniejsze. Uważam, że nie należy robić nic na siłę. Moby I pozwala jedynie na określenie formuł wypełniających poszczególne pola, jakieś specyficzne wyliczenia trzeba zakodować ręcznie. Uspokajam – MOBY II będzie pozwalał na definiowanie formuł w sposób podobny do clarion’a.
Prosta aplikacja, którą próbujemy tu zrobić ma rejestr pojazdów oraz rejestr ich tankowania. Podczas tankowania użytkownik będzie wpisywał stan licznika z momentu tankowania. Możemy ta informacje wpisywać do pola odometer w naszych pojazdach, przez co będą aktualizowane automatycznie.
Jak to zrobić ?
Prostym zapytaniem SQL jesteśmy w stanie pobrać najwyższa wartość stanu licznika dla wybranego pojazdu. Poniżej przypominam strukturę bazy danych.
Pytamy o maksymalna wartość licznika w logu, np. tak :
Select max(EndingOdometer) from FuelLog where Vehicle = 1
Operacje wykonujemy na oknie VehiclesEdit, gdzie id naszego pojazdu możemy pobrać z obiektu reprezentującego rekord z tabeli Vehicles:
Możemy się do niego dostać używając metody getId :
VehiclesRecord.getId()
Czyli nasze zapytanie bedzie wyglądalo tak :
„Select max(EndingOdometer) from FuelLog where Vehicle = ” + VehiclesRecord.getId()
a takie zapytanie wywołamy w następujący sposób:
VehiclesxDbAdapter.getInstance().getQueryScalarLong(„Select max(EndingOdometer) from FuelLog where Vehicle = ” + VehiclesRecord.getId());
aby wpisywalo sie do naszego pola należy wpisać w opcjach pola EndingOdometer EVALUATE oraz EVALUATECONDITION.
EVALUATE(VehiclesxDbAdapter.getInstance().getQueryScalarLong(„Select max(EndingOdometer) from FuelLog where Vehicle = ” + VehiclesRecord.getId()))
EVALUATECONDITION( VehiclesRecord.getId() != null)
Dzięki tym opcjom MOBY wygeneruje kod który pod warunkiem spełnienia warunku w EVALUATECONDITION wpisze wynik z EVALUETE do pola EndingOdometer
public
void DoLookups() {
if (VehiclesRecord.getId() != null) {
VehiclesRecord.setOdmoter(VehiclesxDbAdapter.getInstance().getQueryScalarLong(„Select max(EndingOdometer) from FuelLog where Vehicle = „ + VehiclesRecord.getId()));
// Vehicles Veh:Odmoter
if ( VehiclesRecord.getOdmoter() != null) {
mOdmoterText.setText(VehiclesRecord.getOdmoter().toString());
}
}
}
Uruchamiamy aplikację, wybieramy pojazd, wchodzimy do jego edycji i robimy wpis do logu tankowania, wracamy na dane i pojazdu i …? cieszymy się jak nasz log się aktualizuje.
Skoro poznaliśmy kolejną, istotną możliwość MOBY, wykorzystajmy ja dalej: w logu tankowania przydałoby się, aby stan licznika poprzedniego tankowania był automatycznie podpowiadany, przy okazji niech, jako licznik kończący wpisze się ta sama wartość i oczywiście wyliczy się różnice przejechanych kilometrów.
Robimy to bardzo podobnie jak wcześniej, zmieniamy tylko klauzulę where – mamy wyszukać maksymalna wartość z licznika dla wpisów wcześniejszych niż edytowany. W EVALUATE wpiszemy wyrażenie wyliczające maksymalny licznik z wcześniej wpisanej pozycji
FuelLogxDbAdapter.getInstance().getQueryScalarLong(„Select max(EndingOdometer) from FuelLog where Vehicle = ” + FuelLogRecord.getVehicle() + ” and _id < ” + FuelLogRecord.getId())
Dzięki temu pole StartingOdometer będzie automatycznie uzupełniane.
W kolejnym kroku wprowadzimy wypełnianie EndingOdometer w sytuacji gdy jest puste. Dodatkowo włączymy opcje SPINNABLE, co spowoduje ze MOBY doda 2 przyciski, które pozwalają zwiększać lub zmniejszać wartość tego pola.
UPDATECONTROLS powoduje ze po aktualizacji tego pola pozostałe są ponownie wyliczane, i pole OdometerChange zostanie przeliczone wg zadeklarowanego wyrażenia w EVALUATE.
Wchodzimy do edycji pojazdu, jak widacz licznik jest 6809
Teraz dopisujemy tankowanie, podpowiada nam się Starting i Ending Odometer, zmieniając wartość w Ending Odometer, automatycznie wylicza nam się OdometerChange
Po zapisaniu informacji o tankowaniu w pojeździe automatycznie zaktualizuje nam się Licznik bieżacy
Posted in Android, Clarion, MOBY | Leave a Comment »
Posted by kashiash w dniu 5 lutego, 2011
O atrakcyjności aplikacji decyduje wygląd interfejsu. Niestety interfejs androida nie jest „sexy” i np. odbiega od tego co oferuje iPhone czy aplikacje robione w Adobe Air/Flex. Bolączką wielu programistów, niestety także autora tego tekstu jest brak smykałki do dopracowywania wyglądu interfejsu. Na szczęście Moby dostarcza kilka predefiniowanych szablonów wyglądu list danych. Oto opis jak ich używać.
Dla każdej tabeli możemy zdefiniować layout alternatywny. Najprostszy z nich to Layout 3 zawierający linijke tekstu oraz ikonkę pozwalającą wyświetlać ikonkę, która zależy od zawartości rekordu listy.
LeftIconField |
UpTextField |
RightIconField |
LoTextField |
Aby uzyskać taki wygląd należy w FileUserOptions dodać opcje typu Number o nazwie ALTROWLAYOUT i wpisać jej wartość 3
Oraz określić, jakie pole ma być wyświetlane w UpTextField w przypadku tabeli Dostawców paliwa wybieramy pole Brand, co oznacza , że w polu górnym widoku ma być wyświetlona wartość kolumny Brand z tabeli którą edytujemy czyli w tym przypadku Brands.
Dodatkowo określamy jak ikonka powinna być wyświetlona w LeftIconField podajemy wyrażenie zgodne ze składnia języka JAVA, którego wynik daje nazwę ikonki.
Podobnie robimy w tabeli Makes
Oraz w tabeli Models
Wykaz ikonek potrzebnych dla naszej aplikacji – zawartośc katalogu res\drawables
Aby pokazac układ bardziej rozbudowany, zmodyfikujemy nieco tabelę z dostawcami paliwa – dodamy pole z informacja czy akceptują karte paliwowa UTA
W ten sposób definiujemy pole typu CHECKBOX
Generujemy aplikację. W związku z tym, że zmieniła nam się struktura bazy, modyfikujemy numer wersji bazy danych. Dzięki tej informacji MOBY wygeneruje procedurę do konwersji z poprzedniej wersji, na wersje bieżącą.
Ustawiamy dodatkowe opcje jak poniżej:
Dodajemy opcje związane z informacja o prawej ikonce
RightIconField(„uta” + BrandsxDbAdapter.getAcceptUTACards(c))
Do projektu wgrywamy ikonkę uta1.png
Zmieniamy vehicles_list.xml na:
<?xml version=”1.0″ encoding=”utf-8″?>
<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:id=”@+id/RelativeLayout01″
android:layout_height=”wrap_content”
android:layout_width=”fill_parent”>
<ImageView android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:id=”@+id/lefticon”
android:visibility=”gone”></ImageView>
<TextView
android:layout_width=”wrap_content”
android:text=”TextView”
android:padding=”5dp”
android:textAppearance=”?android:attr/textAppearanceMedium”
android:layout_height=”wrap_content”
android:id=”@+id/model”
android:layout_toRightOf=”@+id/lefticon”
android:layout_alignTop=”@+id/lefticon”
android:layout_alignBottom=”@+id/lefticon”>
</TextView>
<TextView
android:layout_width=”wrap_content”
android:text=”TextView”
android:textAppearance=”?android:attr/textAppearanceMedium”
android:layout_height=”wrap_content”
android:id=”@+id/odmoter”
android:padding=”5dp”
android:layout_alignParentRight=”true”>
</TextView>
<TextView
android:layout_width=”wrap_content”
android:text=”TextView”
android:padding=”5dp”
android:textAppearance=”?android:attr/textAppearanceMedium”
android:layout_height=”wrap_content”
android:id=”@+id/plateno”
android:layout_centerInParent=”true”
></TextView>
</RelativeLayout>
W VehiclesList.java odszukujemy procedure VehiclesHolder
I zmieniamy, aby wyglądała jak poniżej
static class VehiclesHolder {
private TextView Odmoter = null;
private TextView Model = null;
private TextView PlateNo = null;
private ImageView LeftIcon=null; //manual
private View row=null;
VehiclesHolder(View row) {
this.row=row;
LeftIcon=(ImageView)row.findViewById(R.id.lefticon);
Odmoter=(TextView)row.findViewById(R.id.odmoter);
Model=(TextView)row.findViewById(R.id.model);
PlateNo=(TextView)row.findViewById(R.id.plateno);
}
void populateFrom(Cursor c) {
if (VehiclesxDbAdapter.getOdmoter(c) != null) {
Odmoter.setText(VehiclesxDbAdapter.getOdmoter(c).toString());
}
if (VehiclesxDbAdapter.getModel(c) != null) {
Model.setText(VehiclesxDbAdapter.getModel(c).toString());
}
if (VehiclesxDbAdapter.getPlateNo(c) != null) {
PlateNo.setText(VehiclesxDbAdapter.getPlateNo(c));
}
int resId;
try {
resId = R.drawable.class.getDeclaredField(„makes” + VehiclesxDbAdapter.getMake(c).toLowerCase()).getInt(null);
LeftIcon.setImageResource(resId);
LeftIcon.setVisibility(View.VISIBLE);
} catch (Exception e) {
Log.d(TAG,”ikona:” + „makes” + VehiclesxDbAdapter.getMake(c).toLowerCase());
LeftIcon.setVisibility(View.INVISIBLE);
}
}
}
Oczywiście podczas kolejnego generowaniaclarion nadpisze nam nasze zmiany. Aby temu zapobiec, zabronimy generowanie kodu listy oraz layoutu wiersza listy
FreezeListLayout(true) oraz FreezeList(true)
Posted in Android, Clarion, MOBY | Leave a Comment »
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ą
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:
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 »
Posted by kashiash w dniu 28 stycznia, 2011
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 |
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 »