MariaDb verbinding zonder SSL

Cannot open database: TLS/SSL error: SSL is required, but the server does not support it

Sinds ongeveer OpenSUSE v. 15.6 à 16.0 dook het probleem op dat Gambas3 programma’s geen verbinding meer konden maken met een bestaande mariadb database op een computer in het lokaal netwerk, zonder SSL (zie Database verbinding gebroken). Ik vond het probleem niet bij Raspbian (Debian), voor andere distributies weet ik niet, misschien Red Hat?

Het probleem was terug te brengen tot de stap naar een nieuwe mariadb client lib:

libmariadb3 v. 3.4.5

… waarbij het standaard gedrag van de MariaDB Connector/C 3.4 veranderde.

De gewone “skip-ssl” volstaat niet meer (Unable to disable TLS verification when using mariadb-connector-c >= 3.4.0).

Dit kan voor allerlei software die dit soort databaseverbinding maakt een fout/verandering opleveren; openoffice/libreoffice, python programma’s, …. niet alleen voor Gambas.

Omzeilen

Voor Gambas3 kan je het probleem omzeilen door een combinatie van

  • instellingen in een mariadb configuratiebestand op de client computer (waar het gambas programma draait)
  • aanroepen van de juiste opties vanuit je code voor het maken van de verbinding.

Mariadb client configuratie

De instellingen gebeuren normaal in het onzichtbare bestand .my.cfg in de home directory van de gebruiker:

~/.my.cfg

Daarin staat misschien al de instelling om op de CLI de SSL te omzeilen:

[client]
skip-ssl = true

Maak een nieuwe paragraaf aan, bv met de titel “gambasfixnossl” (nadien moet je naar deze header verwijzen in je code):

[gambasfixnossl]
ssl-verify-server-cert=0
ssl-mode=DISABLED

Gambas3 connection opties

Je hebt een combinatie van connection opties nodig om de fout te vermijden. Dit stond al in mijn code*:

With hConnection
.Host = Settings["Connection/Host"]
.User = Settings["Connection/User"]
.Name = Settings["Connection/Name"]
.Password = Settings["Connection/Password"]
.Type = Settings["Connection/Type", "mysql"]
End With

En dit heb ik er nu bijgevoegd:

  ...
.Options["READ_DEFAULT_GROUP"] = "gambasfixnossl"
.Options["PROTOCOL"] = 1
.Options["SSL_MODE"] = 0
.Options["SSL"] = False
.Options["CLIENT_FLAGS"] = 0
.Options["MYSQL_OPT_SSL_ENFORCE"] = 0
End With

Getest

  • Werkt op openSUSE Leap 16.0
  • Werkt op Tumbleweed 20251013

Nota’s: (*) Settings gebruik, Apart mariadb configuratiebestand, .. Continue reading

Database verbinding gebroken?

Database verbindingsprobleem

De combinatie Gambas 3.20+ met openSUSE Tumbleweed en/of Leap 15.6 geeft een probleem met bestaande gambas3 programma’s bij de verbinding met een mysql/mariadb database, zowel een oude als een recentere, op verschillende systemen:

  • Server version: 10.11.13-MariaDB-0ubuntu0.24.04.1 Ubuntu 24.04.
  • Server version: 10.0.32-MariaDB SLE 12 SP1 package =openSUSE.

Vastgesteld dat het niet (meer) werkt bij de combinatie OpenSUSE/Gambas … (zie verder welke versies nog wel werkten)

  • Leap 15.6 + Gambas 3.20.4 + (?)
  • Tw 20250617 + Gambas 3.20.4 + (?)
  • Tw 20250616 + Gambas 3.20.4-12.4 + libmariadb3 v. 3.4.5-2.1 + mariadb 11.8.2-1.1 (PDCz2) (gambas uit home:munix9 / openSUSE_Tumbleweed)
  • Tw 20251007 + Gambas 3.21.0-1.1 + libmariadb3 v. 3.4.5-2.1 + mariadb 11.8.3-4.1 (PDCz2) (gambas uit home:munix9 / openSUSE_Tumbleweed)
  • Tw 20250730 + Gambas 3.20.4-15.1 + libmariadb3 v. 3.4.5-2.1 + mariadb 11.8.2-1.1 (pcb4)
  • Tw 20250923 + Gambas 3.20.99 + libmariadb3 v. 3.4.5-2.1 + mariadb 11.8.3-MariaDB x86_64 ElDskM

