Discussion:
Kundennummern
(zu alt für eine Antwort)
Arne Pietsch
2004-02-12 15:16:18 UTC
Permalink
Hi,

ich möchte in Access2000 automatisch Kundennummern vergeben lassen. Wie kann
ich das am einfachsten lösen?

Gruß Arne
Mark Doerbandt
2004-02-12 15:20:49 UTC
Permalink
Hallo, Arne,
ich moechte in Access2000 automatisch Kundennummern vergeben
lassen. Wie kann ich das am einfachsten loesen?
Nimm einen AutoWert. Nein, nein, kleiner Scherz! ;-)

Wie sind denn Deine Kundennummern aufgebaut?

Schreibe Dir eine kleine Funktion, die die naechste Kundennummer
erzeugt und setze diese in Deinem Formular bei dem Kundennummerfeld
als DefaultValue ein.

Gruss - Mark
--
Informationen fuer Neulinge in den Access-Newsgroups unter
http://www.doerbandt.de/Access/Newbie.htm

Bitte keine eMails auf Newsgroup-Beiträge senden.
Arne Pietsch
2004-02-12 15:56:49 UTC
Permalink
Das ist eine gute Frage! In der Tabelle Stammdaten, da soll auch die
Kundennummer stehen, gibt es Studienkurs(2-stellig), Jahr(4-stellig) und
lfdNr(5-stellig). Aus diesen soll sich die Kundennummer(eigentlich
Studiennummer) zusammensetzen.

Beispiel: WW200400001

Die Spalte lfdNr zählt mit AutoWert.

Gruß Arne
Post by Mark Doerbandt
Hallo, Arne,
ich moechte in Access2000 automatisch Kundennummern vergeben
lassen. Wie kann ich das am einfachsten loesen?
Nimm einen AutoWert. Nein, nein, kleiner Scherz! ;-)
Wie sind denn Deine Kundennummern aufgebaut?
Schreibe Dir eine kleine Funktion, die die naechste Kundennummer
erzeugt und setze diese in Deinem Formular bei dem Kundennummerfeld
als DefaultValue ein.
Gruss - Mark
--
Informationen fuer Neulinge in den Access-Newsgroups unter
http://www.doerbandt.de/Access/Newbie.htm
Bitte keine eMails auf Newsgroup-Beiträge senden.
Mark Doerbandt
2004-02-12 16:03:52 UTC
Permalink
Hallo, Arne,
Die Spalte lfdNr zaehlt mit AutoWert.
Das eben lieber nicht. Schreibe hierfuer die kleine genannte Funktion,
die die bisher hoechste Nummer ermittelt, inkrementiert und als neue
lfdNr zurueck gibt. Den Rest setzt Du gemaess Deiner Anforderungen
dazu.
[fullqoute entsorgt]
Bitte lies mal http://got.to/quote - danke.

Gruss - Mark
--
Informationen fuer Neulinge in den Access-Newsgroups unter
http://www.doerbandt.de/Access/Newbie.htm

Bitte keine eMails auf Newsgroup-Beiträge senden.
Michael Zimmermann
2004-02-12 17:50:57 UTC
Permalink
Hallo!
Post by Arne Pietsch
Das ist eine gute Frage! In der Tabelle Stammdaten, da
soll auch die Kundennummer stehen, gibt es Studienkurs
(2-stellig), Jahr(4-stellig) und lfdNr(5-stellig). Aus
diesen soll sich die Kundennummer(eigentlich
Studiennummer) zusammensetzen.
Beispiel: WW200400001
Die Spalte lfdNr zählt mit AutoWert.
Wenn Deine Kundennummer sich aus anderen Daten quasi
errechnet oder in codierter Form Daten, die noch einmal
an anderer Stelle gespeichert sind, auch nur enthält,
wäre es ein grober Entwurfsfehler, die Kundennummer
in einer Tabelle abzuspeichern. Sie wäre dann als
berechnetes Feld in einer Abfrage zu erzeugen.

Stichwort "Aktenzeichenanomalie"; verstößt je nach
Konstellation gegen 0., 1., 3. oder Boyce-Codd-Normalform.

Gruß aus Mainz
Michael
Mark Doerbandt
2004-02-12 17:54:49 UTC
Permalink
Hallo, Michael,
Post by Michael Zimmermann
Wenn Deine Kundennummer sich aus anderen Daten quasi
errechnet oder in codierter Form Daten, die noch einmal
an anderer Stelle gespeichert sind, auch nur enthaelt,
waere es ein grober Entwurfsfehler, die Kundennummer
in einer Tabelle abzuspeichern. Sie waere dann als
berechnetes Feld in einer Abfrage zu erzeugen.
Was spricht gegen sprechende Nummern?

Gruss - Mark
--
Informationen fuer Neulinge in den Access-Newsgroups unter
http://www.doerbandt.de/Access/Newbie.htm

Bitte keine eMails auf Newsgroup-Beiträge senden.
Michael Zimmermann
2004-02-12 23:04:40 UTC
Permalink
Hallo, Mark!
Post by Mark Doerbandt
Post by Michael Zimmermann
Wenn Deine Kundennummer sich aus anderen Daten quasi
errechnet oder in codierter Form Daten, die noch einmal
an anderer Stelle gespeichert sind, auch nur enthaelt,
waere es ein grober Entwurfsfehler, die Kundennummer
in einer Tabelle abzuspeichern. Sie waere dann als
berechnetes Feld in einer Abfrage zu erzeugen.
Was spricht gegen sprechende Nummern?
Exakt muß es heißen: Was spricht gegen sprechende Nummern
und in der gleichen Tabelle gehaltene Felder mit den
selben Daten im Klartext?

Mathematik und Informatik. Du würdest mit so einem Entwurf
an der Uni durch jede Datenbank-Klausur rasseln.

Die Begründung hast Du gesnipt:

| Stichwort "Aktenzeichenanomalie"; verstößt je nach
| Konstellation gegen 0., 1., 3. oder Boyce-Codd-Normalform.

