AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Interbase Generatorwert zurücksetzen?
Thema durchsuchen
Ansicht
Themen-Optionen

Interbase Generatorwert zurücksetzen?

Ein Thema von plautzer · begonnen am 8. Feb 2005 · letzter Beitrag vom 16. Feb 2005
Antwort Antwort
Seite 1 von 3  1 23      
plautzer

Registriert seit: 23. Aug 2003
172 Beiträge
 
#1

Interbase Generatorwert zurücksetzen?

  Alt 8. Feb 2005, 14:13
Datenbank: Interbase • Zugriff über: IbStoredProc, IBDataSet
Hi Leutz,

ich habe ein SrtingGrid in dem ich Daten eintragen will.
Falls ich einen neuen Datensatz eintrage, wird die ID automatisch durch den Generator hochgesetzt.

Wenn sich der Benutzer es aber anderes überlegt und gar keinen datensatz anlegen will (also cancel), dann soll die ID wieder zurückgesetzt werden um riesige Lücke zu vermeiden.

Kann man den Generator wert irgentwie von Delphi aus festlegen?

Mir würde jetzt keine eleganten Weg einfallen, wie das lösen könnte, wüsstet ihr einen?

Thx,

Plautzer

[edit=sakura] [Klammern] aus dem Titel entfernt. Mfg, sakura[/edit]
  Mit Zitat antworten Zitat
Benutzerbild von lume96
lume96

Registriert seit: 14. Sep 2003
Ort: Rognac/Marseille - Frankreich
128 Beiträge
 
Delphi 7 Professional
 
#2

Re: [Interbase] Generatorwert zurücksetzen?

  Alt 8. Feb 2005, 14:37
Moin,

einen Generator-Wert kann man wie folgt setzen :
SET GENERATOR abc_GEN TO x; wobei abc_GEN der Generatorname ist und x der neue Wert

Im Allgemeinen würde ich aber davon abraten, ausser wenn Du Dir absolut sicher bist, dass NIEMAND sonst auf die DB zugreift (z.B. zweite Instanz Deines Programms). Sonst kann es schnell Probleme geben, z.B.:

App 1 nimmt den Wert 5 (nächster Gen-Wert ist jetzt 6)
App 2 nimmt den Wert 6 (nächster Gen-Wert ist jetzt 7)

App 1 will den Generator-Wert zurückseten, aber auf was ???

Musst Du den den Wert so "früh" erfragen. Logischer wäre es, den Wert erst dann zu erfragen, wenn der User den Record schon gepostet hat, Du also sicher bist, dass die Werte in die DB sollen.

Unter Umständen könnte man das sogar über'n Trigger (Before Insert) automatisieren.

Tschüss,
Lutz
Lutz Meyer
  Mit Zitat antworten Zitat
Quake

Registriert seit: 25. Aug 2003
222 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: [Interbase] Generatorwert zurücksetzen?

  Alt 8. Feb 2005, 15:03
Bei TIBQuery gibt es die Eigenschaft GeneratorField. GeneratorField wiederum besitzt die Eigenschaft ApplyEvent. Setzt du diese auf gamOnPost wird der Wert erst generiert, wenn der Datensatzt auch gespeichert wird.
Oder wenn du den Generatorwert manuell holst dann mache das im onBeforePost Ereignis.
  Mit Zitat antworten Zitat
DelphiDeveloper

Registriert seit: 9. Apr 2003
Ort: Köln
256 Beiträge
 
Delphi XE2 Enterprise
 
#4

Re: [Interbase] Generatorwert zurücksetzen?

  Alt 8. Feb 2005, 18:55
Wie Lume96 bereits geschrieben hat, kann man aus Delphi heraus auch Generatorenwerte setzen.

Für dein beschriebenes Problem wuerde ich davon auch abraten. Luecken machen ueberhaupt nichts bei einer ID die ja meist ja PK fungiert.
Beabsichtigst du sowas wie eine eindeutige lueckenlose sequenz wie etwa RechNr zu generieren, sind Generatoren dafür nicht geeignet.

mfg
DD
  Mit Zitat antworten Zitat
urs.liska

Registriert seit: 6. Aug 2003
Ort: Freiburg
195 Beiträge
 
Delphi 6 Professional
 
#5

Re: [Interbase] Generatorwert zurücksetzen?

  Alt 8. Feb 2005, 21:02
Ich kann mich den Vorrednern nur anschließen:
automatisch hochgezählte Werte sollte man auf keinen Fall von Hand ändern. Das gibt irgendwann eine korrupte Datenbank. Wirklich!

