Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Datenübergabe an DB?!? (https://www.delphipraxis.net/36544-sql-datenuebergabe-db.html)

Hansi 21. Dez 2004 15:01


SQL Datenübergabe an DB?!?
 
Hier meine Abfrage.


Delphi-Quellcode:
SELECT sum(Wert) as Summe FROM Datenbank WHERE Datum BETWEEN :von AND :bis
Delphi-Quellcode:
Summe := Query1.FieldByName('Summe').AsInteger;
Wie kann ich die Variable Summe an eine ganz bestimmt Stelle in die Datenbank schreiben? (WHERE Datum =:bis)

Jelly 21. Dez 2004 15:19

Re: SQL Datenübergabe an DB?!?
 
Ich versteh nicht ganz was du willst. Etwa während der Select Abfrage gleichzeitig was schreiben. Das wird nicht klappen.

Hansi 21. Dez 2004 15:23

Re: SQL Datenübergabe an DB?!?
 
nach der SELECT-Abfrage die sum(Wert) an eine ganz bestimmte Position schreiben.

Jelly 21. Dez 2004 15:27

Re: SQL Datenübergabe an DB?!?
 
Ich würds nicht in einem Schritt probieren. Einfach mal dir die Summe ausrechnen lassen und dann mit einem 2. SQL Statement den Wert einfügen.

Hansi 21. Dez 2004 15:40

Re: SQL Datenübergabe an DB?!?
 
Zitat:

Zitat von Jelly
...und dann mit einem 2. SQL Statement den Wert einfügen.

Ja OK, aber wie?

Klarabella 21. Dez 2004 15:40

Re: SQL Datenübergabe an DB?!?
 
Folgendes könnte so oder ähnlich funktionieren (habs nicht ausprobiert):

SQL-Code:
DECLARE @sum int
BEGIN TRANSACTION
SELECT @sum = (SELECT sum(Wert) as Summe FROM Datenbank WHERE Datum BETWEEN :von AND :bis)
UPDATE tabelle
SET feld = @sum
WHERE Datum =:bis
COMMIT TRANSACTION
Dabei musst du natürlich das Ganze von Delphi aus noch ein bisschen umstellen (:bis und :von als Parameter übergeben)...

Jelly 21. Dez 2004 15:53

Re: SQL Datenübergabe an DB?!?
 
Zitat:

Zitat von Klarabella
Folgendes könnte so oder ähnlich funktionieren (habs nicht ausprobiert

Da gehst du aber klangheimlich von einem MSSQL Server aus... :roll:

Hansi 21. Dez 2004 15:57

Re: SQL Datenübergabe an DB?!?
 
Danke Jelly!

Müsste doch eigentlich ziemlich einfach sein, ein SQL-Abfrage Ergebnis an eine bestimmte Stelle der DB zu schreiben, oder?

Kann mir jemand helfen?

Klarabella 21. Dez 2004 15:57

Re: SQL Datenübergabe an DB?!?
 
Deswegen ja auch könnte und würde :-D

Ne, hast schon recht... :oops: Also bei nem MSSQL-Server funktioniert das! Woanders gehts dann wohl in anderer Art und Weise :wink:

Jelly 21. Dez 2004 16:12

Re: SQL Datenübergabe an DB?!?
 
SQL-Code:
insert into Tabelle (Spaltenname) values (12345)
Das Ganze packst du in eine Query und führst den Befehl mit
Delphi-Quellcode:
query.ExecSQL ;
auf. Für 12345 musst du natürlich deine richtige Summe einsetzen.

CenBells 21. Dez 2004 16:40

Re: SQL Datenübergabe an DB?!?
 
Hi,

welche DB verwendest Du überhaupt?
Probier es doch mal so:

Delphi-Quellcode:
Update Datenbank
 SET DeineSpalte =
  (SELECT sum(Wert) as Summe FROM Datenbank WHERE Datum BETWEEN :von AND :bis)
 WHERE Datum = :Bis
Gruß
Ken

Hansi 22. Dez 2004 08:53

Re: SQL Datenübergabe an DB?!?
 
Vielen Dank für eure Tips!

habe es aber noch nicht hinbekommen.

Nachdem ich mit SQL sum(Wert) AS Summe ermittelt habe möchte ich die Variable Summe in eine leere vorhandene Spalte in die Datenbank speichern aus der ich die Summe gebildet habe.

Könnt Ihr mir dazu ein Beispiel geben?

Danke im Voraus!

Jelly 22. Dez 2004 08:58

Re: SQL Datenübergabe an DB?!?
 
Zitat:

Zitat von Hansi
Nachdem ich mit SQL sum(Wert) AS Summe ermittelt habe möchte ich die Variable Summe in eine leere vorhandene Spalte in die Datenbank speichern aus der ich die Summe gebildet habe.

Also zum Verständnis: Du speicherst deine Werte nicht in eine Spalte einer Datenbank sondern in der Spalte einer Tabelle.

Dann ist es wichtig zu wissen, welche Tabelle das ist. Eine separate, oder die gleiche wo du die Summer errechnest.

Ein Grundsatz solltest du dir merken: vermeide wann immer es geht, redundante Daten. Warum die Summe also speichern wenn du sie immer wieder errechnen lassen kannst. Ändert sich irgendwann im Nachhinein was an deinen Rohdaten, stellt der Wert "Summe" in deiner Tabelle einen falschen Wert dar.

Hansi 22. Dez 2004 09:03

Re: SQL Datenübergabe an DB?!?
 
Danke!

1. Habe mich verschrieben, natürlich Tabelle!
2. Ist die gleiche Tabelle aus der auch die Summe gebildet wird.
3. Es wird zu keinen redundanten daten kommen, da sich die Rohdaten in der Vergangenheit nicht mehr ändern werden. Grund ist: Aus Performancegründen möchte ich die Summen in die Datenbank schreiben, da ich diese Summe noch sehr oft brauchen werde(für andere Berechnungen) Ist das Vorgehen so i.O.?

Wie schreibe ich die Summe an eine bestimmte Position(z.B. wo das DAtum ... ist)?

Jelly 22. Dez 2004 09:16

Re: SQL Datenübergabe an DB?!?
 
Zitat:

Zitat von Hansi
2. Ist die gleiche Tabelle aus der auch die Summe gebildet wird.

:gruebel: :?: Also wie soll ich denn das jetzt verstehen. Du bildest doch die Summe einer Spalte über mehrere Zeilen hinweg. In welche Zeile willst du denn diese Summe jetzt schreiben. Bsp:
Code:
Wert  Datum    Summe
1      1.1.2004  NULL
10     2.1.2004  NULL
100    3.1.2004  NULL
Also nimm mal an die Tabelle sieht wie folgt aus.

Jetzt berechnest du die Summe, die du am Anfang des Threads angegeben hast, z.B. mit der Bedingung Datum between 1.1.2004 and 2.1.2004.
-> Summe = 11 :!:

In welche Datensätze willst du denn jetzt Summe schreiben? Etwa so:
Code:
Wert  Datum    Summe
1      1.1.2004  11
10     2.1.2004  11
100    3.1.2004  NULL
Das ist völliger Quatsch, da der 11 in keiner Verbindung mit deinen Datensätzen steht. Was, wenn du übermorgen die Summe wie folgt berechnet wird, Summe=sum(Wert) where Datum between 2.1.2004 and 3.1.2004 -> Summe=110... Dann käme folgendes bei raus:
Code:
Wert  Datum    Summe
1      1.1.2004  11
10     2.1.2004  110
100    3.1.2004  110
Das ist definitv nicht konsistent. :warn:

Hansi 22. Dez 2004 09:22

Re: SQL Datenübergabe an DB?!?
 
Ich berechne immer die Summe bzw eigentlich genauer den Mittelwert(zur Einfachheit hier nur summe) und zwar so:
Summe am 31.12. über die letzten 30 Tage also 1.12. bis 31.12.
Summe am 1.1. über die letzten 30 Tage also 2.12. bis 1.1.
...

Ich hoffe es ist jetzt klar geworden. Später im Programm möchte ich auf die Summen zugreifen.

Jelly 22. Dez 2004 09:27

Re: SQL Datenübergabe an DB?!?
 
Zitat:

Zitat von Hansi
Ich hoffe es ist jetzt klar geworden. Später im Programm möchte ich auf die Summen zugreifen.

Nein, ist es immer noch nicht. In welchen Zeilen wird denn die Summe gespeichert. Es sind ja mehrere Datensätze betroffen. Ich zweifle grad an deiner Datenbankstruktur, die in meinen Augen keinen Sinn macht.

Hansi 22. Dez 2004 10:00

Re: SQL Datenübergabe an DB?!?
 
So nun versuche ich es nochmal möglichst deutlich zu schreiben. Meiner Meinung macht mein Datenbankstruktur durchaus Sinn.
In die Tabelle mit den Spalten "Name, datum, Wert und Summe" werden die Daten eingelesen. Dann sieht das so aus.


Delphi-Quellcode:
Name   Datum      Wert   Summe
Hans   01.12.2004   100
Hans   02.12.2004   105
Hans   03.12.2004   100
Hans   04.12.2004   102
Hans   05.12.2004   90
Gustav   01.12.2004   40
Gustav   02.12.2004   42
Gustav   03.12.2004   45
Gustav   04.12.2004   50
Gustav   05.12.2004   48
Nun soll der Durchschnitt berechnet werden, und, und, und...

Kannst Du mir bei meinem Problem helfen?

Hansa 22. Dez 2004 12:19

Re: SQL Datenübergabe an DB?!?
 
Ich kann Jelly nur zustimmen. Das ganze Vorhaben kommt mir auch recht seltsam vor. :zwinker: Du darfst auf keinen Fall die Programmlogik zugunsten der Performance reduzieren. Ich glaube aber zu wissen, was du willst. Bei mir sieht es so aus, daß ich einen Rechnungsendbetrag an vielen Stellen brauche. Nun besteht aber jede Rechnung aus vielen Positionen. Natürlich könnte ich den Endbetrag immer wieder aus den Positionen errechnen lassen.

Aber irgendwo hörts dann aber doch auf. 8) Ich speichere das ganze lieber in einer zweiten Tabelle "Rechnungskopf". Also eine 1:n Beziehung, wo jede Rechnung eben n Positionen hat. Jelly hat in der Theorie schon recht. Angenommen ich muß eine Rechnungsposition nachträglich löschen, weil sich rausstellt, daß die Ware doch nicht da ist. In diesen Fällen genügt es dann nicht mehr, nur die Position zu löschen. Ich muß auch ein Update für die Endsumme machen. Aber das weiß ich ja vorher und muß es eben auch machen. Die Konsistenz der Datenbank ist bei so was auch nicht in Gefahr, sofern man seine Transaktionen sinnvoll plant.

Was Du vor hast, das ist allerdings so, als würde ich versuchen die Endsumme in der Rechnungs-Positionen Table unterzubringen. In welchem Feld denn ? Soll ich das
Delphi-Quellcode:
Einzelpreis_oder_Summe_oder_Durchschnitt_Feld
nennen ? :lol: Und später selber nicht mehr wissen, um was es sich jetzt überhaupt handelt ? 8)

