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.


Hetzelfde topic is door mij ook gepost op http://www.pfz.nl/forum/topic/11035-factuurnummers-en-mysql/
Je kan deze toch ook met PHP genereren? Vaak wordt er gewoon een datum aan toegevoegd met een oplopend nummertje, zoals

3112201401 Uiteraard zet je op die kolom wel een UNIQUE.

Hm, kan ook met MySQL zie ik. Onze databasegoeroe Ger heeft er een mooie query voor gebrouwen ;-)

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.
Brecht S op 31/12/2014 10:23:11

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?

Dat is een MySQL query met exotische variabelen en functies.

@Ward: dit is me wel duidelijk, ja. Ik zal dat later wel nog een beetje aanpassen als ik door mijn basis probleem ben ;-) Kan je me daarmee helpen?

Het prefix 2015 kan ik met YEAR() doen of met date('Y') in een variable

[size=xsmall]Toevoeging op 31/12/2014 10:46:20:[/size]

@Aar: ik krijg foutmeldingen op START TRANSACTION; en COMMIT; en die SET ... dus dit werkt niet. Is toch geen gewone php?
Ik zou het factuurkenmerk opsplitsen in drie kolommen:

- factuurdatum (waarvan het jaar het prefix wordt);
- uniek volgnummer;
- type-aanduiding (het postfix).
Brecht S op 31/12/2014 10:23:11

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?

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.

Ik ben gewend om in Oracle met sequences te werken maar helaas kent MySQL dat (nog) niet. Ik heb dat in MySQL nagebouwd middels een functie:

CREATE FUNCTION seq(seq_name char(20)) returns int begin  UPDATE seq SET val=last_insert_id(val+1) WHERE name=seq_name;  RETURN last_insert_id();

Met bijbehorende tabel:

mysql> desc seq
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| name  | varchar(20)      | NO   | PRI | NULL    |       |
| val   | int(10) unsigned | NO   |     | NULL    |       |
+-------+------------------+------+-----+---------+-------+

en met (als voorbeeld):

SELECT seq('nextval') as nextval;

vraag je een factuurnummer op waarbij tevens het factuurnummer in het tabelletje automatisch opgehoogd wordt.


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.
@Obelix: ik kan volgende doen:


$year = date('Y');
$seqnr = ???
$value = 'VF';

Dat steek ik dan in 3 verschillende kolommen in mysql. Maar alleen is me niet duidelijk wat ik dan moet doen met de $seqnr???

[size=xsmall]Toevoeging op 31/12/2014 11:22:47:[/size]

@Ward: kan je eens een voorbeeld geven van een volledig werkende query die ik voor dit kan gebruiken? Ben hier niet meer goed mee.

Is dit dan zoiets als:

$value = 'VF';
$year = date('Y');

INSERT INTO facturen (year, seqnr, value) VALUES ('$year', (SELECT GREATEST(seqnr) + 1 AS next_invoice_number), '$value')

Reageren