AGB  ·  Datenschutz  ·  Impressum  







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

überfordert ~.~

Ein Thema von Anfänger2013 · begonnen am 8. Apr 2013 · letzter Beitrag vom 14. Apr 2013
Antwort Antwort
Seite 1 von 3  1 23      
Anfänger2013

Registriert seit: 8. Apr 2013
11 Beiträge
 
#1

überfordert ~.~

  Alt 8. Apr 2013, 20:38
Datenbank: Datenbank_Hotel • Version: Access 2003 • Zugriff über: Delphi
Hallo Leute,
ich ich muss ein kleines Programm für die Schule schreiben und es ist etwas her, dass ich das letzte mal gut programmiert habe ...und die Ideen waren wie immer über das eigene Können :/

So nun zum Programm. Ich hab mal euch das ganze Packet hochgeladen, da ich nicht genau weiß was ihr braucht bzw wo der Fehler sein könnte. Ich hab auch ein Teil des Quelltextes als Kommentar gesetzt, da ich zu Hause mit Turbo Delphi und in der Schule mit Delphi 6 arbeite. Bsp. das Datum dass ich benutze ...in Turbo Delphi klappt es ganz normal und Delphi 6 muss ich es erst zwerlegen und dann wieder zusammenfügen und wenn ich die Version von Delphi 6 zu Hause mache, dann gehts nicht.

Nun zur Problematik:

Ich hab 2 DateTimePicker und bei denen soll Datum ausgewählt werden und mit der Datenbank abgeglichen und wenn es zutrifft, dann sollen in einen StrinGrid die Felder von den Zimmern rot makiert werden, die zu dem gewählten Zeitpunkt belegt sind.
Mein Problem hierbei ist nun, dass das Programm abstürtzt, wenn die Fälle nicht zutreffen, dass 1. Datum >= 2. Datum oder 1. Datum und 2. Datum nicht in der Datenbank sind (also keine belegten Zimmer zu dem gewählten Zeitpunkt). Wo ist der Fehler?
Meine 2. Frage richtet sich an mein "verstecktes" DBGrid. Für meinen Vergleich habe ich die Datensätze aus dem StringGrid und DBGrid die abgeglichen werden. Ist es möglich, dass man das/die Ergebnis/Ergebnisse auf eine Variable legt und die dann mit dem StringGrid abgleicht? Wenn ja, wie? ...Ich hab schonmal versucht es i.wie auf eine Variable zu setzen, aber erfolgreich gescheitert >.>.
Zu dem Punkt hab ich noch eine Frage: bei mir wird ja abgeglichen welche Zimmer belegt sind und die belegten Zimmer werden im StringGrid rot makiert. Alles soweit so gut ...wenn ich ein belegtes Zimmer hab, dann klappt es ohne Probleme super, aber wenn ich 2+ habe, dann wird nur das letzte rot makiert ...wie kann ich es machen, dass Delphi mir alle belegten Zimmer makiert?

Und zur meinem letzten Problem: Ich habe den Button "Buchen" ...da sollen nun die eingegebenen Werte aus den Edits etc. in die Datenbank eingefügt werden. Und ich bin da echt ratlos. Ich hatte die SQL-Abfrage nach einer Vorlage gemacht, die eig. funktionierte, aber nun benkomm ich dauerhaft Fehlermeldungen und komm einfach nicht weiter. -.-

Tut mir Leid, wenn ich soviele Fragen auf einmal stelle ...aber ich und meine InfoSys-Lehrer in der Schule wissen auch nicht wirklich weiter. Wäre echt schön, wenn jemand etwas Freizeit hat und mal drüber schauen könnte und mir vlt paar Lösungen oder Löungsansetze bieten könnte.

Danke im Voraus und LG Sergej

PS: Ihr könnt nach Lust und Laune im Quelltext Änderungen durchnehmen. Meine E-Mail: Sergej.S.D.A@gogglemail.com
Angehängte Dateien
Dateityp: rar buchung.rar (713,4 KB, 19x aufgerufen)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#2

Crosspostings kennzeichnen

  Alt 8. Apr 2013, 21:11
Crosspost

