There are a ton of articles out there on using the data report with the data environment. Actually, that's what I've found to be the best for me anyway. But there is a little blurb in the below article. And further down, another programmer I work with does his data reports from scratch and there's a snippet of code.
hope it helps
Stacey
Private Sub SetupReport()
Set rptAgentActivity.DataSource = rstReportRecords
With rptAgentActivity
.Sections("secPageHeader"

.Controls("lblHeader3"

. _
Caption = Format(dtpStartDate.Value, "Short Date"

& _
" - " & Format(dtpEndDate.Value, "Short Date"

.Sections("secGroupHeader"

.Controls("txtGroupHeader"

. _
DataField = rstReportRecords.Fields(0).Name
.Sections("secGroupHeader"

.Controls("lblGroupHeader"

.Caption = _
rstReportRecords.Fields(0).Value
.Sections("secDetail"

.Controls("txtAgentNumber"

.DataField = _
rstReportRecords.Fields(1).Name
.Sections("secDetail"

.Controls("txtNew"

.DataField = _
rstReportRecords.Fields(2).Name
.Sections("secDetail"

.Controls("txtPayments"

.DataField = _
rstReportRecords.Fields(3).Name
.Sections("secDetail"

.Controls("txtOptions"

.DataField = _
rstReportRecords.Fields(4).Name
.Sections("secDetail"

.Controls("txtLateTS"

.DataField = _
rstReportRecords.Fields(6).Name
.Sections("secDetail"

.Controls("txtRevenue"

.DataField = _
rstReportRecords.Fields(5).Name
If optByState.Value Then
.Sections("secPageHeader"

.Controls("lblHeader2"

.Caption = _
"by State"
ElseIf optByMarket.Value Then
.Sections("secPageHeader"

.Controls("lblHeader2"

.Caption = _
"by Market"
Else
.Sections("secPageHeader"

.Controls("lblHeader2"

.Caption = _
"by Agent"
.Sections("secGroupHeader"

.Visible = False
End If
.Show
End With
End Sub