Update: 2025 09 26 : Tumbleweed 20250617 krijgt een update inclusief Gambas…dat loste het niet op.

Vanuit de IDE kan je in de console van de IDE (F11) de foutmelding zien:

Try hConnection.Open: Cannot open database: TLS/SSL error: SSL is required, but the server does not support it

deze zag ik ook in bepaalde versiecombinatie:

gb.db.mysql: warning: disabling SSL connection is not supported with your version of MySQL client library.

De fout lijkt voor te komen vanaf de versie waar de client standaard SSL probeert te gebruiken (zie ook MySQL/MariaDb zonder ssl?)

Maar manueel met de mariadbclient kan je er wel voorbij met –skip_ssl of met skip-ssl=true in het .my.cnf bestand; dat bestand heeft geen invloed op de werking van gambas.

Gambas versie?

Ik vermoed dat het vooral Gambas is, Het valt me op dat Gambas vanaf versie 3.20 wijzigingen heeft aan de database componenten. Er is nu zowel de oorspronkelijke gb.db die “grijs staat” om aan te geven dat die “deprecated” is. En er is een gb.db2 beschikbaar die “grotendeels backward compatible” is…

In Gambas 3.18.4 (openSUSE 15.4) is de gb.db component nog aanwezig (componenten in gebruik naast gb.form, gb.gui, gb.image en gb.setttings; geen extra gd.db.mysql of zo geselecteerd). In nieuwe gambas alleen nog gb.db2.

Upd: mijn oorsponkelijke idee dat het aan gb.db2 lag lijkt niet te kloppen. Het heeft waarschijnlijk meer met de mariadb client kant te maken.

Upd: Ik onderzoek nog welke de mariadb client library versies zijn…bv :

  • Tumbleweed 20250730 = libmariadb3 3.4.5-2.1
  • Leap 15.5 = 3.1.22-150000.3.36.

Suse versie? Database client versie?

Deze combinaties werken nog wel Leap=OpenSUSE, Tw= TumbleweedLeap 15.4 + Gambas 3.18.4 + libmariadb3 v. 3.1.22-150000.3.36.1 + mariadb 15.1 Distrib 10.6.15-MariaDB (lapt)2

Leap 15.5 + Gambas 3.19.6 (**) + libmariadb3 v 3.1.22-150000.3.36.1 + mariadb 15.1 Distrib 10.6.20-MariaDB (E)

Leap 15.5 + Gambas 3.14.3 (1) + libmariadb3 3.1.22-150000.3.36.1 + mariadb 10.6.15-150400.3.29.3 (UTM imac) (1)uit openSUSE:Backports:SLE-15-SP2

Leap 15.5 + Gambas3.19.3-lp155.2.1 (munix9) + libmariadb3 v. 3.1.22-150000.3.36.1 + mariadb-client ver 15.1 Dirstrib 10.6.15-150400.3.29.3 (grd)

Leap 15.6(*) + Gambas 3.20.2 + libmariadb3 v. 3.1.22-150600.16.3 + mariadb 15.1 Distrib 10.11.9-MariaDB (Villers)

Tw2024… + Gambas 3.19.x

Tw20250216 + Gambas 3.20.99

(1) https://software.opensuse.org/package/gambas3, Niet-ondersteunde distributies, SUSE:SLE-15:GA, openSUSE:Backports:SLE-15-SP2 : 3.14.3

!(*) Leap 15.6 + Gambas3 3.20.2 : gb3.20.2-lp156.10.1 maar met “oude” gb.db, gb.db.mysql geselecteerd (die doorgeschrapt en grijs staan bij componenten) en zonder ~/.my.cnf en met een update naar gambas 3.20.4-lp156.20.2 die klaarstaat maar (nog) niet uitgevoerd is, beide van home:munix9 als bron. Misschien een openSUSE 15.5 die een upgrade kreeg naar 15.6? Met een native 15.6 werkt het niet.

