einen komplizierten Auto-Wert generieren

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Eia
********
Beiträge: 2614
Registriert: Sa, 23.12.2006 07:40

Re: einen komplizierten Auto-Wert generieren

Beitrag von Eia »

Ich hab' nur wenig Erfahrung mit der Anlage von Datenbanken, aber ich frage mich, ob es geschickt ist, in einem Schlüsselbereich mit Redundanzen zu arbeiten.
Denn entweder die Nummer an sich oder doch die Kombination der drei Felder sind ja wohl die eindeutige ID des Datensatzes.
Wenn Du nun diese Information zusätzlich (kombiniert) in einem Datenfeld fest speicherst, musst Du ja garantieren können, dass es absolut unmöglich ist, dass bei einer späteren Datenmanipulation diese Felder versehentlich unterschiedliche Inhalte bekommen, die zusammengesetzte ID also von den Inhalten der Schlüsselfelder abweicht.
In welchem Moment brauchst Du denn diese ID? Würde es evtl. genügen, bei Abfragen ein solches Feld jeweils aktuell aus den Schlüsselfeldern generieren zu lassen? Das wäre sicher mit CONCAT möglich.
mfG
chrk
*******
Beiträge: 1670
Registriert: Sa, 22.09.2007 18:09

Re: einen komplizierten Auto-Wert generieren

Beitrag von chrk »

BavarianBarbarian hat geschrieben:Leider bin ich derzeit noch nicht sehr mit VBA vertraut
VBA? - Wie unpassend...
ich möchte mit Base ein Bücherarchiv erstellen
;)
Eia hat geschrieben:Ich hab' nur wenig Erfahrung mit der Anlage von Datenbanken, aber ich frage mich, ob es geschickt ist, in einem Schlüsselbereich mit Redundanzen zu arbeiten.
Aber Du holst ganz offensichtlich auf.
Denn entweder die Nummer an sich oder doch die Kombination der drei Felder sind ja wohl die eindeutige ID des Datensatzes.
Wenn Du nun diese Information zusätzlich (kombiniert) in einem Datenfeld fest speicherst, musst Du ja garantieren können, dass es absolut unmöglich ist, dass bei einer späteren Datenmanipulation diese Felder versehentlich unterschiedliche Inhalte bekommen, die zusammengesetzte ID also von den Inhalten der Schlüsselfelder abweicht.
Du bist genau auf dem richtigen Weg, Eia. Es ist wirklich ratsam, die Schlüsselfelder atomar zu speichern. Erstens aus genannten Gründen, zweitens ist es ja nicht auszuschließen, dass man den einen oder anderen der beiden 'sprechenden' Schlüssel mal irgendwann anpassen muss. Außerdem könnte man Lookup-Tables für die sprechenden Schlüssel anlegen (die für spätere Verwendung eventuell auch noch eine Spalte mit dem Langnamen enthalten). Aus denen könnten in einem Eingabeformular die Werte zur Wahl abgerufen werden, dann die laufende Nummer per Autowert, und die halbe Tipperei gespart.

Als Primärschlüssel für die Tabelle taugt im Prinzip ja schon der Autowert der fortlaufenden Nummer, es ist dennoch denkbar, einen kombinierten Schlüssel aus den drei Feldern zum Primärschlüssel zu machen.
In welchem Moment brauchst Du denn diese ID? Würde es evtl. genügen, bei Abfragen ein solches Feld jeweils aktuell aus den Schlüsselfeldern generieren zu lassen? Das wäre sicher mit CONCAT möglich.
mfG
Exakt so.
Eia
********
Beiträge: 2614
Registriert: Sa, 23.12.2006 07:40

Re: einen komplizierten Auto-Wert generieren

Beitrag von Eia »

