Rekenen met tijd in Gambas (uren, dagen)

Om tijd vast te leggen op het moment zelf: Now() geeft de huidige datum+tijd. Bekijk:

DEBUG Now()

Toekennen aan een variabele:

PRIVATE dStartuptime AS Date
dStartuptime = Now()
DEBUG Format$(dStartuptime, “hh:nn:ss”)

De debug regelt toont de variabele weergegeven in opgegeven patroon, waarbij “n” staat voor minuten (omdat de m al staat voor maand in het dagpatroon: yy-mm-dd).

Rekenen met tijd of opgeslagen tijd gaat niet zo:
DEBUG Now() – dStartuptime
Dat geeft immers ofwel direct 0, ofwel na acht seconden 9.055575355887E-5 en waarschijnlijk wil je een leesbaar getal, als een aantal minuten.

Hiervoor gebruik je de functie DateDiff met parameters oude tijd, nieuwe tijd, gecombineerd met uitvoerpatroon:

DEBUG DateDiff(dStartuptime, Now(), gb.Minute)
DEBUG DateDiff(dStartuptime, Now(), gb.Minute)
DEBUG DateDiff(dStartuptime, Now(), gb.Minute)

Bij start is het resultaat:

0
0
0

Na 8 seconden is het resultaat:

8
0
0

En na 121 seconden is het:

121
2
0

Dus je hoeft niet zelf (het aantal minuten x 60 ) plus de seconden te doen; de seconden tellen door en kunnen gebruikt worden, of als je slechts de nauwkeurigheid van minuten nodig hebt kan je rechtstreeks met minuten werken.
Na meer dan een hele dag wordt het, uitgedrukt in gb.Minute, gb.Hour, gb.Day:

1547
25
2

De eerste twee, minuten in uren:
Van minuten naar uren: 1547/60 is 25.7833.. dus de uren worden “afgekapt”
Maar de laatste in “dagen” telt een begonnen dag als een dag: hoewel het maar goed 25 uren zijn wordt 2 dagen aangegeven!

TabStrip: hoe tab-bladen bijmaken en aanspreken?

Een tabstrip zit in de Toolbox onder de tab “Container”.
Eens op het werkvlak getekend heeft hij slechts 1 tab: Tab0.
Als je terug naar de Toolbox gaat zoeken om tab-bladen bij te maken vind je dat daar niet.
Als je op het TabStrip rechtsklikt om tab-bladen bij te maken vind je alleen “Move Tab”, niet “Create”

Tabstrip met tab-bladen

Om tabs bij te maken moet je de “teller” van de tabstrip verhogen:
“Count” staat op 1.

Zet op het gewenste aantal.

Dit kan natuurlijk ook vanuit je programma, bv:

TabStrip1.Count = 3

Daarna kan je de tabbladen aanspreken met

TabStrip1.Index = 2 ' aktief maken van tabblad 2; dwz het derde want er wordt geteld tab0 tab1 tab2.

Een tabblad kan ook verborgen worden:

TabStrip1.Current.Visible = FALSE ' verbergen van een tabblad, hier dus dat derde.
TabStrip1[0].Visible = FALSE ' of bepaal het tabblad met de index

TabStrip1.Hide ' verbergen van heel de tabstrip

Bij de eigenschappen rechts in het ontwerpscherm zie je nog meer mogelijkheden, als een pictogram opnemen enz.

Columnview: kolomtitel invullen, item invullen

Gridview, ColumnviewNieuw formulier FMain, daarop een columnview “cvTwoCols”.

Eerst moeten de dimensies opgegeven worden met Columns.Count.
Dan kunnen de titels ingevuld worden.
Dan kunnen lijnen bijgemaakt worden met een zelfgekozen sleutel waarmee een opvraging kan gebeuren.
Tenslotte kan
– genavigeerd worden met MoveTo,
– een waarde gewijzigd,
– of de waarde in een bij de lijn horende kolom ingevuld worden.