(**) Leap 15.5 (iso van 2023) + download gambas-3.19.16.tar.gz en gecompileerd van source. Daarna start Gambas niet als root, wel als user. Bij het maken van een nieuw database project krijg je de componenten (en de databaseverbinding werkt):

  • gb.db
  • gb.db.form

Raspbian

Ter vergelijking, werkt ok in Raspbian :

  • Raspbian 11: 6.1.21 + Gb 3.15.2 + mariadb-10.5 + libmariadb3 1:10.5.23-0+deb11u1 (libmariadb3_10.5.29-0+deb11u1_armhf.deb)
  • Raspbian 11 6.1.21 + Gb 3.15.2 + mariadb-10.5 + libmariadb3 1:10.5.26-0+deb11u2 (libmariadb3_10.5.26-0+deb11u2_armhf.deb)

Dringendste is: hoe bestaande programma’s terug aan het werk krijgen? Oude distributies installeren? Kan alleen de mariadb client een oude versie blijven?

Upd: het probleem kan omzeild worden met een combinatie van configuratie bestand en connectie-opties in gambas: MariaDb verbinding zonder SSL.

Fout in Library

Door een fout in een library kreeg ik in mijn applicatie (het programma dat die library gebruikte) fouten die ik niet begreep.

Library:

ExampleObject
– id
– SomeExternalId
– otherdata

In de library zat ook een module om de gegevens te bewaren in- en op te vragen uit de database.

Testprocedures in mijn library konden perfect een ExampleObject maken in de de database bewaren.

Mijn eindprogramma niet.

Als in in mijn eindprogramma directe sql code schreef, ging het daar wel.

De fout zat in het ExampleObject in de loadFromDb code.

If resDb.Available
$lId = resDb!id
- $lExternalId = resDb!Xternal_id

–> ipv resDb!External_id

In mijn applicatie deed ik eerst een controle op het bestaan van het order, waarbij die loadFromDb code gebruikt werd.

Verder had ik die load code nog nooit gebruikt (applicatie is nog in ontwikkeling), dus ik was die fout nooit tegengekomen.

Deze fout kan normaal niet voorkomen want ik maak altijd eerst de velden in de databank aan, en genereer daarna de persistence code met de dbInfoCode tool.

Dit veld was nadien toegevoegd, en deze lijn manueel toegevoegd. In het vervolg ga ik langs die tool en knip/plak de gegenereerde code …

Null Object of Connection is not opened

Soms krijg je deze fout bij een databaseverbinding die niet werkt (bv omdat server niet bereikbaar is of de database niet gestart is op je dev station).

Mijn database code zit in een module, bv MData.
Ik gebruikte deze test:

Dim myResult As Result
'
Try myResult = MData.getAllLines()
'
If Error Then
  doLog(Error.Text)
Else
  If myResult.Available Then
    ... use data...
  Endif

Maar dat is niet genoeg; als de fout, zoals hier, in de MData gebeurt, krijg je toch een situatie waar de Try geen fout geeft, maar myResult NULL is, en het programma crasht op myResult.Available: NULL Object.

Dim myResult As Result
'
Try myResult = MData.getAllLines()
'
If Error Or (myResult = NULL) Then
  doLog(Error.Text)
Else
  If myResult.Available Then
    ... use data...
  Endif

Hier wordt de foutmelding: “Connection is not opened

Wat ook werkt:

Dim myResult As Result
'
Try myResult = MData.getAllLines()
'
If (myResult = NULL) Then
  doLog(Error.Text)
Else
  If myResult.Available Then
    ... use data...
  Endif

Hier wordt de foutmelding eveneens “Connection is not opened“.

Je slaat dan wel de test op If Error over, kan dat…

Als je bv verkeerdelijk een paramater meegeeft in
MData.getAllLines(invalidparemater)
krijg je daar een foutmelding over: “Too many arguments“. Ja dus.

Bereik van variabelen als record id

Wanneer kies je in Gambas voor int, wanneer voor long?
Wanneer kies je in de databank voor een int(11), wanneer voor bigint(20)?

