2

複式簿記の財務会計システムを作ろうとしています。データベースの設計が完了しました。このリンクをチェックして、データベースの図を確認してください。http://i39.tinypic.com/juhbv6.png

総勘定元帳を生成するためにmysqlクエリを開発するために多くのことを試みましたが、どこにも近づきませんでした。私が何とかしてやったのは、無制限のアカウント用に作成する必要がある1つのアカウント用の元帳を作成することだけです。

私が試したクエリは次のとおりです。

 $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アカウントからASAccountHeadを取得accounts.codeします。

  2. テーブルdebit_sideに移動しget debit_side.account_code、if debit_side.account_code= accounts.codethen get credit_side.account_codeAS AccountName1(ただし、phpでエコーする場合は、コード自体ではなく名前を取得したい)およびcredit_side.amountAS Amount1、SUM(credit_side.amount)AS TotalAmount1 from credit_sidewhere debit_side.transaction_id_dr= credit_side.transaction_id_cr and transaction_info.voucher_dateis between date1 and date2 WHERE transaction_info.transaction_id==debit_side.transaction_id_dr

  3. 2番目のステップを完了した後、テーブルに移動しcredit_sideget credit_side.account_codeif
    = credit_side.account_codethen accounts.codeget debit_side.account_codeAS AccountName2(ただし、phpでエコーする場合は、コード自体ではなく名前を取得したい)およびdebit_side.amountAS Amount2、SUM(debit_side.amount)AS TotalAmount2 from debit_sidewhere credit_side.transaction_id_cr= debit_side.transaction_id_dr and transaction_info.voucher_dateis in date1とdate2の間WHERE 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>

総勘定元帳のサンプル

ここに画像の説明を入力してください

4

1 に答える 1

5
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();
}

返信が遅くなって申し訳ありませんが、これは何かをする前にテストしたい完璧なものです。このためのビューファイルを作成したかったのですが、複雑で時間がかかるようです。

編集済み

このソリューションは、私がテストしたので、あなたを悩ませているかもしれません。しかし、これら2つのクエリを組み合わせようとして、成功しました。クエリは複雑に見えるかもしれませんが、完璧な結果を取得しています。ここにあります

$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();

このクエリは正常に機能しますが、これはこのクエリの修正および最適化されたバージョンですが、このクエリから実際に学んだことは、これも確認する必要があります

最適化する必要があるQueryでのGroupbyの奇妙な動作

于 2012-04-17T14:37:13.733 に答える