Autor |
Beitrag |
ElTonno
      
Beiträge: 29
XP, Win 7, Ubuntu
Delphi 2007 Enterprise
|
Verfasst: 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.
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 Narses: Delphi-Tags hinzugefügtModeriert von Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Sa 08.08.2009 um 23:14
|
|
NetSpider
      
Beiträge: 123
Windows XP Pro
Delphi 7 Enterprise
|
Verfasst: Sa 08.08.09 09:52
Also, soweit ich weiss brauchst du bei LOCATE kein
Delphi-Quelltext 1:
| for i := 1 to 2 do begin |
Allerdings musst du auf das Ende der DB testen. Weiss nicht obs stimmt aber
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
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 
      
Beiträge: 29
XP, Win 7, Ubuntu
Delphi 2007 Enterprise
|
Verfasst: 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
      
Beiträge: 123
Windows XP Pro
Delphi 7 Enterprise
|
Verfasst: Sa 08.08.09 19:09
ElTonno hat folgendes geschrieben : |
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:
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
      
Beiträge: 123
Windows XP Pro
Delphi 7 Enterprise
|
Verfasst: 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.
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; TableIndex := Table1.RecNo; 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; 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 
      
Beiträge: 29
XP, Win 7, Ubuntu
Delphi 2007 Enterprise
|
Verfasst: 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
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
      
Beiträge: 123
Windows XP Pro
Delphi 7 Enterprise
|
Verfasst: 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 
      
Beiträge: 29
XP, Win 7, Ubuntu
Delphi 2007 Enterprise
|
Verfasst: So 09.08.09 16:47
ok danke dir.
werd mir das anschauen und lernen lernen lernen.
André
|
|
ElTonno 
      
Beiträge: 29
XP, Win 7, Ubuntu
Delphi 2007 Enterprise
|
Verfasst: 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
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
|
Verfasst: Do 13.08.09 10:58
Du vermischst da Delphi- mit SQL-Code. Versuch es mal mit Parametern.
Delphi-Quelltext 1: 2: 3:
| Query.SQL.Text := 'SELECT Nachname, Abreise FROM Reha WHERE Abreise = :abreise'; Query.ParamByName('abreise').value := Date; Query.Open; |
|
|
NetSpider
      
Beiträge: 123
Windows XP Pro
Delphi 7 Enterprise
|
Verfasst: 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):
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
|
Verfasst: 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 
      
Beiträge: 29
XP, Win 7, Ubuntu
Delphi 2007 Enterprise
|
Verfasst: Fr 14.08.09 14:18
hallo nochmal,
merk schon das wird ein jahrhundert projekt.
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 Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
|
|
NetSpider
      
Beiträge: 123
Windows XP Pro
Delphi 7 Enterprise
|
Verfasst: Fr 14.08.09 14:29
DeddyH hat folgendes geschrieben : | 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.
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
|
Verfasst: Fr 14.08.09 15:24
|
|
ElTonno 
      
Beiträge: 29
XP, Win 7, Ubuntu
Delphi 2007 Enterprise
|
Verfasst: Di 01.09.09 14:44
hallo ihr beiden wollt euch nur mal mitteilen das ich das problem mit ner Listbox gelöst habe.
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
|
Verfasst: Di 01.09.09 14:49
Und das funktioniert so? Zumindest ein Next gehört da IMHO schon hinein.
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| Table1.First; while not Table1.EOF do begin Table1.Next; end; |
|
|
ElTonno 
      
Beiträge: 29
XP, Win 7, Ubuntu
Delphi 2007 Enterprise
|
Verfasst: 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 Narses: 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
|
Verfasst: Di 01.09.09 16:50
Zeig mal Deinen Code, ich vermute, Du hast das Next an die falsche Stelle gesetzt.
|
|
ElTonno 
      
Beiträge: 29
XP, Win 7, Ubuntu
Delphi 2007 Enterprise
|
Verfasst: 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
thx
|
|