Kashiash's Blog

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

Go(lang) I MS SQL

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:

package main
import (
    "database/sql"
    "fmt"
    "log"
    _ "github.com/denisenkom/go-mssqldb"
)
func main() {
    condb, errdb := sql.Open("mssql", "server=192.168.1.1;user id=jk;password=JakiesDzwineHaslo;database=baza1")
    if errdb != nil {
        fmt.Println(" Error open db:", errdb.Error())
    }
    var (
        id int
        NrKlienta int
        Nazwa string
    )
    rows, err := condb.Query("select ID,IDKLIENTA,NAZWA from dbo.Klienci")
    if err != nil {
        log.Fatal(err)
    }
    for rows.Next() {
        err := rows.Scan(&id, &NrKlienta, &Nazwa)
        if err != nil {
            log.Fatal(err)
        }
        log.Println(id, NrKlienta, Nazwa)
    }
    defer condb.Close()
}

powyższy kod pobiera 3 wybrane kolumny z tabeli klienci i wyświetla je na oknie konsoli.
Następnym razem wrzucimy to do excela 😉
Gdybysmy chcieli wykonać jakąś komendę nie będąca zapytaniem sql można użyć metody Exec:

   _, err = condb.Exec("update klienci set Uwagi = 'ABC' where Data is not null")

Posted in Go, SQL, Uncategorized | Leave a Comment »

Programowanie w Go

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ć:

  1. Wejść na stronę https://golang.org i tam w okienku nazwany go Playground, pobawić się językiem. Jeśli cie nie zniechęci przejdź dalej…
  2. Po prawej stronie jest rysunek (podobno) susła, trzeba tam kliknąć, zainstalować to co się ściągnie. W starszych windowsach zrestartowac komputer.
  3. Instalujemy VS Code, po uruchomieniu wciskamy Shift+Ctrl+X wyszukujemy go lang i instalujemy pakiet autorstwa lukehoban. Patrzymy w logi jeśli jest jakiś problem z git’em, tzn ze go zle zainstalowaliśmy i trzeba to poprawić.
  4. na wszelki wypadek ręcznie dociągamy dodatkowe biblioteki i narzędzia:
    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:

https://gobyexample.com

Oficjalna dokumentacja

https://golang.org/doc/

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 :

  1. funkcje mogą zwraca wiele parametrów
  2. plik wykonywalny jest samodzielny, nie potrzebuje żadnych dodatkowych bibliotek itp
  3. Język został tak napisany aby poradzić sobie w mocno obciążonym środowisku i dobrze obsługuje współbieżność.
  4. Formatowanie kodu ma znaczenie, nie można go pisać byle jak bo się nie skompiluje. Np nawias klamrowy musi się zaczynać w tym samym wierszu co wyrażenie if
  5. Jak zadeklarowaliśmy jakaś zmienna lub dodaliśmy bibliotekę, której potem nie wykorzystujemy, to jest to marnotrastwo pamięci, czasu i td i tez jest to błąd.

 

 

 

 

 

 

 

 

Posted in Go, Programowanie po pogańsku | Leave a Comment »

Błąd 07006 czyli Naruszenie atrybutu ograniczonego typu danych podczas dostępu do rekordu dbo.Faktury

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: , , | Leave a Comment »

Błąd (01S01) co to za błąd? Szczególnie z punktu widzenia programisty Clarion

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: , , | 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.

 

 

 

 

 

 

 

 

 

Why doesn’t it compile ?

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 »

Sprawdzanie poprawności wprowadzonych danych

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 »

Ewidencja pojazdów: Policzmy to i owo ;)

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 »

Ewidencja pojazdów – dopieszczanie interfejsu

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.

Układ graficzny nr 3

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

Układ graficzny nr 3 wersja rozbudowana

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

Układ graficzny własny … tzn. ręcznie dziergany

Zmieniamy vehicles_list.xml na:

<?xml version=”1.0″ encoding=”utf-8″?>

<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221;

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 »

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 »