PUBLIC SUB btFillColView_Click()
'
cvTwoCols.Columns.Count = 2
'
cvTwoCols.Columns[0].Text = "code"
cvTwoCols.Columns[0].Width = 50
cvTwoCols.Columns[1].Text = "description"
cvTwoCols.Columns[1].Width = 100
'
cvTwoCols.Add("0", "test1")
cvTwoCols.Add("1", "test2")
'
' and now? How to add something to the second column?
cvTwoCols.MoveTo("0")
cvTwoCols.Current.Text = "Test1"
cvTwoCols.Item[1] = "TestItem"
'
END

update griddemo download/demo/GridDemo/

html rapport weergeven of printen

Uitvoer kan je eenvoudig doen in html-bestanden, die je lokaal schrijft en opent met een browser.

Daarvoor moeten we een bestand openen (een nieuw bestand maken) om in te schrijven, tekst naar het bestand schrijven, en het bestand sluiten.

Maak een module met alle printonderdelen, en met bovenaan

PUBLIC bToPrint AS Boolean

PRIVATE hFile AS File

schrijf een bestand

OPEN sFilename FOR WRITE CREATE AS #hFile
pushHeader(bToPrint)

dat je begint met een kop die zo gemaakt wordt:
( de < en > tekens moeten natuurlijk aansluiten zonder spaties in je code)


PUBLIC SUB pushHeader(bToPrinter AS Boolean)
'
PRINT #hFile, " < html > "
PRINT #hFile, " < head > < title > " & Application.Name & " - by " & User.Name & " < /title > < /head > "
PRINT #hFile, " < body topmargin='0' leftmargin='0' fontsize='1'" ' IF (bToPrinter) THEN DEBUG "To printer ..." PRINT #hFile, " onload='window.print()'" ' only works when java is on ENDIF ' PRINT #hFile, " > "
'
END

Daarna stuur je alle gegevenslijnen, eventueel in de vorm van een tabel, en sluit je het af met een “footer”

PUBLIC SUB pushFooter()
'
PRINT #hFile, " < br > < font size='1' > " & "FACS " & Application.Version
PRINT #hFile, " < i > via " & MCommon.sReportDir & " "
PRINT #hFile, "by " & User.Name & "." & System.Host & " at " & CStr(Date(Now())) & " - " & Left$(CStr(Time(Now())), 5)
PRINT #hFile, " < /i > "
PRINT #hFile, " < /font > "
PRINT #hFile, " < /body > "
PRINT #hFile, " < /html > "
'
END

Bestand afsluiten met CLOSE na het vullen:


pushTableHeadwSub(sTitle, arrColNames, sSql, arrColTotals)
pushTableLines(resCostcode, arrColTotals)
pushTableFooter()
pushFooter()

CLOSE #hFile

Als de volledige bestandsnaam met het volledige pad in de variabele sFilename zit, bv:

sFilename = “/home/mijnnaam/Documents/ToPrint/test.html”

dan kan je de pagina openen in een browser:


EXEC ["konqueror", sFilename]
EXEC ["firefox", sFilename]

(dit is in de KDE omgeving uitgevoerd – Gnome heeft bv geen konqueror standaard geïnstalleerd)

Universele product selectie op scherm

Ik ben op zoek naar een manier om een redelijk “universeel” inzetbare productselectie te doen op het scherm.
Voorlopig denk ik aan:

  • Het scherm toont een aantal knoppen om produkten te kiezen
  • produkten komen uit databank
  • aantal produkten ligt niet vast (dus aantal knoppen niet op voorhand bekend)
  • hoeveel produkten op scherm tonen? Wijzigbaar aantal?
  • – tonen per categorie; bovenaan reeks “indruk”-knoppen met produktcategoriën (naam); ingedrukt = lichter; geen ingedrukt= alle, ander indrukken = eerste uit of bijkomend?? dan is “alle” knop nodig (misschien [*])
  • een knop per produkt, met produktnaam of afbeelding
  • een display waar informatie over de selectie komt
  • een methode om er een “aantal” selecties aan te koppelen?
  • een aktie-log in de vorm van een “rolletje” vgl kassa’s?

Ik drop de testversie voorlopig hier: upload.noxqs.org/ProductSelect
Continue reading

