Results 1 to 14 of 14

Thread: Een volgnummer herbruiken

  1. #1
    Senior Member
    Join Date
    Mar 2005
    Location
    Bassenge
    Posts
    424

    Een volgnummer herbruiken

    Lazarus 2.6.1 --- Firebird 3.0


    Ik vul een tabel op met een aantal records. Ieder record heeft ook een uniek volgnummer. Ik kan ook records verwijderen. Als ik weer een nieuw record toevoeg in de tabel dan wil ik het volgnummer van het verwijderde record hergebruiken.

    Welke methode / delphi code is hiervoor aangewezen ?

    Dank bij voorbaat

  2. #2
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,085
    Zelf een routine maken om te kijken welke ontbreek in de lijst, of een lijst bijhouden welke records verwijderd worden.

    Maar wat is er mis met het eerstvolgende record toevoegen met het bijbehorende nummer?
    Zeker met een AutoIncr weet je nagenoeg zeker dat het om een uniek nummer gaat, een Integer geeft toch minstens al 2,147,483,647 verschillende getallen :-)
    Als je zelf nummers gaat hergebruiken en deze ook op een andere plaats gebruikt, loopt je altijd een risico op verkeerd gekoppelde gegevens.
    Ik ben van mening dat je altijd moet doornummeren, tenzij je een record niet verwijderd maar wijzigt, want dat is eigenlijk wat je dan doet.

    Peter
    Last edited by Wok; 26-Feb-17 at 23:23.
    10.4.2, Delphi2010, of Lazarus 2.2.0

  3. #3
    Ik gebruik een veld LINKNUMMER in al mijn tabellen. Dit is een BIGINT en wordt door een GENERATOR en TRIGGER automatisch opgehoogd. Dit veld is voor intern gebruik alleen !!! Gebruikers zien dit veld normaal niet. Een eventueel DEBITEURNUMMER kunnen ze dus vrij wijzigen want daar hang ik niets aan. Alle tabellen hangen via zo'n LINKNUMMER aan elkaar.

    Bij het verwijderen van een record verdwijnt dus ook het LINKNUMMER maar omdat die niet voor de gebruikers is, is dat dus ook niet erg. Je kunt 292.471.208.677 jaar elke seconden een record toevoegen voordat je aan het maximum komt. Dus er is totaal geen reden om nummers opnieuw te gebruiken.

  4. #4
    Helemaal mee eens. Het is een volgnummer van dat ene record. Zo'n nummering zou niet aaneengesloten hoeven te zijn. Als je dood gaat, dan geven ze toch ook niet je BSN nummer aan de volgende?
    1+1=b

  5. #5
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Nou, criminelen maken daar handig gebruik van (of kijk ik teveel tv of lees te veel boeken?)
    Delphi is great. Lazarus is more powerfull

  6. #6
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Je kan elk patroon proberen te exploiteren, zowel hergebruik als doornummeren (wanneer een nummer typisch een directe correlatie heeft met een moment van uitgifte). Ik denk wel dat doornummeren beter is. Ja, je kan dan een aardige gok doen naar de leeftijd van een persoon, maar je loopt geen potentieel risico van het lekken van data van de ene (oude) gebruiker naar de andere (nieuwe).

    Maar goed, stel eens dat Jvb goede redenen heeft (b.v. een aanpalend systeem met een beperkte range). Het beste zou dan zijn de PK even goed te laten doorlopen, maar een apart veld met het beperkte, recyclen nummer?

    Hoe zou je een vrij nummer vinden, en hoe hou je het transactioneel wat safe ?

  7. #7
    Hoe zou je een vrij nummer vinden, en hoe hou je het transactioneel wat safe ?
    Meestal zou je dan vanaf de basis andersom werken, met een pivot tabel. Daar heb je dan nog steeds de uitdaging om het over alle transacties heen (dus voor het hele systeem) safe te houden.

    Je hebt op zich wel een punt, ik ben ook benieuwd naar de reden dat jvb het juist zo wil doen.

  8. #8
    Reader
    Join Date
    May 2002
    Location
    Holland
    Posts
    3,382
    Bij het verwijderen van een record verdwijnt dus ook het LINKNUMMER maar omdat die niet voor de gebruikers is, is dat dus ook niet erg. Je kunt 292.471.208.677 jaar elke seconden een record toevoegen voordat je aan het maximum komt. Dus er is totaal geen reden om nummers opnieuw te gebruiken.
    Damn, voor een 32 bits int is dat maar 64 jaar. Tricky :-)

  9. #9
    Senior Member
    Join Date
    Mar 2005
    Location
    Bassenge
    Posts
    424
    Toch even de situatie verduidelijken :
    Ik heb een tekenprogramma geschreven (met Lazarus) om elektrische tekeningen te maken. Dit programma bestaat uit een situatieschema en een eendraadschema. Ieder symbool dat ik teken in het situatieschema krijgt ook een bijbehorend "partnummer", datzelfde symbool + partnummer kan ik daarna ook tekenen in het eendraadschema. Als ik een symbool in het eendraadschema verwijder, zal dit ook worden verwijderd in het situatieschema ( en dus ook het partnummer ).
    Maar als ik een nieuw symbool teken in het situatieschema, dan wil het graag het "partnummer" van het symbool dat ik heb verwijderd herbruiken, achteraf kan je een symbolen-lijst afdrukken met hun bijbehorende partnummers, maar ik wil een lijst met partnummers die mekaar opvolgen ( dus zonder gaten )
    Ik denk dus dat ik met rede de verwijderde partnummers wil herbruiken ...

  10. #10
    hmmmm als ik je toepassing even doordenk heb je volgens mij nog meer uitdagingen. Je hebt volgens mij ook nog te maken met verschillende componenten die een andere nummerking hebben, bv Kx voor relais, Mx voor motoren, Fx voor fuses enz.

    Je hebt het over records, bedoel je dan records in een database of Delphi records in een eigen structuur?

    Ik zou denk ik in zo'n geval een vlag plaatsen in het record, dus bij je delete actie zou ik dan de component een vlag zetten in het record. Een andere optie is een lijstje bijhouden van de componenten (identifiers) die je hebt verwijderd. Bij het plaatsen van een nieuwe component kijk je dan als eerste in dat lijstje of er nog een nummer is.

    Zelf heb ik geen ervaring met elektro schema's, wel met elektronika. Daar heb je hetzelfde probleem. Een van de laatste stappen die ik moet doen (of in ieder geval doe) voordat ik een schema ga omzetten naar een print is de annotation. Die zorg dat de nummering zonder gaten oplopend is. Dat vertaald dan naar een print.

    Zoiets zou je denk ik ook moeten doen in jouw programma. Een engineer maakt een ontwerp. Op een zeker moment is dat af en moet definitief worden. Dan zou je eigenlijk een optie moeten hebben om de hele boel te nummeren en referenties daarop aan te passen (kabellijst, stuklijsten enz). Als een tekening eenmaal definitief is en gewijzigd gaat worden (dus v1 naar v1.1) dan wil je volgens mij ook geen hergebruik van identifiers om verwarring tussen versies van de tekeningen te voorkomen.

  11. #11
    Senior Member
    Join Date
    Mar 2005
    Location
    Bassenge
    Posts
    424
    Dank je voor het uitwisselen van je ervaring. Ik heb deze routine geschreven :

    Code:
    SqlQuery108 := TSqlQuery.Create(Nil);
         SqlQuery108.DataBase:=DataModule1.IBConnection1;
         SQLTransaction108:=TSQLTransaction.Create(Nil);
         SQLTransaction108.DataBase:=DataModule1.IBConnection1;
         SqlQuery108.Transaction:=SQLTransaction108;
         With SqlQuery108 do
         begin
              Close;
              Sql.Clear;
              Sql.Text:='Select Partnr,Projectnummer From PR_Posities_Sit Where Projectnummer=:_Projectnummer And Partnr > ''0'' Order By Partnr';
              ParamByName('_Projectnummer').Value:=Hoofding._projectnummer;
              Open;
              if RecordCount = 0 then
              begin
                _Partnr:=1;
                Exit;
              end;
              First;
              _teller2:=1;
              While Not Eof do
              begin
                   _teller1:=FieldByName('Partnr').Asinteger;
                   if _teller1=_teller2 then
                   begin
                      Inc(_teller2);
                      _partnr:=_teller2;
                      Next;
                   end
                   else
                   begin
                        _partnr:=_teller2;
                        Exit;
                   end;
              end;
              Close;
              Free;
         end;
    er is 1 variabele teveel, maar het maakt het overzichtelijk. Aan het partnummer kan ik later nog tekst toevoegen zoals bv "L" voor een lichtpunt enz ...

    Werkt prima, dank iedereen
    Last edited by GolezTrol; 01-Mar-17 at 19:39.

  12. #12
    Misschien zit ik er helemaal naast hoor.... maar is dit niet makkelijker:

    SQL Code:
    1. SELECT first 1 Partnr+1 FROM PR_Posities_Sit p1
    2. WHERE NOT EXISTS(SELECT Partnr FROM PR_Posities_Sit p2 WHERE p2.Partnr=p1Partnr+1)
    3. ORDER BY 1
    Deze query geeft 1 record terug met 1 veld voor het eerste NIET gebruikte Partnr.

    Een andere, misschien snellere manier:
    SQL Code:
    1. SELECT first 1 p1.Partnr+1
    2. FROM PR_Posities_Sit p1
    3. LEFT JOIN PR_Posities_Sit p2 ON p2.Partnr=p1.Partnr+1
    4. WHERE p2.Partnr IS NULL
    5. ORDER BY 1

  13. #13
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,085
    Ik zou het geheel ook nog binnen een try try ... finally except zetten voor het geval dat de verbinding er niet is, en als er iets fout gaat kom je er netjes uit.
    10.4.2, Delphi2010, of Lazarus 2.2.0

  14. #14
    Een lijst zonder gaten krijg je op die manier ook alleen als je na het verwijderen van een part ook weer een nieuw part toevoegt. Dat lijkt me ook niet logisch, dus je zou dan eigenlijk de hele lijst op moeten schuiven, of eventueel het laatste part naar voren halen zodat dat het gat opvult. Het voorlaatste part wordt dan het laatste, en het vrijgekomen nummer is het hoogste nummer dat je al had.

    Het lijkt me dan al met al handiger om die nummering in je database los te laten en die alleen te gebruiken bij het afdrukken. Je bepaalt bij het afdrukken dus de lijst van parts (gesorteerd naar wens) en bepaalt op dat moment dat nummer 1 in de lijst ook partnummer 1 heeft. Maar misschien is dat te simpel gedacht. Ik weet niet zoveel van hoe nummering en versioning werkt in dit soort schema's.
    1+1=b

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •