[php,mysqli] Overzicht boekhouding maken
Er zijn verschillende categorien die onderverdeeld moeten worden.
Er staan de volgende lijnen in mijn tabel
user_id price from_name to_name type (0 = debet, 1 = credit)
1 2000 Bank Inventaris 0
1 2000 Inventaris Bank 1
1 5000 Bank Kas 0
1 5000 Kas Bank 1
Nu wil ik het volgende bereiken;
BANK
Omschrijving Naar DEBET CREDIT
Nieuwe kast gekocht Inventaris €2.000
Geld opgenomen Kas €5.000
Inventaris
Omschrijving Naar DEBET CREDIT
Nieuwe kast gekocht BANK €2.000
KAS
Omschrijving Naar DEBET CREDIT
Geld opgenomen BANK €5.000
Ik zoek hiervoor dat hij eerst een overzicht maakt van alle categorien (die hoeft die dus maar 1x te laten zien)
En daarna gaat hij verder in de tabel zoeken naar de tegenrekening.
Ik hoop dat dit allemaal duidelijk is.
Alvast bedankt voor de medewerking
b) een boekhouding is technisch gezien niets anders als een lange lijst met transacties van de ene grootboek naar de andere. een uitzondering zijn de saldi want die hebben geen tegenrekening.
Hier een test database-dump en een query die alle BANK transacties laat zien in 2016:
Code (php)
1
2
3
4
2
3
4
SELECT t.datum, t.omschrijving, g.naam AS tegenrekening, t.bedrag FROM transactions t
LEFT JOIN grootboeken g ON g.id = t.tegenrekening
WHERE t.rekening=2 AND YEAR(t.datum)=2016
ORDER BY t.datum
LEFT JOIN grootboeken g ON g.id = t.tegenrekening
WHERE t.rekening=2 AND YEAR(t.datum)=2016
ORDER BY t.datum
edit:
en een query om je banksaldo te berekenen:
Code (php)
1
2
2
SELECT SUM(transactions.bedrag) AS saldo FROM transactions
WHERE transactions.rekening=2
WHERE transactions.rekening=2
en om alle saldi op te halen:
Code (php)
1
2
3
2
3
SELECT grootboeken.naam, SUM(transactions.bedrag) AS saldo FROM transactions
JOIN grootboeken ON transactions.rekening=grootboeken.id
GROUP BY transactions.rekening
JOIN grootboeken ON transactions.rekening=grootboeken.id
GROUP BY transactions.rekening
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
-- phpMyAdmin SQL Dump
-- version 4.4.15.2
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Gegenereerd op: 09 jan 2016 om 12:27
-- Serverversie: 5.5.44-MariaDB
-- PHP-versie: 5.6.16
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Database: `test`
--
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `grootboeken`
--
CREATE TABLE IF NOT EXISTS `grootboeken` (
`id` int(11) NOT NULL,
`naam` varchar(64) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Gegevens worden gexporteerd voor tabel `grootboeken`
--
INSERT INTO `grootboeken` (`id`, `naam`) VALUES
(1, 'Kas'),
(2, 'Bank'),
(3, 'Inventaris');
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `transactions`
--
CREATE TABLE IF NOT EXISTS `transactions` (
`id` int(11) NOT NULL,
`datum` date NOT NULL,
`omschrijving` varchar(128) NOT NULL,
`tegenrekening` int(11) DEFAULT NULL,
`rekening` int(11) NOT NULL,
`bedrag` decimal(10,2) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
--
-- Gegevens worden gexporteerd voor tabel `transactions`
--
INSERT INTO `transactions` (`id`, `datum`, `omschrijving`, `tegenrekening`, `rekening`, `bedrag`) VALUES
(1, '2016-01-01', 'Saldo', NULL, 1, 500.00),
(2, '2016-01-01', 'Saldo', NULL, 2, 18500.00),
(3, '2016-01-02', 'Naar Bank', 1, 2, 300.00),
(4, '2016-01-02', 'Naar Bank', 2, 1, -300.00);
--
-- Indexen voor gexporteerde tabellen
--
--
-- Indexen voor tabel `grootboeken`
--
ALTER TABLE `grootboeken`
ADD PRIMARY KEY (`id`);
--
-- Indexen voor tabel `transactions`
--
ALTER TABLE `transactions`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT voor gexporteerde tabellen
--
--
-- AUTO_INCREMENT voor een tabel `grootboeken`
--
ALTER TABLE `grootboeken`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=4;
--
-- AUTO_INCREMENT voor een tabel `transactions`
--
ALTER TABLE `transactions`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=5;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
-- version 4.4.15.2
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Gegenereerd op: 09 jan 2016 om 12:27
-- Serverversie: 5.5.44-MariaDB
-- PHP-versie: 5.6.16
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- Database: `test`
--
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `grootboeken`
--
CREATE TABLE IF NOT EXISTS `grootboeken` (
`id` int(11) NOT NULL,
`naam` varchar(64) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Gegevens worden gexporteerd voor tabel `grootboeken`
--
INSERT INTO `grootboeken` (`id`, `naam`) VALUES
(1, 'Kas'),
(2, 'Bank'),
(3, 'Inventaris');
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `transactions`
--
CREATE TABLE IF NOT EXISTS `transactions` (
`id` int(11) NOT NULL,
`datum` date NOT NULL,
`omschrijving` varchar(128) NOT NULL,
`tegenrekening` int(11) DEFAULT NULL,
`rekening` int(11) NOT NULL,
`bedrag` decimal(10,2) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
--
-- Gegevens worden gexporteerd voor tabel `transactions`
--
INSERT INTO `transactions` (`id`, `datum`, `omschrijving`, `tegenrekening`, `rekening`, `bedrag`) VALUES
(1, '2016-01-01', 'Saldo', NULL, 1, 500.00),
(2, '2016-01-01', 'Saldo', NULL, 2, 18500.00),
(3, '2016-01-02', 'Naar Bank', 1, 2, 300.00),
(4, '2016-01-02', 'Naar Bank', 2, 1, -300.00);
--
-- Indexen voor gexporteerde tabellen
--
--
-- Indexen voor tabel `grootboeken`
--
ALTER TABLE `grootboeken`
ADD PRIMARY KEY (`id`);
--
-- Indexen voor tabel `transactions`
--
ALTER TABLE `transactions`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT voor gexporteerde tabellen
--
--
-- AUTO_INCREMENT voor een tabel `grootboeken`
--
ALTER TABLE `grootboeken`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=4;
--
-- AUTO_INCREMENT voor een tabel `transactions`
--
ALTER TABLE `transactions`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=5;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
Gewijzigd op 09/01/2016 12:37:43 door Frank Nietbelangrijk
Maar ik heb het maar in 1 tabel staan.
Want anders moet ik continu controleren of het desbetreffende grootboekrekening al bestaat voordat die het invult.
Enig idee hoe ik dit moet doen dan?
Ik zou overwegen een dropdown te gebruiken voor de grootboekrekeningen, of een autocomplete (een stuk ingewikkelder).
Code (php)
1
2
3
4
5
2
3
4
5
<select>
<option value="1">Kas</option>
<option value="2">Bank</option>
<option value="3">Inventaris</option>
</select>
<option value="1">Kas</option>
<option value="2">Bank</option>
<option value="3">Inventaris</option>
</select>
Zelfs met een dropdown kan een gebruiker er nog voor zorgen dat je een ongeldige grootboek-id terug krijgt.
controleren is simpel te doen met een eenvoudige query:
Levert de query een rij op dan is het een bestaande grootboekrekening. Levert de query nul rijen op dan is het een foutief id. (mysqli_num_rows)