Я пытаюсь отобразить данные из 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),