所以我遇到了另一个......顺便说一句。我一直试图避免提出这个问题,但我显然无法自己解决这个问题。我正在尝试显示“帐户注册”。我发现的例子按日期按降序显示寄存器。我不明白为什么那不会惹恼任何试图使用它的人。我希望看到我最近的交易位于顶部,而不是底部。
本着这种精神,我正在努力解决这个问题。我想我需要按升序从数据库中获取数据,然后反转数组。问题在于显示寄存器。
由于它显示为一个表格,显然它将从第一行开始。在这种情况下,第一行需要是最近的事务。由于我无法从底部开始构建表,因此在开始构建表之前,数据集必须按顺序排列。
一切都很好。它完全按照应有的方式显示,除了运行总计。谷歌搜索这种东西让我有机会做一个运行总计,如果你从数组的开头开始,这很容易。
所以这是我到目前为止的代码。我不想在视图中进行数学计算。
模型
public function get_register($acct_id = NULL) {
$limit = strtotime("now") + 2592000;
if ($acct_id == NULL) {
$sql = "
SELECT
bdgt_trans.trans_amt,
bdgt_trans.clr_flag,
bdgt_trans.memo,
bdgt_trans.trans_date,
bdgt_trans.chk_num,
bdgt_cat.cat_label,
bdgt_payee.disp_name
FROM bdgt_acct
JOIN
bdgt_trans ON bdgt_trans.bdgt_acct_id = bdgt_acct.id
JOIN
bdgt_cat ON bdgt_cat.id = bdgt_trans.bdgt_cat_id
JOIN
bdgt_payee ON bdgt_payee.id = bdgt_trans.payee_id
WHERE
bdgt_acct.acct_default = 1
AND
trans_date <= ?
ORDER BY
trans_date
DESC
";
$query = $this -> db -> query($sql, $limit);
} else {
$sql = "
SELECT
bdgt_trans.trans_amt,
bdgt_trans.clr_flag,
bdgt_trans.memo,
bdgt_trans.trans_date,
bdgt_trans.chk_num,
bdgt_cat.cat_label,
bdgt_payee.disp_name
FROM bdgt_acct
JOIN
bdgt_trans ON bdgt_trans.bdgt_acct_id = bdgt_acct.id
JOIN
bdgt_cat ON bdgt_cat.id = bdgt_trans.bdgt_cat_id
JOIN
bdgt_payee ON bdgt_payee.id = bdgt_trans.payee_id
WHERE
bdgt_acct.id = ?
AND
trans_date <= ?
ORDER BY
trans_date
DESC
";
$query = $this -> db -> query($sql, array($acct_id, $limit));
}
if ($query -> num_rows() > 0) {
foreach ($query->result() AS $row) {
$array[] = get_object_vars($row);
}
return $array;
} else {
return NULL;
}
}
控制器
public function index() {
$acct_id = $this -> uri -> segment(3);
$data['acct_balance'] = $this -> base -> account_balance($acct_id);
$data['register_table'] = $this -> read -> get_register($acct_id);
$data['accounts'] = $this -> base -> acct_list();
$sum = 0;
if (!empty($data['register_table'])) {
foreach ($data['register_table'] AS $ra) {
if (current($data['register_table']) == $data['register_table']) {
$sum = $ra['trans_amt'];
} else {
$sum = $sum += $ra['trans_amt'];
}
$array[] = array('clr_flag' => $ra['clr_flag'], 'trans_date' => $ra['trans_date'], 'disp_name' => $ra['disp_name'], 'chk_num' => $ra['chk_num'], 'cat_label' => $ra['cat_label'], 'trans_amt' => $ra['trans_amt'], $ra['sum'] = $sum);
}
$data['array'] = $array;
}
if ($this -> form_validation -> run() === FALSE) {
$this -> stencil -> paint('finance/view_register', $data);
} else {
redirect(base_url() . 'finance/view_register/' . $acct_id);
}
}
查看
if (!empty($array)) {
foreach ($array AS $rt) {
echo '<tr';
if ($rt['clr_flag'] == 0) {
echo ' class="alert alert-warning"';
}
echo '><td>' . date("m/d/Y", $rt['trans_date']) . '</td><td>' . $rt['disp_name'] . '</td><td>';
if ($rt['chk_num'] == 0) {
echo 'N/A';
} else {
echo $rt['chk_num'];
}
echo '</td><td>' . $rt['cat_label'] . '</td>';
echo '<td>' . $rt['trans_amt'] . '</td>';
echo '<td>' . $rt['sum'] . '</td>';
echo '<td>';
echo $rt['cat_label'] != "Manual Adjustment" ? '
<input type="button" value="Clear" onClick="javascript:;" class="btn btn-primary" />
' : '';
echo '<input type="button" value="Edit" onClick="javascript:;" class="btn btn-primary" />
<input type="button" value="Delete" onClick="javascript:;" class="btn btn-primary" />';
echo '</td>';
echo '</tr>';
}
}
我试图将事情分解,以便尽可能容易理解。在控制器中,我正在做$ data ['array'] = $ array;以防我必须在将$数组传递给视图数据之前对其进行操作。如果我不想这样做,我将在循环中执行$ data ['array']。
[编辑]
在回应Abdulla的评论时,我认为非常简化的版本是,我需要获得trans_amt的运行总和。问题:
所以基本上,结果输出应该是这样的:
| Date | Payee | Amount | Balance | | 01/03/2000 | Burgers-R-Us | -5.00 | 120.00 | | 01/03/2000 | Check from Grandma | 50.00 | 125.00 | | 01/02/2000 | Platinum Gym | -25.00 | 75.00 | | 01/01/2000 | Starting Balance | 100 | 100.00 |
答案 0 :(得分:1)
向数据库添加一列以存储当前余额值,然后按所需的反向时间顺序对其进行操作。从存储的余额开始,作为表格第1行中Balance
列的值,然后从存储的余额中减去 trans_amt
值,并在下一个值中使用该值行。循环遍历所有行,您应该设置。
您可以按时间顺序(最旧 - >最新)顺序构建表格,然后在控制器中执行array_reverse()
,然后将其传递给视图以获得所需的反向时间顺序(最新 - >最旧)顺序。
在模型中,您需要将select语句更改为升序:
...
ORDER BY
trans_date
ASC
...
在您的控制器中,在将其关闭之前调用array_reverse()
方法:
public function index() {
$acct_id = $this -> uri -> segment(3);
$data['acct_balance'] = $this -> base -> account_balance($acct_id);
$data['register_table'] = $this -> read -> get_register($acct_id);
$data['accounts'] = $this -> base -> acct_list();
$sum = 0;
if (!empty($data['register_table'])) {
foreach ($data['register_table'] AS $ra) {
if (current($data['register_table']) == $data['register_table']) {
$sum = $ra['trans_amt'];
} else {
$sum = $sum + $ra['trans_amt'];
}
$array[] = array('clr_flag' => $ra['clr_flag'], 'trans_date' => $ra['trans_date'], 'disp_name' => $ra['disp_name'], 'chk_num' => $ra['chk_num'], 'cat_label' => $ra['cat_label'], 'trans_amt' => $ra['trans_amt'], $ra['sum'] = $sum);
}
$data['array'] = array_reverse($array); // <- Perform an array reverse here to flip the order
}
if ($this -> form_validation -> run() === FALSE) {
$this -> stencil -> paint('finance/view_register', $data);
} else {
redirect(base_url() . 'finance/view_register/' . $acct_id);
}
}
此外,虽然与问题直接无关,但为了便于阅读,您可以考虑将$sum
变量重命名为$balance
或$running_bal
,但是您的选择是您的程序。