helmuthelmut2000
Goto Top

In ein Neues Feld gleichzeitig Daten reinschreiben mit PHP in MSSQL

Hallo,

Ich hab da mal ne Frage womit ich mich schon länger Beschäftige.
In meiner MSSQL DB Erstelle ich ein Neues Feld mit dem befehl:

$sql="ALTER TABLE Verlauf ADD ".$_POST['Artikelnummer']." nchar(11)";

Gleichzeitig möchte ich auch Daten reinschreiben. (z.B. mit INSERT INTO).

Gibt es da überhaupt eine Möglichkeit gleichzeitig ein Feld mit Daten zu erstellen?

Wenn da jemand was wüsste wäre ich sehr dankbar.

Danke.

Gruß
Helmut

Content-Key: 43496

Url: https://administrator.de/contentid/43496

Printed on: April 26, 2024 at 17:04 o'clock

Member: wakko
wakko Nov 01, 2006 at 13:20:54 (UTC)
Goto Top
Sieht so aus, als ob da was beim Datenbankentwurf schief gegangen ist.
Kann dir da nur mal eine Normalisierung ans Herz legen, da du so ja die Tabelle immer "breiter" werden läßt.
Warum soll eine Spalte mit einer geposteten Artikelnummer erstellt werden? Wäre da nicht eine Spalte "Artikelnummer" sinnvoller, die die entsprechende Artikelnummer für jeden Datensatz enthält?
Ansonsten müsstest du das Problem in deinem Fall mal genauer erläutern...

MfG
Member: n.o.b.o.d.y
n.o.b.o.d.y Nov 01, 2006 at 13:23:32 (UTC)
Goto Top
Hallo,

SQL läßt es nicht zu, dass Du eine Tabelle erweiterst und gleichzeitig das Feld füllst. Das mußt Du immer mit zwei Statments machen.
DDL und DML können nicht gemischt werden.

Ralf
Member: Biber
Biber Nov 01, 2006 at 13:29:08 (UTC)
Goto Top
SQL läßt es nicht zu, dass Du eine Tabelle erweiterst und gleichzeitig das Feld füllst.
..es sei denn so:
ALTER TABLE whatever ADD newfield char(12) not null with default "WattDuWillst".
Dann bekämen alle Sätze in der neu angelegten Spalte den Wert "WattDuWillst".

Aber ich denke auch, hier liegt ein Missverständnis vor wie im ersten Kommentar beschrieben...
Es geht doch hoffentlich nur um einen neuen Datensatz, nicht um ein neues Feld.

Gruß
Biber
Member: helmuthelmut2000
helmuthelmut2000 Nov 01, 2006 at 19:23:07 (UTC)
Goto Top
Hallo,

Ja,
Ich habe das so versucht:

ALTER TABLE Verlauf ADD ".$_POST['Artikelnummer']." nchar(11)";

Wenn ich da im Formular Artikelnummer test110 eingebe dann legt es eine Spalte mit
test110 an.
Wenn ich dann:

ALTER TABLE Verlauf ADD ".$_POST['Artikelnummer']." nchar(11) WattDuWillst";

eingebe, dann bekomme ich da die Fehlermeldung:

Warning: mssql_query() [function.mssql-query]: message: Zeile 5: Falsche Syntax in der Nähe von 'WattDuWillst'. (severity 15) in C:\Programme\Apache Group\Apache2on line 23

Ich kann das so "WattDuWillst"; oder so WattDuWillst reinschreiben.

Was mach ich da blos wieder falsch.
Das hängt doch bestimmt wieder mit dem " oder ' zusammen?

Kannst du mir das mal erklären?

Danke.

Gruß
Helmut
Member: Biber
Biber Nov 01, 2006 at 20:35:28 (UTC)
Goto Top
Moin Helmut,

also, ich hatte vorhin offensichtlich wieder vergessen, <Ironie>-Tags oder Smilies mit einzustreuen. Sorry.

Also, grundsätzlich kann ich beim Anlegen einer neuen SPALTE in einer Datenbank auch mit angeben, dass diese SPALTE einen Defaultwert haben soll.

Das gilt aber für alle bereits vorhandenen Datensätze in der Tabelle - also würde dann bei bei Dir in 57 Millionen Datensätzen im der neuen Spalte "4711" (wenn das die neue Artikelnummer ist), der Wert "WattDuWillst" stehen.

Ich glaube nicht, dass das wirklich Dein Wunsch ist.

Wenn doch - die grundsätzliche SQL-Syntax dafür lautet
ALTER TABLE ADD neuesTabellenfeld feldtypUndggfLänge [NOT NULL] [WITH DEFAULT defaultwert]
Mit dieser Syntax würde es eher gehen ...allerdings nur, wenn das Feld wie von mir oben beschrieben ist, CHAR(12) ist.
Weil -"WattDuWillst" hat nu mal 12 Zeichen und nicht 11. face-wink
[wobei das die SQL-Syntax ist, die ich von anderen DBMSen kenne, hab es nicht mit mySQL getestet]

Aber nun zum anderen überlesenen Teil meines Postings:
Es ist höchst ungewöhnlich, dass Du für jeden neuen Artikel eine neue Spalte in einer Tabelle anlegen musst.
Es sei denn, Du bastelst Dir gerade eine Tabellenstruktur für dynamische Auswertungen a la Pivot zusammen.
Bist Du sicher, dass Du für diese eingegebene Artikelnummer eine neue Tabellenspalte brauchst und nicht einen neuen Satz in einer Tabelle?
Eine neue Spalte mit dem Feldnamen "4711" würde doch nur dann Sinn machen, wenn Du schon irgendwo anders weitere Attribute (Artikelname, Artikelpreis,....) in Tabellen hinterlegt hast und außerdem für alle Datensätze in der eben geänderten Tabelle einen sinnvollen Wert für "4711" parat hättest.

Gruß
Biber

P.S. Und ansonsten war die Antwort von n.o.b.o.d.y. die richtige und erschöpfende Lösung.

Was spricht denn dagegen, die Tabelle mit einem ALTER TABLE zu ändern und danach ein "UPDATE TABLE ..SET neuesfeld ="WattDuWillst" zu machen?
Member: helmuthelmut2000
helmuthelmut2000 Nov 01, 2006 at 21:54:46 (UTC)
Goto Top
Hallo Biber,

Ja das ist so wie du das schreibst.
Ich habe in einer anderen Tabelle den Preis, Name usw. angelegt.
Jetzt möchte ich einen Verlauf basteln wo es mir schreibt wann wieviel
von einem Artikel verkauft oder wieder gekauft wird.
Da habe ich das so gemacht das beim Anlegen des Artikels auch noch in der Tabelle
Verlauf eine Spalte mir Artikelnummer(das bietet sich an weil es die Artikelnummer
immer nur einmal gibt)angelegt wird, und wird jetzt immer die Stückzahl eingetragen
wieviel gekauft und dann verkauft wurde. Jetzt wäre das halt schön wenn beim
anlegen das Artikels auch gleich die Startstückzahl mit eingetragen würde.
Aber wenn sowas nicht geht dann muß ich halt bei der eingabe 2 Seiten machen.

Gruß
Helmut
Member: Biber
Biber Nov 01, 2006 at 22:18:01 (UTC)
Goto Top
Wenn das so ist wie Du schreibst, Helmut,

dann wäre es erst recht Unsinn und überflüssig, beim Anlegen der Spalte gleichzeitig einen Default-Wert mitzugeben.

Wenn der Artikel am 1.November dazukommt und 100 Stück gekauft wurden, die Tabelle "Verlauf" aber seit April 2005 existiert.... dann willst Du doch nicht die Angabe "100" in allen Datensätzen stehen haben.

Also mach es wie von n.o.b.o.d.y. skizziert,
- erst das "ALTER TABLE verlauf ADD ".$_POST['Artikelnummer']." nchar(11);"
- dann das "Insert into verlauf ( Pflichtfelder..., ".$_POST['Artikelnummer']." )
values ( pflichtfelderwerte,..., 100)"

Gruß
Biber
Member: helmuthelmut2000
helmuthelmut2000 Nov 02, 2006 at 12:58:12 (UTC)
Goto Top
Hallo,

Nein das mein ich nicht so.

Ein Artikel mit einer Artikelnummer wird nur einmal angelegt, (evt auch mit einer Stückzahl).
Dann wird eine Stückzahl dazuaddiert oder abgezogen (bei kaufen dazu und beim verkaufen weg.)
Das mach ich dann über ändern.

Gruß
Helmut
Member: n.o.b.o.d.y
n.o.b.o.d.y Nov 02, 2006 at 13:12:26 (UTC)
Goto Top
Hallo,

damit wir das hier alle richtig verstehen: face-smile

Du möchtest einmal eine Tabelle mit den Artikelstammdaten haben:

Art.Nr|Bezeichnung|Bestand
4711 |Becksbier |100
...
So etwa?

Dann möchtest Du eine Tabelle mit Historiedaten haben:

Art.Nr|Datum|vorhandene Menge
4711 |1.1.06|55
4711 |2.1.06|100000


Oder wie hast Du dir das vorgestellt?

Ralf
Member: helmuthelmut2000
helmuthelmut2000 Nov 02, 2006 at 14:46:27 (UTC)
Goto Top
Hallo,

Ja ich hätte das so gemacht:

1.Tabelle

Art.Nr|Bezeichnung|Bestand
4711 |Becksbier |100
4712 |Weizenbi.| 200

...

2.Tabelle

4711 | 4712 | .....

100 | 200 | .....


Den Spaltenname möchte ich gleich als Art.Nr. nehmen.

Gruß
Helmut
Member: Biber
Biber Nov 02, 2006 at 18:42:00 (UTC)
Goto Top
Also, diesen Plan mit der 1-Satz-Verlauf (oder eher Bestand-Tabelle) halte ich nicht für zukunftsträchtig.

Aber da das ja nicht die Frage war, musst Du dann das zweite gepostete Statemet ändern von INSERT auf UPDATE.
- erst das ALTER TABLE:
... ALTER TABLE verlauf ADD ".$_POST['Artikelnummer']." nchar(11);
- dann das UPDATE
Update verlauf set ".$_POST['Artikelnummer']." = 100;

-bzw- wenn diese Tabelle wirklich nur den einen Satz mit "Bestand hier und heute" hat, dann kannst Du tatsächlich den oben beschriebenen Unsinn Lösungsweg mit "NOT NULL WITH DEFAULT 100" beim ALTER-Statement nehmen.

Grüße
Biber
Member: helmuthelmut2000
helmuthelmut2000 Nov 02, 2006 at 21:05:54 (UTC)
Goto Top
Hallo,

Also der schreibt das nicht,
aber das mach ich jetzt auf zwei seiten.
Zuerst lege ich die Spalte an und dann mach ich mit
eine zweite Seite wo ich dann den Wert reinschreibe.
Da habt ihr Recht.
Aber vielleicht wisst ihr mir da eine Lösung mit den Zahlen die ich
als Spalte benennen will.
Meine Artikelnummern heisen alle z.B. 778-3423 und 778-3424 usw.
Das macht die SQL db aber nicht.
Da müßte ich immer [778-3423] schreiben.
Wie löst man das am besten damit man nicht schreiben will ???

Danke.

Gruß
Helmut