helmuthelmut2000
Goto Top

Mit php drei Spalten von einer MSSQL DB addieren.

Hallo,

Ich habe ein Problem,
Ich bin in sachen PHP ein totaler frischling,
aber dank diesem Forum habe ich eine schöne Seite
zustande gebracht.
Jetzt sollte ich noch drei Spalten von einer MSSQL-DB addiren.
Kann mir vielleicht jemand sagen wie ich das mache?
Das Ergbniss soll auch in eine Spalte der DB eingetragen werden.

Für eine Hilfe wäre ich sehr dankbar.


Gruß
Helmut

Content-Key: 36944

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

Ausgedruckt am: 29.03.2024 um 08:03 Uhr

Mitglied: Dani
Dani 29.07.2006 um 21:42:48 Uhr
Goto Top
Hi,
du machst zuerst ein select der 3 Spalten.

$sql="SELECT * FROM TABELLE;";  
$result=mssql_query($sql);
$row=mssql_fetch_object($result);

Dann addieren und updaten:
$sql="UPDATE TABELLE SET erg='".($row->spalte1+$row->spalte2+$row->spalte3)."';";  
mssql_query($sql);

Gruß
DAni
Mitglied: filippg
filippg 30.07.2006 um 00:46:13 Uhr
Goto Top
Hallo,

das geht auch in SQL. Fragt sich nur wie face-wink (hängt auch etwas von der Struktur ab). Ein Ansatz wäre " SELECT Summe AS (tabelle.spalte1 + tabelle.spalte2 + tabelle.spalte3) FROM......".

Filipp

Edit: Und von einem etwas akademischen Standpunkt aus betrachtet: Was du vorhast ist eine Sünde: du willst die Daten redundant speichern (die drei Werte selber und die Summe, die du ja jederzeit aus den drei Spalten errechnen kannst), was zu unagenehmen update-Fehlern führen kann.


Edit2: Hups, kleiner Fehler: die Reihenfolge muss umgekehrt werden, korrekt heisst es: "SELECT spalte1 + spalte2 + spalte3 AS Summe".
Und: was die wirklich feinere Variante ist: unter MS SQL kannst du für eine Spalte auch eine Formel angeben. Wenn du dort einfach (spalte1 + spalte2 + spalte3) angibst hast du dort immer den akutellen Wert zum einfachen Abfragen und keine Probleme mit Updates. Das ist die mit Abstand sauberste Lösung für dein Problem (besser auch als ein Umweg über PHP).
Mitglied: Biber
Biber 30.07.2006 um 00:58:46 Uhr
Goto Top
@helmuthelmut2000
Von PHP versteh ich nichts - da will ich mich gar nicht einmengen.
Aber zu der Datenbankseite möchte ich doch anmerken:
Das Ergbniss soll auch in eine Spalte der DB eingetragen werden.
No, no, never...
Wenn dem Benutzer ein Summenfeld (als Summe dreier Tabellenspalten) angezeigt werden soll, dann lässt es sich natürlich mit Danis Strategie berechnen oder indem es gleich mit einem entsprechenden SQl-Statement abgefackelt wird:
$sql="SELECT feld1, feld2, feld3, feld1+feld2+feld3 as SummeFeld1Bis3 FROM TABELLE;";  
$result=mssql_query($sql);
$row=mssql_fetch_object($result);
... für den Betrachter/Benutzer kein sichtbarer Unterschied.
Aber die Tabelle ist redundanzfrei, hat ein Feld weniger (nötig) und das o.a. Update-Statement ist auch überflüssig.

Wie willst Du denn Datenkonsistenz gewährleisten, wenn irgendwann in den Feldern Feld1, Feld2 und Feld3 mal jeweils der Wert 10 steht und um Summenfeld der Wert 35???

Niemals berechnete Felder speichern, ausgenommen bestenfalls komplizierte Brechnungen wie siebente Wurzel mal cos des Netteinkaufswertes (was aber relativ selten benötigt wird). Und wenn doch, dann wird das über Trigger oder angestoßene stored procedures auf der DB-Serverseite getan, aber sicherlich nicht bei einem Arbeitsschritt wie oben, in dem die Tabelleninhalte durch den Client vom Server abgerufen werden, vom (flachbrüstigen) Client berechnet und wieder über das Netz zurückgeschickt werden zum DB-Server.
Das wäre das Vorgehen bei einem reinen File-Server-Szenario (mehrere Clients greifen auf eine Excel-Tabelle oder eine Access-MDB auf einem Netzlaufwerk zu), aber nichts, was Du tun musst, wenn Du eine echte Datenbank-Engine wie MS-SQL zur Verfügung hast.

Gruß
Biber
[Edit]
*winkzzzzz @filippg ...seh ich genauso face-wink
[/Edit]
Mitglied: helmuthelmut2000
helmuthelmut2000 30.07.2006 um 02:06:18 Uhr
Goto Top
Hallo,

Ja ich will mal die letzte lösung versuchen,
Wie mach ich das?
Du meinst ich mach mir noch ne Spalte die heist
z.B. Summe, und wie hinterlege ich da die Formel?
Kannst u mir das kurz erklären.

Danke.

mfG
Helmut
Mitglied: Guenni
Guenni 30.07.2006 um 09:51:11 Uhr
Goto Top
@helmuthelmut2000

Hi,

mache es so, wie Biber und fillipg es anfangs beschrieben haben.
Berechnungen aus Abfragen werden nie gespeichert.(Wer Spass daran hat,
soll es ruhig tun face-smile)

Warum auch?

Tabellen in Datenbanken sind ja selten statisch, das heißt, nach jeder
Änderung müßte in deinem Fall ein Update des Ergebnisfeldes durchgeführt werden.

Entweder für die gesamte Tabelle, oder du mußt in einzelnen Fällen
auch genau bestimmen, welche Datensätze nun aktualisiert werden
sollen.

Eine entsprechend formulierte Abfrage hingegen liefert dir sofort
gewünschte Ergebnisse.

Gruß
Günni

Kleine Anmerkung zu Biber:

...aber sicherlich nicht bei einem Arbeitsschritt wie oben, in dem die
Tabelleninhalte durch den Client vom Server abgerufen werden, vom
(flachbrüstigen) Client berechnet und wieder über das Netz zurückgeschickt
werden zum DB-Server....

... ist nicht richtg.

Das Script wird auf dem Server ausgeführt, heißt auch alle Berechnungen
finden dort statt. Erst das Ergebnis wird zum Client gesendet.
Mitglied: Biber
Biber 30.07.2006 um 10:26:57 Uhr
Goto Top
@günni
stimmt in Danis Skizze.
$sql="UPDATE TABELLE SET erg='".($row->spalte1+$row->spalte2+$row->spalte3)."';";  
mssql_query($sql);
Hast recht. Hatte ich falsch in Erinnerung bei meinem ersten Posting - ich dachte, die Summe wird vorher via PHP berechnet.
Dennoch bliebe auch auf diese Art der ganze zeitintensive und unnötige Overhead der C/S-Kommunikation - das SQL-Statement auf syntaktische Richtigkeit prüfen, kompilieren, Resultset bzw Ergebnis über die Leitung zurückmelden.

Wenn das Ganze via berechnetem Summenfeld in einem View...
CREATE VIEW MitSumme (Feld1, Feld2, Feld3, Summe) 
as Select Feld1, Feld2, Feld3, Feld1+Feld2+Feld3 from TabelleX;
...erledigt wird, gibt es diese Notwendigkeit nicht.

Gruß
Biber
Mitglied: helmuthelmut2000
helmuthelmut2000 01.08.2006 um 01:55:31 Uhr
Goto Top
Hallo,

Ich habe das mal von Biber probiert,
da bekomme ich aber immer die Fehlermeldung:
Warning: mssql_fetch_object(): supplied argument is not a valid MS SQL-result resource in
C:\Programme\Apache Group\Apache2\htdocs\Auftrag.php on line 27.

Ich erkläre mal kurz was ich da will.
Ich mache gerade eine Seite wo die Auftragsbestände zusammengezählt werden.
Es gibt Spalten:
Kunde, Auftagsnummer, Stückzahl, u.s.w.
Jetzt soll immer die Spalte Stückzahl zusammengezählt in einem Feld angezeigt werden.
Das bracht noch nicht abgespeichert sein denn es werden ja auch Aufträge abgearbeitet
und da ändert sich das ja laufend.
Dann möchte ich noch bei jedem Auftrag der hinzukommt die aktuelle Stückzahl anzeigen
in einem Feld das sollte dann gespeichert sein um einen Verlauf mit Datum anzeigen zu
können.
Dazu muß ich doch nur eine Spalte addieren können und auch mal ein paar Felder subdrahieren können.

Könnt ihr euch das Vorstellen wie ich das meine?


Gruß
Helmut
Mitglied: Guenni
Guenni 03.08.2006 um 23:01:06 Uhr
Goto Top
@helmuthelmut2000

Ich habe das mal von Biber probiert,
da bekomme ich aber immer die Fehlermeldung:
Warning: mssql_fetch_object(): supplied argument is not a valid MS SQL-result resource in
C:\Programme\Apache Group\Apache2\htdocs\Auftrag.php on line 27.
Dazu müßte man mal den Quellcode sehen, ansonsten kann man da nix zu sagen,
außer das, was die Fehlermeldung eh' schon sagt.
Ich erkläre mal kurz was ich da will.
Ich mache gerade eine Seite wo die Auftragsbestände zusammengezählt werden.
Es gibt Spalten:
Kunde, Auftagsnummer, Stückzahl, u.s.w.
Jetzt soll immer die Spalte Stückzahl zusammengezählt in einem Feld angezeigt werden.
Das ist aber jetzt mal was anderes, als 3 Spalten addieren face-smile
Du kannst ja in einem PHP-Script mehrere Abfragen definieren, du mußt halt nur
die Ergebnisse unterschiedlichen Variablen zuordnen:
Du addierst die Spalte Stückzahl mit select sum(stückzahl), das Ergebnis weist du
einer Textbox zu, die du irgendwo in der Seite plazierst.
Das bracht noch nicht abgespeichert sein denn es werden ja auch Aufträge abgearbeitet
und da ändert sich das ja laufend.
Dann möchte ich noch bei jedem Auftrag der hinzukommt die aktuelle Stückzahl anzeigen

Dazu änderst du den Select in Select sum(stückzahl) group by auftrag, dazu muß
jeder Auftrag eine eindeutige ID besitzen.
in einem Feld das sollte dann gespeichert sein um einen Verlauf mit Datum anzeigen zu
können.
Womit wir wieder da sind, was man eigentlich nicht machen sollte.
Wenn du einen Verlauf abfragst, ist das Ergebnis doch quasi schon in der Abfrage selber
gespeichert. Was du vor hast ist, korrigiere mich jemand, wenn ich falsch liege, eine
Abfrage abzusetzen, die Tabelle zu "updaten", anschließend die "geupdatete" Tabelle
abzurufen.

Dazu muß ich doch nur eine Spalte addieren können und auch mal ein paar Felder subdrahieren können.
Könnt ihr euch das Vorstellen wie ich das meine?
Klar, kann man sich das vorstellen, ist aber kein Problem in dem Sinne, dass man hier eine
Antwort gibt zu blablabla, das ist ja fast schon eine Anwendungsentwicklung.
Und das wird dir hier keiner abnehmen, das ist doch dein Part, oder???

Gruß
Günni
Mitglied: helmuthelmut2000
helmuthelmut2000 04.08.2006 um 10:35:03 Uhr
Goto Top
Hallo,

Ich habe das jetzt mal so gemacht.

$result=mssql_query("Select Stueck from Ergebnisse");
$Stueck=0;
if ($row = mssql_fetch_array($result)){
do {
$currZahl=$row["Stueck"];
$Stueck+=$currZahl;
} while ($row = mssql_fetch_array($result));
}
$result=mssql_query("Select Stueck1 from Ergebnisse");
$Stueck1=0;
if ($row = mssql_fetch_array($result)){
do {
$currZahl=$row["Stueck1"];
$Stueck+=$currZahl;
} while ($row = mssql_fetch_array($result));
}
$result=mssql_query("Select Stueck2 from Ergebnisse");
$Stueck2=0;
if ($row = mssql_fetch_array($result)){
do {
$currZahl=$row["Stueck2"];
$Stueck+=$currZahl;
} while ($row = mssql_fetch_array($result));
}


echo $Kunde$Stueck1$Stueck2

Gruß
Helmut