https://gambaswiki.org/wiki/lang/type

Kleinere:
Datatype Description Default value Size in memory
Boolean True or false. FALSE 1 byte
Byte 0...255 0 1 byte

Integer meer of minder:
Datatype Description Default value Size in memory
Short -32.768...+32.767 0 2 bytes
Integer -2.147.483.648...+2.147.483.647 0 4 bytes
Long -9.223.372.036.854.775.808...+9.223.372.036.854.775.807 0 8 bytes

Ik merk dat ik uit luiheid meestal “int” gebruik. Dikwijls is dat overkill, en is Short zeker genoeg. En als er geen negatieve getallen kunnen voorkomen (soms wordt een fout aangeduid door een negatief getal), en het maar over een klein getal gaat, dan is Byte zelfs genoeg.
Bij int is het vooral opletten met de grenzen als het bv record nummers woden; 2 miljoen records is niet zo veel.

MariaDB datatypes
MySQL datatypes, bv de integer data types :

Vereiste opslag en bereik van integer data types in MySQL

Type Opslag (Bytes) Minimum waarde Signed Minimum waarde Unsigned Maximum waarde Signed Maximum waarde Unsigned
TINYINT 1 -128 0 127 255
SMALLINT 2 -32768 0 32767 65535
MEDIUMINT 3 -8388608 0 8388607 16777215
INT 4 -2147483648 0 2147483647 4294967295
BIGINT 8 -263 0 263-1 264-1

Zie ook de tabel voor het doen overeenkomen van een type in de programmeertaal naar de databank, db-type mapping:

https://gambaswiki.org/wiki/doc/db-type-mapping

Dataconnection vanuit lib of app?

Ik vraag me af of ik de verbinding met de databank vanuit de applicatie moet doen of vanuit de lib die de data-classes bevat.

Nodig:

1 project als lib (zie properties bij maken nieuw gambas project)
1 project als gewone gambas3 applicatie.

Ik gebruik ook:
gb.db (Database toegang) en “Settings” in project properties, componenten (voorzien in Gambas).
– bibliotheek “DataContext” in project properties, libraries (deze moet je zelf afhalen)

In de lib zitten
– de classes bv CEmployee beschrijft de employee (properties voor velden enz).
– de Module MEmplData: bevat procedures voor het aanmaken van records, opvragen vanuit de classe voor het laden van de variabelen in de properties, bewaren vanuit de classe van het “object/record”.
– de Module MEmpData bezit ook hConData AS Connection

– de applicatie gaat de lib.hCondata initialiseren met de toegangsgegevens van de databank met behulp van DataContext.makeConnection.
(gegevens die gelezen worden uit een settings file – dat gebeurt in de DataContext class CDataContext; je kan er context naar settings mee maken, aktieve context zetten wat ook bewaard wordt in settings, nieuwe settings file maken, lijst alle contexten in settings opvragen, enz)

– in de applicatie ga je gewoon de “current” datacontext gebruiken, en je kan “switchen” van context door de “current” aan te passen via DataContext, en te “herladen”, maw de connectie terug te maken.

Checklist nieuw project, hulpmiddelen

update van gambas.copyleft.be/blog/checklist-project van 2014/2017

Start een nieuw project: commandolijn, lib, grafisch, databank, …
Algemeen: gebruik settings, foutbeheer, log, versienummer, ..

commandolijn

  • ook te gebruiken als shell script. Let op met locatie van bestanden/de applicatie zelf.

commandolijn, lib, grafisch, databank

lib

  • hergebruik in diverse projecten. Opgelet voor versie-verschillen…
  • locatie: gecompileerde library komt bv terecht in /home/username/.local/share/gambas3/lib/

commandolijn, lib, grafisch, databank

databank:

  • Begin met emptydb project sjabloon
  • Gebruik settings om databankgegevens op te slaan; gebruik een “switch” om tussen test en productiedatabank te wisselen (DataContext).
  • Gebruik een applicatie-log (errorlog) bv myLog
  • Veldnamen conventies
  • meta-informatie; bv in databank met aparte tabel (zie dbinfocode)
  • db struktuur opnemen in project (dump zonder data); opvolging van wijzigingen aan databank struktuur: schrijf telkens een stukje code alvorens/om die wijziging uit te voeren zodat je die kan meenemen.
  • persistence, schermcode genereren, …?