Obwohl du im Delphi-Treff bereits zahlreiche Antworten und Hinweise erhältst, mußtest du nun dieselbe Frage hier noch einmal stellen, und zwar wieder sehr pauschal und nahezu ohne konkrete Beschreibung deines Problems. Du darfst mir glauben, daß in den anderen beiden Delphi-Foren dieselben Fachleute unterwegs sind wie hier und du lediglich Ärgerlichkeit erzeugst, wenn du glaubst, mit einem anderen Nick und einer etwas anderen Formulierung falle es nicht auf, daß du crosspostest. Du wirst hier ebenso wenig wie in den anderen Foren deine Hausaufgaben gemacht bekommen ...
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#3

AW: Crosspostings kennzeichnen

  Alt 8. Apr 2013, 22:33
Obwohl du im Delphi-Treff bereits zahlreiche Antworten und Hinweise erhältst,
Weder zahlreiche noch substantielle, nur zurechtweisende.

Du darfst mir glauben, daß in den anderen beiden Delphi-Foren dieselben Fachleute unterwegs sind wie hier und du lediglich Ärgerlichkeit erzeugst, wenn du glaubst, mit einem anderen Nick und einer etwas anderen Formulierung falle es nicht auf, daß du crosspostest.
1. Andere Foren - andere Antworten.
2. Das Pseudonym, das Thema der Diskussion und auch der Beitrag selbst scheinen - flüchtiger Blick - die gleichen zu sein.
3. Woher willst du, Perlsau, dich eigenmächtig anscheinend berufen zu fühlender "Crossposterhunter" (oder -buster?), wissen, daß dieselbe Person dahintersteckt? Du unterstellst es einfach ohne Beweis.

Davon abgesehen, ist das Thema, mit dem Du, Sergej, dieses Forum (beide Foren?) überfällst, tatsächlich erschlagend. Mit der Fülle an Fragen schreckst Du eher ab, als Interesse und die soziale Ader des "leicht gutmenschelnden Helfers" zu wecken.

Wenigstens die e-Mail-Adresse hätte stimmen können, oder gibt es die wirklich?

Geändert von Delphi-Laie ( 8. Apr 2013 um 22:38 Uhr)
  Mit Zitat antworten Zitat
Anfänger2013

Registriert seit: 8. Apr 2013
11 Beiträge
 
#4

AW: überfordert ~.~

  Alt 8. Apr 2013, 22:45
Also ich möchte hirmit was klarstellen, was angesprochen wurde. Die Person die den Beitrag geschrieben hat und auf die du zuweist ist ganz bestimmt nicht ich. Es ist war, wass ich diese Perönlich kenne und wir an einem Projekt arbeiten. Diese Person hat mich auch auf die Idee gebracht mal im Forum nachzufragen. Aber ich arbeite an einem ganz anderem Teil des Projektes(ich bin für die Buchung verantwortlich und die andere Person für die Zimmerbelegung). Wie dir aber auch bestimmt aufgefallen werden sollte, dass ich völlig andere Probleme habe, als die von dir benannte Person hat.
Nun zu dem was Hausaufgaben machen angeht. Ich habe niemals gesagt, dass ihr hier im Forum für mich das Programm schreiben sollt!! ...den gröten Teil des Programms hab ich und es fehlt an Feinschlif.
Was ich von diesem Forum erwarte bzw wünsche ist, wenn jemand Lust und Laune hat und über mein Programm schaut und mir paar Denkanstöße, Hinweise, vlt auch Beilspiele gibt. Ich erwarte keinesfalls, dass hier mein Programm für mich geschrieben wird!!!!! Denn das würde mir in der Prüfung auch nicht viel bringen und ich mir die Zeit mit diesem Thread spaaren könnte.

Und @ Delphi-Laie: Ich weiß hatte meine "Bitte" auch in einem anderen Forum gepostet und wurde auch gesagt, dass es zu viel auf einmal ist -.- ....mal schauen ..morgen ist auch noch ein Tag zum nachdenken und vlt teile ich es in ein paar kleine Fragen auf.

LG Sergej

