AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Hilfe DB anfänger

Offene Frage von "cchris"
Ein Thema von cchris · begonnen am 11. Apr 2005 · letzter Beitrag vom 12. Apr 2005
Antwort Antwort
Benutzerbild von cchris
cchris

Registriert seit: 16. Jun 2003
Ort: Taucha
71 Beiträge
 
Delphi 2005 Personal
 
#1

Hilfe DB anfänger

  Alt 11. Apr 2005, 20:24
Datenbank: Paradox 7 • Zugriff über: BDE
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
  Mit Zitat antworten Zitat
Benutzerbild von eddy
eddy

Registriert seit: 3. Jan 2003
Ort: Sachsen
573 Beiträge
 
Delphi 5 Professional
 
#2

Re: Hilfe DB anfänger

  Alt 11. Apr 2005, 22:03
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
  Mit Zitat antworten Zitat
Benutzerbild von cchris
cchris

Registriert seit: 16. Jun 2003
Ort: Taucha
71 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Hilfe DB anfänger

  Alt 12. Apr 2005, 17:43
Mit DB Control Dingsbums meinte ich das Teil was man meistens braucht umzwischen den Datensätzen zu wechseln.
  Mit Zitat antworten Zitat
Benutzerbild von cchris
cchris

Registriert seit: 16. Jun 2003
Ort: Taucha
71 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Hilfe DB anfänger

  Alt 12. Apr 2005, 17:58
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?
  Mit Zitat antworten Zitat
Benutzerbild von eddy
eddy

Registriert seit: 3. Jan 2003
Ort: Sachsen
573 Beiträge
 
Delphi 5 Professional
 
#5

Re: Hilfe DB anfänger

  Alt 12. Apr 2005, 20:02
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:
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.
mfg
eddy
Angehängte Dateien
Dateityp: exe dbgrid_102.exe (59,2 KB, 22x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:39 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