![]() |
Datenbank: Paradox 7 • Zugriff über: BDE
Hilfe DB anfänger
Hallo!
Ich habe ein paar frage zum Umgang mit Datenbanken. Hier erstmal, was das programm zum Schluss machen soll: Mann soll aus einer Liste eine Wetterstation auswählen, daraufhin sollen dann alle Messwerte angezeigt werden, nach Zeitpunkt der aufnahme Sortiert. Die Daten werden Manuell eingegeben. Die ausgabe soll in sechs Zeilen zu je 13 Editfeldern erfolgen. Jede Zeile gibt die gesamten Informationen einer Aufnahme wieder. In den Zeilen darüber und darunter sollen die vorigen und valls vorhanden späteren Messungen angezeigt werden, um Tendenzen feststellen zu können. Soweit so gut: Jetzt stehe ich vor ein paar Problemen: Ich habe erst mal ne Paradox 7 Tabelle angelegt in der Temperatur, Datum, Uhrzeit, Luftfeuchte usw. stehen. In Delphi greif ich mit der BDE darauf zu. Ich scrolle mit so nem DBControl dingsbums darin rum. Alss Source für die DBEditfelder hab ich momentan einfach die DB Source, aber wie kireg ich das hin, dass nicht überall das selbe angezeigt wird, sondern der vorige und nächste Eintrag?. Und wie kann ich das Machen, dass für mehrere Stationen die Messwerte Parralel gespeichert werden? (In einer Datenbank) Fragen über Fragen |
Re: Hilfe DB anfänger
Hallo cchris,
leg' Dir ein DBGrid (statt ein DBControl dingsbums ???) auf den Bildschirm und verknüpfe es mit der DataSource, die das DataSet Deiner Datentabelle vom Typ TTable verwaltet. Damit wären dann grundsätzlich Deine Anzeigeprobleme gelöst. Dann solltest Du Deine Tabelle so umbauen, daß das 1. Feld (z.B. ID) vom Typ ftAutoInc ist und auf dieses kannst Du dann einen Primärindex legen. Der ist erforderlich, um Sekundärindizes anlegen zu können. Entsprechend Deinen Sekundärindizes kannst Du dann Deine Tabelle beliebig sortieren. Ein weiteres Feld z.B. StationNr (Typ ftInteger) erlaubt Dir das Sortieren und Filtern nach den Stationen. Wenn Du Filter setzt, kannst Du damit dafür sorgen, daß nur ausgewählte Stationsdaten angezeigt werden. Die Felder solltest Du erstmal in der Datenbankoberfläche ergänzen und die Indizes sind auch dort anzulegen. Das ganze kann man auch vom Programm aus machen, aber für den Anfang sollte das der leichtere Weg sein. mfg eddy |
Re: Hilfe DB anfänger
Mit DB Control Dingsbums meinte ich das Teil was man meistens braucht umzwischen den Datensätzen zu wechseln.
|
Re: Hilfe DB anfänger
Ich hab jetzt ne Neue Spalte StationID erstellt.
Wie krieg ich das erstens hin, das diese Spalte nicht angezeigt wird? Hab Schon bei TTable1.Fielddefs[13].Attribute.fahiddenColumn auf true gesetzt aber das bringt nichts. Und Zweitens: wie mach ich das mit Filter und Filtered, das nur alles mit Stationsnummer 1 angezeigt wird, und dann zu guter letzt, dass wenn man irgendwelche werte in eine Neue Zeile einguibt wieder hinten die Stationsnummer drangeklatscht wird? |
Re: Hilfe DB anfänger
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo cchris,
es wäre günstig, wenn Du Dich zu rein kommunikativen Zwecken um verständliche Formulierung bemühen würdest. Ich vermute, Du meinst ein TDBNavigator. Zur Verkürzung vielen Textes (und weil ich heute in der richtigen Stimmung dazu war) habe ich Dir ein komplettes Projekt zum Probieren angehangen inklusive der von mir verwendeten Testdaten. Leg's Dir in ein Verzeichnis und tippe es mit F7 durch. Wenn Du was nicht gleich verstehst, dann quetsche erst die Delphi-Hilfe aus, dann gibt's jedemenge Informationen hier unter "Suchen" und wenn das nichts nützt, dann kann ich auf konkrete Fragen auch konkret (und hoffentlich richtig) antworten.
Delphi-Quellcode:
mfg
unit TestDBG1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids, Db, DBTables, ExtCtrls, ComCtrls, Buttons, DBCtrls, StdCtrls; type TForm1 = class(TForm) pc1: TPageControl; tsListe: TTabSheet; panTop: TPanel; Tab1: TTable; DS1: TDataSource; dbg1: TDBGrid; sbClose: TSpeedButton; DBNavigator1: TDBNavigator; cbStID: TComboBox; Label1: TLabel; sbFilterOff: TSpeedButton; sbNew: TSpeedButton; cbSort: TComboBox; Label2: TLabel; procedure sbCloseClick(Sender: TObject); procedure cbStIDChange(Sender: TObject); procedure FormActivate(Sender: TObject); procedure sbFilterOffClick(Sender: TObject); procedure dbg1DblClick(Sender: TObject); procedure sbNewClick(Sender: TObject); procedure cbSortChange(Sender: TObject); procedure panTopResize(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} const fnMW : string = 'Messwerte.DB'; ixStID : string = 'IdxStID'; ixDatum : string = 'IdxDatumDesc'; c_keineSortierung = 'keine Sortierung'; var s, vfilt : string; // ------ allg. Funktionen ----------------------------------------------------- //UP hängt an einen Pfadstring nötigenfalls ein \ an function AppBkSp(s:string):string; begin AppBkSp := IncludeTrailingBackslash(s); end; //Öffnet eine Tabelle, falls nötig, und setzt vFilt als akt. Filter // Rückgabewert 0 --> erfolgreich Filter gesetzt function SetFilter(Tab : TTable ; vFilt : string) : integer; begin if not fileexists(AppBkSp(Tab.DataBaseName)+Tab.TableName) then begin Result := 101; exit; end; Tab.DisableControls; if not Tab.Active then Tab.Active := true; Tab.Filtered := false; if vFilt = '' then Tab.Filter := '' else begin Tab.Filter := vFilt; try Tab.Filtered := true; Result := 0; except Result := 1; Tab.Filtered := false; ShowMessage('SetFilter: '+ Tab.TableName +' konnte nicht mit '+ vFilt +' gefiltert werden'); end; end; Tab.EnableControls; end; procedure DBGEditEinAus(dbg: TObject); begin if (dbg is TDBGrid) then begin if (dgEditing in (dbg as TDBGrid).Options) then (dbg as TDBGrid).Options := (dbg as TDBGrid).Options - [dgEditing, dgAlwaysShowEditor] + [dgRowSelect, dgAlwaysShowSelection] else (dbg as TDBGrid).Options := (dbg as TDBGrid).Options + [dgEditing, dgAlwaysShowEditor] - [dgRowSelect, dgAlwaysShowSelection]; (dbg as TDBGrid).refresh; end; end; // ------end of allg. Funktionen ----------------------------------------------- procedure TForm1.FormActivate(Sender: TObject); var old, new : integer; i : integer; begin // Tabelle öffnen, falls nicht im OI definiert if not Tab1.Active then begin tab1.DatabaseName := AppBkSp(ExtractFilePath(Application.ExeName)) + 'daten\'; tab1.TableName := fnMW; tab1.Open; end; // Stations-Nummern in Combobox laden, falls das noch nicht erfolgt ist if cbStID.Items.Count = 0 then begin tab1.IndexName := ixStID; tab1.First; old := 0; new := 0; while not tab1.Eof do begin new := tab1.FieldByName('StID').AsInteger; if new <> old then begin s := IntToStr(new); cbStID.Items.Add(s); old := new; end; tab1.Next; end; cbStID.Sorted := true; end; s := cbStID.Items.Strings[0]; cbStID.Text := s; cbStIDChange(Sender); // Tabelle gestalten if dbg1.Columns.Count = tab1.FieldCount then begin dbg1.Columns.Clear; i := 0; dbg1.Columns.Add; // dbg1.Columns.Items[i].Title.Caption := 'Datum'; //Überschrift ändern dbg1.Columns.Items[i].FieldName := 'Datum'; dbg1.Columns.Items[i].Width := 120; inc(i); dbg1.Columns.Add; dbg1.Columns.Items[i].Title.Caption := 'Windstärke'; dbg1.Columns.Items[i].FieldName := 'Wind'; dbg1.Columns.Items[i].Width := 70; inc(i); dbg1.Columns.Add; dbg1.Columns.Items[i].FieldName := 'Temp'; dbg1.Columns.Items[i].Width := 50; inc(i); dbg1.Columns.Add; dbg1.Columns.Items[i].FieldName := 'Feuchtigkeit'; dbg1.Columns.Items[i].Width := 80; inc(i); dbg1.Columns.Add; dbg1.Columns.Items[i].FieldName := 'Luftdruck'; dbg1.Columns.Items[i].Width := 70; inc(i); end; //Sortierordnung einlesen if cbSort.Items.Count = 0 then begin cbSort.Clear; Tab1.IndexDefs.Update; if Tab1.IndexDefs.Count > 0 then begin for i := 0 to Tab1.IndexDefs.Count - 1 do begin s := Tab1.IndexDefs.Items[i].Fields; s := Tab1.IndexDefs.Items[i].Name; if trim(s) = '' then s := c_keineSortierung; cbSort.Items.Add(s); end; end; end; cbSort.Text := ixDatum; tab1.IndexName := ixDatum; tab1.First; pc1.Align := alClient; end; procedure TForm1.sbCloseClick(Sender: TObject); begin close; end; procedure TForm1.cbStIDChange(Sender: TObject); begin s := cbStID.Text; vfilt := 'StID=' + s; SetFilter(tab1, vfilt); end; procedure TForm1.sbFilterOffClick(Sender: TObject); begin SetFilter(tab1, ''); end; procedure TForm1.dbg1DblClick(Sender: TObject); begin DBGEditEinAus(dbg1); end; procedure TForm1.sbNewClick(Sender: TObject); begin tab1.Append; tab1.FieldByName('Datum').AsDateTime := now; tab1.FieldByName('StID').AsInteger := StrToInt(cbStID.Text); tab1.Post; // EditModus einschalten if not (dgEditing in dbg1.Options) then DBGEditEinAus(dbg1); end; procedure TForm1.cbSortChange(Sender: TObject); begin if cbSort.Text = c_keineSortierung then s := '' else s := cbSort.Text; tab1.IndexName := s; tab1.First; end; procedure TForm1.panTopResize(Sender: TObject); begin sbClose.Left := panTop.Width - sbClose.Width - 24; end; end. eddy |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:33 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