Crystal Report с командой не отображаются все поля - PullRequest
0 голосов
/ 01 февраля 2020

Я пытаюсь отобразить данные из 3 MySQL таблиц в один отчет Crystal. Я написал свой собственный запрос, используя опцию «Добавить команду» в окне «Мастер создания стандартного отчета» вместо использования соединителя с базой данных (потому что я хочу написать собственный код запроса)

код ниже запрос, который я хочу выполнить, и я написал в команде:

SELECT
    ubc.boq_table.itemNum,
    ubc.boq_table.descriptionOfWork,
    ubc.boq_table.unit,
    ubc.boq_table.contractualQuantity,
    ubc.boq_table.priceNum,
    ubc.summary.executedQuantLastSummary,
    ubc.summary.priceLastWorks,
    ubc.summary.executedQuantBetw2Sum,
    ubc.submittal.priceCurrentWorks
FROM
    ubc.boq_table
LEFT OUTER JOIN ubc.summary ON
    ubc.boq_table.itemNum = ubc.summary.itemNum
LEFT OUTER JOIN ubc.submittal ON
    ubc.boq_table.itemNum = ubc.submittal.itemNum
WHERE
    ubc.boq_table.projectName = 'proj'
UNION
SELECT
    ubc.boq_table.itemNum,
    ubc.boq_table.descriptionOfWork, 
    ubc.boq_table.unit, 
    ubc.boq_table.contractualQuantity, 
    ubc.boq_table.priceNum, 
    ubc.summary.executedQuantLastSummary, 
    ubc.summary.priceLastWorks, 
    ubc.summary.executedQuantBetw2Sum, 
    ubc.submittal.priceCurrentWorks 
FROM
    ubc.summary
LEFT OUTER JOIN ubc.boq_table ON 
    ubc.summary.itemNum = ubc.boq_table.itemNum 
LEFT OUTER JOIN ubc.submittal ON 
    ubc.summary.itemNum = ubc.submittal.itemNum 
WHERE 
    ubc.summary.projectName = 'proj'  
UNION
SELECT
    ubc.boq_table.itemNum,
    ubc.boq_table.descriptionOfWork,
    ubc.boq_table.unit,
    ubc.boq_table.contractualQuantity,
    ubc.boq_table.priceNum,
    ubc.summary.executedQuantLastSummary, 
    ubc.summary.priceLastWorks, 
    ubc.summary.executedQuantBetw2Sum, 
    ubc.submittal.priceCurrentWorks 
FROM
    ubc.submittal 
LEFT OUTER JOIN ubc.boq_table ON 
    ubc.submittal.itemNum = ubc.boq_table.itemNum 
LEFT OUTER JOIN ubc.summary ON 
    ubc.submittal.itemNum = ubc.summary.itemNum 
WHERE 
    ubc.submittal.projectName = 'proj' 
ORDER BY 
    itemNum;

следующий код, который я написал в функции onLoad формы для отображения отчета о кристалле. Обратите внимание, что «FullOuterQuery» совпадает с первым кодом

 MySqlCommand Command = new MySqlCommand(FullOuterQuery, connection);
                adapter.SelectCommand = Command;
                adapter.Fill(table);
                ReportDocument doc;
                CrystalReport1 report = new CrystalReport1();
                report.SetDataSource(table);
                doc = new ReportDocument();
                doc.Load("C:\\Users\\PC\\Desktop\\WindowsFormsApp6\\WindowsFormsApp6\\WindowsFormsApp6\\CrystalReport1.rpt");
                crystalReportViewer1.ReportSource = report;

моя проблема в том, что отчет Crystal имеет нулевые значения (фактически не найденные значения), потому что я получаю данные из 3 таблиц, и появляется эта ошибка "Ссылка на объект не установлена ​​на экземпляр объекта" Я хочу заменить все нулевые значения с нулем, но я не могу сделать это в запросе, который я написал в команде.

Я попытался использовать формулу, чтобы проверить, является ли значение нулевым, а затем заменить на ноль, например:

if(isnull({Command.priceCurrentWorks})) then 
       {Command.priceCurrentWorks} = 0
else 
   {Command.priceCurrentWorks} = {Command.priceCurrentWorks}

и я использую аналогичную формулу для каждого значения, которое может иметь значение NULL, и изменить параметр «Exception For NULL» на «Значение по умолчанию для NULL» в формуле ' Редактор кода, но все равно ошибка возникает.

