Re: [de-users] Base 2.2: SQL Befehl für neue Datensätze die teilw. aus 2. Tabelle kopierte werden

2007-11-03 Diskussionsfäden Lars Lehmann
Hallo Robert,

> Mach' einmal das Folgende:
> Gründe eine Tabelle "Test" mit nur einer Spalte, Primärschlüssel, einziger
> Wert '1'
> Mach' eine Abfrage
> SELECT "test".*, "FzLu"."ItemID" "FzLu"."Anzahl"
> FROM "FzLu", "test" WHERE ("FzLu"."FzTypID" = 10)

Das ist zwar ein wenig "von hinten durch Knopfloch ins Auge" aber er
funktioniert. Über die SQL-Konsole führt folgeder Befehlssatz zum
erwünschten ergebnis:

CREATE TABLE "tmp" ("FzID" INTEGER PRIMARY KEY);
INSERT INTO "tmp" VALUES ('1');
INSERT INTO "FzA" SELECT "tmp".*, "FzLu"."ItemID", "FzLu"."Anzahl"
FROM "tmp", "FzLu" WHERE ("FzLu"."FzTypID" = 10);
DROP TABLE "tmp"

Ok, das werde ich jetzt mal versuchen als SQL-Befehl in das
entsprechende Makro einzubinden.

Danke
Gruß Lars

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: [de-users] Base 2.2: SQL Befehl für neue Datensätze die teilw. aus 2. Tabelle kopierte werden

2007-11-03 Diskussionsfäden Robert Großkopf
Hallo Lars,
>
> > Teste mal
> > INSERT INTO "FzA" VALUES ('1', SELECT "FzLu"."ItemID" "FzLu"."Anzahl"
> > FROM "FzLu" WHERE "FzLu"."FzTypID" = 10)
>
> Endet mit der Fehlermeldung:
> 1: Unexpected token Fahrzeugausstattung Lieferumfang, requires FROM in
> statement [INSERT INTO "FzA" VALUES ('1', SELECT "FzLu"."ItemID"
> "FzLu"."Anzahl"]
>
> Da schneit er die Angabe von zwei Spalten in einem VALUES-Argument
> nicht zu vertragen.

Mach' einmal das Folgende:
Gründe eine Tabelle "Test" mit nur einer Spalte, Primärschlüssel, einziger 
Wert '1'
Mach' eine Abfrage 
SELECT "test".*, "FzLu"."ItemID" "FzLu"."Anzahl"
FROM "FzLu", "test" WHERE ("FzLu"."FzTypID" = 10)

Wenn das klappt, dann hast Du die Spalten zusammen in einer Abfrage und kannst 
Dir die '1' sparen.

Gruß

Robert

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: [de-users] Base 2.2: SQL Befehl für neue Datensätze die teilw. aus 2. Tabelle kopierte werden

2007-11-03 Diskussionsfäden Lars Lehmann
Am 03.11.07 schrieb Robert Großkopf <[EMAIL PROTECTED]>:
> Hallo Lars,
> >
> > Was ich gerade um zu setzen versuche ist das "Kaufen eines neuen
> > Fahrzeugs". Dazu muss zuerst in Fz ein neuer Datensatz angelegt
> > werden, der auf den entsprechenden FzTyp verweißt. Das habe ich über
> > ein Makro erledigt. Danach muss für das neue Fahrzeug der Liederumfang
> > in die Ausstattungsliste übertragen werden, dazu wollte ich das SQL
> > Kommando wissen. Anders ausgedrück:
> > Ich suche ein SQL Kommando, dass mir in eine Tabelle (FzA) alle
> > Einträge einer anderen Tabelle (FzLu) kopiert,
>
> Warum kopiert? Du willst doch eigentlich nur vorhandene IDs schreiben, oder?

Nein, ich will zusammen mit der "Anschaffung" ein Fahrzeugs, dessen
Lieferumfang "anschaffen". Da die tatsächliche Ausstattung eines
tatsächlichen Fahrzeugs aber in einer anderen Tabelle abgelegt wird
als der Lieferumfang eines Fahrzeugs müssen die entsprechenden Spalten
des Entsprechenden Einträge des Liegerumfangs in die Tabelle der
Fahrzeugausstattung kopiert werden. Sonst würde ich ja mit der
Änderung der Beladung eines tatsächlichen Fahrzeugs die
Serienausstattung mit ändern. Oder wolltest Du mich hintergründig auf
eine elegantere Lösung aufmerksam machen? Dann mußt Du mir diese wohl
ein wenig deutlicher erläutern.


> Teste mal
> INSERT INTO "FzA" VALUES ('1', SELECT "FzLu"."ItemID" "FzLu"."Anzahl"
> FROM "FzLu" WHERE "FzLu"."FzTypID" = 10)

Endet mit der Fehlermeldung:
1: Unexpected token Fahrzeugausstattung Lieferumfang, requires FROM in
statement [INSERT INTO "FzA" VALUES ('1', SELECT "FzLu"."ItemID"
"FzLu"."Anzahl"]

Da schneit er die Angabe von zwei Spalten in einem VALUES-Argument
nicht zu vertragen.

Gruß Lars

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: [de-users] Base 2.2: SQL Befehl für neue Datensätze die teilw. aus 2. Tabelle kopierte werden

2007-11-03 Diskussionsfäden Robert Großkopf
Hallo Lars,
>
> Was ich gerade um zu setzen versuche ist das "Kaufen eines neuen
> Fahrzeugs". Dazu muss zuerst in Fz ein neuer Datensatz angelegt
> werden, der auf den entsprechenden FzTyp verweißt. Das habe ich über
> ein Makro erledigt. Danach muss für das neue Fahrzeug der Liederumfang
> in die Ausstattungsliste übertragen werden, dazu wollte ich das SQL
> Kommando wissen. Anders ausgedrück:
> Ich suche ein SQL Kommando, dass mir in eine Tabelle (FzA) alle
> Einträge einer anderen Tabelle (FzLu) kopiert, 

Warum kopiert? Du willst doch eigentlich nur vorhandene IDs schreiben, oder?

> die eine bestimmte 
> Bedingung erfüllen (FzTypID = Fahrzeugtyp des neu gekauften
> Fahrzeugs). Dabei werden auch der zweiten Tabelle aber nicht alle
> Spalten benötigt (nur ItemID und Anzahl) und in die erste Spalte der
> ersten Tabelle ist immer der gleiche Werte (FzID des neugekauften
> Fahrzeugs) zu schreiben.

Soweit klar.

> Nach meinen Quellen ist die Angabe der Spalten, in die etwas
> eingetragen werden soll optional. Werden die Spalten nicht angegeben,
> müssen werte für jede vorhandene Spalte der Zieltabelle in der
> richtigen Reihenfolge angegeben werden, was bei meinem Ansatz der Fall
> war.

(Siehe auch das Umkopieren von Thread "Komplizierte Abfrage")

>
> Ich habe inzwischen die Vermutung, dass ich das Problem eleganter mit
> Union oder Join lösen kann. Die Einleitung des entsprechenden Kapitels
> in meinen SQL-Buch klingt vielversprechend.

Ich habe die Datenbank zum Ausprobieren nicht, aber hier einmal Deine 
Variante:
INSERT INTO "FzA" VALUES ('1') SELECT "FzLu"."ItemID" "FzLu"."Anzahl"
FROM "FzLu" WHERE "FzLu"."FzTypID" = 10
Und dann mein Hinweis: VALUES endet mit der Schließung der Klammer.

Teste mal
INSERT INTO "FzA" VALUES ('1', SELECT "FzLu"."ItemID" "FzLu"."Anzahl"
FROM "FzLu" WHERE "FzLu"."FzTypID" = 10)

Gruß

Robert

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: [de-users] Base 2.2: SQL Befehl für neue Datensätze die teilw. aus 2. Tabelle kopierte werden

2007-11-03 Diskussionsfäden Lars Lehmann
Hallo Reto, Hallo Robert, Hallo Liste,

erstmal danke für eure Antworten, auch wenn sie noch nicht zu einer
funktionierenden Lösung geführt haben.

Robert schrieb:
> Vielleicht verstehe ich auch die Frage nicht so ganz. Aber Du hast
> ein Einfügekommando, dass nach dem Wert zu Ende ist. Willst Du
> das nächste Kommando gleich hinterherschieben, so musst Du
> mit ";" trennen. Das 2. Kommando ist eine ganz nurmale Abfrage,
> hat meines Erachtens mit dem ersten überhaupt nichts zu tun.

Um diese Unklarheiten zu beseitigen, werde ich die Aufgabe noch mal
ausführlich beschreiben:
Ich habe eine eine Tabelle mit Ausrüstungsgegenständen:

Items(*ItemID, Bezeichnung, ...)
1 Werkzeugkasten
2 Warndreieck
3 Klappleiter
4 Verkehrsleitkegel


In einer weiteren Tabelle sind Fahrzeugtypen gespeichert:

FzTyp(*FzTypID, Bezeichnung, ...)
1 Einsatzleitfahrzeug (Jeep)
2 Einsatzleitfahrzeug (Van)
3 Rüstwagen
...

Zwischen diesen beiden Tabellen gibt es ein n:m-Beziehung, die
ausdrückt welchen Lieferumfang der jeweilige Fahrzeugtyp enthält.
Diese Bezeihung ist durch eine weitere Tabelle realisiert:

FzLu(*FzTypID, *ItemID, Anzahl)
1 2 1
1 4 10
3 1 3
3 3 2
...

Bisher habe ich in der Datenbank also die erhältlichen Fahrzeugtypen
und ihren Lieferumfang gespeichert. Zum einen kann ich nun mehrere
Fahrzeuge desselben Typs kaufen, zum anderen kann ich die Ausstattung
dieser Fahrezuge nach dem Kauf verändern, deshalb gibt es die beiden
Tabellen
Fz(*FzID, FzTypID, ...) in der die tatsächlich vorhandenen
Fahrzeuge gespeichert sind und
FzA(*FzID, *ItemID, Anzahl)  in der gespeichert wird welche Ausrüstung
auf welchem Fahrzeug ist (n:m Relation zwischen Fz und Items).

Was ich gerade um zu setzen versuche ist das "Kaufen eines neuen
Fahrzeugs". Dazu muss zuerst in Fz ein neuer Datensatz angelegt
werden, der auf den entsprechenden FzTyp verweißt. Das habe ich über
ein Makro erledigt. Danach muss für das neue Fahrzeug der Liederumfang
in die Ausstattungsliste übertragen werden, dazu wollte ich das SQL
Kommando wissen. Anders ausgedrück:
Ich suche ein SQL Kommando, dass mir in eine Tabelle (FzA) alle
Einträge einer anderen Tabelle (FzLu) kopiert, die eine bestimmte
Bedingung erfüllen (FzTypID = Fahrzeugtyp des neu gekauften
Fahrzeugs). Dabei werden auch der zweiten Tabelle aber nicht alle
Spalten benötigt (nur ItemID und Anzahl) und in die erste Spalte der
ersten Tabelle ist immer der gleiche Werte (FzID des neugekauften
Fahrzeugs) zu schreiben.

Nun zu euren Vorschlägen:
Reto schrieb:
> Ich glaube du hast die Spalte vergessen anzugeben. Zwar weiss die
> Datenbank nun dass du etwas in die Tabelle FzA schreiben willst, aber
> nicht in welche Spalte:
> INSERT INTO "FzA" (Spalte) VALUES (WERT)

Nach meinen Quellen ist die Angabe der Spalten, in die etwas
eingetragen werden soll optional. Werden die Spalten nicht angegeben,
müssen werte für jede vorhandene Spalte der Zieltabelle in der
richtigen Reihenfolge angegeben werden, was bei meinem Ansatz der Fall
war.

Reto machte noch folgenden Vorschlag:
> INSERT INTO "FzA" (Spalte1,ItemID,Anzahl) VALUES ('1',(SELECT "ItemID"
> FROM "FzLu" WHERE "FzTypID" = 10),(SELECT "Anzahl" FROM "FzLu"
> WHERE "FzTypID" = 10))

An diesem Vorschlag paßt mir nicht, dass für ItemID und Anzahl zwei
getrennte Abfragen gemacht werden, es ist aber wichtig, das ItemID und
Anzahl aus dem selben Datensatz der abgefragten Tabelle stammen.
Bringt diese Abfrage den Fehler "Single Value expected".

Rober schlug vor:
> INSERT INTO "AFz" (FzID) VALUES ('1');
> SELECT "FzLu"."ItemID" "FzLu"."Anzahl"
> FROM "FzLu" WHERE "FzLu"."FzTypID" = 10

Hierbei handelt es sich doch um nacheinander abgearbeitete
Anweisungen, oder. Das Ergebnis von Select soll aber geinsertet werde,
wie oben beschrieben.

Ich habe inzwischen die Vermutung, dass ich das Problem eleganter mit
Union oder Join lösen kann. Die Einleitung des entsprechenden Kapitels
in meinen SQL-Buch klingt vielversprechend.

Gruß Lars

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: [de-users] Base 2.2: SQL Befehl für neue Datensätze die teilw. aus 2. Tabelle kopierte werden

2007-11-02 Diskussionsfäden Robert Großkopf
Hallo Lars,
>
> LuFz (FzTypID, ItemID, Anzahl)
>
> AFz (FzID, ItemID, Anzahl)
>
>
> INSERT INTO "FzA" VALUES ('1') SELECT "FzLu"."ItemID" "FzLu"."Anzahl"
> FROM "FzLu" WHERE "FzLu"."FzTypID" = 10
>
Zuerst einmal: "FzA" oder "AFz"?
"LuFz" oder "FzLu"?
Dann
INSERT INTO "AFz" (FzID) VALUES ('1');
SELECT "FzLu"."ItemID" "FzLu"."Anzahl"
FROM "FzLu" WHERE "FzLu"."FzTypID" = 10

Vielleicht verstehe ich auch die Frage nicht so ganz. Aber Du hast ein 
Einfügekommando, dass nach dem Wert zu Ende ist. Willst Du das nächste 
Kommando gleich hinterherschieben, so musst Du mit ";" trennen. Das 2. 
Kommando ist eine ganz nurmale Abfrage, hat meines Erachtens mit dem ersten 
überhaupt nichts zu tun.

Gruß

Robert

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: [de-users] Base 2.2: SQL Befehl für neue Datensätze die teilw. aus 2. Tabelle kopierte werden

2007-11-02 Diskussionsfäden Hasler Reto
Hallo zusammen


Ich wahr wohl zu voreilig:


> INSERT INTO "FzA" VALUES ('1') SELECT "FzLu"."ItemID" "FzLu"."Anzahl"
> FROM "FzLu" WHERE "FzLu"."FzTypID" = 10
>

INSERT INTO "FzA" (Spalte1,ItemID,Anzahl) VALUES ('1',(SELECT "ItemID" 
FROM "FzLu" WHERE "FzTypID" = 10),(SELECT "Anzahl" FROM "FzLu" 
WHERE "FzTypID" = 10))

So Sollte es eher gehen. Die Spalten sind natürlich noch richtig zu benennen. 
Zur Information was gemacht wurde:

Mit dem Insert wurde gesagt, dass 3 Werte in die Tabelle "FzA" geschrieben 
werden sollen. Die Spalten, welche gefüllt werden sollen, sind in der ersten 
Klammer durch Kommas getrennt aufgelistet. 
Nach dem VALUES werden die Werte, die Eingeschrieben werden sollen, definiert. 
Dabei muss man darauf achten, dass die Reihenfolge mit der Reihenfolge der 
Spalten übereinstimmt. 
Da die Werte ItemID und Anzahl zuerst errechnet werden müssen, wird dies durch 
eine Unterabfrage erledigt. Unterabfragen stehen immer in Klammern und der 
Rückgabewert der Unterabfrage wird dann weiter verwendet. Du willst zwei 
Werte, so brauchst du meines Wissens auch zwei Unterabfragen.

Sollte jemand eine einfachere oder bessere Lösung kennen, soll er es bitte 
sagen.  Ich selber kenne mich mit SQL noch nicht so gut aus und lerne gerne 
noch dazu ;-)

Gruss Reto 

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: [de-users] Base 2.2: SQL Befehl für neue Datensätze die teilw. aus 2. Tabelle kopierte werden

2007-11-02 Diskussionsfäden Hasler Reto
Am Freitag, 2. November 2007 schrieb Lars Lehmann:
> Hallo zusammen,
>
> ich möchte folgendes mit einem SQL Befehl erledigen:
>
> In der Tabelle "LuFz" ist der Lieferumfang von Fahrzeugen abgelegt:
>
> LuFz (FzTypID, ItemID, Anzahl)
>
> In einer weiteren Tabelle "AFz" ist die tatsächliche Ausstattung von
> Fahrzeugen abgelegt (Schließlich kann man Austattung dazu kaufen oder
> verkaufen.)
>
> AFz (FzID, ItemID, Anzahl)
>
> Die unterschiedlichen verfügbaren Fahrzeugtypen sind in einer eigenen
> Tabelle "FzTypen" abgelegt. Der Fuhrpark in der Tabelle "Fz". Wenn ich
> ein neue Fahrzeug "kaufe" soll nun folgenden passieren:
>
> 1. Anlegen eines neuen Datensatzes in "Fz" der auf den entsprechenden
> Fahrzeugtyp verweist. Das habe ich inzwischen per Makro erledigt.
>
> 2. Kopieren der Lieferumfangs für diesen Fahrzeugtyp (in "LuFz") in
> die tatsächliche Ausstattung unter Angabe der FzID der neuen
> Fahrzeugs.
>
> Ich hab das erfolglos mit folgender Anweisung versucht. Dabei habe ich
> der Einfachheit halber erstmal die FzID = 1 und den Fahrzeugtyp = 10
> gesetzt (Fahrzeug und Fahrzeugtyp gib es!)
>
> INSERT INTO "FzA" VALUES ('1') SELECT "FzLu"."ItemID" "FzLu"."Anzahl"
> FROM "FzLu" WHERE "FzLu"."FzTypID" = 10

Ich glaube du hast die Spalte vergessen anzugeben. Zwar weiss die Datenbank 
nun dass du etwas in die Tabelle FzA schreiben willst, aber nicht in welche 
Spalte:

INSERT INTO "FzA" (Spalte) VALUES (WERT)

> Anscheinend ist dieser SQL-Befehl aber falsch und mir gehen die Ideen aus.

Ich denke dass es da dran liegt. Sollte es immer noch nicht gehen, schreibe 
auf jeden Fall wieder die Queries, die du versucht hast, ins E-Mail

Gruss Reto

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



[de-users] Base 2.2: SQL Befehl für neue Datensätze die teilw. aus 2. Tabelle kopierte werden

2007-11-02 Diskussionsfäden Lars Lehmann
Hallo zusammen,

ich möchte folgendes mit einem SQL Befehl erledigen:

In der Tabelle "LuFz" ist der Lieferumfang von Fahrzeugen abgelegt:

LuFz (FzTypID, ItemID, Anzahl)

In einer weiteren Tabelle "AFz" ist die tatsächliche Ausstattung von
Fahrzeugen abgelegt (Schließlich kann man Austattung dazu kaufen oder
verkaufen.)

AFz (FzID, ItemID, Anzahl)

Die unterschiedlichen verfügbaren Fahrzeugtypen sind in einer eigenen
Tabelle "FzTypen" abgelegt. Der Fuhrpark in der Tabelle "Fz". Wenn ich
ein neue Fahrzeug "kaufe" soll nun folgenden passieren:

1. Anlegen eines neuen Datensatzes in "Fz" der auf den entsprechenden
Fahrzeugtyp verweist. Das habe ich inzwischen per Makro erledigt.

2. Kopieren der Lieferumfangs für diesen Fahrzeugtyp (in "LuFz") in
die tatsächliche Ausstattung unter Angabe der FzID der neuen
Fahrzeugs.

Ich hab das erfolglos mit folgender Anweisung versucht. Dabei habe ich
der Einfachheit halber erstmal die FzID = 1 und den Fahrzeugtyp = 10
gesetzt (Fahrzeug und Fahrzeugtyp gib es!)

INSERT INTO "FzA" VALUES ('1') SELECT "FzLu"."ItemID" "FzLu"."Anzahl"
FROM "FzLu" WHERE "FzLu"."FzTypID" = 10

Anscheinend ist dieser SQL-Befehl aber falsch und mir gehen die Ideen aus.

Gruß Lars

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]