Geändert von Anfänger2013 ( 8. Apr 2013 um 22:52 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: überfordert ~.~

  Alt 9. Apr 2013, 01:35
Das Aufteilen in einzelne kleinere Fragen/Themen kann übrigens in den allermeisten Fällen schon ein ganz großer Schritt in Richtung Problemlösung sein! Mir passiert es nicht selten, auch nach Jahren der beruflichen Programmierung, dass ich eine Frage hier im Beitragseditor aufschreibe, und sich eine Lösung schon beim Schreiben ganz von selbst auftut. Auch ist das Zerteilen von großen/komplexen Problemen in viele kleine Handliche Mini-Fragen quasi eine der grundlegenden Techniken, wenn nicht gar das Wesen bei der Programmierung bzw. Entwicklung.
Und für das Fragen in einem Forum ohnehin essentiell. Auf "hier ist mein 10000-Zeilen Programm, da kommen 164 Fehler beim Übersetzen. Guckt da mal einer?" wird kaum einer reagieren wollen. Fremdcode, gerade von Schülern (keine Kritik an die Schüler übrigens, oftmals sind die Lehrer etwas seltsam drauf ) ist ohnehin nicht immer leicht ganz zu verstehen und kostet immer Zeit. Ein ganzes Programm sogar echt viel, vor allem wenn es dann noch vor Problemchen an ganz verteilten Ecken und Enden wimmelt, die das Verstehen des eigentlich gewollten Ergebnisses an dieser Stelle auch verkomplizieren. Ein einzelner wird sich kaum die Zeit für das ganze Teil nehmen können bzw. wollen, in kleinere Häppchen verpackt kann man viel besser die Hilfe auf mehrere Leute hier verteilen. Ergebnis: Erheblich höhere Beteiligung und Bereitschaft sich mit dem Problem zu befassen.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: überfordert ~.~

  Alt 9. Apr 2013, 12:34
Hallo,

habe gerade mal ein bisserl nix zu tuen, deshalb schau ich kurz in den Quelltext

warum
Delphi-Quellcode:
anreise:=(DatetoStr(bu_anreise.Date));
abreise:=(DatetoStr(bu_abreise.Date));

if (anreise >= abreise) then
  begin
    Showmessage('Buchung nich möglich. Bitte überprüfen Sie das Datum.');
  end
else
  begin
Datumswerte kann man miteinander vergleichen (auch unter Delphi 6)
if (bu_anreise.Date >= bu_abreise.Date) then dürfte die gleiche Wirkung haben, wobei ein Vergleich von z. B. 25.05.2013 mit 01.08.2013 als Datumswerte durchaus zu einem "besseren" Ergebnis führen kann als als Zeichenfolge. Als Zeichenfolge ist 01.08.2013 kleiner als 25.05.2013, bei einem Datumsvergleich nicht.

Bitte mal in der Hilfe die Beschreibungen zu den Datumsfunktionen der Unit DateUtils anschauen. Dort sollte es sowas wie DayOf, MonthOf, YearOf geben, die Funktionen benötigen alle als Eingabeparameter einen TDateTime, der mit bu_anreise.Date... ja vorhanden ist. Dadurch läßt sich die gesamte Zeichenfolgenverarbeitung vermeiden und die Ergebnisse werden sicherlich einfacher und korrekt ermittelt.

Die gesamte Datumsumformatierungsorgie mit DD, MM und JJ wird dadurch hinfällig.

Da es sich bei den Buchungsdaten für Anreise und Abreise um Datumswerte handelt, sollten hier in der Datenbank auch Datumswerte gespeichert werden und keine Timestamps. Der Datentyp Date ist der genutzten Datenbank bekannt.

Die Datenbankabfragen sollten parametrisiert werden, damit das Zusammenbauen der SQL-Statements vereinfacht wird.
Das könnte dann z. B. so oder so ähnlich aussehen:
Delphi-Quellcode:
ADOQuery_Buchen2.sql.text:=('SELECT Buchung.Zimmer_Nr FROM Buchung WHERE Buchung.Anreise >= :anreise AND Buchung.Abreise <= :abreise ');
ADOQuery_Buchen2.Parameters.ParamByName('anreise').Value := bu_anreise.Date;
ADOQuery_Buchen2.Parameters.ParamByName('abreise').Value := bu_abreise.Date;
ADOQuery_Buchen2.Active:=true;
Dashier erschließt sich mir überhaupt nicht:
Delphi-Quellcode:
    For zeile := 1 to 20 DO //Zeilen im DBGrid hochzaehlen
      begin
       with DBGrid1.DataSource.DataSet do
         begin
          RecNo := Zeile;
          s:= Fields[spalte-1].AsString;
         end;
         b:=strtoint(s);
      end;
DBGrid1 ist mit ADOQuery_Buchen2 verbunden, es dürfte also auch mit
Delphi-Quellcode:
    For zeile := 1 to 20 DO //Zeilen im DBGrid hochzaehlen
      begin
       with ADOQuery_Buchen2 do
         begin
          RecNo := Zeile;
          s:= Fields[spalte-1].AsString;
         end;
         b:=strtoint(s);
      end;
gehen. Spalte wird am Anfang auf 1 gesetzt und dann immer mit Spalte-1 genutzt, warum? Spalte könnte dann auch direkt 0 sein oder direkt Fields[0].AsString. Da das Feld Zimmer_Nr gelesen wird, wäre FieldByName('Zimmer_Nr').AsString aber eleganter.
Aber sinnvoll ist das Ganze nicht, was ist, wenn die Abfrage weniger als 20 Zeilen hat?
Die Logik geht hier davon aus, dass die Ergebnismenge immer über 20 Zeilen verfügt, das dürfte eher unwahrscheinlich sein. Zimmer_Nr ist in der Datenbank numerisch, warum dann ein derartiges Konstrukt?
Delphi-Quellcode:
s:= Fields[spalte-1].AsString;
b:=strtoint(s);
Wir lesen also einen Integerwert der Datenbank als String, um diesen dann in einen Integer zu verwandeln?b := FieldByName('Zimmer_Nr').AsInteger liefert das gleiche Ergebnis. Interessant ist, dass bei dieser Logik am Ende b immer den Wert der 20. Zimmmer_Nr aus der Ergebnismenge hat. Man könnte dann auch sowas programmieren:
Delphi-Quellcode:
ADOQuery_Buchen2.Active:=true;
ADOQuery_Buchen2.MoveBy(20);
b := FieldByName('Zimmer_Nr').AsInteger;
Hier gibt es, wie mir scheint, mehrere Probleme: Einige, für die Aufgabenstellung erforderliche, Grundlagen sind nicht (hinreichend?) bekannt. Die Aufgabenstellung ist nicht bekannt oder verstanden worden bzw. die Aufgabe wurde nicht in hinreichend kleine Teilstücke zerlegt, um diese dann sinnvoll in Quelltext umsetzen zu können.
  Mit Zitat antworten Zitat
Benutzerbild von SubData
SubData

Registriert seit: 14. Sep 2004
Ort: Stuhr
1.078 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: überfordert ~.~

  Alt 9. Apr 2013, 12:56
@Perlsau, @Delphi-Laie

Sorry für das OT, aber ich möchte euch beide mal daran erinnern, dass auch ihr mal Anfänger wart und viele Dinge,
die für uns "alte Hasen" absolut selbstverständlich sind, für Neulinge eben nicht so selbstverständlich rüber kommen.
Ihr habt beide manchmal eine sehr harsche und direkte Schreibweise, die viele mit Sicherheit auch abschrecken wird.
Ob gerechtfertigt oder nicht, lass ich einfach mal im Raum stehen.

Ich möchte einfach kurz daran appelieren, dass ihr vielleicht ein wenig vorsichtiger und verständnisvoller an neue
Poster herangeht und nicht gleich das schlechteste annehmt bzw. ein wenig sanfter mit euren Formulierungen umgeht.

Sorry, wollte ich einfach mal los werden.


Kleiner Nachtrag: Ja, ich hätte das auch per PN machen können, da mir in einzelnen Fällen auch schon andere aufgefallen
sind, auf die das ebenso zutrifft, ist das eher ein Hinweis an die Allgemeinheit. Nicht nur auf die beiden persönlich
bezogen. Ausserdem soll das kein Angriff, sondern ein gut gemeinter Rat sein
Ronny
/(bb|[^b]{2})/

Geändert von SubData ( 9. Apr 2013 um 13:01 Uhr)
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#8

AW: überfordert ~.~

  Alt 9. Apr 2013, 13:07
@Perlsau, @Delphi-Laie

Sorry für das OT, aber ich möchte euch beide mal daran erinnern, dass auch ihr mal Anfänger wart und viele Dinge,
die für uns "alte Hasen" absolut selbstverständlich sind, für Neulinge eben nicht so selbstverständlich rüber kommen.
Ihr habt beide manchmal eine sehr harsche und direkte Schreibweise, die viele mit Sicherheit auch abschrecken wird.
Ob gerechtfertigt oder nicht, lass ich einfach mal im Raum stehen.
Ich motze aber niemanden voll (was allerdings nicht implizit bedeutet, daß ich es Perlsau in dieser Diskussion unterstelle). Ich weiß, daß aller Anfang schwer ist und bin immer noch nur mittelleicht fortgeschrittener.

Und eines wirst Du bei mir nirgendwo finden: Daß ich mein Selbstwertgefühl daran aufpoliere, daß ich vermeintliche oder tatsächliche (in jedem Falle aber unbewiesene) "Crossposter" jage und erlege.

An Sergejs Reaktion ist ja wohl abzulesen, daß ich mich eher gemäßigt ausdrückte (und es zudem auch so meinte)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: überfordert ~.~

  Alt 9. Apr 2013, 13:39
Manno Mann,
Jetzt ist aber langsam gut!
Ein bischen krabitzig ist ja gut aber so helfen wir sergej nicht unbedingt weiter.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.610 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: überfordert ~.~

  Alt 9. Apr 2013, 15:07
Hallo Sergej,
bin auch gerade mal über dein Programm drübergeflogen. Mir sind einige Dinge aufgefallen, die auch die Stabilität des Programms in Frage stellen könnten. Du benutzt z.B. als Name deines TPageControl das Wort "register". Register ist allerdings in Delphi ein reservierter Begriff und im falschen Kontext durchaus auch falsch zu verstehen.
Des Weiteren schließe ich, bevor ich einer Query einen neuen SQL.Text zuweise, immer zuerst die Query, weiße dann den String zu und öffne sie dann erst wieder.

Das hier:
Delphi-Quellcode:
For zeile := 1 to 20 DO //Zeilen im DBGrid hochzaehlen
      begin
       with DBGrid1.DataSource.DataSet do
         begin
          RecNo := Zeile;
          s:= Fields[spalte-1].AsString;
         end;
         b:=strtoint(s);
      end;
solltest du vielleicht in eine
Delphi-Quellcode:
while NOT ADOQuery_Buchen2.EOF do begin
...
  ADOQuery_Buchen2.Next;
end;
Schleife verpacken. Somit kannst du sicher sein, dass immer alle Datensätze ausgelesen werden. Sollten mal weniger DS in der DB vorhanden sein, wird dir dein Programm einen Fehler melden. Sind mehr drin, werden diese nicht ausgelesen.

Die Daten solltest du wie auch schon von "nahpets" beschrieben, direkt vergleichen und nicht erst in einen String umwandeln. Des Weiteren übergibst du bei deinem SQL-Statement die Daten in Form eines Strings. In der DB ist das Feld aber als DateTime Feld angelegt. Warum sind die "#"-Zeichen vor und hinter dem jeweiligen Datum angebracht? Sollten das Hochkommata " ' " sein? Wenn ja, schau dir bitte mal die Funktion QuotedStr() an. Die erledigt genau das. Wobei das in diesem Fall nicht benutzt werden soll. DateTime Werte können direkt an eine DB per SQL-Statement übergeben werden.

Zu deinem Problem mit dem Einfügen in die Datenbank beim Klick auf "Buchen".
Ein Hinweis noch wenn ihr mir den erlauben darf. Lagere doch Speicherprozeduren aus und durchlaufe nicht alles im OnButtonClick Event. Das kann dir auch beim Finden deiner Fehler helfen.

Das Hinzufügen der Werte in die DB musst zu nicht zwingend über das "INSERT INTO" Statement machen. Du kannst über deine ADOQuery_Buchen auch in etwa so etwas machen:

Delphi-Quellcode:
with ADOQuery_Buchen do begin
  Append;
  FieldByName('Pass_Nr').AsInteger := NaechtePassNr;
  FieldByName('Zimmer_Nr').AsInteger := ZimmerNr;
  ...
  Post;
end;
Alternativ zu FieldByName() kannst du auch Fields[I] benutzen. Bei C ist Fields[I] zumindest als schneller angegeben. Wie es bei Delphi aussieht weiß ich nicht genau.
Wenn du das Eintragen in die DB per "INSERT INTO" machen willst, dann sag nochmal bescheid. Dann müssen wir uns dein SQL-Statement mal genauer ansehen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      

 

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 21: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