Как эффективно запросить несколько таблиц для создания отчета STYLE в формате dataGrid - PullRequest
0 голосов
/ 08 июня 2011

Я создаю C #, приложение Windows Form, используя базу данных Access в качестве серверной части.Я использую наборы данных и адаптеры таблиц для переноса информации из Excel в базу данных, а затем извлекаю нужные мне записи из базы данных, используя winforms.

Я получаю информацию из нескольких таблиц для ежемесячного отчета о продажах.Для каждого отчета, выбранного Store # из поля со списком, необходимо:

  • Имя продукта в виде строки (из таблицы продуктов) В таблице продуктов есть поле с именем productAnalysis, помеченное знаком1, если продукт должен быть включен в отчет об анализе.

  • Количество на начало (инвентаризация) (выбирается в поле выбора даты)

  • (Даты начала, цены покупки товара)

  • Кол-во каждого приобретенного товара.(Таким образом, сумма кол-во по продукту / магазину / дате из таблицы транзакций)

  • Счетчик конечных (инвентаризации) (выбирается блоком выбора даты)

  • Закупочные цены на товары в Заканчивающихся датах.

Подсчеты для каждого магазина сохраняются в одной таблице с датой, № магазина, № счета и № продукта.Все магазины сохраняются в одной таблице.Каждая покупка сохраняется в таблице транзакций с указанием даты, цены покупки, кол-во, store # и product # (есть также несколько других полей, которые не относятся к этой ситуации).Мне нужна сумма кол-ва купленной и последней цены покупки из этой таблицы.

Моя проблема заключается в попытке собрать всю эту информацию в одном запросе для получения DataGridView.

Я вычислю некоторые поля из всей этой информации.Вся информация, которую я могу найти, относится к использованию SQL Server, и я не смог найти эти примеры, подходящие для моей ситуации.Я могу разделить это на куски и выполнить запросы отдельно, но размещение всего этого в одном месте оказывается проблематичным для меня.Ниже приведены некоторые из запросов, которые я пробовал.

SELECT AnalysisItems.ProductName, 
       BeginningCount.CountNumber AS Beginning, 
       sum(Transactions.TransactionQty) AS SumOfTransactionQty, 
       EndingCount.CountNumber AS Ending
FROM Product 
INNER JOIN (((AnalysisItems 
INNER JOIN BeginningCount ON AnalysisItems.Pmid = BeginningCount.Pmid) 
INNER JOIN EndingCount ON BeginningCount.Pmid = EndingCount.Pmid) 
INNER JOIN Transactions ON EndingCount.Pmid = Transactions.Pmid) 
       ON (AnalysisItems.Pmid = Product.Pmid) AND (Product.Pmid = Transactions.Pmid)
WHERE (((Product.ProductAnalysis)=1))
GROUP BY AnalysisItems.ProductName, BeginningCount.CountNumber, 
         EndingCount.CountNumber;

Это сближает меня, но все еще содержит несколько записей для одних и тех же продуктов.Я просто не могу думать о том, как сделать это в доступе.

SELECT 
    AnalysisItems.ProductName,
    BeginningCount.CountNumber AS Beginning,
    Sum(Transactions.TransactionQty) AS SumOfTransactionQty,
    EndingCount.CountNumber AS Ending,
    EndingCount.StoreAccount
FROM Product 
    INNER JOIN 
    (
        AnalysisItems 
           INNER JOIN BeginningCount ON 
               AnalysisItems.Pmid = BeginningCount.Pmid
           INNER JOIN EndingCount ON
               BeginningCount.Pmid = EndingCount.Pmid
           INNER JOIN Transactions ON
               EndingCount.Pmid = Transactions.Pmid
    ) ON 
             (Product.Pmid = AnalysisItems.Pmid) AND 
             (Product.Pmid = Transactions.Pmid)
WHERE (((Product.ProductAnalysis)=1))
GROUP BY 
     AnalysisItems.ProductName,
     BeginningCount.CountNumber,
     EndingCount.CountNumber,
     EndingCount.StoreAccount;

1 Ответ

0 голосов
/ 11 июня 2011

Ну, возможно, есть гораздо более простой способ сделать это, но я не могу его найти.Хотя я новичок, поэтому однажды я оглянулся назад и подумал, насколько легко это было, я уверен :) То, что я сделал, было ..

Поместите 3 поля DataGridView в форму.При загрузке экрана я загружаю данные за предыдущие месяцы в первый, а данные о текущих месяцах во второй.Я их свернул и закрыл за 3-й сеткой, чтобы их не было видно.Затем я создаю таблицу данных, используя каждую строку из каждой из первых двух сеток.Выполните, какие вычисления мне нужно, пока и добавьте все это в третью таблицу.

       private void btnLoad_Click(object sender, EventArgs e)
    {

        //to load the first chosen months data
        this.beginningCountTableAdapter.Fill(this.beginningDataSet.BeginningCount, Convert.ToInt32(storeAccountComboBox.Text), Convert.ToDateTime(dateTimePicker1.Text));
        //to load the second chosen months data
        this.endingCountTableAdapter.Fill(this.endingDataSet.EndingCount, Convert.ToInt32(storeAccountComboBox.Text), Convert.ToDateTime(dateTimePicker2.Text));

        //Create new DataTable
        DataTable dtItems = new DataTable();

        //add columns to the dataTable
        dtItems.Columns.Add("Product", typeof(string));
        dtItems.Columns.Add("Beginning", typeof(decimal));
        dtItems.Columns.Add("Purchases", typeof(int));
        dtItems.Columns.Add("Ending", typeof(decimal));
        //Add a new Column to Calculate the Value
        dtItems.Columns.Add("Total Gone (Usage)", typeof(decimal)); 
        //add more columns for $ value
        dtItems.Columns.Add("Beginning$", typeof(decimal));
        dtItems.Columns.Add("Purchases$", typeof(decimal));
        dtItems.Columns.Add("Ending$", typeof(decimal));
        //Add a new Column to Calculate the Value
        dtItems.Columns.Add("Total Gone ($)", typeof(decimal));
        dtItems.Columns.Add("% of Sales", typeof(decimal));

        try
        {
            for (int i = 0; i < dataGridView1.RowCount; i++)
            {
                //first column
                string product = Convert.ToString(dataGridView1.Rows[i].Cells[0].Value);

                //calculation for TotalGone (usage)
                decimal beginning = Convert.ToDecimal(dataGridView1.Rows[i].Cells[1].Value);
                decimal purchases = Convert.ToDecimal(dataGridView2.Rows[i].Cells[0].Value);
                decimal ending = Convert.ToDecimal(dataGridView2.Rows[i].Cells[1].Value);
                decimal totalGone = ((beginning + purchases) - ending);
                //Variables for conversions for $ column math
                decimal beg = Convert.ToDecimal(dataGridView1.Rows[i].Cells[1].Value);
                decimal begPrice = Convert.ToDecimal(dataGridView1.Rows[i].Cells[2].Value);
                decimal begValue = beg * begPrice;
                decimal pur = Convert.ToDecimal(dataGridView2.Rows[i].Cells[0].Value);
                decimal purPrice = Convert.ToDecimal(dataGridView2.Rows[i].Cells[2].Value);
                decimal purValue = pur * purPrice; 
                decimal end = Convert.ToDecimal(dataGridView2.Rows[i].Cells[1].Value);
                decimal endPrice = Convert.ToDecimal(dataGridView2.Rows[i].Cells[2].Value);
                decimal endValue = end * endPrice;
                decimal totalGoneValue = ((beg * begPrice) + (pur * purPrice)) - (end * endPrice);

                totalGoneColumnTotal = totalGoneColumnTotal + totalGoneValue; //The total of all product totalGoneValues
                decimal salesPercentage = 0; //The sales percentage
                thirtyPercent = Convert.ToDecimal(txtThirtyPct.Text); //the thirty percent discount txt entry
                double chickenValue = Convert.ToDouble(dataGridView2.Rows[28].Cells[0].Value);
                chickenRebate = (chickenValue * .512);
                double steakValue = Convert.ToDouble(dataGridView2.Rows[29].Cells[0].Value);
                steakRebate = steakValue * .550; 
                totalWithRebates = (Convert.ToDouble(totalWithDiscount) - ((chickenRebate + steakRebate)));
                try
                {
                    decimal sales = Convert.ToDecimal(textSales.Text); //convert the sales entry
                    salesPercentage = totalGoneValue / sales * 100; //find sales percentage
                    totalWithDiscount = totalGoneColumnTotal - thirtyPercent; //find thirtypercent discount amount
                }
                catch { MessageBox.Show("The sales entry must be a number between 1 and 999999.99");
                break;
                }

                //add colors to the output. 


                //Add rows to the DataTable
                dtItems.Rows.Add(product, beginning, purchases, ending, totalGone, begValue, purValue, endValue, totalGoneValue, salesPercentage);                
            }//end for

            //Totals Summary Rows
            dtItems.Rows.Add("Totals", null, null, null, null, null, null, null, totalGoneColumnTotal, null);
            dtItems.Rows.Add("30% discounts",  null, null, null, null, null, null, null, thirtyPercent ,null);
            dtItems.Rows.Add("Total w/discount", null, null, null, null, null, null, null, totalWithDiscount, null);
            dtItems.Rows.Add("Chicken Rebate x * 5.12", null, null, null, null, null, null, null, chickenRebate, null);
            dtItems.Rows.Add("Steak Rebate x * 5.50", null, null, null, null, null, null, null, steakRebate, null);
            dtItems.Rows.Add("Total w/Rebates", null, null, null, null, null, null, null, totalWithRebates, null);

            //Set the DataTable as DataSource of the GridView
            dataGridView3.DataSource = dtItems;
        }
        catch { MessageBox.Show("Could not determine values. There may be no data for this date range/store."); }

Как я уже сказал, я уверен, что это, вероятно, очень странный способ сделать это, но я не мог заставить что-либо работать, используя только dataTables ..

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