Foxpro timestamp data leesbaar maken

Een uit Foxpro ingevoerde tabel bevat een kolom met “timestamps”; het is een getal dat in Foxpro gebruikt wordt om te kijken in welke volgorde de records gemaakt (of gemanipuleerd) werden; een vergelijking tussen de getallen levert een aantal seconden verschil op. Hoe dit getal bruikbaar maken, bv door het naar een leesbare datum om te zetten?

Bv: het getal : 487768695 zou op het moment van bewaren het het aantal seconden voorstellen dat verstreken is sinds Foxpro’s referentietijd, een soort seconde nul in het begin van 1980.

Seconden naar minuten -> uren -> dagen: getal / (60 x 60 x 24)

Hier komen de Visual Basic Compatibility functies goed van pas. Je moet dan eerst bij Project, Properties, tab Components gb.vb aankruisen!

De component gb.vb bevat maar een paar functies, niet toevallig met datumfuncties, en meer bepaald om tijd bij te tellen of af te trekken van een datum:

DateAdd DateDiff Left Mid Right Round Str Val

DateAdd vereist de aard van wat erbij geteld wordt (dag), bij te tellen getal, begindatum:

vb.DateAdd("d", Round(db.fldTimestamp / (3600 * 24), 0), Date(1980, 1,1)

Ik probeerde het eerst met seconden maar daar moet ik iets gemist hebben, want dat gaf niet het juiste resultaat:

txlbUpdated.Text=Str$(vb.DateAdd("s", db.fldTimestamp, Date(1980, 1,1))

om weer te geven op het scherm in een programma.

Gambas in OpenSuse 11.1

Ik heb al een repository gevonden in de gbvalor reeks:

http://download.opensuse.org/repositories/home:/gbvalor/openSUSE_11.1/i586/

Toevoegen in het pakketbeheer (repository) in Yast2: in 1 keer plakken werkte niet (mogelijk vanwege de : in de url) dus opdelen ongeveer zo:

  • protocol http
  • server download.opensuse.org
  • directory repositories/home:/gbvalor/openSUSE_11.1/i586/

Bevestig de digitale sleutel van dit repository.

Zoeken naar software in Yast:

Zoek : “gambas2”

Een hele lijst met gambas2 onderdelen verschijnt. Klik rechts, select all.

Installeer; bevestig de afhankelijkheden (dependencies).

Resultaat:
Software menu, Development, gambas2 start Gambas 2.14

Update mei 2010:
* Aangezien dit de laatste openSuse versie is met de KDE 3.5 zou je voor deze versie kunnen kiezen, bv door een installatie van een net-install iso die je alsnog afhaalt van de opensuse site.
Als je na installatie in de repositories de “openSuse-Education” repository kiest, krijg je gambas versie 2.13 geïnstalleerd.

* Recenter: gbvalor
Ofwel de gbvalor repository toevoegen die ondertussen gambas versie 2.18 heeft:
http://download.opensuse.org/repositories/home:/gbvalor/openSUSE_11.1
en import de key.
Software management, zoek “gambas2”, de-installeer eventueel oudere versies; selecteer gambas2 nieuwe versie.

Icoon voor je project

  • Default map icon er is een standaard icoon voor gambasmappen; een map gecobineerd met een blauwe garnaal: .icon.png; de naam begint met een punt en is daardoor onzichtbaar. In een eveneens “onzichtbaar” bestand .directory staat het icoon aangegegeven voor deze directory (in KDE):
    [Desktop Entry]
    Icon=./.icon.png

    Blijkbaar: Als er een icoon gekozen is in het project, wordt dit gecombineerd met een standaard map-icoon tot een nieuw waar beide in voorkomen.
  • Er is ook een standaard icoon voor een project; de blauwe garnaalkop.
  • Het icoon kan je kiezen bij menu project, properties; klik op de grote icoon-knop om het icoon te kiezen uit je bestanden.
  • Als je het project compileert vanuit de IDE maakt die een icoon op de desktop aan om het programma te starten; dit icoon wordt daarvoor gebruikt (anders standaard icoon).