![]() |
Tabellen springen zum letzten Datensatz, warum?
Mahlzeit,
Bei Tabellen, die ich in meinem Prog nutze, haben auf einmal die Angewohnheit zu letzten Datensatz zu springen wenn ich: a:Programmstart(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 |
Re: Tabellen springen zum letzten Datensatz, warum?
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 |
Re: Tabellen springen zum letzten Datensatz, warum?
Nagut, dann geben ich euch mal einen kleinen Einblick in meien quelltext:
Delphi-Quellcode:
Master/detail verbindung habe ich nicht, nur 2 tabellen, die (per filter) zusammen einen mieter ergeben.
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; 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 |
Re: Tabellen springen zum letzten Datensatz, warum?
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:
:gruebel:
Die Keine der Tabelle ist indiziert
heisst das nun die EINE oder KEINE? einen index hab ich nämlich gefunden...
Delphi-Quellcode:
noch was... der primärindex hat bei paradox keinen namen.
WITH indexdefs DO BEGIN
clear; Add('Whg', 'Whg', [ixprimary, ixunique]); END; du kannst ihn auch mit
Delphi-Quellcode:
definieren.
Add('', 'ID', [ixprimary, ixunique]);
Code:
und was ist das dann?
das eonzige was ich mache ist table.open;
Ich wüsste auch garnicht warum ich diese active setzen sollte
Delphi-Quellcode:
oder hier?
with Table1 do begin
active := false;
Delphi-Quellcode:
der unterschied zwischen open und aktive ist nur, dass open/close proceduren sind,
with Table2 do begin
active := false; 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 |
Re: Tabellen springen zum letzten Datensatz, warum?
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:
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?
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 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 |
Re: Tabellen springen zum letzten Datensatz, warum?
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. |
Re: Tabellen springen zum letzten Datensatz, warum?
Das ist der code ohne ne warnung bzw prüfung auf doppelte ID.
Delphi-Quellcode:
Wie prüfe ich denn, das die ID doppelte ist, so wie ich's oben versucht hatte?
table2.Open;
dbgrid1.Enabled:=true; table2.Filtered:=false; table2.Filter := ( 'id =' + inttostr(table1whg.Value)); table2.Filtered:=true; Und wie berechne ich die summe? Plautzer |
Re: Tabellen springen zum letzten Datensatz, warum?
Ich kenne mich mit Table nicht so gut aus, daher hier mal ein Beispiel mit Query.
SQL-Code:
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.
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; |
Re: Tabellen springen zum letzten Datensatz, warum?
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 |
Re: Tabellen springen zum letzten Datensatz, warum?
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:
nur muss er dann beim scrollen in der tabelle bzw beim suchen das editfeld selbst
{$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; mit daten aus dem feld 'ID' versorgen, denn es ist ja nicht mehr gebunden @plautzer:
Delphi-Quellcode:
hier reicht aber ein normales textfeld vollkommen aus, bzw ich würde ein masked editfeld verwenden um mir die formatierung des strings zu ersparen
dbtext3.Caption := Format('%8.2f', [bru_su])+' €';
mfg, stefan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:47 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-2025 by Thomas Breitkreuz