Autor Beitrag
ElTonno
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29

XP, Win 7, Ubuntu
Delphi 2007 Enterprise
BeitragVerfasst: Sa 08.08.09 04:16 
Hallo Leute,

probiere jetzt seid 3 Std diese Messagebox zum laufen zu kriegen.
Hab ne Tabelle mit Gästeabreisen und ich möchte das die Messagebox mir die Gäste anzeigt einen Tag vor reiseende

Abreisedatum 07.08.09 < anzeigen das die morgen gelöscht werden.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm2.Button2Click(Sender: TObject);
var i: Integer;
begin
 FOR i:=1 TO 2 DO
if Application.MessageBox(IntToStr(Table1.Locate('Abreise', DateToStr(Date()-1), [loCaseInsensitive])), 64+0)
=IDOK then close;
end;
end.

über einen tipp oder nen verbesserungsvorschlagen würde ich mich sehr freuen.

Bis dann.

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Sa 08.08.2009 um 23:14
NetSpider
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: Sa 08.08.09 09:52 
Also, soweit ich weiss brauchst du bei LOCATE kein

ausblenden Delphi-Quelltext
1:
for i := 1 to 2 do begin //...					


Allerdings musst du auf das Ende der DB testen. Weiss nicht obs stimmt aber

ausblenden Delphi-Quelltext
1:
While not Table1.Eof do					


Du musst den aktuellen Datensatz noch anpassen. Aber warum verwendest du nicht einfach ein SQL Statement a la

ausblenden Delphi-Quelltext
1:
'SELECT * FROM TDeinerGaesteTable WHERE Abreise = DateToStr(  Trunc(Gewuenschtes_Datum) +1 );'					


Dann bekommst du nur die Leute in deiner Tabelle die einen Tag nach Gewuenschtes_Datum abreisen. Dann brauchst du auch keine MessageBox und alles ist schoen sauber in deinem DBGrid aufgelistet. Welches Datenbank-System verwendest du?

_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
ElTonno Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29

XP, Win 7, Ubuntu
Delphi 2007 Enterprise
BeitragVerfasst: Sa 08.08.09 17:22 
danke für die hilfe.

BDE dbase. aber ich möchte kein datum eingeben weil in der tabelle is ne spalte abreisen und da sind die datumswerte drin. Mir is wichtig eine benachrichtigung für den user zu erreichen. Entweder mit Messagebox oder mit Labels.

hilft es dir ein bisschen??
schau mir dein tip mal. thx erstmal
NetSpider
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: Sa 08.08.09 19:09 
user profile iconElTonno hat folgendes geschrieben Zum zitierten Posting springen:

BDE dbase. aber ich möchte kein datum eingeben weil in der tabelle is ne spalte abreisen und da sind die datumswerte drin. Mir is wichtig eine benachrichtigung für den user zu erreichen. Entweder mit Messagebox oder mit Labels.


Ich bin mir jetzt im Moment nicht sicher in wie weit BDE dbase SQL unterstuetzt, aber gehe ich recht in der Annahme, dass du eine Paradox Datebank verwendest? Sollte dem so sein - und solltest du noch in einem ziemlich fruehen Entwicklungsstadium deines Programms sein, dann rate ich dir eher zu Firebird oder einem anderen RDBMS. Der Vorteil von Firebird ist, dass es 100% kostenlos ist (MySQL kostet bei kommerziellem Einsatz!!!). Ausserdem wird die BDE !NICHT! mehr weiter entwickelt.

Zu deinem Problem. Sollte BDE dbase doch SQL unterstuetzen, dann kannst du das SQL-Statement natuerlich anpassen, ohne dass der User etwas eingeben muss, aber vielleicht willst du am Freitag wissen, wer am Montag abreist... Dann geht dein Konzept von "Wer reist morgen ab?" nicht ab - und der User muesste das am Sonntag pruefen.

Hier der angepasste SQL Text:

ausblenden Delphi-Quelltext
1:
'SELECT * FROM TDeinerGaesteTable WHERE Abreise =   ' + QuotedStr(DateToStr(Trunc(Now +1))) + ';'					


Ich such noch eine Loesung mit Locate raur, aber da muss ich eines meiner uralt Projekte konsultieren :-)

Lg,
Alex

_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
NetSpider
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: Sa 08.08.09 19:30 
OK, hab mein altes Project mal durchdesehen und glaube, dass es mit Locate nicht funktionieren wird, aber es gibt eine andere Moeglichkeit.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
StopSearch := false;  // deklariert als Boolean
TableIndex := Table1.RecNo; // Um am Ende der Suche zum aktuellen Record zurueckzukehren

Table1.First;
    if Table1.FindFirst then begin
      repeat
      if Table1.ControlsDisabled = false then begin
      Table1.DisableControls;
      end;
        if AnsiLowerCase(Table1.FieldByName('Abreise').AsString) = AnsiLowerCase('DEIN SUCHWORT'then begin
          Table1.EnableControls;
          if MessageDlg('Record found! Continue with Search-Function?' + #13 +
          'Result: Hier kannst du alle moeglichen Informationen angeben', mtConfirmation, [mbNo, mbYes], 0) = mrNo then begin
          StopSearch := true;
          end else Table1.DisableControls;
          end;
      until (StopSearch = true) or (Table1.FindNext = false);
     If StopSearch <> true then begin
     MessageDlg('Ende der Tabelle erreicht!', mtInformation, [mbOK], 0);
     Table1.RecNo := TableIndex; // Falls nichts gefunden wurde, zum urspruenglichen Record zurueckspringen
    end;
    end;
finally
Table1.EnableControls;
end;


Ich habs hier im Forum editiert, weiss also nicht ob es 1 zu 1 uebernommen werden kann, aber das muesste so im groben doe Loesung sein. Das disablen der DB-Controlls erhoeht die Geschwindigkeit der Suche, da das DBGrid nicht bei jedem neuen FindFirst neu gezeichnet werden muss.

Hoffe dass dir das weiter hilft.

Lg,
Alex

_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
ElTonno Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29

XP, Win 7, Ubuntu
Delphi 2007 Enterprise
BeitragVerfasst: So 09.08.09 03:24 
ich hab ja ne "Prüfschleife" die gestartet wird wenn das programm öffnet.
die überprüft alle Datumswerte im Feld Abreise (gebe keine Tage ein sondern nur Datumswerte). das funzt ja auch er löscht die ja auch aber ich würd halt gern ne messagebox oder mehrere Labels die zur laufzeit erstellt werden haben wollen die die namen anzeigt die dann demnächst abreisen

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TMenue.FormActivate(Sender: TObject);
var i: Integer;
begin
 FOR i:=1 TO 2 DO
 if Table1.Locate('Abreise', DateToStr(Date()-1), [loCaseInsensitive]) then
   Table1.Delete;
end;


ja ich weis das die bde nich weiter entwickelt wird aber so für meine Zwecke reicht es noch,
(benutz ja auch noch QuickReport anstatt Rave Report ;@))) sql wird unterstützt.
NetSpider
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: So 09.08.09 07:03 
Hast du mein Beispiel mit FindFirst/FindNext ausprobiert? Das muesste naemlich genau das sein was du suchst. Der Code gibt zwar fuer jeden gefundenen Record eine MessageBox aus, aber du kannst es ja anpassen dass er erst alles in eine TStringList schreibt und dann als MessageBox ausgibt. Besser waere hier vielleicht eine TListView, weil du die Daten schoener strukturieren kannst.

LOCATE wird nicht funktionieren um alle Eintraege in deiner DB zu finden. Soweit ich mich erinnere startet LOCATE immer am Anfang der Datenbank und stoppt beim ersten gefundenen Record. Du wirst also immer nur den ersten gefundenen Racord angezeigt bekommen. Im Falle von LOCATE in Verbindung mit DELETE funktioniert das, weil nachdem LOCATE Record gefunden hat, dieser sofort geloescht wird --> LOCATE findet nun den naechsten Record da der erste nicht mehr existiert.

Also bleibt dir nur FindFirst oder das SQL Statement.
Uebrigens, Labels zur Laufzeit erstellen wird eine Unmenge an Arbeit sein. Ausserdem ist das mit Sicherheit nicht die eleganteste Variante. Das einfachste waere SQL!

Schau dir mal die TQuery Komponente an und verbinde die erforderlichen Komponenten wie bei der TTable. Dann setze Eigenschaft SQL auf 'SELECT * FROM einTABELLENname;'.
Sobald du Active auf True setzt, solltest du den ganzen Inhalt der Tabelle aufgelistet bekommen. Klar solltest du dir SQL ein bisschen anschauen und lernen, aber es wird sich lohnen! Wenn du spaeter mal mit Firebird anfaengst, Stored Procedures verwendest usw., dann moechtest du SQL nicht mehr eintauschen :-)

Alex

_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
ElTonno Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29

XP, Win 7, Ubuntu
Delphi 2007 Enterprise
BeitragVerfasst: So 09.08.09 16:47 
ok danke dir.
werd mir das anschauen und lernen lernen lernen.

André
ElTonno Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29

XP, Win 7, Ubuntu
Delphi 2007 Enterprise
BeitragVerfasst: Do 13.08.09 07:27 
Hallo Alex,

dbase unterstützt sql, hab dein text mal eingefügt aber er meckert immer rum.

hab jetzt mal nur die anzeigen wollen mit nachnamen und dem datum wo se abhauen geht aber auch nich.


Table: Reha
Spalten Nachname, Abreise
ausblenden Delphi-Quelltext
1:
SELECT Nachname, Abreise FROM Reha WHERE Abreise  =  +(DateToStr(Trunc(Now +1)));					



hab ich was falsch gemacht??

er gibt aus: merkmal nicht verfügbar.Kannst du damit was anfangen???
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 13.08.09 10:58 
Du vermischst da Delphi- mit SQL-Code. Versuch es mal mit Parametern.
ausblenden Delphi-Quelltext
1:
2:
3:
Query.SQL.Text := 'SELECT Nachname, Abreise FROM Reha WHERE Abreise  = :abreise';
Query.ParamByName('abreise').value := Date;
Query.Open;
NetSpider
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: Do 13.08.09 19:52 
DeddyH zeigt dir eine Loesung mit Parametern, du kannst aber auch folgendes machen:

Du brauchst eine TQuery Komponente (die wie eine TTable an eine TDatabase angebunden werden muss). TQuery hat eine SQL Property (TStrings). Dann kannst du folgenden Code verwenden (z.B. wenn auf einen Button geclickt wird):

ausblenden Delphi-Quelltext
1:
2:
3:
If Query1.Active = true then Query1.Active := false;
Query1.SQL.Text := 'SELECT Nachname, Abreise FROM Reha WHERE Abreise = ' + QuotedStr((DateToStr(Trunc(Now +1)))) + ';';
Query1.Active := true;


Du solltest jetzt alle Nachnamen und das Datum der Abreise von allen Personen bekommen die morgen abreisen.

Hoffe es funktioniert

_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 14.08.09 11:51 
Wieso wird da auf true abgefragt (nicht nur unnötig, sondern falsch) und wozu da erst mühsam das Datum in einen String konvertieren? Was, wenn das DBMS ein anderes Datumsformat erwartet? Wo immer es irgend geht, sollte man Parameter verwenden, es gibt keine wirklich sinnvollen Alternativen dazu.
ElTonno Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29

XP, Win 7, Ubuntu
Delphi 2007 Enterprise
BeitragVerfasst: Fr 14.08.09 14:18 
hallo nochmal,

merk schon das wird ein jahrhundert projekt. :P
Erstmal vielen dank für die hilfe aber es funktionieren beide nich. Er zeigt mir im DBGrid trotzdem alle an. belese mich ja schon im Internet aber es will nüsch klappen. Google ma noch ne runde vllt find ich ja was.
Danke erstmal

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
NetSpider
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 123

Windows XP Pro
Delphi 7 Enterprise
BeitragVerfasst: Fr 14.08.09 14:29 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Wieso wird da auf true abgefragt (nicht nur unnötig, sondern falsch) und wozu da erst mühsam das Datum in einen String konvertieren? Was, wenn das DBMS ein anderes Datumsformat erwartet? Wo immer es irgend geht, sollte man Parameter verwenden, es gibt keine wirklich sinnvollen Alternativen dazu.


Ich bin mir zwar nicht sicher, aber ich denke dass bei manchen TQuery Komponenten eine Exception ausgeloest wird, sollte im aktiven Zustand die SQL Eigenschaft geaendert werden. Es is mit Sicherheit NICHT falsch den Status der TQuery zu testen!

Ausserdem wird bei deinem Beispiel mit Parametern genau das gleiche gemacht! Dein Parameter :abreise wird in einen STRING umgewandelt! Das DBMS besitzt einen SQL Parser der dann das SQL Statement "uebersetzt" - (Deshalb kann man - glaube ich - auch keine BLOB Felder mit SQL uebertragen - StrinListen ausgeschlossen). Im Prinzip ist dein Beispiel fast identisch zu meinem - es wird nur anders umgesetzt.

Soweit ich weiss sollte jedes Datenbank System das Datum intern als Extended (also eine Komma-Zahl) speichern, wobei die Zahl vor dem Komma den Tag nach einem bestimmten Richtwert darstellt. (0 sollte der 31 Dezember 1899 - jedenfalls in der Region). Die Zahl nach dem Komma gibt den Bruchteil des Tages wieder. also .5 is 12 Uhr mittags. Du sprichst hier vom Anzeige-Format, nicht vom Speicher-Format. Das DBMS konvertiert, genauso wie DateToStr in das SELBE Format - und Zurueck! Es gibt also keine Probleme beim Verwenden meines Beispiels.

Sollte ich total daneben liegen, dann bitte um Berichtigung - ansonsten empfehle ich Helen Borrie "The Firebird Book"

@ElTonno
Normalerweise sollte das Query funktionieren. Vielleicht kannst du mal ein bisschen Quelltext posten, oder nochmal nachpruefen wie dein SQL Statement aussieht. Du kannst auch mal andere Werte versuchen.

z.B.
ausblenden Delphi-Quelltext
1:
Query1.SQL.Text := 'SELECT Nachname, Abreise FROM Reha WHERE Nachname LIKE ' + QuotedStr('ElTonno');					

Alex

_________________
Wer in die Fußstapfen anderer tritt hinterlässt keine eigenen Spuren!
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 14.08.09 15:24 
user profile iconNetSpider hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Wieso wird da auf true abgefragt (nicht nur unnötig, sondern falsch) und wozu da erst mühsam das Datum in einen String konvertieren? Was, wenn das DBMS ein anderes Datumsformat erwartet? Wo immer es irgend geht, sollte man Parameter verwenden, es gibt keine wirklich sinnvollen Alternativen dazu.


Ich bin mir zwar nicht sicher, aber ich denke dass bei manchen TQuery Komponenten eine Exception ausgeloest wird, sollte im aktiven Zustand die SQL Eigenschaft geaendert werden. Es is mit Sicherheit NICHT falsch den Status der TQuery zu testen!

Aber es ist falsch, auf true abzufragen, zumal das hier auch noch unnötig ist. Ein einfaches
ausblenden Delphi-Quelltext
1:
Query.Active := false;					

genügt doch vollkommen.
ElTonno Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29

XP, Win 7, Ubuntu
Delphi 2007 Enterprise
BeitragVerfasst: Di 01.09.09 14:44 
hallo ihr beiden wollt euch nur mal mitteilen das ich das problem mit ner Listbox gelöst habe.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm2.FormActivate(Sender: TObject);
begin
While not Table1.Eof do
begin
    if Table1.FieldByName('Abreise').Value < Now -0 then ListBox1.Items.Add(Table1.FieldByName('Nachname').AsString);
end;
end;

das einzige was er nich macht den ersten eintrag berücksichtigen den übergeht er einfach.
jut leuet vielen dank nochmal.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 01.09.09 14:49 
Und das funktioniert so? Zumindest ein Next gehört da IMHO schon hinein.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Table1.First;
while not Table1.EOF do
  begin
    //irgendwas mit dem Datensatz machen
    Table1.Next;
  end;
ElTonno Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29

XP, Win 7, Ubuntu
Delphi 2007 Enterprise
BeitragVerfasst: Di 01.09.09 16:28 
ja funzt. siehste das mit table first hab ich ganz vergessen und hatte auch nen next drin hab ich übersehen. probier ich gleich mal aus. schreib dir dann nochmal.

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

so habs jetzt drin aber er igno. immer noch den ersten Datensatz.
und den letzten trägt er zweimal in die Listbox ein.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 01.09.09 16:50 
Zeig mal Deinen Code, ich vermute, Du hast das Next an die falsche Stelle gesetzt.
ElTonno Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 29

XP, Win 7, Ubuntu
Delphi 2007 Enterprise
BeitragVerfasst: Di 01.09.09 19:41 
jo hab schon, hab auch die codezeilen vertauscht.
habs jetzt richtig gestellt und jeht, meine jüte et jeht :D :D
thx