Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datenbankfelder addieren (https://www.delphipraxis.net/144304-datenbankfelder-addieren.html)

svko 4. Dez 2009 18:43

Datenbank: Paradox • Zugriff über: ODBC

Datenbankfelder addieren
 
Ich schreibe gerade ein Programm für ein Bautagebuch.Das Ganze ist eine Paradoxdatenbank mit ungefähr 100 Feldern.
In 14 Feldern werden unterschiedliche Bauleistungen eingetragen und in 14 anderen Feldern die dazu gehörende Menge.
Jeder Datensatz ist ein Tag.Ich möchte die Tabelle filten z.B. nach Datum und alle gleichen Bauleistungen addieren,wobei die
Bauleistungen tageweise in unterschiedlichen Feldern stehen können.Es soll dann auch nur die gefilterte Menge angezeigt werden.

Danke schon mal im voraus.

mkinzler 4. Dez 2009 18:51

Re: Datenbankfelder addieren
 
Woran sieht man welche Bauleistung es ist?
BTW wäre die Datenbank ordentlich normalisiert wäre es einfacher.

svko 4. Dez 2009 19:11

Re: Datenbankfelder addieren
 
Es kann Sein,das der Benutzer den ersten Tag in Feld1 z.B Schachtarbeiten schreibt und in Feld2 Maurerarbeiten,
und Tage später Mauerearbeiten in Feld1.

mkinzler 4. Dez 2009 19:24

Re: Datenbankfelder addieren
 
Also steht die Art der Leistung immer im Feld vor dem Wert?
Bei 100 Feldern würde diese Auswertung schon unheimlich kompliziert werden. Wie gesagt würde ich das datenbankschema richten

svko 4. Dez 2009 19:55

Re: Datenbankfelder addieren
 
Die Leistungen und Mengen stehen in nur 14 Feldern.

mkinzler 4. Dez 2009 20:02

Re: Datenbankfelder addieren
 
Sind trotzdem 14 Felder die man Abfragen muss und das dann noch für verschiedene Bauleistungen.

verkouter 5. Dez 2009 12:33

Re: Datenbankfelder addieren
 
Ich hab mir gedacht, ich lese alle 14 Felder je Datensatz in eine Listbox,lösche alle doppelten Einträge und filtere danach die Datenbank.

haentschman 5. Dez 2009 14:43

Re: Datenbankfelder addieren
 
Hallo,

Zitat:

Ich hab mir gedacht, ich lese alle 14 Felder je Datensatz in eine Listbox,lösche alle doppelten Einträge und filtere danach die Datenbank.
...eine Datenbank benutzt man um genau diesen Hickhack zu verhindern. :zwinker: Wenn deine Anwendung noch nicht fertig ist, empfehle ich das Datenbankdesign zu überdenken. Warum 14 Felder für verschiedene Leistungen ? 1 Datensatz ist ein Datensatz. Datum, 1 Leistung (egal welche) die Menge...fertig...nächste Leistung.

verkouter 5. Dez 2009 18:36

Re: Datenbankfelder addieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Auf die Idee für die Leistungen eine extra Datenbank zu machen war ich auch schon gekommen.Wie aber zeige ich 14 Datensätze in meinen Formular an, das für einen Tag nur einen Datensatz nutzt.Und wie kann
ich dann aus den gefilterten Daten eine Summe bilden.

Helmi 5. Dez 2009 18:49

Re: Datenbankfelder addieren
 
Hallo,

das hat zwar jetzt gar nichts mit deinem Problem zu tun, aber ich muss es einfach loswerden:
Du hast zwei Grammatikfehler drin :-)

1. Bei Besonderheiten,Behinderungen fehlt nach dem Komma ein Leerzeichen
2. Bei Geräte,Fahrzeuge fehlt ebenfalls ein Komma

man mag mich jetzt kleinlich nennen, aber seit ich selbst Doku mache, fällt mir sowas
sofort auf :-)

haentschman 5. Dez 2009 22:49

Re: Datenbankfelder addieren
 
Zitat:

Wie aber zeige ich 14 Datensätze in meinen Formular an, das für einen Tag nur einen Datensatz nutzt.
nicht für jeden Tag einen Datensatz, für jede Leistung einen Datensatz. Das würde bedeuten, daß du für jeden Tag 14 Datensätze ablegst. Beim lesen würdest du pro Datum in der Ergebnismenge 14 Datensätze erhalten welche du dann in deinen Formularfelder anzeigen kannst.
Ergänzung: Oder nur die ausgefüllten Reihen speichern und entsprechend von oben nach unten wieder eintragen.

Zum Thema Summe: Wenn du die Leistungen einzeln speicherst ist es ein leichtes über SQL auch die entsprechenden Summen zu berechnen.

PS: mir würden zu dem Projekt spontan 5 Tabellen einfallen. Welche hast du ?

hoika 7. Dez 2009 14:38

Re: Datenbankfelder addieren
 
Hallo,

1. Arbeits-Tabelle (wie bisher)

Arbeits-Id AutoInc
Arbeits-Datum

2. Tabelle für mögliche Leistungen, nur Namen, keine Dopplungen
- Schachtarbeiten
- Maurerarbeiten

Leistungs-Id AutoInc
Leistungs-Name

3. Zuordnung der Leistungen zu einem Eintrag in Tabelle 1

Id AutoInc
Arbeits-Id Integer
Leistungs-Id Integer
Menge Float
OrderNo Integer // zur Sortierung oder Numerierung


Ausserdem würde ich schleunigst weg von Paradox.

Noch eine Entscheidungs-Hilfe.
Was für einen Aufwand bedeutet es,
das Programm von 14 auf 15 Leistungen umzubauen ?

Bei meiner Struktur gar keinen.


Heiko

verkouter 28. Dez 2009 12:17

Re: Datenbankfelder addieren
 
So, dass hat jetzt eine ganze Weile gedauert, aber ich habe jetzt die große Datenbank in 3 kleine
zerpflückt.Eine dient als Mastersource und das Datum als Masterfield. Die Geschichte funktioniert
mit DBGrid auch sehr gut, nur habe ich keine Ahnung wie ich 14 DBcomboboxen die Werte aus der
Leistungsdatenbank zuweise.

hoika 28. Dez 2009 12:27

Re: Datenbankfelder addieren
 
Hallo,

du schreibst immer Datenbanken, meinst aber Tabellen.
So dass musste ich mal loswerden ;)

Durch das "Auseinanderpflücken" geht das gar nicht mehr so "einfach".

Ich würde dafür ein eigenes Form nehmen

links - alle möglichen Bauleistungen (in einem ListView, was du selber füllst per Query)
rechts - ausgewählte
Mitte - Button(s) zum Hin- und Rüberklicken

Mit OK schreibst du die ausgewählten Leistungen in die hoff.
jetzt existierende "Leistung - Arbeit" - Tabelle.
Vorher wird noch geprüft, ob der Eintrag nicht schon existiert.
Einfacher ist es, einfach auf Verdacht alle Leistungen der aktuellen Arbeit zu löschen
Das Feld OrderNo stellt die Reihenfolge sicher.


Heiko

omata 28. Dez 2009 12:28

Re: Datenbankfelder addieren
 
Zitat:

Zitat von verkouter
...ich habe jetzt die große Datenbank in 3 kleine zerpflückt...

Es gibt einen Unterschied zwischen Datenbank und Tabelle. Vermutlich meinst du hier Tabelle und nicht Datenbank.

verkouter 28. Dez 2009 12:39

Re: Datenbankfelder addieren
 
Das Formular, siehe Screenshot sollte schon so erhalten bleiben.
Die Leistungen kann ich nicht vorgeben. Für jeden Baustelle gib es vom Auftraggeber ein
Angebotsschreiben in dem Leistungen stehen. Es gäbe alse viele hundert verschiedene Bauleistungen.

hoika 28. Dez 2009 12:56

Re: Datenbankfelder addieren
 
Hallo,

Dann zeige uns doch erst mal deine jetzige Datenbank-Struktur.

Zitat:

Die Leistungen kann ich nicht vorgeben. Für jeden Baustelle gib es vom Auftraggeber ein
Dann ist das freier Text ? -> TDBEdit


Ich hoffe, du legst jetzt nicht für jede Baustelle
ein Verzeichnis (=Datenbank) an ...


Heiko

verkouter 28. Dez 2009 13:15

Re: Datenbankfelder addieren
 
Doch es wird für jede Baustelle ein Ordner angelegt, da die Bautagebücher auf der Baustelle
geschrieben werden und wenn die Baustelle fertig ist ins Büro sollen.In der Mastertabelle werden
Datum,Kalenderwoche(es soll KW weise gefiltert werden und Wochenleistung errechnet werden),die
Arbeitsstunden pro Tag,die Geräte die in Einsatz kommen.In der Leistungstabelle wird Datum,
Leistungsbezeichnung,Einheit und Menge gespeichert.Und in der Baustofftabelle das Datum,
Baustoffeingang,Einheit und Menge. Ziel des ganzen ist ein zweites Formular auf dem (je nach
KW-Filter )der Baustoffeingang gesammt und die einzelnen Leistungen addiert ausgeben werden.