Hansi 22. Dez 2004 12:25

Re: SQL Datenübergabe an DB?!?
 
Vielen Dank für Deine Antwort. Werde mir überlegen ob meine Struktur wirklich die richitge für mich ist.


Trotzdem ist der Hauptpunkt dieses Beitrags für mich immer noch offen wie bekomme ich das Ergebnis der SQL-Abfrage in die Tabelle an einer bestimmten Position? :dance:

Hansa 22. Dez 2004 12:41

Re: SQL Datenübergabe an DB?!?
 
Indem du z.B. für deinen "Gustav" in einer 2. Tabelle ein Feld Durchschnitt, Summe usw. anlegst und den Wert dann dort speicherst. Dieses eine Feld in der zweiten Tabelle wäre dann zuständig für die x Felder von Gustav in der ersten. Du willst es aber wohl so machen, wie es dir von jedem ordentlichen Informatiker um die Ohren geschmissen werden wird: eine Tabellenspalte für 2 grundsätzlich verschiedene Dinge zu mißbrauchen. Eventuell nur, um ein einziges Feld einzusparen.

Hansi 22. Dez 2004 12:47

Re: SQL Datenübergabe an DB?!?
 
Wissen eigentlich diejenigen die hier Antworten schreiben was ich eigentlich für ein Problem habe?

Wenn jemand diese 20 Beiträge liest und noch weiss was mein Problem ist kann ein Waschmaschine(defekt) gewinnen.

Mann!Mann!Mann!Mann!Mann!Mann!Mann!Mann!Mann!Mann! Mann!Mann!

Bitte nur noch Lösung posten, danke! :wall: :wall: :wall:

Hansa 22. Dez 2004 12:56

Re: SQL Datenübergabe an DB?!?
 
Zitat:

Zitat von Hansi
Bitte nur noch Lösung posten, danke!

1. Lösungsansätze sind genug da.
2. Hier gibt es keine Silbertabletts.
3. Lösungen für auf dem Holzweg Reisende gibt es nirgends.
4. weißt du überhaupt, was du willst und hast es genau genug erklärt ?

Jelly 22. Dez 2004 13:16

Re: SQL Datenübergabe an DB?!?
 
Ich geb Hansa vollkommen Recht. Nicht nur, daß du hier wohl kaum eine Fertiglösung serviert bekommst, sondern in erster Linie auf die Datenstruktur bezogen. Ich würd auf jeden eine 2. Tabelle anlegen.

Noch ein Tip: sobald du mit Datumfeldern arbeitest, wirds immer kompliziert, wenn du damit mal was rechnen mußt. Du z.B. willst dir den letzten Monat irgendwie rausfiltern (gruppieren) und Summen über andere Felder erstellen. Das wird dann immer ziemlich komplex, deshalb hab ich mir angewöhnt, für jedes Datum in einer Tabelle noch 3 zusätzliche Spalten zu erstellen, mit Jahr, Monat und Tag. Diese Spalten werden auf Datenbankseit in einem Trigger automatisch gefüllt. Wenn du das so machst, sieht dein Bsp recht einfach aus, hier mal in ungefähr der SQL Code:
SQL-Code:
select Name, Jahr, Monat, sum(Wert) as Monatssumme
from Tabellenname
group by Name, Jahr, Monat
order by Jahr, Monat
Damit hast du eigentlich in einem Ruck, was du brauchst.

