Seite 1 von 1

Feldinhalt auto. aufteilen in Tabelle f. Datenbank?

Verfasst: Do, 13.09.2012 16:28
von Riri_2022
Hallo, ich habe ein Problem, mit dem ich nicht klar komme...

Ich habe eine Datenbank, zu welcher eine Tabelle existiert.

In dieser Tabelle gibt es eine Spalte "Seriennummer".

Ich möchte gerne den Inhalt in allen Feldern in dieser Spalte automatisiert aufteilen lassen, wie mache ich das? (Formel?)

BSP.:

Als Seriennummer wird das hier eingetragen: AB_121212_CDEF_1

das soll nun in die Felder nebenan getrennt eingefügt werden

AB in das Feld "Herstelller"
121212 in das Feld "Datum" ->12.12.12
CDEF in das Feld "Herkunftsland"
1 in das Feld "Version"


Kann mir jemand bitte helfen?

VIELEN DANK.

Re: Feldinhalt auto. aufteilen in Tabelle f. Datenbank?

Verfasst: Do, 13.09.2012 17:07
von juetho
Das einfachste dürfte ein SQL-Befehl sein:

Code: Alles auswählen

UPDATE myTable
   SET Hersteller = SUBSTRING(Seriennummer FROM 1 FOR 2),
       Datum = CAST( SUBSTRING(Seriennummer FROM 4 FOR 6) AS DATE ),
       Herkunftsland = SUBSTRING(Seriennummer FROM 11 FOR 4),
       Version = SUBSTRING(Seriennummer FROM 16);
/* bei einmaliger Anpassung ohne WHERE-Klausel, normalerweise mit */
Vor allem die Konvertierung des Datums wird komplizierter sein, weil vermutlich dd/mm/yyyy einzeln herausgelöst und danach zusammengesetzt werden müssen. Die genaue Schreibweise und Alternativen für SUBSTRING und CAST hängen vom Datenbankmanagementsystem (DBMS) ab. Allgemein dazu siehe SQL-Funktionien, konkret im Handbuch für das von dir verwendete DBMS.

Wenn diese Aufgabe auch künftig bei neuen Datensätzen erforderlich ist, ist es sinnvoll, das über einen Trigger oder ein Makro zu organisieren. Für konkretere Antworten fehlen Angaben: welches OO-Produkt, welche Version, welche Datenbank. Jürgen

Re: Feldinhalt auto. aufteilen in Tabelle f. Datenbank?

Verfasst: Fr, 14.09.2012 09:48
von Riri_2022
juetho hat geschrieben:Das einfachste dürfte ein SQL-Befehl sein:

Code: Alles auswählen

UPDATE myTable
   SET Hersteller = SUBSTRING(Seriennummer FROM 1 FOR 2),
       Datum = CAST( SUBSTRING(Seriennummer FROM 4 FOR 6) AS DATE ),
       Herkunftsland = SUBSTRING(Seriennummer FROM 11 FOR 4),
       Version = SUBSTRING(Seriennummer FROM 16);
/* bei einmaliger Anpassung ohne WHERE-Klausel, normalerweise mit */
Vor allem die Konvertierung des Datums wird komplizierter sein, weil vermutlich dd/mm/yyyy einzeln herausgelöst und danach zusammengesetzt werden müssen. Die genaue Schreibweise und Alternativen für SUBSTRING und CAST hängen vom Datenbankmanagementsystem (DBMS) ab. Allgemein dazu siehe SQL-Funktionien, konkret im Handbuch für das von dir verwendete DBMS.

Wenn diese Aufgabe auch künftig bei neuen Datensätzen erforderlich ist, ist es sinnvoll, das über einen Trigger oder ein Makro zu organisieren. Für konkretere Antworten fehlen Angaben: welches OO-Produkt, welche Version, welche Datenbank. Jürgen

Danke für die Antwort. Ok, ich hab gesehen, das Datum kann man weg lassen... :)

