2016-12-09 5 views
1

У меня есть отчет, который имеет столбец profit. Мне нужно добавить все значения столбца прибыли и получить общую прибыль за день. Цените любую помощь, так как я прошел через SO и не нашел для этого решения.Рассчитать СУММУ прибыли в FPDF

$result = mysqli_query($connection, "SELECT S.sales_id, I.item_name, ST.stock_code, 
    S.date, S.unit_price, SUM(S.qty), (SUM(S.qty)*S.unit_price), 
    ((SUM(S.qty)*S.unit_price)-(SUM(S.qty)*P.unit_cost)) FROM sales S 
    INNER JOIN items I ON S.item_id=I.item_id 
    INNER JOIN stock ST ON S.stock_id=ST.stock_id 
    INNER JOIN purchase_items P ON S.purchase_id=P.purchase_id 
    WHERE S.date BETWEEN '$date 00:00:00' AND '$date 23:59:59' GROUP BY S.item_id"); 

$qty = $row['SUM(S.qty)']; 
$unit_price = $row['unit_price']; 
$amount = $row['(SUM(S.qty)*S.unit_price)'];  
$profit = $row['((SUM(S.qty)*S.unit_price)-(SUM(S.qty)*P.unit_cost))']; 
$dailyProfit = $row['(SUM(SUM(S.qty)*S.unit_price)-(SUM(S.qty)*P.unit_cost)))']; 
$pdf->Cell(25,10,$dailyProfit,'B',0,'J',1); 

Это возвращает только одну запись с последним элемента, в profit, как это должно быть исправлено, чтобы получить суточную sum(profit)?

enter image description here

Обновленный код

$result = mysqli_query($connection, "SELECT S.sales_id, I.item_name, ST.stock_code, S.date, 
    S.unit_price, SUM(S.qty) AS line_qty, (SUM(S.qty)*S.unit_price) AS line_total, 
    ((SUM(S.qty)*S.unit_price)-(SUM(S.qty)*P.unit_cost)) AS line_profit 
    FROM sales S 
    INNER JOIN items I ON S.item_id=I.item_id 
    INNER JOIN stock ST ON S.stock_id=ST.stock_id 
    INNER JOIN purchase_items P ON S.purchase_id=P.purchase_id 
    WHERE S.date BETWEEN '$date 00:00:00' AND '$date 23:59:59' GROUP BY S.item_id"); 

$qty = $row['line_qty']; 
$unit_price = $row['unit_price']; 
$amount = $row['line_total'];  
$profit = $row['line_profit']; 

$aRows = array(); 
while ($oRow = mysqli_fetch_assoc($result)) $aRows[] = $oRow; 
mysqli_free_result($result); 

$dTotalProfit = 0; 
if (count($aRows) > 0) foreach ($aRows as $aRow) { 
    $dTotalProfit += $aRow['line_profit']; 
    //$pdf->Cell(25, 10, $aRow['line_qty'], 'B', 0, 'J', 1); 
} 
$totalProfit = number_format($dTotalProfit, 2); 

$pdf->Cell(220, 10, 'Daily Total Profit:', 'B', 0, 'R', 1); 
$pdf->Cell(25, 10, $totalProfit, 'B', 0, 'J', 1); 

enter image description here

+0

И ваш код, который показывает нам, что вы пробовали до сих пор? – Kitson88

+0

Ах, извините, мой плохой ... можно увидеть сейчас. – Kitson88

+1

Я думаю, что вы делаете group by item_id, так что вы получите результат одной записи на основе этого конкретного элемента, поэтому я думаю, вам следует использовать array_sum() после этого, чтобы вычислить прибыль за весь день – jilesh

ответ

3

Вы не можете использовать функции SQL и выражения PHP переменных, эти работы только при выполнении запросов в SQL. Чтобы избежать путаницы и сделать код читаемыми, насколько это возможно, я бы рекомендовал присвоить имена столбцов или псевдонимы для ваших расчетных значений, например:

<?php 
$sSQL = "SELECT S.sales_id, I.item_name, ST.stock_code, S.date, S.unit_price, 
    SUM(S.qty) AS line_qty, (SUM(S.qty)*S.unit_price) AS line_total, 
    ((SUM(S.qty)*S.unit_price)-(SUM(S.qty)*P.unit_cost)) AS line_profit 
    FROM sales S 
    INNER JOIN items I ON S.item_id=I.item_id 
    INNER JOIN stock ST ON S.stock_id=ST.stock_id 
    INNER JOIN purchase_items P ON S.purchase_id=P.purchase_id 
    WHERE S.date BETWEEN '$date 00:00:00' AND '$date 23:59:59' GROUP BY S.item_id"; 

Затем вы можете получить доступ к данным с помощью:

$qty = $row['line_qty']; 
$unit_price = $row['unit_price']; 
$amount = $row['line_total'];  
$profit = $row['line_profit']; 

для того, чтобы получить общую ежедневную прибыль, вам необходимо суммировать значения всех возвращаемых строк, это легко сделать в пределах цикла в этом контексте:

$oConnection = mysqli_connect($sHostname, $sUsername, $sPassword); 
mysqli_select_db($oConnection, $sDatabaseName); 
$oResult = mysqli_query($oConnection, $sSQL); 
$aRows = array(); 
while ($oRow = mysqli_fetch_assoc($oResult)) $aRows[] = $oRow; 
mysqli_free_result($result); 

$dTotalProfit = 0; 
if (count($aRows) > 0) foreach ($aRows as $aRow) { 
    $dTotalProfit += $aRow['line_profit']; 
    $pdf->Cell(25, 10, $aRow['line_qty'], 'B', 0, 'J', 1); 
    ... 
} 

А потом на боту томом вашего PDF-документа вы можете использовать number_format($dTotalProfit, 2) для вывода вашей ежедневной общей суммы прибыли.


Суммируя затем и применить все методы выше:

$oQuery = mysqli_query($connection, "SELECT S.sales_id, I.item_name, ST.stock_code, S.date, 
    S.unit_price, SUM(S.qty) AS line_qty, (SUM(S.qty)*S.unit_price) AS line_total, 
    ((SUM(S.qty)*S.unit_price)-(SUM(S.qty)*P.unit_cost)) AS line_profit 
    FROM sales S 
    INNER JOIN items I ON S.item_id=I.item_id 
    INNER JOIN stock ST ON S.stock_id=ST.stock_id 
    INNER JOIN purchase_items P ON S.purchase_id=P.purchase_id 
    WHERE S.date BETWEEN '$date 00:00:00' AND '$date 23:59:59' GROUP BY S.item_id"); 

$aRows = array(); 
while ($oRow = mysqli_fetch_assoc($oQuery)) $aRows[] = $oRow; 
mysqli_free_result($oQuery); 

$aColumnWidths = array(25, 20, 20, 100, 20, 20, 20, 20); 
$dTotalProfit = 0; 
if (count($aRows) > 0) foreach ($aRows as $aRow) { 
    $dTotalProfit += $aRow['line_profit']; 
    $pdf->Cell($aColumnWidths[0], 10, $aRow['date'], 'B', 0, 'J', 1); 
    $pdf->Cell($aColumnWidths[1], 10, $aRow['sales_id'], 'B', 0, 'J', 1); 
    $pdf->Cell($aColumnWidths[2], 10, $aRow['stock_code'], 'B', 0, 'J', 1); 
    $pdf->Cell($aColumnWidths[3], 10, $aRow['item_name'], 'B', 0, 'L', 1); 
    $pdf->Cell($aColumnWidths[4], 10, $aRow['line_qty'], 'B', 0, 'R', 1); 
    $pdf->Cell($aColumnWidths[5], 10, $aRow['unit_price'], 'B', 0, 'R', 1); 
    $pdf->Cell($aColumnWidths[6], 10, $aRow['line_total'], 'B', 0, 'R', 1); 
    $pdf->Cell($aColumnWidths[7], 10, $aRow['line_profit'], 'B', 0, 'R', 1); 
    $pdf->Ln(); 
} 
$pdf->Ln(); 
$pdf->Cell($aColumnWidths[0] + $aColumnWidths[1] + $aColumnWidths[2] + $aColumnWidths[3] + 
    $aColumnWidths[4] + $aColumnWidths[5] + $aColumnWidths[6], 10, 
    'Daily Total Profit:', 'B', 0, 'R', 1); 
$pdf->Cell($aColumnWidths[7], 10, number_format($dTotalProfit, 2), 'B', 0, 'R', 1); 

В этом коде вы также заметите, я переместил столбец даты в начале, как правило, на финансовых отчетах дата была бы показанный слева, а затем столбец прибыли справа, будет иметь прямое значение. Я уже догадывался о форматировании строк $pdf->Cell, поскольку ваш включенный исходный код был неполным, включая их.

Также, если вы не знакомы с префиксами, я использовал венгерскую нотацию в исходном коде ответа, то есть o в $ oQuery для объекта, a в $ aRows для массива, d в $ dTotalProfit для double, и я мог бы использовать i для integer, b для булевых и т. д., если возникнет такая необходимость. Это просто помогает считывать код, если вы можете идентифицировать тип переменной из имени.

+0

Спасибо за отличный код. Я применил его к моему коду. Теперь я извлекаю одну запись (первую запись) и получаю ежедневную общую прибыль за записи, которые не отображаются в отчете. Как я могу это решить? Пожалуйста, найдите обновленный код и экран печати на моем оригинальном посте. – EKBG

+0

Похоже, что итоговая общая прибыль верна.Вы убедились, что строка кода, которая добавляет строки строк, находится внутри одного цикла, который увеличивает общую прибыль? т. е. где вы закомментировали строку '// $ pdf-> Cell (...)' в обновленном коде? Внутри цикла foreach я ожидал бы увидеть все ваши строки столбцов, такие как тот, который я включил в свой пример. Я обновил свой ответ с помощью более полного фрагмента кода, который поможет вам. – richhallstoke

 Смежные вопросы

  • Нет связанных вопросов^_^