Du willst mir jetzt aber nicht im Ernst weismachen,
daß Du Dich damit nie beschäftigt hast und die
Normalisierungsalgorithmen nicht kennst???

Gruß aus Mainz
Michael
Mark Doerbandt
2004-02-12 23:26:00 UTC
Permalink
Hallo, Michael,
Post by Mark Doerbandt
Post by Mark Doerbandt
Was spricht gegen sprechende Nummern?
Es draengt sich mir die Vermutung auf, dass Du Lehrer,
zumindest aber Dozent bist!? ;-)
Post by Mark Doerbandt
Was spricht gegen sprechende Nummern
und in der gleichen Tabelle gehaltene Felder mit den
selben Daten im Klartext?
Davon habe ich nichts geschrieben und davon stand da auch nichts. Es
ging seit dem Moment, wo Arne den Aufbau der Kundennummer erlaeutert
hat um eine laufende Nummer und weitere Informationen in der gleichen
Tabelle, die zu einer Kundennummer /zusammengesetzt/ werden. Wo stand
oder steht da /abspeichern/?
Post by Mark Doerbandt
Du wuerdest mit so einem Entwurf an der Uni durch
jede Datenbank-Klausur rasseln.
Es ist ja nicht mein Entwurf und zum Glueck
muss ich keine DB-Klausuren schreiben.

Gruss - Mark
Michael Zimmermann
2004-02-13 20:32:30 UTC
Permalink
Hallo, Mark!
Post by Mark Doerbandt
Post by Mark Doerbandt
Post by Mark Doerbandt
Was spricht gegen sprechende Nummern?
Es draengt sich mir die Vermutung auf, dass Du Lehrer,
zumindest aber Dozent bist!? ;-)
Nicht schlecht ;-) Inzwischen bin ich zwar Mitinhaber
einer EDV-Firma, aber in meiner HiWi-Zeit habe ich an
der Uni Mathe- und Informatik-Seminare und -Übungen
geleitet; später dann EDV-Seminare. Im Moment bin
ich gerade wieder im Dozentenmodus "drin", da ich
vor zwei Tagen auf einem Fachkongreß einen Vortrag
zu just diesem Thema gehalten habe.
Post by Mark Doerbandt
Post by Mark Doerbandt
Was spricht gegen sprechende Nummern
und in der gleichen Tabelle gehaltene Felder mit den
selben Daten im Klartext?
Davon habe ich nichts geschrieben und davon stand da
auch nichts. Es ging seit dem Moment, wo Arne den Aufbau
der Kundennummer erlaeutert hat um eine laufende Nummer
und weitere Informationen in der gleichen Tabelle, die
zu einer Kundennummer /zusammengesetzt/ werden.
Wo stand oder steht da /abspeichern/?
Bei mir. ;-) Weil ich's schon so oft falsch gesehen habe,
habe ich über die schriftlich fixierten Fakten hinaus
interpretierend auf einem Signifikanzniveau von 95%
*vorsorglich* angemerkt, daß das Speichern in der Tabelle
böse wäre und die Kundennummer als berechnetes Abfragefeld
erzeugt werden sollte.

Wir scheinen somit wieder einmal heftig darüber zu
diskutieren, daß wir eigentlich das gleiche meinen. ;-)

Schade, daß unsere Access-Stammtische so weit
auseinanderliegen.

Gruß aus Mainz
Michael
Mark Doerbandt
2004-02-13 21:30:55 UTC
Permalink
Hallo, Michael,

* Michael Zimmermann (Fr, 13 Feb 2004 20:32:30 GMT):

;-)
Schade, dass unsere Access-Stammtische so weit
auseinanderliegen.
Komm zur AEK, dann trinken wir mal ein
oder zwei abendliche Biere!

Gruss - Mark
Jörg Ackermann
2004-02-13 22:17:25 UTC
Permalink
Hi,
Post by Mark Doerbandt
Komm zur AEK, dann trinken wir mal ein
oder zwei abendliche Biere!
Ich denk' doch mal, der Karl hat eh' gerade seinen
AEK-Terminplaner in der Hand und überlegt,
wo ein Vortrag zu Normalisierungs-theorien
reinpassen könnte... ;-)

Könnte uns, nebst ein paar hübschen Praxisbeispielen,
die auch einer vom Dorf versteht, wohl nicht schaden.

Gruß
Mark Doerbandt
2004-02-13 22:29:40 UTC
Permalink
Hallo, Acki,
Post by Jörg Ackermann
Ich denk' doch mal, der Karl hat eh' gerade seinen
AEK-Terminplaner in der Hand und ueberlegt,
wo ein Vortrag zu Normalisierungs-theorien
reinpassen koennte... ;-)
Koennte uns, nebst ein paar huebschen Praxisbeispielen,
die auch einer vom Dorf versteht, wohl nicht schaden.
/Gute Idee/! Karl, Michael, was denkt Ihr?

Gruss - Mark
Michael Zimmermann
2004-02-14 11:05:48 UTC
Permalink
Hallo, Mark!
Post by Mark Doerbandt
Post by Jörg Ackermann
Ich denk' doch mal, der Karl hat eh' gerade seinen
AEK-Terminplaner in der Hand und ueberlegt,
wo ein Vortrag zu Normalisierungs-theorien
reinpassen koennte... ;-)
Koennte uns, nebst ein paar huebschen Praxisbeispielen,
die auch einer vom Dorf versteht, wohl nicht schaden.
/Gute Idee/! Karl, Michael, was denkt Ihr?
Klar, gerne. Karl muß mir nur eine Eintrittskarte
reservieren.
;-)

Gruß aus Mainz
Michael
Karl Donaubauer
2004-02-13 22:35:32 UTC
Permalink
Post by Jörg Ackermann
Post by Mark Doerbandt
Komm zur AEK, dann trinken wir mal ein
oder zwei abendliche Biere!
Ich denk' doch mal, der Karl hat eh' gerade seinen
AEK-Terminplaner in der Hand und überlegt,
wo ein Vortrag zu Normalisierungs-theorien
reinpassen könnte... ;-)
Ihr kennt's mich schon zu gut.
Post by Jörg Ackermann
Könnte uns, nebst ein paar hübschen Praxisbeispielen,
die auch einer vom Dorf versteht, wohl nicht schaden.
Beitrag war bereits im Ordner für Potentielle-AEK-Referenten
gespeichert.
--
cu
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
Datenbankprofis: http://www.dbdev.org
Josef Poetzl
2004-02-12 18:03:16 UTC
Permalink
Hallo!

Michael Zimmermann schrieb:
[...]
Post by Michael Zimmermann
Wenn Deine Kundennummer sich aus anderen Daten quasi
errechnet oder in codierter Form Daten, die noch einmal
an anderer Stelle gespeichert sind, auch nur enthält,
wäre es ein grober Entwurfsfehler, die Kundennummer
in einer Tabelle abzuspeichern. Sie wäre dann als
berechnetes Feld in einer Abfrage zu erzeugen.
Stichwort "Aktenzeichenanomalie"; verstößt je nach
Konstellation gegen 0., 1., 3. oder Boyce-Codd-Normalform.
Grundsätzlich gebe ich Dir recht, aber wenn es sich dabei um einen
Wert handelt, welcher nur _ein einziges mal erstellt_ wird, würde ich
den trotzdem in einem extra Feld ablegen und nicht jedes mal neu
errechnen. - mit dem Wissen dass ich bewußt gegen die Regeln der n-ten
Normalform verstoße. ;-)
Stichwort Geschwindigkeit:
Wenn sich die Felder mit einem einfachen Feld1 & Feld2 & ...
zusammensetzen wird man ja noch keinen Unterschied merken (naja
vielleicht doch: und zwar dann, wenn nach diesem Feld gefilter wird),
aber was ist, wenn sich der Feldwert mittels einer selbst erstellten
Funtkion ergibt? => diese immer in die Abfrage einbauen finde ich
nicht gerade empfehlenswert.

mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Arne Pietsch
2004-02-12 18:43:17 UTC
Permalink
Ich möchte doch nur pro Datensatz eine Nummer erzeugen, welche eindeutig
ist und als Studiennummer sich aus anderen Spalten zusammensetzt.
Wie lautet die Funktion dazu?

viele Grüße
Arne
Jörg Ackermann
2004-02-12 19:55:17 UTC
Permalink
Hi,
Post by Arne Pietsch
Ich möchte doch nur pro Datensatz eine Nummer erzeugen, welche eindeutig
ist und als Studiennummer sich aus anderen Spalten zusammensetzt.
Wie lautet die Funktion dazu?
lngNummer = "MM" & Year(Date) & Format(Nz(DMax("Mid(Studiennummer, 7)", "tblStammdaten"), 0),"00000")

(alles in eine Zeile)

HTH
Gruß
Michael Zimmermann
2004-02-12 23:04:59 UTC
Permalink
Hallo!
Post by Arne Pietsch
Ich möchte doch nur pro Datensatz eine Nummer erzeugen,
welche eindeutig ist und als Studiennummer sich aus
anderen Spalten zusammensetzt.
Das ist schon klar. Ich wollte Dir nur den Hinweis geben,
daß diese Vorgehensweise aus Sicht der Informatik falsch
ist.

Analogie:
Frage
"Ich möchte (a+b)² in a²+b² auflösen.
Wie geht das in Access?"

Kommentar
"Man löst (a+b)² gar nicht so auf, sondern
in a²+2ab+b², weil a²+b² falsch ist."

Gruß aus Mainz
Michael
Michael Zimmermann
2004-02-12 23:05:07 UTC
Permalink
Hallo, Josef!
[...]
Auch [...] ;-)
Post by Michael Zimmermann
Stichwort "Aktenzeichenanomalie"; verstößt je nach
Konstellation gegen 0., 1., 3. oder Boyce-Codd-
Normalform.
Grundsätzlich gebe ich Dir recht, ...
Bis hierhin okay...
aber...
Es läßt nach ;-)
wenn es sich dabei um einen Wert handelt, welcher
nur _ein einziges mal erstellt_ wird, würde ich
den trotzdem in einem extra Feld ablegen und nicht
jedes mal neu errechnen. - mit dem Wissen dass ich
bewußt gegen die Regeln der n-ten
Normalform verstoße. ;-)
Es ist ein Unterschied, gegen eine Regel, die man kennt
und beherrscht aus - dokumentierten - Gründen und unter
Gewichtung aller Konsequenzen zu verstoßen oder von der
Existenz von Regeln gar nichts zu wissen.
Stichwort Geschwindigkeit
Das ist - ich meine das jetzt nicht persönlich - ein
unsinniges Pauschalurteil, das seit den 70er Jahren,
ohne den Fortschritt in der Hardware-Entwicklung zu
berücksichtigen, immer weiter vererbt wird, ohne es mit
Performance-Tests geprüft zu haben.

1. Code-lastige Sichtweise vieler Programmierer:

Performance ist nicht die Zeit, die der Code zum Laufen
braucht, sondern die Zeit, bis eine betriebliche
Aufgabenstellung erledigt ist - einschließlich der
Arbeitszeit, die nötig ist, um durch Denormalisierung
entstandene Widersprüche aus den Daten zu schütteln.

2. Prozessoren mögen lieber Zahlen als Text:

Eine Sortierung über 1, 2, 3 statt z. B. der damit
codierten Strings "Fremdartikel", "Eigenfertigung", etc.
ist trotz der Auslagerung (Normalisierung) der
Artikelkategorie in eine eigene Tabelle schneller(!),
als über ein integriertes Feld Artikelkategorie als
Text. Da die Codeziffern intern ausreichend sind, muß
man oft noch nicht mal joinen. Zusätzlich kann man
durch die reinen Zahlenschlüssel viele Bedingungen
ohne Iif und & durch boolesche Ausdrücke und rein
arithmetische Verknüpfungen wesentlich performanter
gestalten. Die Zahlencodierung einfacher Textspalten
entspricht in den Grundzügen der Domain-Key-Normalform.

3. Rushmore und ähnliche Optimierungen:

Die aus den 70ern stammende Aussage, daß Selektion
billiger als Join ist, kenne ich auch. Aber: Kein
gescheites DBMS (Access schon gar nicht) joint heute
noch intern nach der Basisregel Kreuzprodukt und
zeilenweise Auswahl der vom Join betroffenen Tupel.
Darauf bezieht sich nämlich das Join-Selection-Statement.

4. Weniger Daten durch normale Strukturen:

Pack mal eine dreifache Multi-Value-Dependency (4NF)
in eine Tabelle statt in drei. Dann hast Du statt
z. B. 30+50+70 = 150 DS, die Du *vor* dem Joinen
filterst, 30*50*80 = 120.000 (!) DS, mit denen Du Dich
jetzt ganz performant auseinandersetzen darfst.

5. Lieber richtig als schnell:

Obwohl ich selbst Performance-Fanatiker bin, das
klare Bekenntnis: Datenintegrität kommt ganz klar vor
Geschwindigkeit. Eine DB, die blitzschnell Fehler erzeugt,
ist nutzlos.
Wenn sich die Felder mit einem einfachen Feld1 & Feld2
& ... zusammensetzen wird man ja noch keinen Unterschied
merken (naja vielleicht doch: und zwar dann, wenn nach
diesem Feld gefilter wird),
Tut man ja nicht - man filtert nach den einzelnen
indizierten Feldern.
aber was ist, wenn sich der Feldwert mittels einer selbst
erstellten Funtkion ergibt? => diese immer in die Abfrage
einbauen finde ich nicht gerade empfehlenswert.
Kommt auf die Abfrage an und wofür sie gut ist. Wenn die
Abfrage dem User den errechneten Wert nicht zeigen muß,
ist er überflüssig, da die Informationen ja in anderen
Feldern atomar vorliegen und zum Filtern/Gruppieren
benutzt werden können.

Wenn der User den Wert sehen soll, bekommt er sowieso
ein Formular vorgesetzt. Da genügt meist *ein* berechneter
Wert (Einzelansicht), was schnell genug geht. Access
ist auch schlau genug, nur die sichtbaren Werte zu
berechnen. Das Problem, daß erst mal 200.000 DS
durchgerechnet werden, bevor die Anzeige kommt, stellt
sich nicht.

Nach allem, was ich bis jetzt an DB-Fragmenten die doch
nicht gelaufen sind, die unsere Firma dann bei Kunden zur
Weiterentwicklung übernommen hat, gesehen habe, drängt sich
mir eher der Eindruck auf, daß z. B. nicht normalisierte
Verbundabhängigkeiten weniger auf einem berechneten
Vergleich der zu erwartenden Laufzeiten bei Aufteilung
vs. einer Tabelle beruhen, sondern auf Unkenntis der
5. Normalform. Oder willst Du dagegen wetten? ;-)

Völlig normalisierte Grüße aus Mainz
Michael
Josef Poetzl
2004-02-13 08:10:37 UTC
Permalink
Hallo!
Post by Michael Zimmermann
Post by Josef Poetzl
Stichwort Geschwindigkeit
Das ist - ich meine das jetzt nicht persönlich - ein
unsinniges Pauschalurteil, das seit den 70er Jahren,
ohne den Fortschritt in der Hardware-Entwicklung zu
berücksichtigen, immer weiter vererbt wird, ohne es mit
Performance-Tests geprüft zu haben.
<OT>
Dass die Hardware ausgelastet wird, dafür sorgt ja MS - z.B. durch die
Objektnamen-Autokorrektur, die für mich nur lästig ist, da man sie bei
jeder neuer DB erstmal deaktivieren muss. Und wenn Du sie einmal
einsetzten willst, dann funktioniert sie nicht.
</OT>
Post by Michael Zimmermann
Performance ist nicht die Zeit, die der Code zum Laufen
braucht, sondern die Zeit, bis eine betriebliche
Aufgabenstellung erledigt ist -
Ich persönlich würde nur bis hier die Zeit betrachten.
Post by Michael Zimmermann
... einschließlich der
Arbeitszeit, die nötig ist, um durch Denormalisierung
entstandene Widersprüche aus den Daten zu schütteln.
Diese Zeit sollt immer gegen 0 gehen ;-)
[...]
Richtig, aber meine Kunden lieber oft Text mehr als Zahlen.

[viele richtige Bemerkungen]

Zum Abschluss gebe ich noch einmal ein Beispiel, wo ich in einem
meiner Anwendungen bewußt gegen Normalisierung verstoßen habe:

Dokumentenverwaltung/Dokumentennummern:
Die Dok.-Nummern-Sturkut ist je nach Projekt und Dok.-Art
Formatierbar.
Das Nummernformat wird in abhängig von Projekt und Dokumentenart in
einer Tabelle abgelegt.
Beispeile:
P-1234-yxa, X-POET-1234-JOS, ....

In der Dok.Tabelle habe ich nun diese Nummer _und_ den aktuellen
Zähler (oben: 1234) abgelegt.
Es sind also folgende Werte gespeichert:
Tab. Dokumente: P-1234-yxa und 1234
Tab. Dok-Arten: P-[ZAEHLER]-[KENNUNG]
(es gibt aber noch mehrere FOrmatierungsmöglcihkeiten wie z.B. [AUTOR]
o.ä.)

Den Zähler habe ich deshalb doppelt vorhanden, da ich ihn zur
ermittlung der nächsten freien Nummer verwende.
Was ich immer ncoh getrennt habe ist die Ausgabe und Revision.