hoika 28. Dez 2009 13:51

Re: Datenbankfelder addieren
 
Hallo,

habe ich immer noch nicht richtig verstanden ;)

- geg: pro Baustelle eine DB (=Verzeichnis in Pdx)
- ges: Summe X über alle Baustellen ?

- Lösung: geht nicht

Andere Frage:
Warum ComboBoxen bei den Bauleistungen ?

Oder anders:
Woher weisst du, welche Bauleistungen pro Baustelle möglich sind ?


Zeig doch mal deine jetzige DB-Struktur und zwar bitte so wie z.B. bei #12
(also nicht so viel Text)


Heiko

verkouter 28. Dez 2009 14:18

Re: Datenbankfelder addieren
 
Nein, Summe Baustoffe und Summe leistung1, Summe Leistung2 usw pro Baustelle.

Datenstrucktur


Mastertabelle

Nummer(autoinc)
Datum
Kalenderwoche
6mal für mögliche Geräte
Arbeitsdtunden

Leistungstabelle

Nummer(autoinc)
Datum
Lv-Nummer
Bezeichnung
Einheit
Mennge

Baustofftabelle

Nummer(autoinc)
Datum
Bezeichnung
Einheit
Menge


Die Leistungsbezeichnung kenne ich garnicht, die trägt erst der Polier vor Ort ein.

Combobox deshalb, wenn der Polier das erste mal schreibt wird der Eintrag in einer
Stringlist gespeicher und steht beim nächtsten mal zur Auswahl.

hoika 28. Dez 2009 14:28

Re: Datenbankfelder addieren
 
Hallo,

ist ja schon ein guter Anfang.

Mach mal bitte die Tabellen-Name fett (Namen markieren und oben links das B)

Leistungstabelle

Nummer(autoinc) OK

Datum wozu das denn ???

MasterId Integer -> RefKey auf Master.Id, damit ist das Feld Datum unnötig

Lv-Nummer 1-14 ???, also die OrderNo, OK
Bezeichnung
Einheit
Menge


Zitat:

Combobox deshalb, wenn der Polier das erste mal schreibt wird der Eintrag in einer
Stringlist gespeicher und steht beim nächtsten mal zur Auswahl.
Der Polier wird sich freuen, dass er das nicht immer eintippen muss.

Aber:
Wazu speichern
ein

SQL-Code:
Select Distinct(Leistungstabelle.Bezeichnung)
beim Start des Forms und laden in eine StringList ist besser.
Die Daten sind dann nicht doppelt (DB, externe Datei).


Wo ist jetzt aber das Problem ?
Das Eintragen in die DB würde ich per Query selber zusammenbauen.
Das macht dann den Umstieg auf eine richtige DB (das kommt noch ... ;) ) einfacher.

Die Komponente ist dann hier eine einfache TComboBox.


Zu der Abfrage
Zitat:

Summe Baustoffe und Summe leistung1, Summe Leistung2 usw pro Baustelle.
Du bekommst mit deinem Ansatz Baustelle = Verzeichnis (DB)
eh nur die Summe für genau eine Baustelle hin, etwa so

SQL-Code:
Select
  Sum(Leistungstabelle.Menge)
From
  Leistungstabelle
Group By
  Leistungstabelle.Bezeichnung

Heiko

verkouter 7. Jan 2010 16:57

Re: Datenbankfelder addieren
 
Liste der Anhänge anzeigen (Anzahl: 2)
Erst einmal, ein gesundes neues Jahr.

Ich muss gestehen,ich habe noch nie mit Query und sql gearbeitet, aber mit den Tipps mein
eigendliches Problem leicht lösen können.Ich habe allerdings keine Ahnung wie ich mit Query
die 14 Comboboxen füllen soll.Meine Formularseite stellt ein Tag im Bautagebuch dar, der
Polier blättert mit Dbnavigator durch dass Bautagebuch.

hoika 8. Jan 2010 06:44

Re: Datenbankfelder addieren
 
Hallo,

du versteifst dich auf die Zahl 14.
Denke mal nach oben offen.