chrk hat geschrieben:
Eia hat geschrieben:Ich hab' nur wenig Erfahrung mit der Anlage von Datenbanken, aber ich frage mich, ob es geschickt ist, in einem Schlüsselbereich mit Redundanzen zu arbeiten.
Aber Du holst ganz offensichtlich auf.
Ist vor allem Theorie. Datenpflege (mit Hilfe von Listengeneratoren, ohne direktes SQL) bin ich seit vielen Jahren gewohnt und daher vertraut mit jeder Menge Stammdaten-Fallen wie z.B. redundante Feldinhalte (die aber manchmal unverzichtbar sind).....
Als Primärschlüssel für die Tabelle taugt im Prinzip ja schon der Autowert der fortlaufenden Nummer, es ist dennoch denkbar, einen kombinierten Schlüssel aus den drei Feldern zum Primärschlüssel zu machen.
Ich hab' mal probiert, in Base eine Tabelle anzulegen mit folgenden Feldern:
Herausgeber: fixer Text mit 3 Stellen
Genre: fixer Text mit 2 Stellen
Nr.: Integer, autocrement
und dann diese 3 zu einem Primärschlüssel zusammenzufassen.
Das ging aber nicht. Also entweder, es geht nicht wegen der Feldarten oder es geht nicht mit Base oder ich stelle es falsch an:
alle drei Felder selektioniert, Kontextmenu, Primärschlüssel. Das wird noch akzeptiert, beim Speichern jedoch ist Schluss.
mfG
berndkli
*****
Beiträge: 289
Registriert: Di, 12.04.2005 22:05

Re: einen komplizierten Auto-Wert generieren

Beitrag von berndkli »

Hallo Bavarian
Ist es möglich, ein solches Feld zu erstellen? Wenn ja, wie könnte man das machen?
Ja, das geht, allerdings nur in einer Abfrage oder Tabellenansicht.

Ich würde für dein Projekt vorschlagen, zunächst 2 Tabellen anzulegen - für Genre und Verlage.
Dann eine Haupttabelle die alle Informationen zum Buch aufnimmt, also: Genre, Verlag, ID, Titel, Autor usw.

In einem Formular kannst du dann über Listenfelder die Daten aus der Genre- und Verlagstabelle in die Haupttabelle übernehmen, die restlichen Daten per Hand eintippen, die ID (prim.Schlüssel) zählt automatisch hoch (Autoincrement).

Jetzt brauchst du noch eine Abfrage (besser Tabellenansicht) in der du in der ersten Spalte Genre, Verlag und ID Spalte der Haupttabelle mit einer CONCAT Funktion verbindest und dir in weiteren Spalten die restlichen Daten anzeigen lässt. Fertig.

Das war jetzt ziemlich knapp zusammen gefasst, wenn was unklar ist frag nochmal nach.

Gruss Bernd
Eia
********
Beiträge: 2614
Registriert: Sa, 23.12.2006 07:40

Re: einen komplizierten Auto-Wert generieren

Beitrag von Eia »

Ich bin mir nicht ganz sicher, ob wir das Anliegen richtig verstehen, aber wenn wir mal bei der Version "Abfrage" bleiben, kann ich so viel mal vorgeben:
Wenn Du die Datenbank öffnest und auf "Abfragen" klickst, kannst Du dort eine Abfrage auf unterschiedliche Weise erstellen.
Wenn Du "Abfrage in SQL-Ansicht" wählst, könnte so eine Anweisung so aussehen:
SELECT "nr", "ver", "genre", "buch", CONCAT( "genre", "nr" ) AS "ID" FROM "Tabelle1"

Das würde dann so aussehen:
a.png
a.png (4.55 KiB) 3672 mal betrachtet
Die ersten vier Spalten sind Felder, die sich in der Datenbank befinden, die letzte ist das zusammengestellte Feld, das es in der Datenbank nicht gibt, sondern nur in der Abfrage.

Meine Versuche, mehr als zwei Felder in die CONCAT-Klammer zu bringen, sind aber gescheitert.
Ich habs nur mit verschachtelten Anweisungen hinbekommen:

SELECT "nr", "ver", "genre", "buch", CONCAT(CONCAT( CONCAT( "genre", '-' ), CONCAT( "ver", '-' ) ), "nr") AS "ID" FROM "Tabelle1"
bzw.:
SELECT "nr", "ver", "genre", "buch", CONCAT( CONCAT( CONCAT( CONCAT( "genre",'-'),"ver"),'-'),"nr") AS "ID" FROM "Tabelle1"

Geht das auch einfacher?

mfG
Dateianhänge
b.png
b.png (6.78 KiB) 3673 mal betrachtet
Zuletzt geändert von Eia am Do, 13.03.2008 07:26, insgesamt 1-mal geändert.
chrk
*******
Beiträge: 1670
Registriert: Sa, 22.09.2007 18:09

Re: einen komplizierten Auto-Wert generieren

Beitrag von chrk »

BavarianBarbarian hat geschrieben:[...]
Was würdest du empfehlen, chrk?

[...]
Ich könnte mir jetzt eine ironische Formulierung für diesen überflüssigen Kommentar überlegen, finde aber dass ein solcher die Sachlichkeit des Threads zu sehr gefährden würde.
Entschuldige die Ironie: VBA ist Visual Basic for Application, der Basic Dialekt in Microsoft Office. Dass Dir aber bewusst bist, mit OOo Base zu arbeiten, hat Dir den Grinser eingebracht. Hier im Forum tauchen gelegentlich Fragen zu 'Office' auf in völliger Missachtung des feinen Unterschieds der Bürosuiten.

Empfehlen würde ich ggf. StarBasic, dass ist der Basic Dialekt, den OOo verwendet.

Tatsächlich würde ich es aber eher so lösen, wie Bernd und Eia vorschlagen, weil es auch mit meinen StarBasic-Kenntnissen nicht weit her ist.

Wenn du die Daten in der Tabelle speichern willst, kannst Du sie auch mit einer update-Anweisung nach ähnlichem Muster einfügen, mit der Einschränkung WHERE [id] IS NOT NULL, damit nicht alle Datensätze bei jedem Durchlauf neu geschrieben werden müssen.

Ein anderer Ansatz, bei dem Du auf Basic zurückgreifen müsstest, wäre, ein Eingabeformular zu erstellen (siehe auch Bernds Vorschlag), die Verkettung (&-Operator) in einem Makro zu erledigen und in den Datensatz einfügen zu lassen. Dabei besteht allerdings die Schwierigkeit, dass der Autoinkrement-Wert erst nach dem Verlassen des Datensatzes (Abschluss der Eingabe) zur Verfügung steht, das Makro den Datensatz also zweimal öffnen müsste.
berndkli
*****
Beiträge: 289
Registriert: Di, 12.04.2005 22:05

Re: einen komplizierten Auto-Wert generieren

Beitrag von berndkli »

@ Eia
Eia hat geschrieben:Geht das auch einfacher?
Nein. Hsql kann maximal 2 Argumente in einer CONCAT Funktion verbinden. Wenn's mehr sein sollen hilft nur die Verschachtelung.

Gruss Bernd
Eia
********
Beiträge: 2614
Registriert: Sa, 23.12.2006 07:40

Re: einen komplizierten Auto-Wert generieren

Beitrag von Eia »

berndkli hat geschrieben:@ Eia
Eia hat geschrieben:Geht das auch einfacher?
Nein. Hsql kann maximal 2 Argumente in einer CONCAT Funktion verbinden. Wenn's mehr sein sollen hilft nur die Verschachtelung.
OK, dann hier ein Tipp, wie man das einigermassen bequem editieren kann und kein Chaos bei den Klammern und Kommata bekommt:

Ich habe zunächst geschrieben:
CONCAT( "genre", "nr" )
Dann habe ich diesen String markiert, kopiert und den ersten Feldnamen ("genre") mit der Kopie überschrieben:
CONCAT( CONCAT( "genre", "nr" ), "nr" )
und angepasst:
CONCAT( CONCAT( "genre", '-' ), "nr" )
dann das gleiche mit dem zweiten Feldnamen, also "nr" mit der Kopie überschrieben:
CONCAT( CONCAT( "genre", '-' ), CONCAT( "genre", "nr" ) )
und angepasst:
CONCAT( CONCAT( "genre", '-' ), CONCAT( "nr", '-' ) )
dann brauch man nur noch einmal CONCAT mit öffnender Klammer davor zu schreiben und danach:
, "nr")
anhängen:
CONCAT(CONCAT( CONCAT( "genre", '-' ), CONCAT( "ver", '-' ) ), "nr")

mfG
berndkli
*****
Beiträge: 289
Registriert: Di, 12.04.2005 22:05

Re: einen komplizierten Auto-Wert generieren

Beitrag von berndkli »

Hallo Bavarian

Ich hab mal auf die Schnelle was zusammengeschustert. Funktioniert wie oben von mir umrissen.

Gruss Bernd
Dateianhänge
Zusageszt_ID.odb
(9.92 KiB) 106-mal heruntergeladen
Antworten