Wenn ich nun nach Deiner oben beschriebenen Methode vorgehe, müsste
ich in die Tab. Dokumente statt der Dok.-Nummer folgende Felder
aufnehmen:
[KENNUNG], [AUTOR],... - auch wenn die Felder oftmals gar nicht
verwendet werden.
Wenn ich nun eine Dokumentenliste erstellen will, dann müsste ich
zuerst in der Tabelle Dok.-Arten nachsehen welches Format für den
einzelnen DS benötigt wird, daraus kann ich dann die Dok.-Nummer
erstellen, welche angezeigt werden soll.
Da diese Nummer aber nur _einmal_ ertellt wird, habe ich sie direkt in
die Tabelle aufgenommen. - Und jetzt behauptest Du, man erreicht mit
/korrekter/ Normalisierung die gleiche Performance als mit
/manipulierter/ Normalisierung. (Und betrachte das ganze bitte noch
unter der Bedingung, dass z.B. ein Access-Backend verwendet könnte)
(Anm.: Ich hatte zuerst eine Aufteilung der Dok.Nummer in ihre
Bestandteile vorgesehen, bin dann aber schnell zur fertigen Dok-Nummer
übergegangen, da die Anzeigegeschwindigkeit eine 'Zumutung' war.)

Noch als Schlussbemerkung:
Ich bin der Meinung: Normalisierung ist wichtig - aber man soll sie
auch hin und wieder brechen dürfen. Diese Freiheit nehme ich mir
zumindest als Wirtschaftingenieur - der nur durch Zufall in die
EDV-Branche geraten ist.
Ich behautpe einmal: solage das Datenmodell in sich logisch ist, wird
es keine größeren Probleme geben, auch ohne Berücksichtigung von
Normalisierung - naja doch: 'logisch' bedeutet doch dass das Ergebnis
der Normalisierung großteils entspricht, oder nicht? ;-))

mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Paul Rohorzka
2004-02-13 10:15:56 UTC
Permalink
Josef Poetzl wrote:
... viel Richtiges.
Post by Josef Poetzl
Ich behautpe einmal: solage das Datenmodell in sich logisch ist, wird
es keine größeren Probleme geben, auch ohne Berücksichtigung von
Normalisierung - naja doch: 'logisch' bedeutet doch dass das Ergebnis
der Normalisierung großteils entspricht, oder nicht? ;-))
To quote C.J. Date, the principles of database design are "nothing more
than formalized common sense."
(Quelle: http://r937.com/relational.html)

Beim Versuch, Beispiele für Datenbestände zu finden, die gegen die erste
oder zweite Normalform verstoßen, ist mir das sehr deutlich geworden.
Wenn man ein bissl ein "Gespür" für die Idee des relationalen Ansatzes
hat, kann es recht schwer sein, die niedrigen Normalformen zu verletzen.
:-)

LG,
Paul
Michael Zimmermann
2004-02-13 21:06:08 UTC
Permalink
Hallo, Josef!
Post by Josef Poetzl
Post by Michael Zimmermann
Post by Josef Poetzl
Stichwort Geschwindigkeit
Das ist - ich meine das jetzt nicht persönlich - ein
unsinniges Pauschalurteil, das seit den 70er Jahren,
ohne den Fortschritt in der Hardware-Entwicklung zu
berücksichtigen, immer weiter vererbt wird, ohne es mit
Performance-Tests geprüft zu haben.
<OT>
Dass die Hardware ausgelastet wird, dafür sorgt ja
MS - z.B. durch die Objektnamen-Autokorrektur,
</OT>
<Spaß>
Da habe ich einen tollen Tip für Dich: Du kannst sie unter
Exras/Optionen ausschalten ;-)
</Spaß>
Post by Josef Poetzl
[...]
Richtig, aber meine Kunden lieber oft Text mehr als
Zahlen.
Seit ich dazu übergegangen bin, die Kunden als Vektoren
anzusehen, klappt's auch mit den Zahlen ;-)
Post by Josef Poetzl
[viele richtige Bemerkungen]
Zum Abschluss gebe ich noch einmal ein Beispiel, wo ich
in einem meiner Anwendungen bewußt gegen Normalisierung
Wie ich schon sagte: Es ist ein Unterschied, bewußt
und dokumentiert unter Abwägung der Konsequenzen eine
Regel zu dehnen oder sie nicht zu kennen.
Post by Josef Poetzl
Die Dok.-Nummern-Sturkut ist je nach Projekt und Dok.-Art
Formatierbar.
Das Nummernformat wird in abhängig von Projekt und
Dokumentenart in einer Tabelle abgelegt.
P-1234-yxa, X-POET-1234-JOS, ....
In der Dok.Tabelle habe ich nun diese Nummer
_und_ den aktuellen
Zähler (oben: 1234) abgelegt.
Tab. Dokumente: P-1234-yxa und 1234
Tab. Dok-Arten: P-[ZAEHLER]-[KENNUNG]
[...]
Da diese Nummer aber nur _einmal_ ertellt wird, habe
ich sie direkt in die Tabelle aufgenommen.
Klingt für mich nach Archivtabelle/Dokumentationstabelle.
Falls ja, ist das gar kein Verstoß, da Redundanzen in
solchen (gekennzeichneten) Tabellen statthaft sind.
Post by Josef Poetzl
- Und jetzt behauptest Du, man erreicht mit
/korrekter/ Normalisierung die gleiche Performance
als mit /manipulierter/ Normalisierung. (Und betrachte
das ganze bitte noch unter der Bedingung, dass z.B. ein
Access-Backend verwendet könnte)
(Anm.: Ich hatte zuerst eine Aufteilung der Dok.Nummer
in ihre Bestandteile vorgesehen, bin dann aber schnell
zur fertigen Dok-Nummer übergegangen, da die
Anzeigegeschwindigkeit eine 'Zumutung' war.)
Ohne mich jetzt so intensiv in Dein Datenmodell
hineingedacht zu haben nur ein Beispiel:

Statt
idArt divFelder Kategorie ZuständigKat
112 ... Verkaufsartikel 23
238 ... Eigenfertigung 35


idArt divFelder Kategorie
112 ... 1
238 ... 2
+
idKat Klartext ZuständigKat
1 Verkaufsartikel 23
2 Eigenfertigung 35