Mit meinem Ansatz (#21) kannst du so viele Leistungen anlegen/zuordnen,
wie du willst.

Die Anzeige der Leistungen eines Tages erfolgt am einfachsten
mit einer Query und einem DBGrid (oder mit einem normalen StringGrid).
Das Zuordnen ist jetzt aber aufwendiger.
Ich würde da gar kein TDBX-Dingens mehr nehmen, sondern 2 ListViews:

Links alle möglichen Leistungen, rechts die ausgewählten,
in der Mitte Pfeilbuttons zum Rüberschieben.

Wie sieht denn deine jetzige DB-Struktur aus ?.


Heiko

verkouter 8. Jan 2010 07:21

Re: Datenbankfelder addieren
 
Die Datenbankstrucktur ist genau so gebleiben.Auf einen Tabsheet habe ich ein Query den
ich mit Hilfe Deines Tipps gefüllt habe.Das Datum steht deshalb in der Tabelle, weil die
Leistungstabelle nach einem Tatumsbereich gefiltert wird.Die 14 Felder resultiern aus dem
orginal Papierbautagebuch.

Delphi-Quellcode:
with Query.SQL do
begin
Clear;
Add('SELECT Nummer,Bezeichnung,Sum(Menge),Einheit');
Add('FROM Leistungen.DB');
Add('WHERE (Datum >= :date1) and (Datum <= :date2)');
Add('group by Nummer,bezeichnung,Einheit');
end;
Query.ParamByName('date1').Asdate := strtodate(filter1.Text);
Query.ParamByName('date2').Asdate := strtodate(filter2.Text);
Query.Open;
Ich kann kein Listview mit Leistungen füllen, weil ich die Leistungen vorher noch garnicht kenne.

hoika 8. Jan 2010 08:28

Re: Datenbankfelder addieren
 
Hallo,

Zitat:

Ich kann kein Listview mit Leistungen füllen, weil ich die Leistungen vorher noch garnicht kenne.
Stimmt, das war freier Text.

Und wo ist jetzt das Problem ?



Heiko

verkouter 8. Jan 2010 18:54

Re: Datenbankfelder addieren
 
Das Problem ist das ich in der Eingabemaske nicht mit DBgrid arbeiten möchte,sondern mit
dbcombobox oder combobox.Und dann die Datensätze eines Tages aus der Leistungs.db den
Comboboxen zuweisen muss.Wie gesagt habe ich noch nie mit Query gearbeitet.

hoika 9. Jan 2010 07:03

Re: Datenbankfelder addieren
 
Hallo,

dann nimm eine normale ComboBox
und TTable zum Speichern.

Mit einer Query sind halt bestimmte Lesefunktionen (Select)
viele einfacher.



Heiko

verkouter 9. Jan 2010 13:28

Re: Datenbankfelder addieren
 
Ich hatte echt keinen Plan wie ich die Zuordnung zu den einzelnen Comboboxen hinbekommen soll.
Bin jetzt wieder bei einer großen Tabelle und habe mit Query aus den 14 Spalten eine Tabelle gemacht.

Delphi-Quellcode:
with Query1.SQL do
begin
Clear;
Add('SELECT lvn1,be1,ein1,me1');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn2,be2,ein2,me2');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn3,be3,ein3,me3');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn4,be4,ein4,me4');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn5,be5,ein5,me5');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn6,be6,ein6,me6');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn7,be7,ein7,me7');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn8,be8,ein8,me8');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn9,be9,ein9,me9');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn10,be10,ein10,me10');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn11,be11,ein11,me11');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn12,be12,ein12,me12');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn13,be13,ein13,me13');
Add('FROM "' + Datei + '" ');
Add('union SELECT lvn14,be14,ein14,me14');
Add('FROM "' + Datei + '" ');
Um jetzt Sum(Menge) und Group by zu realisieren, muss ich noch ein Query erstellen???

hoika 9. Jan 2010 14:16

Re: Datenbankfelder addieren
 
Hallo,

ich hatte ja gesagt, dass du die Struktur umstellen sollst.
Kommt ketzt noch ne le15 dazu, fängst du an verschiedenen Stellen an,
rumzubauen.
Auch wenn der Kunde sagt, wir haben nur 14, kann das morgen ganz anders sein.

So wie du es jetzt hast, ginge viell. ein SubSelect
(war das Paradox ?, dann ist das extrem lahm, wenn es überhaupt geht).

Oder du lädst das alles lokal in eigene Listen und rechnest das selber aus.


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:00 Uhr.

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