Вопрос по mysql, php – Как создать Главную книгу / T-аккаунт с помощью PHP Mysql
Я пытаюсь создать систему финансового учета с двойной записью. Я завершил проектирование базы данных для него, пожалуйста, проверьте эту ссылку, чтобы увидеть диаграмму моей базы данных.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> </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> </td> <td>Total </td> <td><?echo $TotalAmount2 ; ?></td> </tr> </table> </code>General Ledger Sample

:)
.
halfer
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, которое нужно оптимизировать