0

私のレポートは、従業員フィールドからの名前のレポートに生データであると私が信じているものを示し続けています。SQLテーブルには正しいデータがありますが、レポートに正しい名前が付いていることはありません。参加した従業員ではなく、常にpkがゼロの従業員が表示されます。expenseHdrレポートに正しく表示されるため、sフィールドとsフィールドから正しいデータを表示していると思いexpenseDtlますが、デバッグ時にクエリにカーソルを合わせると、経費の詳細(レポートのラインアイテム)だけが表示されますが、VisualStudioは初めてです。 。

基本的に、クエリとデータソースの間に接続が切断されているか、結合に問題があるようです。これがデータソースから取得したSQLSELECTで、以下がクエリです。どんな助けでも大歓迎です。

SELECT DISTINCT expenseHdr.rptNo,expenseHdr.description,expenseHdr.purpose,
expenseHdr.reimbursement, expenseHdr.department, expenseHdr.period, 
expenseDtl.expDesc, expenseDtl.expType, expenseDtl.expCost, 
expenseDtl.expDate, employees.name, expenseDtl.expNo,   
expenseDtl.location
FROM   (Intranet.dbo.expenseHdr expenseHdr INNER JOIN
Intranet.dbo.expenseDtl expenseDtl ON 
expenseHdr.rptNo=expenseDtl.rptNo) INNER JOIN Intranet.dbo.employees 
employees ON expenseHdr.empPk=employees.pk
ORDER BY expenseDtl.expNo
private void launchReport(int pKReport)
{
    using (DataClasses1DataContext db = new DataClasses1DataContext())
    {
        var query = (from s in db.expenseHdrs
                         join d in db.expenseDtls on s.rptNo equals d.rptNo
                         where s.rptNo == pKReport
                         join g in db.employees on s.empPk equals g.pk
                         select new
                         {
                             s.period,
                             s.description,
                             s.department,
                             s.rptNo,
                             s.reimbursement,
                             s.purpose,
                             g.name,
                             d.expDate,
                             d.expType,
                             d.expDesc
                     });

        expenseReportMain cr1 = new expenseReportMain();

        cr1.FileName = @"\\SRV-NAS\Intranet\Reports\expenseReportMain.rpt";

        ConnectionInfo connectionInfo = new ConnectionInfo();
        connectionInfo.ServerName = "svr-sql";
        connectionInfo.DatabaseName = "intranet";
        connectionInfo.UserID = "sa";
        connectionInfo.Password = "******";

        SetDBLogonForReport(connectionInfo, cr1);
        cr1.SetDataSource(query);
        crystalReportViewer1.ReportSource = cr1;
    }
}

private void SetDBLogonForReport(ConnectionInfo connectionInfo,
                                 expenseReportMain reportDocument)
{
    Tables tables = reportDocument.Database.Tables;
    foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
    {
        TableLogOnInfo tableLogonInfo = table.LogOnInfo;
        tableLogonInfo.ConnectionInfo = connectionInfo;
        table.ApplyLogOnInfo(tableLogonInfo);
    }
}

また、リクエストごとにいくつかのサンプルデータを編集しました。

expenseHdr             expenseDtl                employees

rptNo  empPk           expNo   rptNo             pK    name    userid
1      333             3       1                 333   Tom     tom.b
2      240             4       1                 240   Kelly   kelly.c
3      542             5       2                 542   Jean    jean.g
                       6       3

そのため、employeesテーブルの情報はレポートに正しく表示されません。他の2つのテーブルのデータは正常に表示されます。

4

2 に答える 2

0

以前の定義が影響する可能性があるため、両方の結合の後に where を配置してクエリを変更したことを覚えています。

var query = (from s in db.expenseHdrs
                         join d in db.expenseDtls on s.rptNo equals d.rptNo
                         where s.rptNo == pKReport
                         join g in db.employees on s.empPk equals g.pk
                         select new
                         {
                             s.period,
                             s.description,
                             s.department,
                             s.rptNo,
                             s.reimbursement,
                             s.purpose,
                             g.name,
                             d.expDate,
                             d.expType,
                             d.expDesc
                     });

に:

var query = (from s in db.expenseHdrs
                         join d in db.expenseDtls on s.rptNo equals d.rptNo
                         join g in db.employees on s.empPk equals g.pk
                         where s.rptNo == pKReport
                         select new
                         {
                             s.period,
                             s.description,
                             s.department,
                             s.rptNo,
                             s.reimbursement,
                             s.purpose,
                             g.name,
                             d.expDate,
                             d.expType,
                             d.expDesc
                     });

SQLではwhere句の前にすべてのテーブルを結合する必要があるため、問題を解決します。

于 2012-09-06T15:59:35.413 に答える
0

linq 処理では join 演算子だけではなく、多くを選択しているため、これは正常です。

SQLクエリ:3つの結合を持つクエリがあります

linq query : select many があり、select が 2 つあり、select ごとに join があります

したがって、expenseHdrs を持つ従業員に参加していないため、結合からの従業員ではなく、常に pk がゼロの従業員が表示されるのは正常です。

 var query = (from s in db.expenseHdrs
                     join d in db.expenseDtls on s.rptNo equals d.rptNo
                     where s.rptNo == pKReport
                     join g in db.employeess on g.pk equals s.empPk
                     select new
                     {
                        //Adjust your select

                     });
于 2012-08-28T16:42:06.763 に答える