commandolijn, lib, grafisch, databank

Desktop (grafische gebruikers-bediening):

  • Begin met empty project sjabloon.
  • ! desktop-eigen bibliotheken (kde-qt/gtk)
    • worden soms niet meer ondersteund in een volgende versie; bv qt upgrades enz.
    • maken het moeilijker over te zetten naar een andere desktop/distributie..
  • Log: Gebruik een applicatie-log (errorlog) bv myLog
  • Gebruik settings om gebruikersinstellingen op te slaan, bv met GbSettingsTool kan je die vullen/lezen
  • Gebruiksteller of RunCounter: bewaren in settings
  • Venster-titel: Geef nuttige/relevante venstertitels, zodat je ziet welke vensters bij deze applicatie horen; met applicatienaam-vensternaam(functie)-versie.nr, … Bv door procedure in mmain of MForm die je voor elk venster aanroept, met een bDeveloper switch kan je als developer de form naam krijgen, gebruiker krijgt functietitel
  • Venster-icoon: zetten in de form Me.Icon of neem dat eventueel mee op in de procedure van de venstertitel. Je kan het icoon laten evolueren (kleur, scherpte, vorm) om de graad van de hiërarchie van het venster te tonen; bv hoofdvenster, 1e sub, sub-van-1e-sub… Iconen in mapje met namen voor level; iconL0.png ,iconL1.png, iconL2.png, …
  • Menu Help/About met Help, About, License, Changes, WhatsNew,
  • Menu File met Quit die afsluitprocedure oproept. Eventueel per vergissen sluiten met venster [x] opvangen.
  • Feedback naar gebruiker: eventueel te sluiten, of met bDeveloper switch te aktiveren
  • Versienummer: je moet kiezen om die door Gambas te laten tellen of uit een “VERSION” bestand in te lezen. Je kan dat versienummer ook bij verhogen van de gebruiksteller opslaan als laatstgebruikte versie in het settingsbestand.
  • Weergaveconventies: stel op en gebruik, integreer in een voorbeeldscherm. Kleur/vorm voor vaste tekst, ingaveveld, ingavevoorbeeld, reaktie, foutmelding, enz.
  • Dubbelstartcontrole (als dat belangrijk is voor je app – bv omdat die naar een bestand schrijft, ..)

commandolijn, lib, grafisch, databank

Driver name missing

Een foutmelding in een programma bij het maken van een databankverbinding:

Driver name missing

Er kan wel manueel ingelogd worden vanop de commandolijn met de gegevens zelf (host, gebruiker, ww).

De foutmelding “Driver name missing” betekent normaal dat één van de eigenschappen in het connection object niet gegeven is, nl

connection.name = "mydatabasename" (zie “login” voor user-name). Of wijst “driver” eigenlijk op type: connection.type = "mysql"?)

(ik herinner me vroeger al eens naar een gelijkaardig probleem gezocht te hebben, dat uiteindelijk niets met de driver name, hier “mysql” te maken had – de fout zat elders maar had deze melding tot gevolg.)

Soms heeft het te maken met een verkeerd interpreteren van de al dan niet geïnitialiseerde of open verbinding.

Maar er zijn ook andere omstandigheden waarin deze foutmelding voorkomt, bv:
– je gebruikt een verkeerd connection object, bv lokaal ipv ModuleData (localhost/remote) …
– connection object is niet geïnitialiseerd of gecreëerd: hConnection .login, .password, .host, .name.; als ze uit een config bestand komen, check die inhoud.
– er worden lege parameters gestuurd in het commando dat de database aanspreekt (door missende initialisatie van strings, settings, …)

Andere dingen om te proberen?
– de gegevens van de gebruiker op de server zijn wel aangemaakt maar er zijn geen rechten toegekend op de database. Ook vervelend is als de rechten specifiek op tabellen en zels velden zijn gegeven (of vergeten – of er is een veld bijgekomen enz..).
– de gegevens van de gebruiker op de server zijn wel aangemaakt maar niet geladen (refresh)?
– draait de database server?

Nieuw project in gambas, hulpmiddelen

(Zie ook de praktische nieuwe project checklist en bij het programmeren de domme fouten checklist)

Enkele hulpmiddelen bij het starten van een nieuw project:

Leeg project
– Gebruik een sjabloon of een modelproject om van te starten. Het standaard leeg project van Gambas zelf bevat niets meer dan een startprocedure (methode), maar zelf zal je merken dat je telkens hetzelfde soort dingen er standaard insteekt. Denk maar aan een menubalk met File, Edit, Help/About/Changes/Licentie.. enz. Je maakt je eigen standaard leeg project met die menu’s er allemaal in, en dan kan je iedere keer daarvan starten. Je zet dat best online zodat je er van overal aankan. Je past het ook aan met de kennis en ervaring die verder opdoet, zodat het leeg project je steeds meer werk bespaart. (Voorbeeld “Emptyproject”).

Instellingen
Vrij snel merk je dat je allerlei instellingen wil bijhouden, zoals adressen van servers waarmee je verbindt, instellingen op het scherm van de gebruiker enz. Daarvoor dient de “settings” module van Gambas. Maar zowel het uitlezen van de settings als het bewaren ervan moet je programmeren, en die kunnen niet beide tegelijk klaar zijn. Met een “Gambas settings tool” kan je een nieuw settings bestand maken voor je project, met een scherm om snel de sleutel/waarde combinaties in te geven, er waarden inzetten zodat je ze al kan uitlezen met code, controleren wat je programma er in geschreven heeft enz. (Voorbeeld “Gambas Settings Tool”)

Vormgeving
Om de vormgeving een beetje te stroomlijnen kan je een form “Layout.form” maken waarin alle kenmerken voorkomen, bv de voor- en achtergrondkleuren van je schermen, de eigenschappen van de tekst, enz. Er hoeft geen code in te zitten, maar je kan wel zien hoe het er uit ziet op het scherm. Je zet er van ieder object een voorbeeld van op een scherm, (wel public zetten) en je applicatie neemt telkens daar de kleur, font, enz. van bij het openen van een nieuw scherm. (Zoals in Main.form bv een tekst die je initialiseert in FMain met txbx.Foreground=FLayout.txbxInput.Foreground). Als je dan je Layout.form aanpast, is heel je applicatie aangepast!

Databank
Ook voor de databank-koppeling kan je je laten helpen.
– Instellingen: door een vaste manier van databankgegevens op te slaan in de settings, met de mogelijkheid om te schakelen tussen je ontwikkel-databank (op je laptop bv), een test-databank op een testserver, en je productie-databank voor het uiteindelijk gebruik.
– Ontwerp: bij het ontwerpen van de databank komen bepaalde velden in tabellen telkens voor, zoals de id, het bijhouden van de datum van wijziging van een record, en de gebruiker die het wijzigde, een opmerkingen veld, enz. Met een tool kan je snel een nieuwe tabel maken, waarbij de standaard velden al voorgesteld worden op het scherm en je maar moet aanvinken welke je wil, en er bovendien automatische een data-dictionary bijdrage wordt gemaakt met mogelijkheid tot voorbeeld data en uitleg over de velden. (Voorbeeld: “DbInfoCode”)
– Ontwikkeling: bij het omzetten van objecten naar de databank of omgekeerd (persistence), van record naar objecten heb je ook telkens wat standaard handelingen als bewaren en ophalen van de inhoud van het object, het omzetten van de velden naar de properties van het object. Een hulpprogramma kan de velden van de records lezen en er objecten met properties voor maken, met de bijhorende get/set procedures. (Voorbeeld: “DbInfoCode”)

Opkuis
Om af en toe je programma op te kuisen, bv allerlei variabelen die je ooit eens maakte maar nooit gebruikt, kan je ook een hulpprogramma gebruiken dat de code voor je leest en op zoek gaat naar wat weg mag enz. Voor Gambas2 gebruikte ik daarvoor “ProbableCause”, maar nu is veel daarvan al geïntegreerd in Gambas3.

