相当新的VBA,曾经在PHP,javascript,其他网络技术的东西工作。
我正在Access中构建数据库。由于我构建表的方式,我必须以编程方式创建我必须生成的报告。我无法弄清楚如何以任何其他方式执行它,因为SQL语句依赖于组合框的输入(您将在下面的代码中看到)。
我遇到的问题是尝试有条理地格式化以编程方式创建的报表。这是一个飞机维护计划数据库,我想创建一个报告,在预定的检查到期时将为代码着色。因此,如果检查时间为50小时,那么检查将显示为橙色,过期的事物将显示为红色。但我无法弄清楚如何使用记录集来做到这一点。
我尝试将记录集转换为多维数组并迭代数组以创建控件并应用条件格式。但出于某种原因,我最终得到了每个产生的记录的那个讨厌的“输入参数值”对话框,并且在这个方法上投入了不少。
所以我的问题是这怎么可能?我的第二个问题是我是否正在接近表格的结构并以正确的方式报告?从我的PHP经验来看,我会将条件格式化逻辑应用于返回的数组,但与Access中的记录集不同,我可以完全控制数组。或者我应该在生成报告之前在记录集中应用逻辑?或者我应该将逻辑应用于SQL并重新格式化我的查询?
无论哪种方式都有意义,在一天结束时,我希望能够根据当前数据与基准数据的接近程度,使用条件格式创建报告。
以下是创建报告的代码:
Private Sub Command5_Click()
Dim strSQL As String
Dim aircraft As String
Dim Title As String 'holds title of report
aircraft = [Forms]![DeviationSelectionForm]![cmbAircraft]
Dim status As Integer
status = [Forms]![DeviationSelectionForm]![opt_status]
Title = "Deviations and SPFPs - AC CH12" & aircraft
If status = 1 Then
strSQL = "SELECT Deviations.Deviation, Deviations.Link, Deviations.Rev, Deviations.Title, Deviations.Issued, Deviations.ExpiryDate, Deviations.ExpiryHours, Deviations.ExpOther FROM Deviations WHERE Deviations.[" & [Forms]![DeviationSelectionForm]![cmbAircraft] & "]=True AND Deviations.Active=True ORDER BY Deviations.Deviation DESC;"
Title = Title & " - Active"
ElseIf status = 2 Then
strSQL = "SELECT Deviations.Deviation, Deviations.Link, Deviations.Rev, Deviations.Title, Deviations.Issued, Deviations.ExpiryDate, Deviations.ExpiryHours, Deviations.ExpOther FROM Deviations WHERE Deviations.[" & [Forms]![DeviationSelectionForm]![cmbAircraft] & "]=True AND Deviations.Active=False ORDER BY Deviations.Deviation DESC;"
Title = Title & " - Inactive"
ElseIf status = 3 Then
strSQL = "SELECT Deviations.Deviation, Deviations.Link, Deviations.Rev, Deviations.Title, Deviations.Issued, Deviations.ExpiryDate, Deviations.ExpiryHours, Deviations.ExpOther FROM Deviations WHERE Deviations.[" & [Forms]![DeviationSelectionForm]![cmbAircraft] & "]=True ORDER BY Deviations.Deviation DESC;"
Title = Title & " - All"
End If
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim fld As DAO.Field
Dim txtNew As Access.TextBox ' textbox control
Dim lblNew As Access.Label ' label control
Dim rpt As Report ' hold report object
Dim lngTop As Long ' holds top value of control position
Dim lngLeft As Long ' holds left value of controls position
lngLeft = 0
lngTop = 400
'Create the report
Set rpt = CreateReport
' set properties of the report
With rpt
.Width = 8500
.RecordSource = strSQL
.Caption = Title
End With
rpt.Section("Detail").Height = 2000
' Open SQL query as a recordset
Set db = CurrentDb
Set rs = db.OpenRecordset(strSQL)
' Create label title
Set lblNew = CreateReportControl(rpt.Name, acLabel, acPageHeader, , Title, 0, 0)
With lblNew
.FontBold = True
.FontSize = 16
End With
lblNew.SizeToFit
' Create corresponding label and text box controls for each field.
For Each fld In rs.Fields
'Create new text box control and size to fit data.
Set txtNew = CreateReportControl(rpt.Name, acTextBox, acDetail, , fld.Name, lngLeft + 1500, lngTop)
txtNew.Width = 8000
txtNew.TextAlign = 1
txtNew.BorderStyle = 0
'Create new label control and size to fit data.
Set lblNew = CreateReportControl(rpt.Name, acLabel, acDetail, txtNew.Name, fld.Name, lngLeft, lngTop, 1400, txtNew.Height)
lblNew.SizeToFit
'Increment top value for next control
lngTop = lngTop + txtNew.Height + 25
Next
' Create datestamp in Footer
Set lblNew = CreateReportControl(rpt.Name, acLabel, acPageFooter, , Now(), 0, 0)
' Create page numbering on footer
Set txtNew = CreateReportControl(rpt.Name, acTextBox, acPageFooter, , "='Page ' & [Page] & ' of ' & [Pages]", rpt.Width - 1000, 0)
txtNew.SizeToFit
' Open new report
DoCmd.OpenReport rpt.Name, acViewReport
DoCmd.MoveSize 0, 50, 12000, 14000
'reset all objects
rs.Close
Set rs = Nothing
Set rpt = Nothing
Set db = Nothing
End Sub