Ich verwende OO 3.3.0 - aufm Mac iOS 10.6
Welche Datenbank? Hm, ich bin ziemlich unwissend in dem Bereich .. via Base hab ich die Daten in eine .odb Tabelle eingetragen.... Das ist so ziemlich das beste was ich herausfinden konnte wie ich auf die Schnelle ein Formular erstellen konnte :(

Re: Feldinhalt auto. aufteilen in Tabelle f. Datenbank?

Verfasst: Fr, 14.09.2012 12:54
von juetho
Riri_2022 hat geschrieben:Welche Datenbank? Hm, ich bin ziemlich unwissend in dem Bereich .. via Base hab ich die Daten in eine .odb Tabelle eingetragen....
Minimal-Angaben erhältst du in Base (nach dem Öffnen der Datenbank) über Bearbeiten > Datenbank > Eigenschaften (beide Register) sowie Bearbeiten > Datenbank > Verbindungsart. Dann wäre zumindest die Art der Datenbank geklärt. Genaueres kann erst nach dieser Klärung gesucht und beantwortet werden. Jürgen

Re: Feldinhalt auto. aufteilen in Tabelle f. Datenbank?

Verfasst: Mo, 17.09.2012 10:51
von Riri_2022
juetho hat geschrieben:
Riri_2022 hat geschrieben:Welche Datenbank? Hm, ich bin ziemlich unwissend in dem Bereich .. via Base hab ich die Daten in eine .odb Tabelle eingetragen....
Minimal-Angaben erhältst du in Base (nach dem Öffnen der Datenbank) über Bearbeiten > Datenbank > Eigenschaften (beide Register) sowie Bearbeiten > Datenbank > Verbindungsart. Dann wäre zumindest die Art der Datenbank geklärt. Genaueres kann erst nach dieser Klärung gesucht und beantwortet werden. Jürgen

Hallo Jürgen,

danke. Leider komme ich zu keinem Ergebnis, beide Optionen (Eigenschaften und Verbindungsart) sind bei mir grau und nicht an-click-bar (aktiv)..
Ich habe kein Datenbank Programm. Ich habe lediglich mit BASE eine 'neue Datenbank' mit dem Datenbankassistent erstellt und das wars. Ich kenn mich nicht aus damit, aber aus meinem BASE Handbuch ging hervor dass ich auf diese Art und Weise mit BASE arbeiten kann (ohne extra Datenbank software) oder bin ich da total falsch mit dieser Annahme? :(

Wenn ich die BASE Datenbankdatei öffne steht da was von eingebetteter Datenbank und HSQL Datenbank-Engine. Wahrscheinlich hilft das aber auch nicht weiter... :(

Ich frage mich was ich nun machen soll,.

Re: Feldinhalt auto. aufteilen in Tabelle f. Datenbank?

Verfasst: Mo, 17.09.2012 11:26
von juetho
Riri_2022 hat geschrieben:Wenn ich die BASE Datenbankdatei öffne steht da was von eingebetteter Datenbank und HSQL Datenbank-Engine. Wahrscheinlich hilft das aber auch nicht weiter... :(
Doch, genau das ist die Antwort auf meine Frage. In der Base-Einführung wird in der Einführung (Seite 5) gleich im ersten "Hinweis" etwas dazu gesagt.

Für SUBSTRING und CAST gelten also die Hinweise im ausführlichen Base-Handbuch. Leider stehen dazu nur im Anhang (Seite 270 ff.) minimale Hinweise ohne Beispiele. Zusammen mit meinem Code-Beispiel könntest du aber eine funktionierende Variante selbst ausprobieren. Andernfalls kannst du dich auch erneut melden (bitte mit Angabe der Versuche und Fehlermeldungen dazu). Jürgen

Re: Feldinhalt auto. aufteilen in Tabelle f. Datenbank?

Verfasst: Mo, 17.09.2012 11:46
von Riri_2022
juetho hat geschrieben:
Riri_2022 hat geschrieben:Wenn ich die BASE Datenbankdatei öffne steht da was von eingebetteter Datenbank und HSQL Datenbank-Engine. Wahrscheinlich hilft das aber auch nicht weiter... :(
Doch, genau das ist die Antwort auf meine Frage. In der Base-Einführung wird in der Einführung (Seite 5) gleich im ersten "Hinweis" etwas dazu gesagt.

Für SUBSTRING und CAST gelten also die Hinweise im ausführlichen Base-Handbuch. Leider stehen dazu nur im Anhang (Seite 270 ff.) minimale Hinweise ohne Beispiele. Zusammen mit meinem Code-Beispiel könntest du aber eine funktionierende Variante selbst ausprobieren. Andernfalls kannst du dich auch erneut melden (bitte mit Angabe der Versuche und Fehlermeldungen dazu). Jürgen

Super! Danke für die Hilfe erstmal! :)

Ich werde dann mal weiter lesen und hoffen dass ich das mit dem testen auch hinbekomme..

Nochmals DANKE

Re: Feldinhalt auto. aufteilen in Tabelle f. Datenbank?

Verfasst: Fr, 21.09.2012 12:29
von Riri_2022
juetho hat geschrieben:
Riri_2022 hat geschrieben:Wenn ich die BASE Datenbankdatei öffne steht da was von eingebetteter Datenbank und HSQL Datenbank-Engine. Wahrscheinlich hilft das aber auch nicht weiter... :(
Doch, genau das ist die Antwort auf meine Frage. In der Base-Einführung wird in der Einführung (Seite 5) gleich im ersten "Hinweis" etwas dazu gesagt.

Für SUBSTRING und CAST gelten also die Hinweise im ausführlichen Base-Handbuch. Leider stehen dazu nur im Anhang (Seite 270 ff.) minimale Hinweise ohne Beispiele. Zusammen mit meinem Code-Beispiel könntest du aber eine funktionierende Variante selbst ausprobieren. Andernfalls kannst du dich auch erneut melden (bitte mit Angabe der Versuche und Fehlermeldungen dazu). Jürgen

Hallo Jürgen,

ich hoffe du siehst diese Mitteilung, ...

Ich habe eine wahrscheinlich "doofe" Frage, und zwar...lassen sich die SQL Befehle nur als Abfragen anwenden?
Mein Wunsch ist es ein Tabellen Feld nach dem Einfügen des Inhaltes, diesen auf mehrere Felder aufzuspalten ohne dass ich etwas daran mache. Nun War die Idee dass es hierfür eine Formel gibt welche ich einmalig in der Tabelle hinterlege, und diese dann jede neue Zelle der gewünschten Spalte in die nebenstehenden Zellen aufteilt...

Als Abfrage würde mir der SQL Befehl jeglich die gewünschten Daten in einem Bericht anzeigen, richtig?

Ich bin mir sehr unsicher was ich falsch verstehe :(

Wo genau gebe ich den SQL Befehl ein, sodass meine Idee umgesetzt werden kann?
Oder geht das aufteilen einer Zelle nicht, so wie ich mir das vorstelle?


Nochmals vielen Dank!

Re: Feldinhalt auto. aufteilen in Tabelle f. Datenbank?

Verfasst: Fr, 21.09.2012 13:13
von juetho
Riri_2022 hat geschrieben:Hallo Jürgen, ich hoffe du siehst diese Mitteilung, ...
Ich bin nicht der einzige Helfer. Zurzeit befasse ich mich etwas intensiver mit OO, danach kommen vermutlich wieder acht Monate Pause. :)
Ich habe eine wahrscheinlich "doofe" Frage, und zwar...lassen sich die SQL Befehle nur als Abfragen anwenden?
Nein, schon mein erster SQL-Code enthält den UPDATE-Befehl, der für Änderungen zuständig ist. Neben SELECT (vor allem für Abfragen und VIEWs) gibt es INSERT und DELETE (wofür die wohl stehen mögen...). Vielleicht liest du einmal die einleitenden Kapitel der Einführung in SQL (nur durchlesen, nicht durcharbeiten), damit du ein Gefühl dafür bekommst, wofür SQL gut ist.
Mein Wunsch ist es ein Tabellen Feld nach dem Einfügen des Inhaltes, diesen auf mehrere Felder aufzuspalten ohne dass ich etwas daran mache. Nun War die Idee dass es hierfür eine Formel gibt welche ich einmalig in der Tabelle hinterlege, und diese dann jede neue Zelle der gewünschten Spalte in die nebenstehenden Zellen aufteilt...
Das ist möglich, dafür sind TRIGGER vorgesehen. Ein Trigger ist ein Arbeitsablauf, der automatisch vor oder nach jedem Speichern-Befehl ausgeführt wird. Unter MySQL wird ein Trigger etwa so definiert (stark verkürzt):

Code: Alles auswählen

CREATE TRIGGER <Name des Triggers>
BEFORE INSERT ON <Name der Tabelle>
FOR EACH ROW
BEGIN
  /* mach etwas, z.B. die Aufteilung */
END
HSQLDB kennt Trigger (Base-Handbuch Seite 275), aber wie die Befehle aufgebaut sein müssen, wird dort leider nicht beschrieben. Das muss im Internet herausgesucht werden; aber ich finde keinen Ansatz dazu.
Als Abfrage würde mir der SQL Befehl jeglich die gewünschten Daten in einem Bericht anzeigen, richtig?
Nicht nur in einem Bericht, sondern auch in Formularen oder als Datenquelle für ein Writer-Dokument. Ich betone noch einmal: Mein obiger SQL-Befehl gehört nicht zu einer Abfrage, sondern ändert die Daten innerhalb der Datenbank-Tabelle!
Wo genau gebe ich den SQL Befehl ein, sodass meine Idee umgesetzt werden kann?
Oder geht das aufteilen einer Zelle nicht, so wie ich mir das vorstelle?
Es geht auf jeden Fall.

Nach dem Sinn von SQL und relationalen Datenbanken wäre der Trigger optimal dafür geeignet. Das CREATE TRIGGER wird einmalig eingegeben. Von der Base-Hauptseite ist eigentlich kein Weg dafür vorgesehen. Dann müsste vermutlich (das ist jetzt nur geraten!) der Punkt "Abfrage in SQL-Ansicht erstellen" missbraucht werden; durch "Abfrage öffnen" würde die Trigger-Definition registriert. Danach macht die Datenbank die Aufteilung selbständig.

Es ist verbreitet, alles als "Abfrage" zu bezeichnen; denn Abfragen sind das wichtigste Hilfsmittel von SQL. Mit zumindest der gleichen Berechtigung könnte man verallgemeinert sagen: "Befehl in SQL-Ansicht erstellen" und dann "Befehl ausführen".

Eine sinnvolle Ersatzlösung ist der folgende Weg, sofern die neuen Daten über ein Formular eingegeben werden: Erstelle ein Makro, das "meinen" UPDATE-Befehl ausführt. Bearbeite das Formular; bei den Formular-Eigenschaften ist unter "Ereignisse" bei "Nach der Datensatzaktion" dieses Makro zuzuordnen. (Über Formular plus Makro gibt es auch andere Verfahren, sodass die String-Aufteilung während des Speicherns und nicht erst danach in einem zweiten Schritt erfolgt; aber dazu müssten wir das von dir vorgesehene Vorgehen bei der Dateneingabe genauer erfahren.)

Wenn die neuen Daten auf anderem Weg gespeichert werden sollen, gibt es vermutlich ähnliche Verfahren. Dazu müsstest du aber konkretere Informationen liefern; und vermutlich muss ich mit meinen Base-Kenntnissen passen. Jürgen

Re: Feldinhalt auto. aufteilen in Tabelle f. Datenbank?

Verfasst: Fr, 21.09.2012 18:17
von RobertG
Die eigentliche Dokumentation zur internen HSQLDB ist hier im Netz zu finden:
http://www.hsqldb.org/doc/1.8/guide/
Bei der in OOo und LO genutzen Version handelt es sich um die HSQLDB 1.8, also nicht die aktuelle 2.2.

Die Eingebe von anderen Befehlen als dem "SELECT" funktioniert nicht in dem Abfrageeditor von Base. Ein Trigger müsste also unter
Extras → SQL
direkt eingegeben werden.
Ich habe noch nie mit Triggern gearbeitet, kann zu den Funktionen unter Base daher auch nichts sagen.

Gruß

Robert

Re: Feldinhalt auto. aufteilen in Tabelle f. Datenbank?

Verfasst: Mo, 24.09.2012 16:42
von Riri_2022
juetho hat geschrieben:
Es ist verbreitet, alles als "Abfrage" zu bezeichnen; denn Abfragen sind das wichtigste Hilfsmittel von SQL. Mit zumindest der gleichen Berechtigung könnte man verallgemeinert sagen: "Befehl in SQL-Ansicht erstellen" und dann "Befehl ausführen".

Eine sinnvolle Ersatzlösung ist der folgende Weg, sofern die neuen Daten über ein Formular eingegeben werden: Erstelle ein Makro, das "meinen" UPDATE-Befehl ausführt. Bearbeite das Formular; bei den Formular-Eigenschaften ist unter "Ereignisse" bei "Nach der Datensatzaktion" dieses Makro zuzuordnen. (Über Formular plus Makro gibt es auch andere Verfahren, sodass die String-Aufteilung während des Speicherns und nicht erst danach in einem zweiten Schritt erfolgt; aber dazu müssten wir das von dir vorgesehene Vorgehen bei der Dateneingabe genauer erfahren.)

Wenn die neuen Daten auf anderem Weg gespeichert werden sollen, gibt es vermutlich ähnliche Verfahren. Dazu müsstest du aber konkretere Informationen liefern; und vermutlich muss ich mit meinen Base-Kenntnissen passen. Jürgen

Danke nochmals für die ausführliche Rückmeldung!

Ich habe mir einiges der Funktionen zu SQL durchgelesen, aber nicht alles. Soweit ist mir der Sinn und Zweck eigentlich recht klar, nur mit dem Umsetzen klappt es noch nicht.

Als erstes dachte ich nehme ich mal deinen ersten SQL Vorschlag, ändere Ihn auf die neuen Kriterien ...

((Die neue Seriennummer sieht so aus, welche nach folgenden Kriterien aufgeteilt werden sollte:

22200_B106_C013_1F5C_0512 -> Ausführung, Hardware, Firmware, Fertigungslos, Display.))

...wäre mein gewünschter Code dann wie folgt ?

Code: Alles auswählen

UPDATE myTable
   SET Ausführung = SUBSTRING(Seriennummer FROM 1 FOR 5),
       Hardware = SUBSTRING(Seriennummer FROM 7 FOR 4),
       Firmware = SUBSTRING(Seriennummer FROM 12 FOR 4),
       Fertigungslos = SUBSTRING(Seriennummer FROM 17 FOR 4),
       Display = SUBSTRING(Seriennummer FROM 22 FOR 4),
/* bei einmaliger Anpassung ohne WHERE-Klausel, normalerweise mit */



Wie ich anschliessend weiter mit dem arbeiten kann muss ich erst sehen :(

Das Thema Trigger klingt mir sehr schwierig, und mit Makros habe ich noch nie gearbeitet....

Anyways, wenn ich den obigen SQL code so als Abfrage eingebe kommt nur ein Fehlersalat :(
SQL-Status: HY000
Fehler-Code: 1000

Syntax error in SQL expression


parse error, expecting `BETWEEN' or `IN' or `SQL_TOKEN_LIKE'

Ich würde gerne bereits aufgeben, doch leider bin ich drum gebeten worden eine Lösung für die automatische Trennung der Felder zu finden... :?

Re: Feldinhalt auto. aufteilen in Tabelle f. Datenbank?

Verfasst: Mo, 24.09.2012 17:15
von juetho
Riri_2022 hat geschrieben:...wäre mein gewünschter Code dann wie folgt ?
Nein. RobertG hat einen Link gebracht, wo die Syntax bei HSQL zu finden ist. Auf dieser Hilfeseite wird im Abschnitt "String built-in Functions" auf SUBSTRING(Seriennummer, 1, 5) hingewiesen.
Anyways, wenn ich den obigen SQL code so als Abfrage eingebe kommt nur ein Fehlersalat :(
RobertG hat auch darauf hingewiesen, dass "Abfragen" in der Tat falsch ist, sondern Extras > SQL der richtige Startpunkt ist.

In einer "normalen, richtigen" Datenbank sind Trigger nicht besonders schwierig. Dazu gehört eigentlich nur der Code, den ich oben schon gebracht habe; zwischen BEGIN und END gehören die gleichen SUBSTRING-Anweisungen wie im UPDATE-Befehl. Aber nach dem, was ich gerade bei RobertGs Link gelesen habe, braucht man bei HSQL-Triggern fundierte Programmierkenntnisse nicht nur in SQL, sondern zumindest auch in Java und OOP. Dann wären OO-Makros erheblich leichter.

Hinter dem letzten SET-Parameter darf kein Komma stehen; das wird viele (teilweise unerklärliche) Fehler hervorrufen. In meinem Beispiel steht ein Semikolon als Abschluss des UPDATE-Befehls; wenn mit WHERE eine Einschränkung folgt, darf gar nichts kommen, sondern das Semikolon folgt erst nach der gesamten WHERE-Klausel.

Gruß Jürgen