Door deze hulpprogramma’s zelf te programmeren kan je ze steeds laten evolueren met je noden. Zet ze online en schrijf erover.

Rapportgenerator 2 : Rapport met velden uit een databank

(vervolg van Gambas3 Rapportgenerator 2 basis)

Ik maak een eenvoudig rapport met drie kolommen gegevens; de lijnen zijn data uit een databank, de kolommen velden.
De datalijnen worden onder elkaar herhaald, en lopen over meer dan één blad.

Rapport layout

Aktiveer de module gb.report2 in Project, Properties, Components.

Maak een nieuw Rapport aan bij Sources, (rechtsklik) New, Report.

Teken op het scherm een titel met Report, ReportLabel, en vul de Titel in bij de eigenschap “Text”

Teken op het scherm een vertikaal kader met Container, ReportVBox; deze mag de overblijvende bladspiegel vullen.
Zet de eigenschap om de marge onderaan de pagina vrij te laten, bv: Margin Bottom: 16mm

Teken in die ReportVBox bovenaan een ReportHBox, over de hele breedte van de ReportVBox.
(alle eigenschappen op False, behalve Visible: True; marges en spacing naar wens)

Teken in die ReportHBox drie ReportLabels naast elkaar: ReportLabelColumn1, ..ReportLabelColumn2, ReportLabelColumn
(je kan ertussen bv een ReportTextLabel zetten met een scheidingsteken als – of ; )

Deze ReportLabels zullen in code gevuld worden met de inhoud van velden uit de databank.

Rapport code

Declareer een databankverbinding en een resultset in de Report1.Class:

  Private hConData As Connection
  Private hres As Result

Initialiseer; je maakt een procedure waarin je een verbinding maakt naar je databank:

Eenvoudige uitvoering:

Public Sub initDb()
  '
  With hConData
    .User="databank-gebruiker"
    .Password="mijn-wachtwoord"
    .Host="localhost" ' of hostnaam of ip adres
    .Type="mysql" ' in mijn geval
  End With
  hConData.Open()
  hres = hConData.Exec("SELECT * FROM test")
End

Voor elk data element dat je gemaakt hebt, maak je een _Data methode:

Public Sub ReportLabelColumn1_Data(Index As Integer)
  Dim s As String
  '
  hres.MoveTo(Index) ' dit moet je niet meer doen voor 2 en 3
  s = Str$(Index) & ") " & hres!id & " : " & hres!name ' overeenkomend met velden uit je tabel
  Last.Data = s
End

In Report_Open() roep je de databank initialisatie aan, en geef je de herhaling van de invulling tov de records aan:

  initDb()
ReportHBox1.DataCount = hres.Count

Shift-F5
De rest gebeurt wonderwel vanzelf bij het draaien van het rapport (je kan het rapport apart testen met “Shift-F5”; vgl Run=F5)

De report preview geeft de kans om te vergroten, verkleinen, enz…

Valkuil(en)

Crash

De preview in de report design mode werkt mogelijk niet als je de database routines in elders in modules initialiseert. Ook kreeg ik een crash (runtime/interpreter? met bom pixel art) in dat geval, maar had misschien met een andere variable definition fout te maken, die er ook was (index ipv integer).

Traag

Na het aktiveren van de “Report Preview” duurt het ellendig lang eer het preview scherm tevoorschijn komt, en de gebruiker kan nergens aan zien dat het programma bezig is.
Als je rechtstreeks uit een menu-item de preview aanroept, blijft het menu openstaan (en lijkt de app te hangen).
(Gambas 3.9.2)

Waarde blijft staan

Opgelet als je een voorwaarde inbouwt bij het vullen van de _Data! Data van de vorige record blijft er in staan!
(Gambas 3.10.0)

Inhoud velden onzichtbaar

Ik krijg de inhoud van de velden niet meer te zien bij het maken van het rapport. Pas als ik ze verwijderd heb (broncode laten staan), en terug toegevoegd, komen ze te voorschijn. (Zelfs vanuit vergelijking van de source van .report is me niet duidelijk wat er fout is. (font?).
(Gambas 3.9.2)