In unserem letzten Tipp haben wir Ihnen gezeigt, wie man mit VB-Boardmitteln eine komfortable Druckroutine zum formatierten Ausdrucken des MSFlexGrid-Controls realisieren kann. Nun kommt es aber mit Sicherheit genauso häufig vor, dass man Daten aus einer Datenbank tabellarisch am Bildschirm anzeigt, und diese Tabelle dann gerne auch ausgedruckt haben möchte - jedoch ohne den Einsatz zusätzlicher Reporting-Tools, wie CrystalReport, List & Label, ActiveTable o.ä. Für die Bildschirmdarstellung werden viele von Ihnen sicherlich das Microsoft DataGird Control verwenden, da es im Installationsumfang von VB enthalten ist und somit kein zusätzliches Geld kostet. Die Daten werden häufig über einData-Control aus der Datenbank gefiltert. Damit die Daten dann im DataGrid-Control angezeigt werden, weisst man einfach der DataSource-Eigenschaft das Data-Control zu. Seit Einführung von ADO kann man der DataSource-Eigenschaft aber auch direkt ein Recordset-Objekt zuweisen. Somit spart man sich das DataControl und ist in vielen Bereichen flexibler. Und genau, das machen auch wir. Wir öffnen die Datenbank, erstellen ein Recordset, weissen dem DataGrid das Recordset zu und feilen dann noch ein wenig am Tabellen-Layout - und schon werden die Daten aus der Datenbank-Tabelle schön formatiert am Bildschirm angezeigt. Als Beispiel nehmen wir eine kleine Literatur-Datenbank, welche folgenden Aufbau hat: Die Testdatenbank können Sie sich hier downloaden: Literatur.zip (7 KB) ' Globale Variablen ' Datenbank-Connection + Recordset Objekt Public Conn As ADODB.Connection Public Rs As ADODB.Recordset Im Form_Load-Ereignis öffnen wir also die Datenbank, erstellen das Recordset und nehmen die Spalten-Formatierungen vor: Private Sub Form_Load() ' Datenbank öffnen Set Conn = New ADODB.Connection Conn.CursorLocation = adUseClient Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & App.Path & "\Literatur.mdb;" & _ "Persist Security Info=False" ' Recordset erstellen und öffnen Set Rs = New ADODB.Recordset Rs.Open "SELECT * FROM Buecher", Conn, _ adOpenStatic, adLockOptimistic ' DataGrid mit dem Inhalt des Recordsets füllen With DataGrid1 ' Titel der Tabelle .Caption = "BÜCHER" ' Datenanbindung Set .DataSource = Rs ' Spaltenbreiten .Columns(0).Width = 2000 .Columns(1).Width = 2000 .Columns(2).Width = 600 .Columns(3).Width = 1350 .Columns(4).Width = 650 .Columns(5).Width = 3000 ' Spaltenausrichtung .Columns(2).Alignment = dbgCenter .Columns(4).Alignment = dbgRight ' Spaltenformat .Columns(4).NumberFormat = "0.00" End With End Sub Nun werden alle Daten der Tabelle Buecher sauber und schön formatiert im DataGrid dargestellt - das Erscheinungsjahr wird hierbei zentriert und der Buchpreis rechtsbündig angezeigt. Ausdrucken des DataGrid/Recordsets Hierzu bedienen wir uns (viele werden es schon ahnen) logischerweise wieder "unserer" zwei universellen Druckfunktionen aus dem gestrigen Tipp. Für alle die es nicht wissen: es handelt sich hierbei um die Prozeduren PrintRow und PrintCheckLength. Alle wichtigen Details und Beschreibungen lesen Sie bitte hier nach: DataGrid/Recordset drucken a) Tabellenbeschriftung anhand der Spaltenbezeichner ermitteln With DataGrid1 For I = 0 To .Columns.Count - 1 If .Columns(I).Visible Then _ sHeader = sHeader + .Columns(I).Caption Next I End With b) aktuell eingestellten Spaltenbreiten prozentual zum Papierformat berücksichtigen With DataGrid1 For I = 0 To .Columns.Count - 1 If .Columns(I).Visible Then _ GridWidth = GridWidth + .Columns(I).Width Next I End With Jetzt berechnen wir für jede einzelne Spalte die benötigte Spaltenbreite in Prozent der Gesamtbreite. Wenn wir dann die auf dem Ausdruck verfügbare maximale Druckbreite durch 100 dividieren und mit der berechneten Spaltenprozentzahl multiplzieren, erhalten wir die Spaltenbreite, die uns für den Ausdruck zur Verfügung steht. With DataGrid1 For I = 0 To .Columns.Count - 1 With .Columns(I) If .Visible Then ' Ausrichtung berücksichtigen Select Case .Alignment Case dbgCenter ' zentriert fmt = fmt + "^" Case dbgRight ' rechtsbündig fmt = fmt + ">" End Select intProz = (.Width / GridWidth * 100 + 0.5) ColWidth = (PageWidth / 100 * intProz + 0.5) fmt = fmt + Format$(ColWidth, "0") + "|" End If End With Next I End With d) alle Spalten schön sauber untereinander ausdrucken
Rs.MoveFirst While Not Rs.EOF sRow = "" With DataGrid1 For I = 0 To .Columns.Count - 1 If .Columns(I).Visible Then ' NumberFormat berücksichtigen If .Columns(I).NumberFormat <> "" Then sRow = sRow + Format$(FeldInhalt(Rs.Fields(I)), _ .Columns(I).NumberFormat) + "|" Else ' normaler Text / sonstige Datentypen sRow = sRow + CStr(FeldInhalt(Rs.Fields(I))) + "|" End If End If Next I PrintRow xPos, fmt, sRow End With ' nächster Datensatz Rs.MoveNext Wend Zusammenfassung Private Sub cmdPrint_Click() Dim fmt As String Dim sRow As String Dim xPos As Long Dim I As Long Dim intProz As Integer Dim GridWidth As Long Dim ColWidth As Long Dim PageWidth As Long Dim sHeader As String Screen.MousePointer = 11 With Printer .ScaleMode = 6 ' Maßeinheit "mm" xPos = 20 ' 20mm Rand link .Font.Name = "Arial" .Font.Size = 12 ' Listenbezeichnung .CurrentY = 10 .CurrentX = xPos .Font.Bold = True Printer.Print DataGrid1.Caption + vbCrLf .Font.Bold = False ' Format (Spaltenbreiten) + Tabellenkopf ' anhand Bildschirm-Spaltenbreite ermitteln PageWidth = .ScaleWidth - (xPos * 2) With DataGrid1 ' Gesamtbreite For I = 0 To .Columns.Count - 1 If .Columns(I).Visible Then GridWidth = GridWidth + .Columns(I).Width End If Next I ' Prozentuale Verteilung auf die Spalten ' plus Tabellenkopf For I = 0 To .Columns.Count - 1 With .Columns(I) ' zunächst Spaltenausrichtung berücksichtigen Select Case .Alignment Case dbgCenter ' zentriert fmt = fmt + "^" Case dbgRight ' rechtsbündig fmt = fmt + ">" End Select ' jetzt Spaltenbreite berechnen intProz = (.Width / GridWidth * 100 + 0.5) ColWidth = (PageWidth / 100 * intProz + 0.5) fmt = fmt + Format$(ColWidth, "0") ' Tabellenkopf sHeader = sHeader + .Caption End With fmt = fmt + "|" sHeader = sHeader + "|" Next I ' abschliessendes "|" entfernen fmt = Left$(fmt, Len(fmt) - 1) sHeader = Left$(sHeader, Len(sHeader) - 1) End With ' Tabellenkopf drucken .Font.Bold = True .Font.Size = 9 PrintRow xPos, fmt, sHeader .Font.Bold = False ' Jetzt Recordset "satzweise" ausdrucken .Font.Size = 8 .CurrentY = .CurrentY + 5 Rs.MoveFirst While Not Rs.EOF sRow = "" With DataGrid1 For I = 0 To .Columns.Count - 1 If .Columns(I).Visible Then ' NumberFormat berücksichtigen If .Columns(I).NumberFormat <> "" Then sRow = sRow + Format$(FeldInhalt(Rs.Fields(I)), _ .Columns(I).NumberFormat) + "|" Else ' normaler Text / sonstige Datentypen sRow = sRow + CStr(FeldInhalt(Rs.Fields(I))) + "|" End If End If Next I PrintRow xPos, fmt, sRow End With ' nächster Datensatz Rs.MoveNext Wend ' Druckauftrag beenden .EndDoc End With Screen.MousePointer = 0 MsgBox "Grid wurde ausgedruckt!", 64, "Drucken..." End Sub ' Nullfeld abfragen Public Function FeldInhalt(Feld As Field) As Variant If IsNull(Feld.Value) Then Select Case Feld.Type Case adInteger, adSmallInt FeldInhalt = 0 Case adBoolean FeldInhalt = False Case Else FeldInhalt = "" End Select Else FeldInhalt = Feld.Value End If End Function Dieser Tipp wurde bereits 68.109 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevZIP40 Pro DLL Zippen und Unzippen wie die Profis! Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Tipp des Monats Dezemeber 2024 Roland Wutzke MultiSort im ListView-Control Dieses Beispiel zeigt, wie sich verschiedene Sortierfunktionen für ein ListView Control realisieren lassen. Access-Tools Vol.1 Über 400 MByte Inhalt Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |