【问题标题】:How to create General Ledger/T-Account using PHP Mysql如何使用 PHP Mysql 创建总帐/T-Account
【发布时间】:2012-04-17 12:43:18
【问题描述】:

我正在尝试创建复式财务会计系统。我已经完成了它的数据库设计,请查看此链接以查看我的数据库图表。 http://i39.tinypic.com/juhbv6.png

我已经尝试了很多来开发 mysql 查询来生成总帐,但我没有接近。我所做的只是为一个帐户创建分类帐,而我必须为无限帐户创建。

我尝试过的查询如下:

 $this->db->select('*');
    $this->db->from('credit_side');
    $this->db->join('debit_side', ' debit_side.transaction_id_dr = credit_side.transaction_id_cr ');
    $this->db->join('transaction_info', 'transaction_info.transaction_id = credit_side.transaction_id_cr ');
    $this->db->join('accounts', 'accounts.code = credit_side.account_code ');
    $this->db->where('debit_side.account_code', '1001'); 
    $this->db->order_by('voucher_date','ASC');

在编写可以为所有帐户生成分类帐的 mysql 查询失败后,我写下了创建总帐/T 帐户的逻辑。

现在,请您帮我查询一下 mysql 吗?

请在执行以下操作之前检查数据库。 提前致谢:)

  1. 从帐户中获取 accounts.name AS AccountHead、accounts.code

  2. 转到表debit_sideget debit_side.account_code, 如果debit_side.account_code=accounts.code 然后得到credit_side.account_code AS AccountName1(但是当我将在php中回显时,我想获取名称而不是代码本身)和credit_side.amount AS Amount1,SUM(credit_side.amount) AS TotalAmount1来自@ 987654333@ 其中debit_side.transaction_id_dr=credit_side.transaction_id_cr 并且transaction_info.voucher_date 在 date1 和 date2 之间 在哪里transaction_info.transaction_id=debit_side.transaction_id_dr

  3. 完成第二步后转到表credit_sideget credit_side.account_code,
    如果credit_side.account_code=accounts.code 然后得到debit_side.account_code AS AccountName2(但是当我在php中回显时,我想获取名称而不是代码本身)和debit_side.amount AS Amount2,SUM(debit_side.amount) AS TotalAmount2 from @ 987654346@credit_side.transaction_id_cr=debit_side.transaction_id_dr 并且transaction_info.voucher_date 在 date1 和 date2 之间 在哪里transaction_info.transaction_id=credit_side.transaction_id_cr

现在在视图文件中,我的目标是:

   <table width="200" border="0">
     <tr><td colspan="5">Account Head <?echo $AccountHead ; ?> </td> </tr>


    <tr>
           <td>Dr.</td>
           <td>amount.</td>
            <td>&nbsp;</td>
           <td>Cr</td>
          <td>Amount</td>

    </tr>
     <tr>
       <td><?echo $AccountName1 ; ?></td>
       <td><?echo $Ammount1 ; ?></td>
      <td></td>
 <td><?echo $AccountName2 ; ?></td>
     <td><?echo $Ammount2 ; ?></td>

     </tr>

     <tr>
     <td>Total</td>
     <td><?echo $TotalAmount1 ; ?></td>
     <td>&nbsp;</td>
 <td>Total  </td>
 <td><?echo $TotalAmount2 ; ?></td>

     </tr>
     </table>

总帐样本

【问题讨论】:

  • 我认为这个问题可能过于本地化(以及太长)。您可以对其进行编辑以缩小您遇到的确切问题吗?人们不会从下载站点(使用 paste.org 代替)下载您的 SQL,也不会阅读 PDF - 让您的读者更轻松,更简洁 :)
  • 对不起,..好的,我要删除不必要的东西。

标签: php mysql codeigniter accounting


【解决方案1】:
public function getDebits(){    
    $data   =   array(
                'debit_side.account_code DebitCode',
                'group_concat(distinct accounts.name) as DebitAccount',
                'group_concat(debit_side.amount) as DebitAmount',
                'group_concat(transaction_info.voucher_date) as DebitVoucherDate'
                );
    $this->db->select($data);
    $this->db->from('accounts');
    $this->db->join('credit_side','accounts.code = credit_side.account_code','left');
    $this->db->join('debit_side','debit_side.transaction_id_dr = credit_side.transaction_id_cr','left');
    $this->db->join('transaction_info','transaction_info.transaction_id = credit_side.transaction_id_cr','left');
    $this->db->group_by('debit_side.account_code');
    $this->db->order_by('debit_side.account_code','ASC');
    $query  =   $this->db->get();
    return  $query->result_array();
}


public  function getCredits()
{
    $data   =   array(
                'credit_side.account_code CreditCode',
                'group_concat(distinct accounts.name) as CreditAccount',
                'group_concat(credit_side.amount) as CreditAmount',
                'group_concat(transaction_info.voucher_date) as CreditVoucherDate'
                );
    $this->db->select($data);
    $this->db->from('accounts');
    $this->db->join('debit_side','accounts.code = debit_side.account_code','left');
    $this->db->join('credit_side','debit_side.transaction_id_dr = credit_side.transaction_id_cr','left');
    $this->db->join('transaction_info','transaction_info.transaction_id = credit_side.transaction_id_cr','left');
    $this->db->group_by('credit_side.account_code');
    $this->db->order_by('credit_side.account_code','ASC');
    $query  =   $this->db->get();
    return  $query->result_array();
}

抱歉回复晚了,但这是您在做任何事情之前想要测试的完美东西。我想为此创建一个视图文件,但它似乎很复杂并且需要更多时间,目前我正在湖

已编辑

这个解决方案可能会在我测试过的视图中让您感到厌烦,但是我曾经尝试将这两个查询结合起来并成功了。该查询可能看起来很复杂,但它正在获取完美的结果。 在这里

$data   =   array(
                  'debit_side.account_code    Code',
                  'group_concat(distinct accounts.name) as DebitAccount',
                  'group_concat(debit_side.amount) as DebitAmount',
                  'group_concat(transaction_info.voucher_date) as DebitVoucherDate',
                  '(SELECT group_concat(distinct accounts.name) as CreditAccount FROM (accounts)
                    left JOIN debit_side ON accounts.code = debit_side.account_code
                    left JOIN credit_side ON debit_side.transaction_id_dr = credit_side.transaction_id_cr
                    left JOIN transaction_info ON transaction_info.transaction_id = credit_side.transaction_id_cr
                    group by credit_side.account_code
                    having credit_side.account_code = `Code`) as CreditAccount',
                  '(SELECT  group_concat(credit_side.amount) as CreditAmount FROM (accounts)
                     left JOIN debit_side ON accounts.code = debit_side.account_code
                     left JOIN credit_side ON debit_side.transaction_id_dr = credit_side.transaction_id_cr
                     left JOIN transaction_info ON transaction_info.transaction_id = credit_side.transaction_id_cr
                   group by credit_side.account_code
                   having credit_side.account_code = `Code`) as CreditAmount',  
                  '(SELECT  group_concat(transaction_info.voucher_date) as CreditVoucherDate FROM (accounts)
                    left JOIN debit_side ON accounts.code = debit_side.account_code
                    left JOIN credit_side ON debit_side.transaction_id_dr = credit_side.transaction_id_cr
                    left JOIN transaction_info ON transaction_info.transaction_id = credit_side.transaction_id_cr
                    group by credit_side.account_code
                    having credit_side.account_code = `Code`) as CreditVoucherDate'

                );
    $this->db->select($data);
    $this->db->from('accounts');
    $this->db->join('credit_side','accounts.code = credit_side.account_code','left');
    $this->db->join('debit_side','debit_side.transaction_id_dr = credit_side.transaction_id_cr','left');
    $this->db->join('transaction_info','transaction_info.transaction_id = credit_side.transaction_id_cr','left');
    $this->db->group_by('debit_side.account_code');
    $this->db->order_by('debit_side.account_code','ASC');
    $query  =   $this->db->get();
    return  $query->result_array();

虽然这个查询工作正常,但这里是这个查询的修改和优化版本,我真的从这个查询中学到了东西,你也应该看看这个

Strange Behaviour of Group by in Query which needs to be optimized

【讨论】:

  • 感谢 raheel shan,我已经尝试过您的代码;它产生的结果不是总账。我正在努力找出问题所在,我很快就会带着报告回来。 :) 谢谢 :)
  • @raheel shan。我一直在玩你的脚本,但无法让它工作,所以这次我写下了实现我想要实现的目标的逻辑。我相信这次你可以解决问题,因为书面逻辑会给你一个确切的想法,我一直在寻找什么。那么我应该将它作为一个新问题发布还是编辑这个问题?请回复。谢谢:)
  • 确定编辑这个问题,但不要删除之前可能有帮助的数据
  • Raheel Shan 我已经更新了我的问题,请检查一下好吗?
  • 能否请您上传一张有借方和贷方的图片以及帐户名称,以便我可以形成它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 2017-01-10
  • 2011-07-18
  • 2014-04-07
相关资源
最近更新 更多