2016-12-09 14 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)を取得するために修正する必要があると1つのレコードだけを取り出しますか?

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

私はあなたがitem_idでグループを行うと思うので、その特定の項目に基づいて1つのレコードの結果を得ることができるので、私は一日の利益を計算するために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行のフォーマットを推測しましたが、あなたのインクルードされたソースコードはこれらを含めて完全ではありませんでした。

また、あなたが接頭辞に慣れていない場合は、私の答えのソースコードでハンガリー記法を使っています。すなわち、$ oQueryのoはオブジェクトを表し、$ aRowsのaは配列を表し、dは$ですdTotalProfitは倍精度のため、整数の場合はi、booleanの場合はbなど必要が生じた場合は使用している可能性があります。これは、名前から変数の型を識別できる場合には、コードの可読性に役立ちます。

+0

素晴らしいコードをありがとう。私は自分のコードにそれを適用しました。今、私は1つのレコード(最初のレコード)を取得し、レポートに表示されていないレコードの毎日の総利益を取得します。これをどうすれば解決できますか?オリジナルの投稿に更新されたコードと印刷画面があります。 – EKBG

+0

最終的な総利益が正しいように見えます。行ラインを追加するコード行が、総利益を増やしている同じループ内にあることを確認しましたか?つまり、コメント付きの '// $ pdf-> Cell(...)'行があなたの更新されたコードのどこにあるのでしょうか? 'foreach'ループの中では、私の例に含まれているような全てのカラムラインを見ることが期待されます。私はより完全なコードスニペットで自分の答えを更新しました。 – richhallstoke

関連する問題