вторая проблема, которую я написал в условии where projectName = 'proj', но пользователь должен ввести имя проекта, например where projectName = '"+ projectNameTextBox.tex+"' ;, как я могу сделать это в запросе, который я написал в команде, потому что, когда я пытаюсь чтобы изменить это в FullOuterQuery (запрос, который написан в форме c#), ничего не изменилось. Я протестировал свой запрос в localhost phpMyAdmin, и он заработал. запрос SELECT в команде должен быть таким:

SELECT
    ubc.boq_table.itemNum,
    ubc.boq_table.descriptionOfWork,
    ubc.boq_table.unit,
    ubc.boq_table.contractualQuantity,
    ubc.boq_table.priceNum,
    IFNULL(ubc.summary.executedQuantLastSummary,0),
    IFNULL(ubc.summary.priceLastWorks,0),
    IFNULL(ubc.summary.executedQuantBetw2Sum,0),
    IFNULL(ubc.submittal.priceCurrentWorks,0)

И когда я использую следующий код, ошибки не возникало, но также не было данных

 adapter = new MySqlDataAdapter(FullOuterQuery, connection);

                DataSet ds = new DataSet();
                adapter.Fill(ds);
                ReportDocument cryRpt = new ReportDocument();
                cryRpt.Load("C:\\Users\\PC\\Desktop\\WindowsFormsApp6\\WindowsFormsApp6\\WindowsFormsApp6\\CrystalReport1.rpt");
                cryRpt.DataSourceConnections.Clear();
                cryRpt.SetDataSource(ds);
                crystalReportViewer1.ReportSource = cryRpt;
                crystalReportViewer1.Refresh();

ОБНОВЛЕНИЕ 2: когда я называю свои таблицы в адаптере, например adapter.Fill(ds,"boq_table");, и в источнике данных для отчета отображаются некоторые данные, а некоторые отсутствуют, я создаю представление таблицы данных с тем же запросом отчета, чтобы увидеть, есть ли какие-либо проблемы в данные, представление таблицы данных отображают результат, как и ожидалось, но я не знаю, почему его нет в отчете Я проверяю базу данных и каждое поле и перестраиваюсь, также я создаю новый отчет Crystal, но ничем не отличается

следующий код является последним (появляются некоторые данные)

 adapter = new MySqlDataAdapter(FullOuterQuery, connection);
                DataSet ds = new DataSet();
                adapter.Fill(ds,"boq_table");
                adapter.Fill(ds, "summary");
                adapter.Fill(ds, "submittal");

                ReportDocument cryRpt = new ReportDocument();
                dataGridView1.DataSource = ds.Tables["boq_table"];
                dataGridView1.DataSource = ds.Tables["summary"];
                dataGridView1.DataSource = ds.Tables["submittal"];

                cryRpt.Load("C:\\Users\\PC\\Desktop\\WindowsFormsApp6\\WindowsFormsApp6\\WindowsFormsApp6\\CrystalReport1.rpt");
                cryRpt.DataSourceConnections.Clear();

                cryRpt.SetDataSource(ds.Tables["boq_table"]);
                cryRpt.SetDataSource(ds.Tables["summary"]);
                cryRpt.SetDataSource(ds.Tables["submittal"]);
                crystalReportViewer1.ReportSource = cryRpt;
                crystalReportViewer1.Refresh();

следующие поля не

 IFNULL(ubc.summary.priceLastWorks,0),
    IFNULL(ubc.summary.executedQuantBetw2Sum,0),
    IFNULL(ubc.submittal.priceCurrentWorks,0)

Вы можете подумать, что есть проблема с IFNULL или из-за того, что есть поле из другой таблицы, но в следующей строке запроса данные отображаются правильно

IFNULL(ubc.summary.executedQuantLastSummary,0),

1 Ответ

0 голосов
/ 03 февраля 2020

установите точку остановки на

ReportDocument cryRpt = new ReportDocument(); 

и посмотрите, есть ли вообще набор данных ds (или вам нужно поработать над этим

. Следующий шаг - создать Файл rpt, который использует эту структуру данных.

есть такой способ { ссылка }

Где вы создаете исходный код xsd или как я это использую ds.write xml (filepath) и создайте файл xml и используйте его как источник данных Basi c для создания вашего файла rpt (Это похоже на dtp). Я могу найти руководство по этому вопросу только на немецком языке, но вы не найдете ответа чтобы задать c вопросов.

Итак, теперь у вас есть файл rpt, который может использовать набор данных ds, и он не обращает внимания на данные

Когда вы создали свой rpt, используйте свой код для воплотите его в жизнь, показав в CrystalViewer.

После того, как вы впервые сделаете это и поймете необходимость Crystal, вам станет легче, и вы потратите некоторое время на изучение, чтобы получить хороший отчет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...