gruppiere und selektiere ich Dir über die Integerwerte
schneller, als bei der unnormalisierten Form mit
Texten. Außerdem kann man Mehrfachbedingungen à la
Kat = "Verkaufsartikel And LagerOrt = Halle 3"
über pure Integerarithmetik auswerten, was wesentlich
schneller ist.
Post by Josef Poetzl
Ich bin der Meinung: Normalisierung ist wichtig - aber
man soll sie auch hin und wieder brechen dürfen.
Die allgemeine Lösung der homogenen Differentialgleichnung
erster Ordnung ist wichtig - aber man soll stattdessen
auch Lösungen nehmen dürfen, die falsch sind???

Die Normalisierungsregeln sind keine Empfehlung sondern
ein exaktes bewiesenes mathematisches Modell - eine
Abweichung steht jedem frei, ist aber falsch.

Genauso kannst Du ja auch ohne Bußgeld behaupten
daß Pi = 3, weil es bequemer ist oder schneller geht
- stimmen tut es aber nicht.
Post by Josef Poetzl
Ich behautpe einmal: solage das Datenmodell in sich
logisch ist, ... - naja doch: 'logisch' bedeutet doch
dass das Ergebnis der Normalisierung großteils
^^^^^^^^
exakt
Post by Josef Poetzl
entspricht, oder nicht? ;-))
Völlig richtig, die Normalisierung ist eine direkte
Folgerung aus der Prädikatenlogik (intensionales Modell)
bzw. Relationenalgebra (extensionales Modell).

Anders gesagt: ein nicht normalisiertes Modell ist
eben in sich unlogisch (inkonsistent).

Beweis als Übung ;-)

Gruß aus Mainz
Michael
Josef Poetzl
2004-02-13 22:12:08 UTC
Permalink
Hallo!
Post by Michael Zimmermann
Post by Josef Poetzl
<OT>
Dass die Hardware ausgelastet wird, dafür sorgt ja
MS - z.B. durch die Objektnamen-Autokorrektur,
</OT>
<Spaß>
Da habe ich einen tollen Tip für Dich: Du kannst sie unter
Exras/Optionen ausschalten ;-)
</Spaß>
;-)) Danke für den Tipp, daran habe ich aber schon gedacht.
Aber kannst Du mir auch sagen, wie ich das *dauerhaft* deaktivieren
kann, ohne es bei jeder neu angelegten DB einstellen zu müssen?
Das ist nämlich genau so ein Punkt der mich von MS stört: Sobald etwas
Neues dazukommt /muss/ es gleich einmal standardmäßig aktiviert
werden.
Post by Michael Zimmermann
Seit ich dazu übergegangen bin, die Kunden als Vektoren
anzusehen, klappt's auch mit den Zahlen ;-)
Wieviele Dimensionen benötigst Du dafür?
Post by Michael Zimmermann
Ohne mich jetzt so intensiv in Dein Datenmodell
Statt
idArt divFelder Kategorie ZuständigKat
112 ... Verkaufsartikel 23
238 ... Eigenfertigung 35
idArt divFelder Kategorie
112 ... 1
238 ... 2
+
idKat Klartext ZuständigKat
1 Verkaufsartikel 23
2 Eigenfertigung 35
Für dieses "Schul"-Beispiel ;-) ist imo die Sachlage ganz klar.

Ich meinte so etwas:

Tabelle Dokumentenart
(Dokument im Sinn von Verträgen, Zeichnungen, ...)
- DokArtID
- NummerFormat (=Vorgabe zur Erstellung einer sprechenden Dok.-Nr)
- ...

Ein Beispiel-DS:
ID=1, Format="[Projekt-Kennung]-DWG-[ZAEHLER]",...

Tabelle Dokumente:
-DokID
-DokArtID
-DokNummer !!! hier sind mehrere 'Felder' vereint
-DocZaehler !!!
-Titel
-...

Das Feld DokNummer wird bei der Erstellung aus dem Format-Feld der
Dokumentenart und der zugehörigen Werte ermittelt.
Dabei ist anzumerken, dass die Dokumentennummer je nach Projekt und
Dokumentenart unterschiedlich aufgebaut sein kann.
Im Feld DokNummer ist auch der Zähler vorhanden.
Trotzdem habe ich dieses Feld Zaehler noch einmal im DS, da ich so
leichter/schneller den nächsten freien Zähler ermitteln kann.

Ursprünglich dachte ich an einen solchen Tabellenaufbau:
- DokID
- DokArtID
- [hier statt der fertigen Dokumentennummer alle möglichen Felder
welche in die Dok.-Nummer einfließen können] (das Format ist über die
Tabelle DokArten ermittelbar)
- Titel
- ...

Dieser Aufbau wäre zwar von der Theorie her sehr flexibel, ist aber
praktisch unbrauchbar.
Daher bin ich übergegangen die fertige Dokumentennummer abzuspeichern,
trotzdem aber noch einige Zusatzfelder (z.B. für den Zähler zur
Ermittlung der nächsten freien Nummer) anzulegen - diese Werte werden
also doppelt gehalten.

Zum Abschluss der Diskussion:
Ich wollte hier nicht die Normalierung in Frage stellen, sondern nur
anmerken, dass man trotzdem hin und wieder eine *bewußte* Abweichungen
in Kauf nehmen muss, damit die Anwendung auch 'benutzbar' bleibt.
Post by Michael Zimmermann
Post by Josef Poetzl
Ich bin der Meinung: Normalisierung ist wichtig - aber
man soll sie auch hin und wieder brechen dürfen.
[...]
Post by Michael Zimmermann
Genauso kannst Du ja auch ohne Bußgeld behaupten
daß Pi = 3, weil es bequemer ist oder schneller geht
Da nehm ich lieber 22/7 ist auch schnell und doch etwas genauer.
Aber: Ich behaupte einmal, dass auch Du nie den exakten Wert von Pi
verwenden wirst, sondern nur einen ausreichend genauen. Oder bist Du
schon auf die endgültige Lösung gekommen? ;-)

mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Michael Zimmermann
2004-02-14 11:05:23 UTC
Permalink
Hallo, Josef!
Post by Josef Poetzl
;-)) Danke für den Tipp, daran habe ich aber schon
gedacht. Aber kannst Du mir auch sagen, wie ich das
*dauerhaft* deaktivieren kann, ohne es bei jeder neu
angelegten DB einstellen zu müssen?
Wo Du jetzt so fragst - ja. Es ist aber nur ein
Würg-Around. Ich habe mir eine frische neue leere
DB, der ich alle standardmäßig benutzten Verweise
verpaßt habe, angelegt und die gewünschten Optionen
gesetzt.

Diese Vorlage benutze ich dann immer, wenn
ich zwischendurch prophylaktisch ein FrontEnd
komplett neu importiere oder auch, um eine neue DB
anzulegen. Ich finde ein Datei > Neu statt ...> Öffnen
immer noch weniger aufwendig als das Geklicke bei jeder
neuen DB.
Post by Josef Poetzl
Sobald etwas Neues dazukommt /muss/ es gleich einmal
standardmäßig aktiviert werden.
Ich pflichte bei. Immerhin *kannst* Du es abstellen.
Schlimmer finde ich das ab Word 2000 eingeführte
SDI-Interface, das sich nicht deaktivieren läßt.
Post by Josef Poetzl
Post by Michael Zimmermann
Seit ich dazu übergegangen bin, die Kunden als Vektoren
anzusehen, klappt's auch mit den Zahlen ;-)
Wieviele Dimensionen benötigst Du dafür?
42. Wie war nochmal die Frage?
Post by Josef Poetzl
Post by Michael Zimmermann
Ohne mich jetzt so intensiv in Dein Datenmodell
...
[Dein Beispiel schon wieder gesnipt, ohne näher darauf
einzugehen ;-)]
Willst Du das jetzt nur als für Dich abgeschlossenes
Beispiel für sinnvolle Denormalisierung geben oder willst
Du die Struktur *diskutieren*?

Dann sag nochmal bescheid, dann wechseln wir den Betreff
und ich les mich nochmal genauer rein. Wenn Du aber
sowieso auf keinen Fall was dran ändern möchtest, spar
ich mir die Mühe - das ist so abschreckend lang ;-)
Post by Josef Poetzl
Post by Michael Zimmermann
... Pi ...
Da nehm ich lieber 22/7 ...
Dem Inscheniör ist nix zu schwör ;-)
Post by Josef Poetzl
Aber: Ich behaupte einmal, dass auch Du nie den exakten
Wert von Pi verwenden wirst, sondern nur einen
ausreichend genauen. Oder bist Du
schon auf die endgültige Lösung gekommen? ;-)
Dein Numerik-Trick liefert 3 geltende Ziffern.
Ich bevorzuge Const Pi = 3.14159265, das sind 9 geltende
Ziffern und geht sehr schnell, weil ich es soweit
auswendig kann und eine Konstante im Code schneller
ist als die Floating-Point-Rechnung 22/7.

Wenn Du etwas Zeit hast (unendlich lange) liefern Dir
Reihenentwicklungen wie die folgende beliebig genaue
Ergebnisse:

lim 4*[1-1/3+1/5-1/7+1/9...(+/-)1/(2i-1)]
i->Unendlich

Stammt aber nicht von mir, sondern ist mathematisches
Allgemeingut (Stichwort Taylor).

Du kannst ja mal einen Algorithmus daraus programmieren
und ihn ein paar Jahre - die Reihe konvergiert ziemlich
langsam - auf einem Server im Hintergrund laufen lassen,
dann schaun mer mal ;-)

Gruß aus Mainz
Michael
Josef Poetzl
2004-02-14 12:28:08 UTC
Permalink
Hallo Michael!
Post by Michael Zimmermann
Willst Du das jetzt nur als für Dich abgeschlossenes
Beispiel für sinnvolle Denormalisierung geben...
Genaus so war es gedacht.
Post by Michael Zimmermann
Post by Josef Poetzl
Post by Michael Zimmermann
... Pi ...
Da nehm ich lieber 22/7 ...
Dem Inscheniör ist nix zu schwör ;-)
:-))
Post by Michael Zimmermann
Dein Numerik-Trick liefert 3 geltende Ziffern.
Ich bevorzuge Const Pi = 3.14159265, das sind 9 geltende
Ziffern und geht sehr schnell, weil ich es soweit
auswendig kann
Da bin ich jetzt beeindruckt: Pi auf 9 Stellen genau im Kopf.
Ich merk mir immer nur 3.1416 - aber ich bin ja auch kein Mathematiker
;-)
Post by Michael Zimmermann
und eine Konstante im Code schneller
ist als die Floating-Point-Rechnung 22/7.
Bei diesem "Numerik-Trick" dachte ich eher an Kopfrechnen, denn in
einem Programm wird man ja kaum eine Konstante vereinfachen.
Aber das Kopfrechnen fällt mir mit einer Zahl mit mehreren
Kommastellen doch etwas schwer. ;-)

So, das war's nun endgültig von meiner Seite.

mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Peter Doering
2004-02-14 13:29:10 UTC
Permalink
Hallo Michael,

On Sat, 14 Feb 2004 12:05:23 +0100, Michael Zimmermann wrote:

Nur mal 'ne Frage am Rande, OT sozusagen. Hast du eigentlich den Thread von
Jens Schilling gelesen, wo der Hilfeschrei nach einem Mathematiker laut
geworden ist? Falls nicht, such mal nach "Reihenfolge oder Rangfolge
berechnen" (07.02.04 19:04:40), Message-ID:
<***@TK2MSFTNGP11.phx.gbl>.

;-)

