2011-09-22 25 views
1

在金融工作追踪,并已运行到有点障碍与降序排列显示交易(最新到最旧)。 这里是我使用的SQL:平衡账户而递减顺序选择的MySQL行 - 用正确的运行平衡代码更新

SELECT amount, payee, cat, date FROM transactions ORDER BY id DESC, date DESC

我使用一个类来处理这个程序,并显示该交易功能的其他方面是它的一部分。如果我是显示在升序交易,下面的代码按预期工作:

//Fetch the transactions 
public function fetchTransactions() { 
    global $db; 
    $this->getStartingBalance(); 
    $runningTotal = $this->startingBalance; 
    $fetchTransactionsSQL = $db->query("SELECT amount, payee, cat, date FROM transactions ORDER BY id, date"); 
    while ($transactionDetails = $fetchTransactionsSQL->fetch()) { 
     $payee = stripslashes($transactionDetails[payee]); 
     $category = $transactionDetails['cat']; 
     $amount = money_format("%n", $transactionDetails[amount]); 
     $runningTotal = $runningTotal + $transactionDetails['amount']; 
     $runningTotalOutput = money_format("%n", $runningTotal); 
     echo " 
      <tr> 
        <td class=\"payee\">$payee</td> 
        <td>$category</td> 
        <td>$amount</td> 
        <td class=\"runningTotal\">$runningTotalOutput</td> 
       </tr>"; 
    } 
} 

憋屈试图在递减顺序与正确的运行平衡显示 - 例如,如果$this->startingBalance值是$ 354.00和第一个(因此最后以desc顺序显示)交易价格为4.00美元,最后一笔交易额为350.00美元。这些号码已经签署。

非常感谢!

更新的代码

沿drew010的意见的线之后,我想起了一个方便的小功能 - array_reverse。我更新了函数以包含事务数组,并将其颠倒过来,然后遍历数组,以正确的运行余额按升序显示事务。

我刚碰到的另一个问题是索引事务的问题 - 例如,只显示当前月份的事务,同时保持正确的运行平衡。下面更新的代码解决了以正确的顺序显示所有交易的问题,并且没有限制返回的行的问题。

这里是更新的代码,建议表示赞赏。

public function fetchTransactions() { 
    global $db; 
    $this->getStartingBalance(); 
    $runningTotal = $this->startingBalance; 
    //Array to contain the transactions 
    $transactions = array(); 
    //Counter for transactions array key 
    $i = 0; 
    $fetchTransactionsSQL = $db->query("SELECT amount, payee, cat, date FROM transactions ORDER BY id, date"); 
    while ($transactionDetails = $fetchTransactionsSQL->fetch()) { 
     $payee = stripslashes($transactionDetails[payee]); 
     $category = $transactionDetails['cat']; 
     $amount = money_format("%n", $transactionDetails[amount]); 
     $runningTotal = $runningTotal + $transactionDetails['amount']; 
     $runningTotalOutput = money_format("%n", $runningTotal); 
     $transactions[$i] = array("payee" => $payee, "category" => $category, "amount" => $amount, "runningTotal" => $runningTotalOutput); 
     $i++; //Increment the array key 
    } 
    $transactions = array_reverse($transactions); //Reverse the transactions array to display in ascending order 
    //Iterate over transactions array 
    foreach ($transactions as $transaction) { 
     $payee = $transaction['payee']; 
     $category = $transaction['category']; 
     $amount = $transaction['amount']; 
     $runningTotal = $transaction['runningTotal']; 
     echo " 
      <tr>\n 
       <td>$payee</td>\n 
       <td>$category</td>\n 
       <td>$amount</td>\n 
       <td>$runningTotal</td>\n 
      </tr>\n 
     "; 
    } 
} 
+0

什么是$ this-> startingBalance?如果您指定月份,是否会为指定的日期约束获取起始余额? – Naltharial

+0

起始余额是帐户添加到应用程序时的初始余额。例如。如果用户在开始时的价值为359美元,那么该帐户将与帐户名称和帐户类型一起保存在帐户表中。余额通过将交易总额(金额的签名整数)与开始金额相加来计算。 – NightMICU

回答

2
  1. 运行SUM(额),交易
  2. 记住结果,并将其添加到您的$ startingBalance并记住,作为$ endingBalance
  3. 运行查询的DESC以便选择所有交易像你想
  4. 对于每笔交易,而不是增加$金额$运行平衡,从。减去$ endingBalance的$金额...


例子:在DESC顺序选择0 5交易(仅量):
1. -7
2. 10
3. 22
4. -17
5. -2
记录,SUM:$ TSUM = -7 + 10 + 22 - 17 - 2 =
$ startingBalance =
$ endingBalance = $ startingBalance + TSUM = 300 + 6 =

交易显示按照降序排列:
(AMOUNT | RUNNING BALLANCE)
END BALANCE:306
-7 | 306($ endingBalance)
10 | 313($ endingBalanse - = -7)
22 | 303($ endingBalance - = 10)
-17 | 281($ endingBalance - = 22)
-2 | 298($ endingBalance - = -17)
START平衡:300($ endingBalance - = -2)

您的代码更新:

//Fetch the transactions public 
function fetchTransactions() 
{  
    global $db; 
    $this->getStartingBalance(); 
    $endingBalance = $this->startingBalance + $this->getTransactionsSum(); 
    $runningTotal = $endingBalance; 
    $prevAmount = 0; 
    $fetchTransactionsSQL = $db->query("SELECT amount, payee, cat, date FROM transactions ORDER BY id DESC, date DESC");  

    while ($transactionDetails = $fetchTransactionsSQL->fetch()) 
    {   
     $payee = stripslashes($transactionDetails[payee]);   
     $category = $transactionDetails['cat'];   
     $amount = money_format("%n", $transactionDetails[amount]); 

     $runningTotal -= $prevAmount;  
     $prevAmount = $amount; 

     $runningTotalOutput = money_format("%n", $runningTotal);   

     echo "<tr>      
       <td class=\"payee\">$payee</td>      
       <td>$category</td>      
       <td>$amount</td>      
       <td class=\"runningTotal\">$runningTotalOutput</td>     
      </tr>";  
    } 
} 

function getTransactionsSum() 
{ 
    $sql = $db->query("SELECT SUM(amount) AS mySum FROM transactions"); 
    if($sumFields = $sql->fetch()) 
    { 
     return money_format("%n", $sumFields[mySum]); 
    } 
    else 
    { 
     return 0; 
    } 
} 

我希望你能发现有用的..

+0

这看起来很有希望,会稍微尝试一下。我正在努力解决的另一个问题是如何将所有这些放到分页索引中而不会丢掉所有内容。例如,从最近的事务开始,每页30个事务。感谢您的帮助,我认为就是这样。 – NightMICU

+0

将考虑分页索引并在明天之前解决问题...我很高兴能够提供帮助。 –

+0

非常感谢!我在我的“日常工作”上24小时轮班,在我能做到的时候就开始工作。恭喜赢得赏金,真的很感激它。 – NightMICU

0

我会从起始余额与查询中第一个事务匹配的点开始按升序读取值。

一切加入含有收款人,金额,类别等数组,并计算您的余额出现。然后将该数组添加到另一个数组$transactions[] = $transaction

然后,当你准备输出,从$交易和输出他们倒读。

for ($i = sizeof($transactions) - 1; $i >= 0; ++$i) { 
    $txn = $transactions[$i]; 
    // output data 
} 

这是一个好主意,从其他的逻辑分离的数据库访问,和单独的数据库和控制器逻辑从你的HTML输出,适用于多种原因。请参阅维基百科上的MVC

0

你为什么不从现在开始平衡和向后工作?所以第一个事务的运行平衡将是启动的平衡,那么你减去从一开始就平衡当前的交易量,这是下一个事务的运行平衡。