Ich denk, jetzt hast du genug Denkanstöße gekriegt. Jetzt spiel mal bischen damit rum, und dann meldest du dich wieder, wenn du konkret ein Problem hast. :zwinker:

Hansi 22. Dez 2004 14:05

Re: SQL Datenübergabe an DB?!?
 
Kopfschütteln

Albi 22. Dez 2004 14:18

Re: SQL Datenübergabe an DB?!?
 
Ich würde zwar auch ne zweite Table verwenden aber hast Du mal versucht eine Procedure zu schreiben (ich gehe jetzt mal von Interbase, MySQL usw. aus) die die Abfrage ausführt, dass Ergebnis in eine Variable schreibt und im gleichen Atemzug ein InsertStatment abzusetzen?

SQL-Code:
Create Procedure Test1 (
   ID Integer,
   ...)
AS
Declare variable v date;
Begin
   Select * From DB WHERE Datum between Datum
   into V;

   update DB set Summe = :v
end;
Ich habe das zwar nicht ausprobiert aber so oder ähnlich sollte es funktionieren. :wink:

PS: Was schümpft du hier eigentlich rum, du hast auf Fragen die gestellten Fragen gar nicht reagiert. Der ganze Beitrag sieht danach aus, dass Du dir hier keinen Kopf machst sondern lieber die anderen denken läßt.

Jelly 22. Dez 2004 16:09

Re: SQL Datenübergabe an DB?!?
 
Zitat:

Zitat von Albi
PS: Was schümpft du hier eigentlich rum, du hast auf Fragen die gestellten Fragen gar nicht reagiert. Der ganze Beitrag sieht danach aus, dass Du dir hier keinen Kopf machst sondern lieber die anderen denken läßt.

Ich sag dazu jetzt gar nichts mehr. Jeder Vorschlag den man macht wird mit Gegenfragem und Verweisen beantwortet. Meine Infos hab ich gegeben, wenn Hansi damit nichts anfangen kann, weiß ich auch keinen Rat mehr, außer sich ein gescheites Datenbankbuch zuzulegen und sich damit mal bischen intensiver zu beschäftigen. Hinweise und Hilfestellung hat er genug gekriegt, die ihm das Problem lösen sollten.

hardy1234 3. Jan 2005 05:36

Re: SQL Datenübergabe an DB?!?
 
Hey Jelly,

ich hab das wohl richtig verstanden, das Du danach fragst , wie du das ergebnis in die richtige zeile und spalte der Tabelle bekommst. Ich arbeite nun mit Postgre und Firebird. Wollen mal sehen ob wir uns einig sind:

tablename
Name Datum Wert Summe
1. aaaaa xx.xx.xxxx xxxx
2. bbbbb xx.xx.xxxx xxxx
3. ccccc xx.xx.xxxx xxxx
4. aaaaa xx.xx.xxxx xxxx
5. bbbbb xx.xx.xxxx xxxx

Angenommen du willst die Summe in das Feld Summe des 3. Datensatzes in die Spalte "SUMME" schreiben, dann sieht das mit Firebird/Delphi so aus:

proc
var
q: string;
begin
Query.SQL.Clear;
q := 'UPDATE tablename SET SUMME = ''' + summe + '''' +
'WHERE (NAME = ''' + name + ''') AND ( DATUM = ''' + bis + ''')';
Query.SQL.ADD(q);
try
Query.SQL.ExecSQL;
except
end;
end;

Du mußt aber auf die Datentypen achten, die müssen alle Text sein sonst wird das nix. Am besten siehst Du dir das Ergebnis der Stringzusammensetzung im Debugger an und vereinbarst vorsorglich eine string-variable (w.o) zum probieren. Wenn summe den typ real hat, dann

... + FloatToStr(summe) + ...

bis: TDateTime

... DATUM = ASDATE(''' + DateToStr(bis) + ...

in einem Zug geht das freihlich nicht. Das ginge nur mit einer Stored-Procedure. Ob das bei dir dann konsistent ist mußt du wissen, jeder Zeile mit aaa darf jedes Datum nur genau einmal zugewiesen sein. Sonst geht das natürlich schief.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz