Я занимаюсь разработкой на vb.net для visual studio 2016. Я использую последние отчеты Crystal для VS, загруженные из SAP.Я использую сервер базы данных преимуществ с визуальными таблицами foxpro - каждая из исходных таблиц для отчета является таблицами без VFP, как и фактические таблицы отчета, которые создаются.У меня есть один основной отчет и один подотчет, вложенный в подробный раздел основного отчета как подотчет.У меня есть основная таблица, которая вводит данные в основной отчет, а подробная таблица - данные для подотчета.Обе таблицы имеют идентичное индексированное поле, которое используется в ссылке между основным отчетом и вложенным отчетом.Поля подробностей отображаются в разделе подробностей вложенного отчета, а поле сводки - в нижнем колонтитуле подчиненного отчета.При запуске отчета отображаются только два поля таблицы подробностей (oline и custid из 7 полей), и отображается только первая строка таблицы подробностей.Мне нужно показать все подробные поля и все строки подробной таблицы для текущего отчета в основном отчете.
Я проверил настройку связи, я убедился, что в обеих таблицах есть данные в каждом поледля каждой строки, и что данные ссылки действительны в обеих таблицах.Я включил поле ссылки (custid) в подробный раздел подотчета, чтобы убедиться, что подотчет получает правильные данные ссылки из основного отчета (это одно из полей, отображаемых в подробном разделе подотчета).и поле показывает правильные данные ссылки на каждой странице для основных данных на этой странице.Основное тело отчета печатается правильно для всех основных записей.Подотчет не имеет параметров (кроме автоматически определяемого для ссылки) и не имеет формул, для каждого отчета имеется только одна таблица источника данных, а подотчет отображает поля непосредственно в подробном разделе.
' Create the reporting tables
lcSQL = "CREATE Table " & lcTempDName & " (CustID Char(5), CustName
char(9), Address char(25), Dept char(3)) as free table"
If System.IO.File.Exists(lcTempDName & ".dbf") Then
System.IO.File.Delete(lcTempDName & ".dbf")
End If
If System.IO.File.Exists(lcTempDName & ".cdx") Then
System.IO.File.Delete(lcTempDName & ".cdx")
End If
loSQL.Connection = loTempConn
loSQL.CommandText = lcSQL
Try
loSQL.ExecuteNonQuery()
lcSQL = "Create Index CustID on " & lcTempDName & "(CustID)"
loSQL.CommandText = lcSQL
Try
loSQL.ExecuteNonQuery()
Catch ex As Exception
MessageBox.Show("Error creating index on temporary Reporting
table.", "")
End Try
Catch ex As Exception
MessageBox.Show("Error creating temporary Reporting table.", "")
End Try
lcSQL = "CREATE Table " & lcTempDSubName & " (CustID Char(5), oline
char(3), odate date, otype char(15), oqty Numeric(8, 2), " &
"oamount Numeric(8, 2), ojob char(6)) as free table"
If System.IO.File.Exists(lcTempDSubName & ".dbf") Then
System.IO.File.Delete(lcTempDSubName & ".dbf")
End If
If System.IO.File.Exists(lcTempDSubName & ".cdx") Then
System.IO.File.Delete(lcTempDSubName & ".cdx")
End If
loSQL.Connection = loTempConn
loSQL.CommandText = lcSQL
Try
loSQL.ExecuteNonQuery()
lcSQL = "Create Index CustID on " & lcTempDSubName & "(CustID)"
loSQL.CommandText = lcSQL
Try
loSQL.ExecuteNonQuery()
Catch ex As Exception
MessageBox.Show("Error creating index on temporary Reporting
subtable", "")
End Try
Catch ex As Exception
MessageBox.Show("Error creating temporary Reporting subtable.", "")
End Try
.
.
' Populate the report tables
' I have opened the main source VFP table as loCustTable
for each loCustRow in loCustTable.rows
lcSQL = "INSERT into " & lcTempDName & " (CustID, CustName, Address,
Dept) values ('" & loCustRow("custid") & "', '" &
loCustRow("custname") & "', '" & loCustRow("address") & "', '" &
loCustRow("dept") & "')"
loSQL.Connection = loTempConn
loSQL.CommandText = lcSQL
Try
loSQL.ExecuteNonQuery()
Catch ex As Exception
MessageBox.Show("Error creating temporary Reporting subtable.",
"")
End Try
.
.
' I have opened the source detail VFP table as loDetailTable
for each loDetailRow in loDetailTable.rows
lcSQL = "INSERT into " & lcTempDSubName & " (CustID, oline,
odate, otype, oqty, oamount, ojob) values ('" &
loDetailRow("custid") & "', '" & loDetailRow("oline") & "',
'" & loDetailRow("odate") & "', '" & loDetailRow("otype") &
"', " & loDetailRow("oqty") & ", " & loDetailRow("oamount") &
", '" & loDetailRow("ojob") & "')"
loSQL.Connection = loTempConn
loSQL.CommandText = lcSQL
Try
loSQL.ExecuteNonQuery()
Catch ex As Exception
MessageBox.Show("Error creating temporary Reporting
subtable.", "")
End Try
next
next
' I now have created a main report table holding one record for each cust
and a subreport table holding multiple records for each cust found in
the main table - These tables are verified after construction to be
correct (using VFP to open the tables directly for viewing - not left
open for the actual report run)
' I now select the records from the two tables
lcSQL = "SELECT * from " & lcTempDName
loAdapter.SelectCommand = loSQL
loAdapter.SelectCommand.Connection = loTempConn
loAdapter.SelectCommand.CommandText = lcSQL
Try
loAdapter.Fill(loReportSet)
loReportTable = loReportSet.Tables(0)
Catch ex As Exception
MessageBox.Show("Error opening report table", "")
End Try
lcSQL = "SELECT * from " & lcTempDSubName
loAdapter.SelectCommand = loSQL
loAdapter.SelectCommand.Connection = loTempConn
loAdapter.SelectCommand.CommandText = lcSQL
Try
loAdapter.Fill(loReportSet)
loSubTbl = loReportSet.Tables(0)
Catch ex As Exception
MessageBox.Show("Error opening subreport table", "")
End Try
' The report tables are also verified accurate from within vb.net prior to
running the report itself
.
.
' now generate the report
' The reports are built with fields from the report tables
Dim pS As New System.Drawing.Printing.PageSettings
pS.Landscape = False
' get printer data
Dim pDialog As New PrintDialog
gcPrintDialog = pDialog.ShowDialog
If gcPrintDialog = DialogResult.OK Then
gcPrinterName = pDialog.PrinterSettings.PrinterName
goPrinterSettings = pDialog.PrinterSettings
End If
dim oReport As New ReportDocument
dim rptname as String = "mainreport.rpt"
oReport.Load(rptName)
oReport.SetDataSource(loReportTable)
oReport.Subreports(0).SetDataSource(loSubReportTable)
' NOTE I have tried:
oReport.Subreports("subreport.rpt").SetDataSource(loSubReportTable)
with no difference in results
oReport.PrintToPrinter(goPrinterSettings, pS, False)
Как указано - в отчете печатается одна страница, как и ожидалось, для каждого случая, однако встроенный подотчет печатает частичную первую строку подробностей (некоторые, но не все поля) и печатает только первый ряд подробностей, независимо от того, какмного фактических записей есть в подчиненном отчете для этого списка.Первая напечатанная строка всегда соответствует CustID основного отчета, как и ожидалось.Каждое поле в подотчете выбирается непосредственно как поле из подотчета, без формул и параметров.Там нет подавления выбора для любого поля или любого раздела.Нет сообщений об ошибках.