![]() |
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. |
Re: Datenbankfelder addieren
Woran sieht man welche Bauleistung es ist?
BTW wäre die Datenbank ordentlich normalisiert wäre es einfacher. |
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. |
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 |
Re: Datenbankfelder addieren
Die Leistungen und Mengen stehen in nur 14 Feldern.
|
Re: Datenbankfelder addieren
Sind trotzdem 14 Felder die man Abfragen muss und das dann noch für verschiedene Bauleistungen.
|
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.
|
Re: Datenbankfelder addieren
Hallo,
Zitat:
|
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. |
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 :-) |
Re: Datenbankfelder addieren
Zitat:
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 ? |
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 |
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. |
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 |
Re: Datenbankfelder addieren
Zitat:
|
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. |
Re: Datenbankfelder addieren
Hallo,
Dann zeige uns doch erst mal deine jetzige Datenbank-Struktur. Zitat:
Ich hoffe, du legst jetzt nicht für jede Baustelle ein Verzeichnis (=Datenbank) an ... Heiko |
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. |
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 |
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. |
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:
Aber: Wazu speichern ein
SQL-Code:
beim Start des Forms und laden in eine StringList ist besser.
Select Distinct(Leistungstabelle.Bezeichnung)
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:
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 |
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. |
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 |
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:
Ich kann kein Listview mit Leistungen füllen, weil ich die Leistungen vorher noch garnicht kenne.
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; |
Re: Datenbankfelder addieren
Hallo,
Zitat:
Und wo ist jetzt das Problem ? Heiko |
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. |
Re: Datenbankfelder addieren
Hallo,
dann nimm eine normale ComboBox und TTable zum Speichern. Mit einer Query sind halt bestimmte Lesefunktionen (Select) viele einfacher. Heiko |
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:
Um jetzt Sum(Menge) und Group by zu realisieren, muss ich noch ein Query erstellen???
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 + '" '); |
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 10:16 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 by Thomas Breitkreuz