Wenn Du wirklich lückenlose Zahlenfolgen brauchst - wie eben die genannte Rechnungsnummer - dann solltest Du zwei separate Felder benutzen: Eines für den Primärschlüssel (mit Generator) und ein zweites für die lückenlose Folge (die Du auf irgendeine andere Weise programmseitig erzeugen musst).

MfG
Urs
  Mit Zitat antworten Zitat
Quake

Registriert seit: 25. Aug 2003
222 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: [Interbase] Generatorwert zurücksetzen?

  Alt 9. Feb 2005, 06:36
@urs.liska: Die Frage ist nur wie möchtest du sonst solch eine Zahl erzeugen? Ich denke, wenn man im Netzwerkarbeitet und man benötigt eine Zahl die nicht doppelt vorkommen darf sollte man auf jeden Fall einen Generator verwenden. Die Frage ist nur wann und wie man ihn erzeugt. Sofort wenn man einen neuen Datensatz anlegt oder erst wenn man ihn speichert. Ob man SELECT verwendet oder das GeneratorField von TIBQuery ist dabei auch noch egal.

ciao
  Mit Zitat antworten Zitat
urs.liska

Registriert seit: 6. Aug 2003
Ort: Freiburg
195 Beiträge
 
Delphi 6 Professional
 
#7

Re: [Interbase] Generatorwert zurücksetzen?

  Alt 9. Feb 2005, 07:22
@Quake
Ich würde sagen: gamOnPost, wenn man den Primärschlüssel nicht schon vorher braucht (z.B für Detaildaten).

Für die Frage der lückenlosen Nummernfolge gibt es fertige Methoden (bitte nicht fragen wo und wie, ich weiß nur, dass es so was gibt; ich glaube, bei den Docs von ibphoenix oder ibobjects habe ich mal was gesehen).
Urs
  Mit Zitat antworten Zitat
Quake

Registriert seit: 25. Aug 2003
222 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: [Interbase] Generatorwert zurücksetzen?

  Alt 9. Feb 2005, 10:19
Ja genau das meinte ich für DatensatzID gamOnNewRecord und für RechnungsNr etc. gamOnPost. Die Details werden dann mit der DatensatzID verknüpft.
  Mit Zitat antworten Zitat
DelphiDeveloper

Registriert seit: 9. Apr 2003
Ort: Köln
256 Beiträge
 
Delphi XE2 Enterprise
 
#9

Re: [Interbase] Generatorwert zurücksetzen?

  Alt 10. Feb 2005, 00:45
Zitat:
Ja genau das meinte ich für DatensatzID gamOnNewRecord und für RechnungsNr etc. gamOnPost. Die Details werden dann mit der DatensatzID verknüpft.
Die RechNr bei OnPost zu generieren minimiert zwar das Problem aber eine lückenlose Sequenz von RechNr kriegt man dann auch noch nicht hin. Hat man irrtümich gepostet dann ist die Rechnr schon generiert und das löschen der Rechnung bringt "Löscher" in der Sequenz.

Ich würde mir für eindeutige Sequenzen sowas bauen:

Eine Tabelle mit einem Nummernkreis hier nur eine Zeile
ID NEXTNUMBER
1 4711

Eine Tabelle Nummernpool mit verwaisten Rechnr


Das ganze arbeitet dann wie folgt

hier als Pseudoalgo

exklusiver Zugriff auf Tabelle Nummernkreis anfordern (Lock)
wenn gesperrt warte...
schaue im Numernpool ob noch verwaiste Nr vorliegen
wenn ja hole satz aus nummernpool und loesch ihn dort -> fertig
wenn nix im Nummernpool
hole NEXTNumber aus Nummernkreis, incrementiere um 1 NextNumber in Nummernkreis
exklusiver Zugriff auf Tabelle zureucksetzen (unlock).
  Mit Zitat antworten Zitat
Quake

Registriert seit: 25. Aug 2003
222 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: [Interbase] Generatorwert zurücksetzen?

  Alt 10. Feb 2005, 06:52
Rechnungen dürfen nicht gelöscht werden. Wenn dann storniert man sie, d.h. man hat z.B. ein boolsches Feld STORNIERT das man auf true setzt. Deswegen entstehen erst garkeine Lücken.
Mit deiner Methode würdest du ja auch unter Umständen hinbekommen, daß du Rechnungs-Nr. von Heute zwischen die von vor 10 Jahren packst weil da zufällig eine gelöscht wurde. Das ist nicht Sinn der sache.

ciao
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz