AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Tabellen springen zum letzten Datensatz, warum?
Thema durchsuchen
Ansicht
Themen-Optionen

Tabellen springen zum letzten Datensatz, warum?

Ein Thema von plautzer · begonnen am 23. Jun 2004 · letzter Beitrag vom 24. Jun 2004
Antwort Antwort
Seite 1 von 2  1 2      
plautzer

Registriert seit: 23. Aug 2003
172 Beiträge
 
#1

Tabellen springen zum letzten Datensatz, warum?

  Alt 23. Jun 2004, 15:10
Mahlzeit,

Bei Tabellen, die ich in meinem Prog nutze, haben auf einmal die Angewohnheit zu letzten Datensatz zu springen wenn ich:
arogrammstart(vorher wurde imma der ersten datensatz ausgewählt und nun der letzte)
b:einen Speicherbutton, von einer anderen form drücke.
c:im grid wenn ich anderen Datensatz editieren will.

Hat dafür jemand 'ne erklärung für mich?

Plautzer
  Mit Zitat antworten Zitat
grayfox

Registriert seit: 22. Jan 2003
Ort: Litschau
173 Beiträge
 
Delphi 4 Standard
 
#2

Re: Tabellen springen zum letzten Datensatz, warum?

  Alt 23. Jun 2004, 15:50
hast du jetzt erst die tabellen indiziert oder waren sie das schon vorher?
öffnest du die tabellen selbst, oder sind sie in den komponenten schon als 'active = true' definiert?
hast du irgendwelche master/detail verbindungen eingerichtet?

langsam wäre etwas quelltext schon von vorteil...

mfg, stefan
  Mit Zitat antworten Zitat
plautzer

Registriert seit: 23. Aug 2003
172 Beiträge
 
#3

Re: Tabellen springen zum letzten Datensatz, warum?

  Alt 23. Jun 2004, 16:03
Nagut, dann geben ich euch mal einen kleinen Einblick in meien quelltext:

Delphi-Quellcode:
procedure TMietverwaltung.FormCreate(Sender: TObject);
var
pfad,tabellen, name, ext: string;
a:integer;
begin
  pfad := ExtractFilePath(Application.ExeName);
  name := ExtractFileName(Application.ExeName);
  ext := ExtractFileExt(Application.ExeName);
  tabellen:=pfad + 'tabellen';
  with Table1 do DatabaseName := tabellen;
  with Table2 do DatabaseName := tabellen;
IF NOT FileExists(tabellen + '\daten.DB') THEN
        BEGIn
        if not ForceDirectories(tabellen) then
        ShowMessage('Beim Anlegen von '+Tabellen+' ist ein Fehler aufgetreten! Bitte überprüfen Sie ob Schreibzugriff auf den Datenträger der Mietprogramm.exe haben..');

        with Table1 do
                begin
                active := false;
                DatabaseName := tabellen;
                tabletype := TTParadox;
                tablename := 'daten';
                Name := 'Table1';

        with FieldDefs do
                begin
                 clear;
                     Add('Whg', ftinteger, 0, false);
                     Add('Name', ftString, 50, false);
                     Add('Vorname', ftstring, 50, false);
                     Add('Mietbegin', ftDate, 0, false);
                     Add('Bemerkung', ftString, 100, false);
                     Add('telefon', ftinteger, 0, false);
                     Add('Bruttomiete', ftcurrency, 0, false);
                     Add('Nettomiete', ftcurrency, 0, false);
                     Add('Nebenkosten', ftcurrency, 0, false);
                     Add('Kaltwasser', ftcurrency, 0, false);
                     Add('Warmwasser', ftcurrency, 0, false);
                     Add('Müll', ftcurrency, 0, false);
                     Add('Fernwärme', ftcurrency, 0, false);
                     Add('Antenne', ftcurrency, 0, false);
                     Add('HMService', ftcurrency, 0, false);
                end;

        WITH indexdefs DO BEGIN
        clear;
        Add('Whg', 'Whg', [ixprimary, ixunique]);
      END;

        CreateTable;
        table1.Open;
        vordefinieren;
        end;
        IF NOt FileExists(tabellen + '\kosten.DB') THEN
        BEGIN
        with Table2 do
                begin
                active := false;
                DatabaseName := tabellen;
                tabletype := TTParadox;
                tablename := 'kosten';
                Name := 'Table2';

        with FieldDefs do
              begin
                 clear;
                     Add('id', ftinteger, 0, false);
                     Add('Datum', ftDate, 0, false);;
                     Add('Bruttomiete', ftcurrency, 0, false);
                     Add('Bezahlt', ftcurrency, 0, false);
                     Add('Offen', ftcurrency, 0, false);
                end;
  CreateTable;

         end;
        end;

                setbuttons(1);
                table1.Open;
                table2.Open;
                vordefinieren;
        end
        else begin
                setbuttons(1);
                table1.Open;
                table2.Open;
                end;

brutto_summe;

a:=table1.RecordCount;
dbtext2.caption:=inttostr(a);
                table2.Filtered:=false;
                table2.Filter := ('id =' + inttostr(table1whg.Value));
                table2.Filtered:=true;


  if ((e_whg.Text='') and (e_name.Text='')) then
        begin
        dbgrid1.Enabled:=false;
        table1.Edit;
        table1.Delete;
        end
  else dbgrid1.Enabled:=true;
  summe;
end;
Master/detail verbindung habe ich nicht, nur 2 tabellen, die (per filter) zusammen einen mieter ergeben.
Active setzte ich diese garnicht,
das eonzige was ich mache ist table.open;
Ich wüsste auch garnicht warum ich diese active setzen sollte, ich sehe da keien unterschied.
Die Keine der Tabelle ist indiziert.

Ich wäre euch dankbar wenn ihr mir noch heute helfen könntet, da ich das programm morgen abgeben muss.

Plautzer
  Mit Zitat antworten Zitat
grayfox

Registriert seit: 22. Jan 2003
Ort: Litschau
173 Beiträge
 
Delphi 4 Standard
 
#4

Re: Tabellen springen zum letzten Datensatz, warum?

  Alt 23. Jun 2004, 19:13
auf den ersten blick fallen mir ein paar sachen/ungereimtheiten/unschönheiten auf...

- ich lege für die tabellen immer einen eigenen 'daten'-ordner im hauptverzeichnis des programmes an.
wenn das prog über mehrere jahre laufen soll, dann befinden sich im daten-ordner noch ordner mit der
jahreszahl und dort drinnen stehen erst die tabellen.

- ID's bennene ich mit ID. somit sehe ich auf den ersten blick, dass es sich um den haupt-ID einer tabelle
handelt. fremdID's bekommen zum feldnamen, auf welchen sie verweisen die endung '_ID' (zb: Plz_ID). auf diese
weise bewahre ich mir die übersicht.

- ich benenne feldnamen niemals 'name'. das kann schon wieder in irgend einem db-system ein reserviertes wort
sein und probleme schaffen. warum sagst nicht 'zuname' oder 'nachname'?

- ich verwende bei tabellennamen WEDER umlaute, NOCH leer- oder sonderzeichen. auch wenn die eine db solche
akzeptiert, bei einer anderen kann es schon wieder vollkommen anders aussehen.



Code:
Die Keine der Tabelle ist indiziert

heisst das nun die EINE oder KEINE?
einen index hab ich nämlich gefunden...
Delphi-Quellcode:
   WITH indexdefs DO BEGIN
     clear;
     Add('Whg', 'Whg', [ixprimary, ixunique]);
   END;
noch was... der primärindex hat bei paradox keinen namen.
du kannst ihn auch mit
 Add('', 'ID', [ixprimary, ixunique]); definieren.

Code:
das eonzige was ich mache ist table.open;
Ich wüsste auch garnicht warum ich diese active setzen sollte
und was ist das dann?
Delphi-Quellcode:
   with Table1 do begin
     active := false;
oder hier?

Delphi-Quellcode:
   with Table2 do begin
     active := false;
der unterschied zwischen open und aktive ist nur, dass open/close proceduren sind,
welche die tables öffnen oder schliessen und activ ein property ist, mit dessen
hilfe sich der status der tables abfragen lässt.

wieso arbeitest denn mit varianten variablen, wenn du den feldtypen kennst?
[delphi] table1whg.Value[ /delphi]
macht das sinn?

ich verwende diese form des zugriffes nur, wenn ich mit einer schleife über alle felder
iteriere - somit kann ich den feldindex nutzen und brauch mich auch nicht um den typen
zu kümmern

ich vermute, dass das komische verhalten der tabelle von deinem filter herrührt. ich versteh
den sinn dieser routine nicht ganz

und die überprüfung auf whg und name = '' mit anschliessendem löschen des eintrages kommt
mir in der FormCreate-procedure komisch vor.

ausserdem würde ich zum Table1.DisableControls und Table1.EnableControls verwenden, um die
anzeige von der tabelle abzukoppeln. mit DBGrid.Enabled:= true schaffst nur, dass der user
nichts mehr anklicken kann, die datensätze werden trotzdem sichtbar gescrollt.

stehen diese routinen wirklich alle in der FormCreate-procedure, oder hast zum herzeigen
allerhand zusammenkopiert?

mfg, stefan
  Mit Zitat antworten Zitat
plautzer

Registriert seit: 23. Aug 2003
172 Beiträge
 
#5

Re: Tabellen springen zum letzten Datensatz, warum?

  Alt 23. Jun 2004, 20:19
Ja, das steht alles in Formcreate.
Ich sehe auch ein, dass das was ich hier mache nicht viel sinn, rein vom lernen her macht, aber das ist eben Schule. Uns wurde vor gut 2 wochen gesagt, das wir ein programm programmieren sollen mit Beschreibung struktogramm etc... . Das wäre ja alles kein Thema, aber da es zum jahresende immer noch stressiger und jeder noch schnell was aufgeben will, das bremst den Elan und somit die Ausführung gewaltig..naja und bis morgn muss es fertsch sein.Nun aber zum programm:

Ich habe den Fehler fürs das springen des datensatzes gefunden:

Delphi-Quellcode:
procedure TMietverwaltung.brutto_summe;
var bru_su:currency;
a:integer;
begin
bru_su:=0.0;
  while Not Table1.EOF do
  begin
    bru_su := bru_su +Table1.FieldByName('Bruttomiete').AsFloat;
    table1.Next;
  end;
dbtext3.Caption := Format('%8.2f', [bru_su])+'';
a:=table1.RecordCount;
dbtext2.Caption:=inttostr(a);
end
Es soll jeweils die summe einer Spalte (miete) ermittelt werden, ich weiss aber nicht wie ich das anders machen soll als oben. Habt ihr ne idee?

Wenn man eine doppelte ID eingibt, dann sagt der erst was beim speichern, ... d.h. bei mit zumindest, das ein fehlermeldung kommt und ab da an spinnt das programm, es wir eine datensatz ohne ID, also leer, erstellt und ab da hat man verloren, mann muss alle daten löschen bevor man das leere feld wegbekommt.

Plautzer
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#6

Re: Tabellen springen zum letzten Datensatz, warum?

  Alt 23. Jun 2004, 20:37
Hallo,

Ich weiß jetzt nicht wie dein restlicher Code aussieht aber ich würde in das OnExit Ereignis eine Abfrage schreiben. So das sich dich schon warnt bevor du das speichert.

Wenn Du es in dem BeforePost oder so ähnlich trin zustehen hast, ist es bestimmt nur ein kleiner Fehler, denn eigentlich sollte die Procedure abbrechen, wenn es zu einem Fehler kommt. In deinem Fall, die doppelte ID. Nun könnstest Du die Procedure dahingehend ändern, das wenn die ID schon vergeben ist automatisch eine neue generierst.

Zeigt uns mal Code zu speichern, dann können wir den Fehler bestimmt finden.
  Mit Zitat antworten Zitat
plautzer

Registriert seit: 23. Aug 2003
172 Beiträge
 
#7

Re: Tabellen springen zum letzten Datensatz, warum?

  Alt 23. Jun 2004, 21:01
Das ist der code ohne ne warnung bzw prüfung auf doppelte ID.

Delphi-Quellcode:
table2.Open;
dbgrid1.Enabled:=true;
table2.Filtered:=false;
table2.Filter := ( 'id =' + inttostr(table1whg.Value));
table2.Filtered:=true;
Wie prüfe ich denn, das die ID doppelte ist, so wie ich's oben versucht hatte?

Und wie berechne ich die summe?

Plautzer
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#8

Re: Tabellen springen zum letzten Datensatz, warum?

  Alt 23. Jun 2004, 21:26
Ich kenne mich mit Table nicht so gut aus, daher hier mal ein Beispiel mit Query.

SQL-Code:
Query1.close;
Query1.SQL.clear;
Query1.SQL.Text:= 'Select * From DB WHERE ID Like '+Edit.WhgNr';
Query1.open;

If Query1.RecordCount > 0 Then
Begin
ShowMessage(
'Die Whg-Nr ist bereist vergeben')
else
//dein restlicher Code zum Beispiel speichern
end;
Dieses Code könnstest Du in das OnExit Ereignis deines Edit eintragen und jedesmal, wenn du das Edit verläßt, wird überprüft, ob die Whg-Nr bereits vergeben ist oder nicht.
  Mit Zitat antworten Zitat
plautzer

Registriert seit: 23. Aug 2003
172 Beiträge
 
#9

Re: Tabellen springen zum letzten Datensatz, warum?

  Alt 23. Jun 2004, 21:39
Nee.. tables und sql funzen nicht zusammen..

Naja, bringt jetzt auch nichts mehr.

Ich danke EUCH für eure Bemühungen, ihr habt mir viel geholfen, vieleli werdens ja 10pkte.

Cya,

Plautzer
  Mit Zitat antworten Zitat
grayfox

Registriert seit: 22. Jan 2003
Ort: Litschau
173 Beiträge
 
Delphi 4 Standard
 
#10

Re: Tabellen springen zum letzten Datensatz, warum?

  Alt 23. Jun 2004, 22:09
hallo albi!

mit einem ungebundenen db-feld funktioniert es auch mit einem table, nur mit einem gebundenen
hab ich es auch noch nicht hinbekommen.

zb im OnExitEvent des edit-feldes, in welchem plautzer die wohnungsnummer einträgt

Delphi-Quellcode:
{$SCHNELL_MAL_ZUSAMMENGETIPPT_UND_KURZ_GETESTET}
procedure TForm1.Edit1Exit(Sender: TObject);
var
  aID: LongInt;
  Code: integer;
begin
  if Edit1.Text = 'then
    Exit;
    
  val(Edit1.Text,aID,Code);
  if Code > 0 then begin
    ShowMessage('die wohnungsnummer ist nicht numerisch');
    Edit1.Clear;
    Edit1.SetFocus;
    Exit
  end;

  if Table1.Locate('ID',aID,[]) then begin
    ShowMessage(Format('die wohnungsnummer %5d ' + #13#10
      + 'ist bereits angelegt',[aID]));
    Edit1.SetFocus
  end else begin
    if not (Table1.State in [dsInsert, dsEdit]) then
      Table1.Append;
    Table1.FieldByName('ID').asInteger:= aID
  end
end;
nur muss er dann beim scrollen in der tabelle bzw beim suchen das editfeld selbst
mit daten aus dem feld 'ID' versorgen, denn es ist ja nicht mehr gebunden

@plautzer: dbtext3.Caption := Format('%8.2f', [bru_su])+''; hier reicht aber ein normales textfeld vollkommen aus, bzw ich würde ein masked editfeld verwenden um mir die formatierung des strings zu ersparen

mfg, stefan
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:42 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