Вопрос по mysql, php – Как создать Главную книгу / T-аккаунт с помощью PHP Mysql

2

Я пытаюсь создать систему финансового учета с двойной записью. Я завершил проектирование базы данных для него, пожалуйста, проверьте эту ссылку, чтобы увидеть диаграмму моей базы данных.http://i39.tinypic.com/juhbv6.png

Я много пытался разработать запрос mysql для создания главной книги, но я не дошел до цели. Все, что мне удалось сделать, это создать бухгалтерскую книгу только для одной учетной записи, которую я должен создать для неограниченной учетной записи.

Запрос, который я пробовал, следующий:

<code> $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');
</code>

После неудачной попытки написать запрос mysql, который может создать бухгалтерскую книгу для всех учетных записей, я записал логику создания учетной записи в Главной книге / T.

Теперь, не могли бы вы помочь мне с запросом MySQL?

Пожалуйста, проверьте базу данных, прежде чем пройти через следующее. Заранее спасибо :)

Get the accounts.name AS AccountHead, accounts.code from accounts.

Go to the table debit_side and get debit_side.account_code, if debit_side.account_code=accounts.code then get credit_side.account_code AS AccountName1 (but when I will echo in php, I want to get the name instead of the code itself) and credit_side.amount AS Amount1, SUM(credit_side.amount) AS TotalAmount1 from credit_side where debit_side.transaction_id_dr=credit_side.transaction_id_cr and transaction_info.voucher_date is in between date1 and date2 WHERE transaction_info.transaction_id=debit_side.transaction_id_dr

After completing the second step go to the table credit_side and get credit_side.account_code,
if credit_side.account_code=accounts.code then get debit_side.account_code AS AccountName2 (but when I will echo in php, I want to get the name instead of the code itself) and debit_side.amount AS Amount2, SUM(debit_side.amount) AS TotalAmount2 from debit_side where credit_side.transaction_id_cr=debit_side.transaction_id_dr and transaction_info.voucher_date is in between date1 and date2 WHERE transaction_info.transaction_id=credit_side.transaction_id_cr

Теперь в файле представления я стремлюсь иметь следующее:

<code>   <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>
</code>

General Ledger Sample enter image description here

Прошу прощения, .. хорошо, я собираюсь удалить ненужные вещи. black_belt
Я думаю, что этот вопрос, вероятно, слишком локализован (а также слишком длинный). Не могли бы вы отредактировать его, чтобы сузить точную проблему, с которой вы столкнулись? Люди не будут загружать ваш SQL-код с сайта загрузки (вместо этого используйте pastie.org) и читать PDF-файлы - это облегчит работу ваших читателей и сделает его намного более лаконичным:). halfer

Ваш Ответ

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

но это идеальная вещь, которую вы хотите проверить, прежде чем что-то делать. я хотел создать файл представления для этого, но это кажется сложным и занимает больше времени, что в настоящий момент я

РЕДАКТИРОВАНИЕ

Возможно, это решение заставит вас задуматься над тем, как я его тестировал. Как бы я ни пытался объединить эти два запроса, и все получилось. Запрос может выглядеть как нечто сложное, но он приносит идеальные результаты. Вот

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

Хотя этот запрос работает нормально, но вот модифицированная и оптимизированная версия этого запроса, я действительно узнал кое-что из этого запроса, вы должны взглянуть на это тоже

Странное поведение Group by в Query, которое нужно оптимизировать

Рахил Шан Я обновил свой вопрос, пожалуйста, проверьте его? black_belt
Хорошо, я собираюсь редактировать этот вопрос сейчас. :) black_belt
спасибо, Рахил Шен, я попробовал твой код; результат, который он производит, не является главной книгой. Я пытаюсь выяснить проблему, я вернусь с докладом очень скоро. :) Спасибо :) black_belt
хорошо, отредактируйте этот вопрос, но не удаляйте предыдущие данные, которые могут помочь
@ Рахил Шан. Я играл с вашим сценарием, но не смог заставить его работать, поэтому на этот раз я записал логику для достижения того, чего я пытаюсь достичь. Я полагаю, что на этот раз вы сможете решить проблему, и поскольку письменная логика даст вам точное представление о том, что я искал. Так я должен опубликовать его как новый вопрос или отредактировать этот вопрос? Пожалуйста, ответьте. Спасибо :) black_belt

Похожие вопросы