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)