Отсутствуют данные в связанном подотчете - PullRequest
0 голосов
/ 19 июня 2019

Я занимаюсь разработкой на 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 основного отчета, как и ожидалось.Каждое поле в подотчете выбирается непосредственно как поле из подотчета, без формул и параметров.Там нет подавления выбора для любого поля или любого раздела.Нет сообщений об ошибках.

...