Door
Brecht S
op 31-12-2014 10:13
gewijzigd op 31-12-2014 10:23
4.142 views
Ik weet dat dit topic al overal te vinden is maar kom niet aan een passende oplossing toe.
Dus ik wil factuurnummers automatisch laten verhogen maar dat kan niet met een auto-increment omdat ik die al gebruik voor mijn id field. Blijkbaar kan ik geen twee keer een auto-increment doen in dezelfde tabel?
Ik heb dus een tabel facturen met volgende velden:
ID titel aantal omschrijving e_prijs tot factnr
1 Test1 1 Testfactuur 1 100 100 ?
2 Test2 3 Testfactuur 2 100 200 ?
Hoe vul ik nu het beste de ? in? Met welke query?
Het formaat zou moeten 2015/001/VF zijn. Waarbij 2015 het jaar, 001 (moet telkens verhoogd worden met 1) het factnr zelf en VF zou moeten staan voor voorschotfactuur maar dit kan evengoed TF = tussentijdse factuur, RF = regie factuur, SF = slotfactuur.
Sorry vergeten vermelden. Het formaat zou moeten 2015/001/VF zijn. Waarbij 2015 het jaar, 001 (moet telkens verhoogd worden met 1) het factnr zelf en VF zou moeten staan voor voorschotfactuur maar dit kan evengoed TF = tussentijdse factuur, RF = regie factuur, SF = slotfactuur.
[size=xsmall]Toevoeging op 31/12/2014 10:31:35:[/size]
Ik had al zitten denken om zoiets te doen:
$seqnr = 001 + 1;
$factnr = '2015/'.$seqnr.'/VF
Maar hier krijg ik een probleem. Als de volgende factuur dan achteraan RF krijgt komt het volgnr (001+1) niet meer juist. Dus moet ik iets met een MAX(seqnr) of zo gaan doen? En uiteraard 2 mysql fields aanmaken in dezelfde tabel die het nummer moeten samenstellen?
[size=xsmall]Toevoeging op 31/12/2014 10:33:18:[/size]
START TRANSACTION;
SET @billno = (SELECT COALESCE(MAX(b_seq_no), 0) + 1 FROM billing WHERE b_year = YEAR(CURRENT_DATE) FOR UPDATE);
INSERT INTO billing (b_year, b_seq_no, blabla) VALUES (YEAR(CURRENT_DATE), @billno, 'omschrijving');
COMMIT;
Dit werkt helemaal niet. Of is het niet dat wat je bedoelde. Ik had dit al bekeken. Is dit normale php code?
Je moet, wettelijk verplicht, de volledige factuurdatum vermelden en dus opslaan (en niet slechts het factuurjaar). Uit de factuurdatum kun je met bijvoorbeeld de MySQL-functie YEAR() dus vervolgens ook het prefix 2015/ afleiden.
Maar hier krijg ik een probleem. Als de volgende factuur dan achteraan RF krijgt komt het volgnr (001+1) niet meer juist. Dus moet ik iets met een MAX(seqnr) of zo gaan doen? En uiteraard 2 mysql fields aanmaken in dezelfde tabel die het nummer moeten samenstellen?
Wat denk je dat $segnr oplevert? Voorloopnullen kun je niet in een database (als getal) opslaan. Wel als text, maar daar kun je dan weer geen 1 bij optellen.
Bij $factnr heb je het jaar hard gecodeerd. Betekent dus dat je elk jaar moet aanpassen?!
Het jaar kun je afleiden uit de factuurdatum. Maak een kolom met daarin het soort factuur en een kolom met nummer. Vervolgens haal je, voor je een nieuwe factuur toevoegt, het laatste nummer op voor de combinatie jaar / factuursoort en telt daar 1 bij op. Die schrijf je weg in de database.
Ger kan dat, ongetwijfeld, in 1 query.
Nice, maar als je toch een aparte tabel gaat toevoegen, dan kun je ook die ook gebruiken voor de facturen mét AUTO_INCREMENT op de primaire sleutel voor het volgnummer?
Om het niet ingewikkelder te maken dan het is: het volgende factuurnummer kun je berekenen met een (sub)query zoals SELECT GREATEST(invoice_number) + 1 AS next_invoice_number.