Keek op de week: waar begint de weektelling?

Na het vervangen van een server treden er eigenaardige fouten op, die te maken hebben met tijdsberekening. Nader onderzoek leidt me tot enkele eenvoudige testen:

Gambas commandolijn (onderaan in de IDE):

? week(now())

41

Dan op de mysql server via de browser in phpmyadmin of rechtstreeks in de mysql commandprompt:

SELECT WEEK(NOW());

+-------------+
| week(now()) |
+-------------+
|          40 |
+-------------+
1 row in set (0.02 sec)

Niet iedereen begint op dezelfde manier te tellen; de Europeanen blijkbaar vanaf de eerste dag van het jaar, de Amerikanen vanaf de eerste volle week van het jaar.

Gambas2 op OpenSUSE 13.1: meer dan de runtime?!

Het lijkt erop dat Gambas2 stilaan en onvermijdelijk Einde Loopbaan is. In de huidige installatie van OpenSUSE 13.1 komt bv alleen nog de runtime voor van Gambas2, tenminste als je de community repositories/Educational geïnstalleerd hebt. (bronnen van de gemeenschap)
Gambas 2.24.0 is installeerbaar van de One Click install
Ik ging specifiek op zoek naar de gambas2 IDE en vond die ook:
http://software.opensuse.org/package/gambas2-ide:

Als u doorgaat zullen de volgende wijzigingen worden aangebracht aan uw systeem:
Toe te voegen installatiebronnen:
http://download.opensuse.org/distribution/13.1/repo/non-oss/ (openSUSE:13.1:NonFree)
http://download.opensuse.org/distribution/13.1/repo/oss/ (openSUSE:13.1)
http://download.opensuse.org/repositories/Education/openSUSE_13.1/ (Education)
http://download.opensuse.org/repositories/devel:/languages:/perl/openSUSE_13.1/ (devel:languages:perl)
http://download.opensuse.org/repositories/devel:/languages:/python/openSUSE_13.1/ (devel:languages:python)

Te installeren software:
gambas2-ide

Gambas2 programmeeromgeving duikt op in het klassiek KDE menu recent geïnstalleerd.

Ubuntu 12.04 LTS naar 14.04 zonder Gambas2

Op Ubuntu 12.04 draait Gambas2 vlot en snel. Bij een upgrade naar 14.04 krijg je heel wat nieuwe softwareversies; maar wat gebeurt met de geïnstalleerde Gambas2 (2.23) ?

Gambas3 is immers niet zomaar een nieuwe versie van Gambas2 als bij een nieuwe Firefox versie; sommige fundamentele zaken zijn veranderd, en je ontsnapt er niet aan om de broncode van programma’s aan te passen voor gebruik in Gambas3.

Na installatie van de upgrade krijg je de vraag om oude softwarepaketten te verwijderen; zo’n 200-tal zijn niet meer nodig, een 120 worden aangeboden om te verwijderen met een klik.

Kijk even naar de “Details”, in de alfabetische lijst ben je vrij snel bij de “g” van Gambas. Gambas2 staat aangeduid om te verwijderen! Je kan kiezen voor “behouden”.

Daarna is het computer herstarten. Gambas2 IDE, en de in Gambas2 gemaakte applicaties (met hun icoon op de desktop) werken nu nog.

ps: Ik weet niet hoe het zit in andere distributies; op openSUSE heeft de combinatie Gambas2 en Gambas3 lang goed gewerkt (nog op dit moment september 2014).

Gambas error door databank update: “wanted Integer ..”

Bij een bestaande applicatie in gambas2 duikt een fout op na een update van de database server:

Type mismatch: wanted Integer, got String instead

Net voor het probleem opdook werd de server waarop de MySQL databank draaide, geupdate van
mysql 3.23.x naar mysql 5.5.x

De reaktie van de database is veranderd bij een ontbrekende waarde; in plaats van een 0 (nul als getal), komt nu een andere waarde terug (in debug getoond als -23495771):

De test die vroeger het onderscheid maakte of data aanwezig was of niet in het veld fld_diff in een resultset resRecord:

IF resRecord!fld_diff > 0

is nu vervangen door een combinatie met een test op het type van het veld:

IF TypeOf(resRecord!fld_diff) = gb.Integer
    IF resRecord!fld_diff > 0

Pas als je weet dat het een getal is kan je de waarde gaan testen.

Daarna werkte het programma terug.

Een array vullen met bestandsnamen

Een array arrFileNames moet gevuld worden met de namen van de bestanden uit een directory sDirectory.

En hoewel je de directory kan gaan doorlopen en één voor één de namen uitlezen en in een array toevoegen met “insert’, bestaat er een snelle en handige manier in gambas met “Dir“, dat een array teruggeeft op een selectie van bestanden:

aFiles = Dir(sDirectory, "*.txt")

Voorbeeld van uitlezen van beelden en opeenvolgend tonen in bestaande Picturebox1 :

 DIM s AS String
...
 TRY aFiles = Dir(sDirectory, "*.png")
 IF ERROR 
    DEBUG Error.Text
  ELSE 
    FOR EACH s IN aFiles
      Picturebox1.Picture = Picture.Load(sDirectory &/ s)
      Message.Info(s) ' toon bestandsnaam en wacht
    NEXT 
  ENDIF 

Gambas3 start niet meer op na upgrade openSUSE 13.1: omzeilen

Kort:

Probleem na upgrade van openSUSE 13.1: gambas3 start niet meer op.

openSUSE 13.1 – Gambas 3.5.4-3.1 na upgrade: “unable to find startup file”
(of start met commando gambas3: “KDEInit could not launch ‘gambas3.gambas’: Could not find ‘gambas3.gambas’ executable)

Oplossing: installeer van de home:munix9:gambas repository (** Beschrijving om probleem op te lossen/te omzeilen)

Probleem-beschrijving

/usr/bin/gambas3
gbx3: unable to find startup file

Er zijn gambas2 en gambas3 files te vinden in:
/usr/bin
/usr/share

cyb@linuxbox:/usr/bin> ls gb*
gba2 gba3 gbc2 gbc3 gbi2 gbi3 gbr2 gbr3 gbs2 gbs2.gambas gbs3 gbs3.gambas gbw2 gbw3 gbx2 gbx3

cyb@linuxbox:/usr/bin> ls gamb*
gambas2 gambas2-database-manager.gambas gambas2.gambas gambas3

en

:/usr/share> ls gamb*
gambas2:
examples help info

gambas3:
control examples gb.sdl help icons info

en dan nog wat links en iconen en zo.

Info: opensuse 13.1 / 64 bit / KDE 4.11.5/gambas 3.5.4-3.1
Repository: OpenSUSE / Education.
Geen beschrijvingen op web gevonden op dit moment (16/7).

Gambas3 komt voor in 3 repositories: educational, home:ccgx en home:munix9:gambas. (software.opensuse.org/package/gambas3)
Ik probeer om te schakelen naar home:ccgx , wat gambas 3.5.4-4.2 installeert.
Maar dat werkt evenmin; exact dezelfde melding “unable to find startup file”, na:

  • 1. de-installeren- alle bestanden ivm gambas3 en gb3 zijn weg in beide directories;
  • 2. uitschakelen softwarebron en inschakelen andere softwarebron;
  • 3. opnieuw installeren

Sommige bestanden hebben een grootte van 0, en bij het starten van gbi3 krijg ik foutmeldingen.
(zien helemaal onderaan *)

** Beschrijving om probleem op te lossen/te omzeilen:

Verander repository naar home:munix9:gambas

Je kan ook via software.opensuse.org zoeken op gambas3; daar heb je de mogelijkheid tot “1-click” install. Daarbij worden volgende repositories toegevoegd:

  • http://download.opensuse.org/repositories/home:/munix9/gambas/openSUSE_13.1/
  • http://download.opensuse.org/repositories/openSUSE:/13.1/standard/

Deze keer is het goed; de “munich” repository installeert wel een versie die opstart.
in Yast 18/7: Gambas 3.5.4-2.2 Build time Sat 12 Jul 2014 09:59:16 PM CEST
Deze versie kreeg (een update) updates:
22/7/2014 Gambas 3.5.4-4.1 Build time Tue 22 Jul 2014 02:06:39 AM CEST
23/7/2014 Gambas 3.5.4-5.1 Build time Tue 22 Jul 2014 08:55:53 AM CEST
06/8/2014 Gambas 3.5.4-5.2 Build time Wed 30 Jul 2014 03:50:31 PM CEST
12/8/2014 Gambas 3.5.4-5.3 Build time Mon 06 Aug 2014 03:25:52 PM CEST
21/8/2014 Gambas 3.5.4-5.4 Build time Thu 21 Aug 2014 12:14:22 AM CEST
22/8/2014 Gambas 3.5.4-5.5 Build time Fri 22 Aug 2014 01:11:56 AM CEST
22/8/2014 Gambas 3.5.4-5.6 Build time Sat 23 Aug 2014 03:37:15 AM CEST

18/9/2014 Gambas 3.5.4-5.10 Build time Thu 18 Sep 2014 05:56:46 AM CEST
23/9/2014 Gambas 3.5.4-6.1 Build time Sun 21 Sep 2014 08:01:17 PM CEST
23/9/2014 Gambas 3.5.4-6.3 Build time Wed 24 Sep 2014 03:26:56 PM CEST (6.2 gemist?)
29/9/2014 Gambas 3.5.4-6.4 Build time Mon 29 Sep 2014 07:52:39 PM CEST
07/10/2014 Gambas 3.5.4-6.5 Build time Mon 06 Oct 2014 04:57:15 PM CEST

Regelmatige updates blijkbaar, niet slecht dus!

Update 22/10/2014:
Als ik na een niet-werkende gambas3 uit de education repo, nu die uit de munich repo probeer te installeren krijg ik een foutmelding op de “ports” repositories:
ports/
Ports/extra/
Update/ports/

Ik heb die ge-deselecteerd, en de installatie verdergezet.
Lijkt te werken.

Continue reading

openSUSE 13.1 – Gambas 3.5 upgrade probleem: omzeild

openSUSE 13.1 – Gambas 3.5.2-1.4 upgrade probleem; omzeild.

Bij upgrade naar Gambas 3.5.2-1.4 op OpenSUSE kan een probleem opduiken, waarbij Gambas3 niet meer start. Mogelijk heeft het te maken met de oorspronkelijk geïnstalleerde versie van het Munich project. Daar ontbraken de voorbeelden van de programmeeromgeving, wat deed zoeken naar een andere versie. De Educational repository van openSUSE werd geactiveerd, en die deed een “upgrade” van 3.4 naar 3.5, waarbij een aantal componenten echter niet meer voor handen bleken (uit de foutmeldingen).

Enkele opeenvolgende foutmeldingen op de commandline:

gambas3
Cannot load class ‘Action’: Bytecode too recent. Please upgrade Gambas.

gambas3
gbx3: unable to find startup file

gambas3
/usr/bin/gambas3: No such file or directory

Aan de laatste ziet u al wat ik deed; ik verwijderde met de package manager yast heel gambas3 (zoek op “gambas3” – laat gambas2 staan als je die wil houden).

Daarna gambas3 terug geïnstalleerd van de education repository, en Gambas 3.5.2 start vrolijk op.

Gambas2 menu editor: Action

Een van die nuttige, toevallige ontdekkingen: wat de Action betekent in menu: mailinglist

items .. which can throw “actions”

De Action helpt in het beheer van complexe toepassingen met veel menu’s en knoppen, die overlappen in functie, en waarvan de toestand (beschikbaarheid) moet aangepast worden naargelang omstandigheden (itt een altijd bereikbaar menu als Help, About,..).

Met dat Action veld kan je een “actie” definiëren waarop die verschillende “controls” van toepassing zijn, zoals de actie “bewaar huidig document”, actie bv genaamd “ActSaveFile” (zou bv voor menu “File, Save” en shortcut ctrl-s en een toolbutton “tlbtSave” kunnen zijn).

Je kan volgens de beschrijving die met één procedure na het bewaren inactief maken bv.

action["ActSaveFile"].Enabled = FALSE

PUBLIC SUB inactivateSave(bNewState AS Boolean)
  Action["ActSaveFile"].Enabled = bNewState
  mniOther.Enabled = NOT bNewState  ' some other alternating function
END

Bovendien kan je op basis daarvan ook code laten uitvoeren; acties worden gecheckt, je moet alleen de procedure schrijven om er iets mee te doen; de parameter is de naam van de actie en return waarde is een boolean:


PUBLIC SUB Action_Activate(sAction AS String) AS Boolean
  DEBUG sAction
  SELECT sAction
    CASE "ActSaveFile"
      saveCurrentFile()
    CASE
      ' ...
  END SELECT
  RETURN TRUE ' might be located in CASEs as result there
END

Meer uitleg over Actions op de (niet-vertaalde) documentatiepagina: http://www.gambasdoc.org/help/comp/gb.qt/action?nl

Startvenster vanuit MMain

Een applicatie die

  1. – start met MMain
  2. – in FMain heel wat initialisatie en schermopbouw-tijd nodig heeft (database-connecties)
  3. – daardoor slechts na enkele seconden teken van leven geeft (nl. FMain zichtbaar maken op scherm)

Enkele pogingen om alvast een ander venstertje op het scherm te zetten, dat aangeeft dat het programma opgestart is, bv vanuit MMain al, liepen fout op het terug afsluiten van dat startvenster.

Hoe het wel lukte: Vanuit FMain wordt eerst FStartup aangeroepen, al vanuit de
  PUBLIC SUB _new()
code, dan worden de initialisaties gedaan, en wordt de code doorlopen van
  PUBLIC SUB Form_Open()
Deze eindigt, aan het einde van alle initialisaties en opbouw van schermelementen, met
  FStartup.Close()
 END

om het startup venster te sluiten.

Bij andere pogingen, met bv het startscherm geopend vanuit MMain, kreeg ik fouten als:
– het opstartscherm gaat niet dicht als FMain open is.
– het opstartscherm dat uit MMain opgestart was, wordt gesloten in FMain, maar dan gaat FMain mee dicht (?!)
– het opstartscherm wordt wel gesloten, maar na het beëindigen van FMain blijft er “iets” van Gambas aktief; zichtbaar in de ps -AH uitvoer op de commandolijn: gbr blijft draaien.

Het lijkt me dus best om de “hiërarchie” van de schermen zuiver te houden…

Een datum achteruit; bv een week terug

Bij weergave van gegevens van een week geleden tot nu moet je de begindatum van die periode bepalen.
Hoe kan ik de datum van een week terug vinden?

De huidige datum in Gambas krijg je met:

date()
of
date(now())

(Deze commando’s kan je uitproberen in het Console venster onderaan in Gambas IDE, met vraagteken plus commando, zoals “ ? date()“.)

De gewone now() geeft ook de tijd erbij. Maar het interessante aan now() is dat je van daaruit kan teruggaan naar de dag van nu min een week:

date(now()-7)

In de Console moet het zo:

? Date(Now()-"7")

Als je dus from.. until datums nodig hebt, kan je hiermee je “from” datum berekenen.

De aparte waarden voor jaar, maand en dag indien je die nodig hebt, bv voor het opstellen van een SQL vraag:

year(date(now()-7) & "-" & month(date(now())-7) & "-" & day(date(now())

Of als je de hele voorbije week nodig hebt, kan je een array vullen met die dagen:


 PUBLIC SUB fillLastWeek(arrLastWeek AS Date[], iBack AS Integer, OPTIONAL bTodayIncl AS Boolean)
  
  DIM dStart AS Date
  DIM dRun AS Date
  DIM dEnd AS Date
  DIM i AS Integer
  DIM iShiftToday AS Integer = 0
  
  DEBUG arrLastWeek.Type
  
  IF bTodayIncl
    iShiftToday = 1
  ENDIF 

  IF iBack = 0
    iBack = 7 
  ENDIF 
  
  dStart = Date(Now() - (iBack - iShiftToday))
  
  dRun = dStart
  
  FOR i = (1) TO (iBack)
    arrLastWeek.Add(dRun)
    dRun = Date(dStart + i)
    'DEBUG "i=" & i & " iBack=" & iBack & " iShiftToday=" & iShiftToday & " dRun = " & dRun
  NEXT 
  
END

  

Wordt aangeroepen:

fillLastWeek(arrLastWeek, 7)

of

fillLastWeek(arrLastWeek, 7, TRUE)

Nog een vraag: wat was de eerste dag van deze week?

? date(now()-weekday(Now())+"1")

Zonder de +1 kom je op zondag uit; je kan die 1 ook aftrekken van je dagnummer natuurlijk:

? date(now()-(weekday(Now()-"1")))

Zeker nuttig is ook DateAdd, waar je bij een datum aangeeft welke eenheid er hoeveel bij moet geteld worden:

DateAdd(date1, gb.Day, 7)