login  Naam:   Wachtwoord: 
Registreer je!
 Forum

MySQL auto_increment. Verwijderde ID's opnieuw gebruiken

Offline XAXIS - 13/09/2006 10:27
Avatar van XAXISNieuw lid Beste mensen,

Ik heb een script geschreven die voor een bedrijf automatisch facturen aanmaakt. Elke factuur krijgt z'n eigen nummer, namelijk de auto_increment value die mysql aan een record geeft.

Nu is het van belang (voor de belastingdienst) dat de factuurnummers oplopend zijn. Tot nu toe geen probleem, mysql doet dit automatisch.

Echter, als ik een factuur verwijder ivm een verbetering, komt er dus een 'gap':
Factuur: 001, 002, 004, 005..

Bij een volgende factuur neemt mysql logischerwijs 006 als nummer. Maar dan gaat de belastingdienst moeilijk doen en vragen waar 003 is.

Is er een function te schrijven die het laagste, niet-gebruikte ID-value opzoekt en die gebruikt, dus dat de volgende factuur 003 wordt en de daaropvolgende factuur 006?

Hopelijk kunnen jullie me helpen!

Groeten, Kenneth

15 antwoorden

Gesponsorde links
Offline marten - 13/09/2006 10:45
Avatar van marten Beheerder Kijk eens in het forum. Hier is al genoeg over gevraagd.
Het makkelijkste is je hele tabel te legen en dan alles opnieuw toe te kennen. Waarschijnlijk is ooit eens de derde factuur toegevoegd maar is deze later verwijderd. Maar is het niet verstandiger om zelf een id mee te geven? (handmatig) Vooral als het zo precies komt met de belastingdienst?
Offline MechaVore - 13/09/2006 10:46
Avatar van MechaVore Gouden medaille

PHP gevorderde
Ik weet niet hoe je met mysql de waardes kan zien die nog niet ingevoerd zijn, dit kan je natuurlijk wel met php controleren, maar om nou bij elke insert query alle velden te controleren is een beetje onnodig. Je zou bijvoorbeeld wel een cronjob kunnen maken, die de hele tabel doorloopt en ze weer op goede volgorde neerzet. daarna zet je de auto increment op het goede getal (je telt gewoon alle vorige inserts) dmv ALTER TABLE tabel AUTO_INCREMENT = getal
Offline XAXIS - 13/09/2006 11:03
Avatar van XAXIS Nieuw lid De hele tabel legen is geen optie. De bestaande records dienen wel bewaard te blijven. Het droppen van enkel de auto_increment kolom is ook geen optie, aangezien de bestaande records wel dezelfde values dienen te houden.

Ik heb denk ik wel wat anders gevonden (voor mensen met dezelfde vragen).

Vóór de bewuste query die een nieuwe record toevoegt, voer je ALTER TABLE table AUTO_INCREMENT = 1 uit.
Volgens diverse sites zal Mysql dan proberen de record met ID = 1 toe te voegen, zien dat deze al bezet is en dan net zo lang doorgaan totdat ie een value vind die niet gebruikt word (de gap).

Ik ga dit uitproberen 
Offline Thomas - 13/09/2006 11:11
Avatar van Thomas Moderator Waarom pas je een factuur niet gewoon aan - waarom moet deze weggegooid worden? Als een factuur opnieuw gemaakt moet worden, dan lijkt het mij niet meer dan logisch dat aan dit factuur een nieuw nummer gehangen wordt. Misschien kun je een kolom opnemen in je tabel die aangeeft dat een factuur met een bepaald nummer een "correctie" is van een ouder (en wellicht niet langer bestaande, maar dan is er dus niet echt een punt) factuur?

Mji lijkt mij echter het aanpassen van een bestaande factuur logischer. Aan de andere kant, een factuur zou op een gegeven moment "definitief" moeten zijn en niet langer mogen wijzigen.
Offline XAXIS - 13/09/2006 11:18 (laatste wijziging 13/09/2006 11:19)
Avatar van XAXIS Nieuw lid Om maar even in de financiële termen te spreken.

Na het aanmaken van de PDF van een factuur mag deze inderdaad niet meer gewijzigd worden. En al helemaal niet als je de factuur al de deur uit hebt gedaan.

Stel, dat je factuur 003 aangemaakt hebt, maar in plaats 2.000 euro per ongeluk 20.000 hebt ingeklopt. Foutje van de zaak. Maar officieel zou je als bedrijf nog wel de BTW van de 20.000 moeten 'voorschieten' aan de belastingdienst. Dus wat doe je? Je maakt een nieuwe factuur aan, die dan jammer genoeg 006 als nummer krijgt, en verwijderd de oude.

De belastingdienst komt aan het eind van 2006 even controleren en merkt dat er een sequence-foutje in je factuurnummering zit. Ze gaan zich dan afvragen waar factuur 003 is, en dan alsnog die 20.000 factureren.

Dat is zo'n beetje de werkwijze.

Ontopic weer:
Ik kan natuurlijk handmatig factuurnummers genereren, maar dan krijg je waarschijnlijk dezelfde probleem. Want dan moet ik alsnog een script/function schrijven die zoekt naar het laagste, niet-gebruikte factuurnummer...

En dat ALTER TABLE van m'n laatste post, wil niet echt lukken blijkbaar  
Offline Thomas - 13/09/2006 11:37 (laatste wijziging 13/09/2006 11:38)
Avatar van Thomas Moderator In dat geval zou ik het auto-increment veld zo maken, dat hier alleen id's in zitten (1, 2, 3, 4, ...) en van dat volgnummer een zelf in te vullen tekstveld maken wat je wel kunt aanpassen.