Gruss - Peter
--
Ich beantworte keine Fragen per Email.
Mitglied im http://www.dbdev.org
FAQ: http://www.donkarl.com
Michael Zimmermann
2004-02-14 17:14:08 UTC
Permalink
Hallo, Peter!
... Hast du eigentlich den Thread von Jens Schilling
gelesen, wo der Hilfeschrei nach einem Mathematiker laut
geworden ist? Falls nicht, such mal nach "Reihenfolge
oder Rangfolge berechnen" (07.02.04 19:04:40) ...
Nein, in der Zeit sieht meine Posting-Statistik wegen
Vorbereitungen zum Softwaretag Hessen ganz dünn aus.

Wäre interessant gewesen, aber inzwischen ist der Thread
wohl eingeschlafen. Aber Mark war ja ein würdiger Retter
in der Not.

Gruß aus Mainz
Michael

Jörg Ackermann
2004-02-12 15:54:18 UTC
Permalink
Hi,
Post by Mark Doerbandt
Schreibe Dir eine kleine Funktion, die die naechste Kundennummer
erzeugt
Ja genau.
Post by Mark Doerbandt
und setze diese in Deinem Formular bei dem Kundennummerfeld
als DefaultValue ein.
Einspruch Euer Ehren !
Damit sind in einer Mehrbenutzerumgebung Konflikte
vorprogrammiert, die erst durch (unnötige) Basteleien
wieder abgefangen werden können. In der Zeit vom Öffnen des
Forms bis zum evtl. Speichern können schon x andere Kunden
angelegt worden sein.

Die Kundennummer sollte erst unmittelbar beim Speichern
des Datensatzes erzeugt, gespeichert und ggf. zur Info
angezeigt werden.

Etwa so
wenn Kundennummer ein einfaches Long feld ist:

dim db as dao.database
dim rs as dao.recordset
dim lngNrKunde as long, _
lngIDKunde as long

set db = currentdb
set rs = db.openrecordset(Select * from tblkunde where KID=0, dbopendynaset)

rs.addnew
rs!KundeName = Me!KundeName
...
rs!KundeOrt = Me!KundeOrt

lngNrKunde = Nz(Dmax("KundeNummer","tblKunde"), 0) + 1
rs!KundeNummer = lngNrKunde

lngIDKunde = rs!KID
rs.update

rs.Close: set rs = Nothing

'hier dann ggf. weitere Aktionen
'wie Detailtabellen befüllen

set db = Nothing

Msgbox "Kunde wurde unter der Nummer " & lngNrKunde & " angelegt.", _
vbInformation, _
"Kunden-neuanlage erfolgreich"

Gruß
Mark Doerbandt
2004-02-12 16:01:40 UTC
Permalink
Hallo, Acki,
Post by Jörg Ackermann
Post by Mark Doerbandt
Schreibe Dir eine kleine Funktion, die die naechste Kundennummer
erzeugt
und setze diese in Deinem Formular bei dem Kundennummerfeld als
DefaultValue ein.
Einspruch Euer Ehren !
Damit sind in einer Mehrbenutzerumgebung Konflikte
vorprogrammiert, ...
Das kommt darauf an, wie die Funktion eine Kundennummer vergibt. Wenn
sie z.B. selbst einen Datensatz in der Basistabelle anlegt und
speichert und dann erst die eben generierte Nummer zurueck gibt, klappt
auch alles.

Grundsaetzlich aber hast Du recht, dass man auf solche Konflikte in
einer Mehrbenutzerumgebung achten muss.

Gruss - Mark
Jörg Ackermann
2004-02-12 16:10:13 UTC
Permalink
Hi,
Post by Mark Doerbandt
Das kommt darauf an, wie die Funktion eine Kundennummer vergibt. Wenn
sie z.B. selbst einen Datensatz in der Basistabelle anlegt und
speichert und dann erst die eben generierte Nummer zurueck gibt, klappt
auch alles.
Jo, und einmal im Monat löscht der Lehrling die
leeren Datensätze raus, die nach einem Cancel entstehen...
Oder die Anwendung tut das automatisch, dann muß der
Lehrling versuchen, fortlaufende Nummern herzustellen.

Aber na gut...warum nicht.

Gruß
Mark Doerbandt
2004-02-12 16:29:11 UTC
Permalink
Hallo, Acki,
Jo, und einmal im Monat loescht der Lehrling die
leeren Datensaetze raus, die nach einem Cancel entstehen...
Oder die Anwendung tut das automatisch, dann muss der
Lehrling versuchen, fortlaufende Nummern herzustellen.
;-)

Nein, die Anwendung tut das automatisch, und zwar beim Cancel direkt.
Die Funktion ist natuerlich so intelligent, dass sie eine geloeschte
Kundennummer neu vergibt, wenn lueckenlose Kundennummern gewuenscht
sind...

btw: warum denn immer den armen Lehrling bemuehen?

Aber im Ernst: was mich an der Vergabe der Kundennummer beim Speichern
stoert ist die Tatsache, dass man sie dann nicht sieht. Wenn also der
Vertriebsmann am Telefon mal eben einen neuen Kunden anlegen will,
braucht er die Nummer, um sie diesem zu sagen. Daher hab ich's gern,
wenn sie gleich im Formular steht. (btw: lueckenlose Nummern
interessieren mich persoenlich in der Regel nicht, nur eindeutige.)

Gruss - Mark
Roland Wollenschläger
2004-02-13 08:36:39 UTC
Permalink
Hi,

da man ja in den meisten Datenbanken einen Autowert mitlaufen lässt, kannst
Du ganz einfach die Studiennummer beim Erstellen des Datensatzes über das
Formular zusammenfügen und in das dafür vorgesehene Datenfeld speichern.
Aufgrund des Autowertes wird dann diese Kundennummer immer eindeutig sein.

Der enstprechenden Stringverknüpfung bzw. Zahlenverknüpfung sollte man
mächtig sein.

Greets
Roland
Post by Arne Pietsch
Hi,
ich möchte in Access2000 automatisch Kundennummern vergeben lassen. Wie kann
ich das am einfachsten lösen?
Gruß Arne
Loading...