De laatste (meest recente) factuur bij een bepaald volgnummer is dan de factuur met het hoogste auto-increment id, bijv.:

id, factuurnr
1, 001
2, 002
...
5, 001 <-- laatste factuur met volgnummer 001

Als default waarde voor het zelf in te vullen factuur-nummer-veld zou je dan dus het maximale factuur-nummer + 1 kunnen nemen.
Offline XAXIS - 13/09/2006 11:47
Avatar van XAXIS Nieuw lid Als ik het goed begrijp (had je post een paar keer over moeten lezen) krijg je dan dit:

ID, Factuurnummer
1, 001
2, 002
3, 003
4, 004

En dan verwijder ik factuur 003 (DELETE... WHERE factuurnummer = 003).. Dan krijg ik dus..

1, 001
2, 002
4, 004

Dan maak ik een nieuwe factuur aan, op basis van het max. factuurnummer+1:

1, 001
2, 002,
4, 004
5, 005 (004+1)

Dezelfde probleem lijkt mij? Of bedoelde je het anders?
Offline Skelton - 13/09/2006 11:53
Avatar van Skelton Nieuw lid Een factuur mag nooit verwijderd worden, als hier een fout opstaat moet je dit bekend maken met een creditnota ;)
Offline XAXIS - 13/09/2006 11:56 (laatste wijziging 13/09/2006 11:57)
Avatar van XAXIS Nieuw lid een 'uitgegeven' factuur mag inderdaad nooit verwijderd worden.
Als je een factuur aanmaakt met per ongeluk de verkeerde adresgegevens of iets dergelijks, mag je deze heus wel door de shredder halen en een nieuwe aanmaken, als de factuurnummers maar kloppen 
Offline Thomas - 13/09/2006 11:57
Avatar van Thomas Moderator Dan maak je een nieuwe aan, waarbij je het factuurnummer manueel verandert van 005 (eerste vrije fact.nr.) naar 003 (de factuur die het betrof).
Offline marten - 13/09/2006 12:45
Avatar van marten Beheerder Factuurnummers auto increment maken is nooit handig.
Offline CDNC - 13/09/2006 16:02 (laatste wijziging 13/09/2006 16:03)
Avatar van CDNC PHP ver gevorderde Als het nu echt héél veel facturen zijn, en er is geen heel laag vrij id, dan gaan er wel lekker veel query's uitgevooert worden.
dan kun je misschien $l wat hoger zetten.
  1. <?
  2.  
  3. /*
  4.  * auto_increment er af gooien en devolegnden functie het laagste vrije id bepalen
  5.  * $t = table, de tabel van het egbeuren
  6.  * $v = het id-veld
  7.  * $l = het laagte mogelijk id
  8.  * returnt = integer met de juiste waarden voor het veld $v
  9.  */
  10. function GetLowestId($t, $v, $l = 1)
  11. {
  12.  
  13. /*
  14.   * het huidge hoogte id
  15.   */
  16. $hidSQLq = mysql_query("SELECT ". $v ." FROM ". $t ." ORDER ". $v ." DESC LIMIT 0, 1");
  17. $hidSQLf = mysql_fetch_Assoc($hidSQLq);
  18. mysql_free_result($hidSQLq);
  19.  
  20. /*
  21.   * loopen total we het hoogte id hebben berijkt
  22.   */
  23. for($i = $l; $i < $hidSQLf[$v]; $i)
  24. {
  25.  
  26. /*
  27. * tellen hoeveel id's er zijn met de waarden van $i
  28. */
  29. $gliSq = mysql_query("SELECT COUNT(". $v .") FROM ". $t ." WHERE ". $v ." = ". $i);
  30. $gliSr = mysql_result($gliSs, 0);
  31.  
  32. /*
  33. * als het id niet betstaat en dus kleiner is dan het hoogte, loop vroegtijdig
  34. * afbreken en dan hebben we ook mee laagste vrije id, return dan $i
  35. */
  36. if($gliSr == 0)
  37. {
  38.  
  39. return $i;
  40. break;
  41.  
  42. }
  43.  
  44. /*
  45. * als $i gelijk is aan het hoogte id dat was opgehaalt, hebben we geen lager
  46. * vrij id meer, dan moeten we hethoogte is + 1 returnen
  47. */
  48. if($gliSr == $hidSQLf[$v])
  49. {
  50.  
  51. return ($hidSQLf[$v] + 1);
  52.  
  53. }
  54.  
  55. }
  56.  
  57. }
  58.  
  59. ?>

Ik heb de functie ook niet getest, maar ik vermoed dat ie werkt.
Offline ikkedikke - 13/09/2006 16:08
Avatar van ikkedikke PHP expert kan je niet iets doen van
INSERT INTO `tabel` VALUES(MAX(SELECT id from `tabel`))
Offline XAXIS - 15/09/2006 15:02 (laatste wijziging 15/09/2006 15:03)
Avatar van XAXIS Nieuw lid Ik heb een tussentijdse (niet al te schone ) oplossing geimplementeerd.

Als je een factuur verwijderd, schrijft ie dit nummer weg in de config-database van mijn script.

Bij het aanmaken van een nieuwe factuur kijkt ie eerst of er een nummer is wat ie moet gebruiken.
Zo ja, dan gebruikt ie dat nummer, zo niet, dan gebruikt ie gewoon auto_increment.

Het is een oplossing wat waarschijnlijk niet de netste manier is, maar het werkt 
Offline Gerard - 15/09/2006 15:03
Avatar van Gerard Ouwe rakker Waarom is het niet mogelijk om een (al aangemaakte) verkeerde factuur gewoon aan te passen?
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.197s