Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Arbeitszeitaufzeichnung - Ideen sind gefragt! (https://www.delphipraxis.net/1141-arbeitszeitaufzeichnung-ideen-sind-gefragt.html)

m-werk 23. Okt 2002 14:09


Arbeitszeitaufzeichnung - Ideen sind gefragt!
 
Hallo Leute, hat jemand einige Ideen, für folgende Sache?

Ich möchte eine Arbeitszeitaufzeichnung erstellen.

Es soll eine Eingabemaske geben wo man folgende Daten eingeben muß: Name, Arbeitsstunden pro Tag, Personalnummer, Eintrittsdatum ins Unternehmen, und gegebenfalls alle Feiertage, die es im Jahr gibt mit Datum.

So, und bei einer anderen Seite (Hauptseite) soll mann dann die Uhrzeit eingeben (Jeden Tag), Wann habe ich zu Arbeiten begonnen, Wann habe ich aufgehört, wielange war ich Mittagspause. Und es soll dann noch eine ComboBox bei jedem Tag dabei sein, wo ich z.B. Daten auswählen kann wie z.B. Urlaub, Krankenstand, Zeitausgleich usw.

Ich hab aber noch keine Idee, wie die Maske aussehen könnte, und wie ich die Daten speichern könnte, damit diese immer drinn stehen?

Hat da jemand eine Idee?

sakura 23. Okt 2002 14:34

Über das Design der Maske habe ich mir jetzt keine Gedanken gemacht :D

Aber, Du solltest nicht eintragen, der Arbeiter X hat am von ... bis ... gearbeitet und von ... bis ... Mittgaspause gemacht.

Lieber sollte sich der Arbeiter X dann zwei Mal eintragen mit, ich habe von ... bis ... gearbeitet. Ansonsten hast Du ein Problem, wenn er mal zwei oder gar drei größere Pausen macht, oder gar keine. Zusätzlich wird die Ermittlung der Gesamtarbeitszeit erleichtert - letztenendes auch das Design der Eingabemaske...

m-werk 23. Okt 2002 14:56

Hi, ich hab mich bei der Beschreibung ein wenig vertan. Der Angestellte soll eintragen wann er zu Arbeiten beginnt, wann er aufhört und vieviele Minuten er Mittagspause gemacht hat.

Da ich es für meine Firma erstelle, sind nicht mehr Daten notwendig. Zur Zeit haben wir alles in Excel. Jeder Angestellte hat eine Excel-Datei, wo er diese Werte einträgt. (Lokal auf jedem PC.) Es soll auch Lokal bei jedem bleiben, nur das mit Excel möchte ich weghaben, deshalb auch meine Idee ein eigenes Programm zu schreiben.

MrSpock 23. Okt 2002 18:39

Hallo m-werk,

das könntest du mit Paradox machen. Es handelt sich ja hier um Personendaten und beliebig viele Einträge pro Person. Eine typisches 1:n Relation für eine relationale Datenbank. Über SQL kannst du dann auch recht einfach Auswertungen über die Daten machen. In den Masken benutzt du datensensitive Editfelder. Kommt dieser Ansatz für dich in Frage? Gibt es dort auch ein Netzwerk, so dass jeder seine Daten in dieselbe Datenbank schreiben kann?

m-werk 24. Okt 2002 07:29

Hi, das heißt, dass paradox vollkommen ausreicht? Naja, dann werd ich es so machen.

Es existiert bei uns schon ein Netzwerk, aber damit kenn ich mich überhautpt nicht aus. Was ich so im Forum mitbekommen habe, ist das gar nicht so einfach über ein Netzwerk zu fahren.

Anundfürsich wäre es aber sicherlich einfacher über ein Netzwerk zu fahren. Ich muß dann nur noch Benutzernamen und Usernamen eingeben, damit jeder seine eigenen Daten hat. HAB ABER KEINE AHNUNG, WIE ICH DAS MACHEN KÖNNTE.

MrSpock 24. Okt 2002 11:40

Hallo m-werk,

wenn du ein Netzwerk hast, ist es einfach, die Datenbank auf irgendeinen Pfad zu legen, auf dem jeder Schreibrechte hat. Der Alias wird dann auf den Netzwerkpfad umgeleitet.

m-werk 24. Okt 2002 11:57

ja, das ist mir schon klar, aber wie soll ich nun die DB aufbauen damit jeder seine persönliche Arbeitszeit angezeigt bekommt? Er muß sich ja anmelden mit Benutzername und PW im Programm

MrSpock 24. Okt 2002 20:15

Hallo m-werk,

die Struktur der Tabellen hast du ja eigentlich schon selbst vorgegeben:

1. Tabelle Personen
Personalnummer A 10 * (Schlüssel)
Name A 30
StdProTag N
Eintrittsdatum D

2. Tabelle Arbeitszeit
Jahr S
Tag S
Start T
Ende T
Pause S

3. Tabelle Passwoerter
Personalnummer A 10*
Passwort A 20

Hier hast du die Möglichkeit, die Tabelle mit einem Paßwort zu sichern, dann werden die Einträge verschlüsselt, oder die Einträge selbst zu verschlüsseln.

4. Tabelle Feiertage
Jahr S
Bezeichnung A 20
DasDatum D

Hier kannst du eventuell noch ein Feld hinzufügen, das anzeigt, ob es ein bundesweiter Feiertag ist.

Soweit klar?

m-werk 24. Okt 2002 21:02

Hi, Danke ersteinmal, ich habe die Tabellen jetzt einmal erstellt.

Warum ist bei den Tabellen Arbeitszeit und Feiertage eigentlich kein KEY gesetzt? Brauche ich den dort nicht?
Ich habe weiters beim Speichern die möglichkeit einen ALIAS anzuwählen. Welchen soll ich denn verwenden? (Hab die DB mit Paradox 7 gemacht)

Da ich zum 1. Mal mit Paradox arbeite, würde ich es toll finden, wenn du mich unterstützt.

MrSpock 24. Okt 2002 21:35

Hallo m-werk,

da hast du gleich einen guten Punkt gefunden. Bei der Tabelle Arbeitszeit fehlt aus Versehen das wichtigste Feld ist natürlich noch die Personalnummer. Das sollte gleich das erste Feld sein. Ein Schlüssel (primary key) muss eindeutig sein. In der Tabelle Arbeitszeit soll aber für jede Person, für jedes Jahr mehrer Einträge gemacht werden. Du müsstest also einen zusammengestzten Schlüssel verwenden. Jeder Benutzer soll später nur seine Daten sehen können. Dazu werden wir dann eine SQL Anweisung verwenden.

Die Feiertage brauchen auch keinen Schlüssel. Hier gibt es nur wenige Datensätze und Schlüssel bringen hier keine großen Vorteile.

Den Alias kannst du schon definieren und diesen auf das Verzeichnis setzen, in dem die Tabellen stehen.

Die Passwort Tabelle sollte wie gesagt selbst mit einem Passwort geschützt werden. Hier solltest du persönlich die späteren Nutzer eintragen und ihnen ein Startpaßwort zuordnen.

Morgen geht's weiter...

MrSpock 24. Okt 2002 21:41

Übrigens: Sollten die Personaldaten oder die Arbeitszeiten kritisch sein, solltest du auch hier Paßwörter anlegen! Sonst könnte ein Nutzer die Daten sehr leicht darauf zugreifen. Sicherheit ist natürlich ein wichtiges Thema. Paradox kann hier wohl nicht mit SQL Datenbanken mithalten. Aber so einfach knackt man Paradox Tabellen nicht :mrgreen: .

[Edit=MrSpock]Beitrag verschoben ...[/Edit]

m-werk 25. Okt 2002 07:10

Danke für die Infos. Ich werd nur die Tabelle Passwörter schützen. Gibts da nen punkt im DBExplorer? Die anderen Tabellen sind nicht kritisch.
Das mit dem alias ist so eine sache, da ich die Abeitszeit nicht in der Firma wo ich jetzt arbeite programmiere, sondern wo anders. Dort existiert zwar auch ein Netzwerk aber nicht so eines wie in meiner Firma. Kanns da probleme geben?

Ich muß jetzt aber noch 3 Felder in der Personaltabelle eingeben.

1. Ueberstunden
2. Reststunden
3. Resturlaub

Ich muß ja den Resturlaub (entweder + oder -) eintragen, da ja das Programm von Jänner an starten soll.
Und das Gleiche ist bei den Reststunden.

Das Feld Überstunden brauche ich ja auch noch.
Das werd ich heute am frühen abend mal alles so machen.
Dann kanns ja schon an die Form ran gehen.

PS: Wenn du wilst, kann ich dir ja mal unsere Excel-Arbeitszeit schicken, damit du siehst, wie ich es im Excel gemacht habe.

MrSpock 25. Okt 2002 07:19

Hallo m-werk,

diese drei Felder würde ich nicht in die Personaltabelle schreiben, weil sie sich ja ständig ändern. Lieber eine neue Tabelle mit Personalnummer als Schlüssel. Das Passwort legst du am besten gleich mit der Datenbankoberfläche an. Falls die Tabelle schon existiert wählst du Tools|Umstrukturieren und dann in den Tabelleneigenschaften Passwortschutz.

Ich meld mich wieder...

m-werk 25. Okt 2002 17:31

Hi, ich habe jetzt eine Weitere Tabelle erstellt "Zusatz"
mit folgenden Feldern

Personalnummer A 10 *
Ueberstunden S
Reststunden S
Resturlaub ?

Bei Resturlaub weiß ich nicht, was ich da verwenden kann. Ich hab einmal A 2 eingegeben.

Die Tabelle Passwort habe ich auch schon mit einem Code geschützt.

Meiner Meinung nach sind wir mit der Tabelle nun fertig. Jetzt gehts sicherlich ans Formen ODER?
Erstelle ich eigentlich jetzt erst im Form die 1:n Beziehung?

MrSpock 25. Okt 2002 21:53

Hallo m-werk,

ich gehe davon aus, dass du den Resturlaub in Tagen angeben willst, dann wäre S auch OK.

Ich würde vielleicht mit einem Login - Fenster anfangen. Die Idee dahinter: Jeder muss sich anmelden. Das Formular enthält den Login Namen und das Passwort. Willst du einen Login Namen zulassen, der nicht genau dem Namen entspricht, soltest du die Passworttabelle um ein Feld LoginName erweitern. Außerdem würde ich noch ein Feld "Fehlversuche S" hinzufügen. Wenn einer z.B. 3 Fehlversuche beim einloggen hat, wird sein Account gesperrt, bis du ihn wieder freischaltest. Das Login Formular solltest du einblenden, noch bevor das Hauptfenster erscheint. Das Hauptfenster sollte nur erscheinen, wenn das Passwort stimmt.

Ob du im Login Fenster alle Namen anzeigst, für die ein Login existiert (wie z.B. Linux) oder in einer Dropdownliste oder eben gar nicht, solltest du selbst entscheiden.

Wenn du das Formular fertig hast, solltest du direkt inn den Quelltext des Programms (Projekt|Quelltext anzeigen...) eingreifen und dort dein Login - Formular erstellen, anzeigen und entscheiden, ob du das Hauptformular erstellen lässt oder nicht.

m-werk 30. Okt 2002 08:27

Hi, so ich habe nun ein Loginfenster erstellt.
Das mit den 3 Versuchen, brauch ich hier nicht. Es soll so einfach wie möglich sein.
Sollte jemand sein PW vergessen, so werd ich sowieso kontaktiert. Weiters kann mann sein PW gar nicht vergessen, da ja jede Person jeden Tag in dieses Formular einsteigen muss.

Ich habe jetzt ein Edit feld, OK-button und Abbrechen-Button im Programm
Im Abbrechen Button habe ich jetzt "Applicatin.Terminate" stehen.

Theoretisch muß ich jetzt ja in der PW-Datenbank die Passwörter anlegen.
Dannach muß ich nun das andere Formular erstellen, wo ich dann die Arbeitszeit eintrage. ODER?

Im Formular, wo ich die AZ eintrage, gebe ich dann die anderen Buttons hinein, Mitarbeiterdaten usw.

Wie greife ich denn eigentlich auf die DB zu? Das was ich so gesehen habe, müsste ich aliase für die DB angeben. Oder gibts da nen anderen Weg?

MrSpock 30. Okt 2002 09:11

Hallo m-werk,

auf die Fragen werde ich heute Abend eingehen. Nur ein kurzer Kommentar. Das mit den 3 Versuchen beim Login, war nur dazu gedacht, dass ein Mitarbeiter nicht versucht, sich als anderer Mitarbeiter einzuloggen und dessen Passwort hackt. Er hätte, in dem Konzept, das ich mir vorstelle, nach Eingabe des korrekten Passwortes, Zugriff auf die bisher eingegebenen Daten des Mitarbeiters, als der er/sie sich eingeloggt hat.

m-werk 30. Okt 2002 12:09

Mit der einsicht ist es nicht so bei uns. Es kann zur Zeit auch jeder in das Arbeitsverzeichnis des anderen zugreifen. Geändert wird da auch nichts. Es ist nur eine Übersicht für den Steuerberater (Dabei geht es hauptsächlich um die Urlaubs- und Krankheitstage, da unser Steuerber. dies auch verwaltet.) Wir müssen jedes Monat einen Ausdruck zu Ihm schicken.

Daher wird das mit dem 3. Versuch nicht in diesem Programm benötigt. Sollte es dennoch benötigt werden, dann kann ich das auch später nachholen.

m-werk 7. Nov 2002 08:40

MrSpock, hättest du zeit und lust mir jetzt wieder weiterzuhelfen? Ich habe jetzt längere Zeit nichts weitergemacht (Zeitmangel) Ich habe nun ein Login erstellt.
Jetzt müsste ich die überprüfung machen, wenn das Login OK, dann soll das Hauptmenü gestartet werden mit der richtigen Person.
(NUR WIE?)

Weiters: Muß ich jetzt schon mal in die Passwort - DB die Personen mit den Passwörtern eingeben?

MrSpock 7. Nov 2002 10:51

Hallo m-werk,

zum Testen solltest du mindestens einen Eintrag in die Personentabelle und einen passenden Eintrag in die Passwoerter Tabelle schreiben.

Du solltest das Login Formular von der automatischen Erstellung ausnehmen (Projekt|Optionen...).

Im Projektquelltext solltest du dann so was ähnliches wie das hier machen:

Delphi-Quellcode:
  Application.Initialize;
  frmLogin := TfrmLogin.Create(Application);
  if (frmLogin.ShowModal = 1) and frmLogin.PasswortOK then
  begin
     Application.CreateForm(TForm1, Form1);
     Application.Run;
  end
  else
     Application.Terminate;
Das Programm startet damit nur, wenn der Benutzer OK im Login angeklickt hat und das Passwort stimmt.

Im Passwortdialog muss das natürlich überprüft werden. Das könnte z.B. so funktionieren:

Delphi-Quellcode:
procedure TfrmLogin.BitBtn1Click(Sender: TObject);
begin
   if Trim(ePasswort.Text) = '' then
   begin
      MessageDlg('Bitte gültiges Passwort eingeben.', mtInformation,
                 [mbOK], 0);
      ActiveControl := ePasswort;
      ModalResult := mrNone;
      EXIT
   end;
   PasswortOK := False;
   qryCheck.Close;
   if Trim(cbUser.Text) <> '' then
   begin
      qryCheck.ParamByName('name').AsString := cbUser.Text;
      try
         qryCheck.Open;
         if UpperCase(Trim(qryCheckPasswort.Value)) =
            UpperCase(Trim(ePasswort.Text)) then
            PasswortOK := True
         else begin
            PasswortOK := False;
            MessageDlg('Passwort stimmt nicht.', mtError, [mbOK], 0);
            ModalResult := mrNone;
         end;
      except
         on exception do
         begin
             MessageDlg('User nicht gefunden.', mtError, [mbOK], 0);
            PasswortOK := False;
         end
      end
   end
   else begin
      MessageDlg('Bitte gültigen User auswählen.', mtError, [mbOK], 0);
      PasswortOK := False;
   end;
   qryCheck.Close;
end;
Dabei hätte das Loginformular eine ComboBox mit den verfügbaren Usern und eine Query zum Überprüfen des Passwortes, die wie folgt aussehen würde:

Code:
SELECT Passwort FROM passwoerter W
    WHERE W.personalnummer =
       (SELECT personalnummer, name FROM personen
          WHERE name = :name)
So weit alles klar?

Ach ja, die ComboBox könntest du füllen über:

Delphi-Quellcode:
procedure TfrmLogin.FormActivate(Sender: TObject);
begin
   qryUser.Close;
    qryUser.Open;
   cbUser.Clear;
   if qryUser.RecordCount = 0 then
      cbUser.Items.Add('Kein User definiert.')
   else begin
      cbUser.Items.Add('Bitte User auswählen.');
      while not qryUser.EOF do
      begin
         cbUser.Items.Add(qryUserName.Value);
         qryUser.Next
      end
   end;
   cbUser.ItemIndex := 0;
end;
wobei die qryUser wie folgt definiert sein könnte:

Code:
SELECT Name FROM Personen P, Passwoerter W WHERE
   P.Personalnummer=W.Personalnummer
:mrgreen:

MrSpock 7. Nov 2002 11:08

Hallo m-werk,

ein wichtiger Tip noch:

Dem Eingabefeld im Passwortdialog (oben im Code ePasswort) sollte im Objektinspektor ein PasswordChar (meist *) zugwiesen werden.

m-werk 9. Nov 2002 08:16

Hi, so nun steh ich ein bischen an.

Das mit dem 1. Code, habe ich erledigt.

beim 2. Code:
PasswortOK (erscheint auch beim 1. code), Welche zuordnung hat dieser?

In der Automatischen Erzeugung der Formulare habe ich jetzt nichts mehr drinn.

Ich habe beim Login Formular eine DBComboBox eingebaut. Ist das richtig so?

Ich habe die BDE Querys genommen und auch so beannt, wie du geschrieben hast. Ich habe auch bei den beiden Querys den SQL-Code eingetragen. Die beiden Querys habe ich auf das Loginformular plaziert.
Beim qryUser bin ich auf 'Alle Felder hinzufügen' gegangen und da habe ich 'Name' hinzugefügt.
Beim qryCheck wollte ich es auch so machen und da kam die Felher-Meldung:
qryCheck:Typ für Feld 'Name' unbekannt
Da muß was in der SQL-Anweisung was falsch sein, nur was?

Muß ich nicht die DBComboBox mit der Personen-DB verknüpfen? Wenn ja, wie?

Noch was habe ich bemerkt. Muss ich nicht in der Datenbank 'Arbeitszeit' auch den 'Monat' einfügen?
(FieldName: Monat, Type: S)?

Es tud mir leid, dass ich so viele Fragen stelle, aber ich möchte ja auch was lernen dabei, und so kann ich es dann.

MrSpock 9. Nov 2002 18:15

Hallo m-werk,

PasswortOK habe ich als Boolean im PUBLIC Bereich von frmLogin deklariert, damit andere Formulare darauf zugreifen können.

Das Login Formular soll das "2. Formular" sein. Das Hauptformular soll weiterhin in der automatischen Reihenfolge bleiben! Durch den Eingriff in den Projektquellcode haben wir aber verhindert, dass es tatsächlich erzeugt wird, solange der Benutzer kein korrektes Passwort eingibt.

Im Login Formular habe ich nur eine normale ComboBox (also keine datensensitive cbBox) benutzt. Die Daten für die Füllung hole ich über die entsprechende TQuery Komponente. Ich wollte nicht, dass das Programm an dieser Stelle direkt mit Daten aus der Datenbank verknüpft wird.

Bei qryCheck kannst du nach Eingabe des SQL Testes das Array Params über den Objektinspektor zugreifen. Dort steht (wie von Geisterhand :witch:) der Parameter Name drin. Weise diesem den Typ String zu.

Ich habe nicht mit Monat gearbeitet, das wird komplizierter. Die Woche genügt ja, da jede Kalenderwoche eindeutig ist und du jedes Datum innerhalb der Kalenderwoche darstellen kannst.

Viele Fragen sind übrigens kein Problem, denn dafür sind wir ja da :mrgreen:. Was sollte ich sonst mit der vielen Freizeit machen :lol: ?

m-werk 10. Nov 2002 16:49

Danke erstmals für die freundliche unterstützung.

Zitat:

Bei qryCheck kannst du nach Eingabe des SQL Testes das Array Params über den Objektinspektor zugreifen. Dort steht (wie von Geisterhand ) der Parameter Name drin. Weise diesem den Typ String zu.
Ich kapier das nicht so ganz. Was meinst du damit genau. Wie gehe ich vor?

m-werk 13. Nov 2002 18:19

Hi, so nun hab ich ein bischen herumgedüftelt.

Ich habe bei qryCheck bei Params den Namen angeklickt und unter dem Punkt DataType 'ftString' ausgewählt. Ist das richtig so?

Weiters: Wenn ich jetzt das Login (Programm) starte, kommt beim Start eine Passwortaufforderung (Da muß ich nun das Passwort für die Passwort-Datenbank eingeben)
Wenn ich dann das Passwort eingegeben habe, kommt folgende Meldung:
Name not unique in this context.

Dann bin ich beim Login Formular und kann aber keinen Benutzer auswählen. (Es steht in der Combobox nichts drin)

Was ist da nur los?

Wenn das dann alles klappt, könnten wir ja schon zur eigentlichen Hauptform überspringen und diese dann gestallten.

MrSpock 13. Nov 2002 20:53

Hallo m-werk,

ja, der Eintrag ftString als Typ des Parameters ist korrekt.

Nun zu der Passworteingabe für die Datenbank. Die musst du natürlich über das Programm eingeben, sonst müsstest du ja jedem Mitarbeiter das Paßwort nennen, damit er sich anmelden kann. Das Passwort fügst du vor dem Zugriff auf die Passwoerter Tabelle wie folgt der Session hinzu:

Code:
  Session.AddPassword('mwerk');
  {Jetzt kannst du auf die Tabelle zugreifen }
mwerk wäre natürlich ein schlechtest Paßwort :shock: .

Wenn du auf die Tabelle zugegriffen hast, solltest du das Paßwort wieder aus der Session entfernen, z.B. mit:

Code:
Session.RemoveAllPasswords;
Übrigens, wenn du das Passwort wie oben beschrieben hinzufügst, könnte ein Hacker den String 'mwerk' eventuell in deinem Executable finden und so das Passwort herausbekommen. Es wäre deshalb eventuell sinnvoll, den String irgendwie zusammenzubauen, falls du Hacker fürchten musst.

Die Fehlermeldung Name not unique könnte verschiedene Ursachen haben. Prüfe einmal, ob in der Personen und Passwoerter Tabelle alle Namen eindeutig sind und nicht z.B. ein Leereintrag existiert. Ansonsten lauf mal im Einzelschritt durch die Anwendung, um festzustellen, wo der Fehler erzeugt wird.

Wenn das alles funktioniert kann es ans Hauptformular gehen. :mrgreen:

m-werk 14. Nov 2002 18:49

Hi, das mit der Session kapier ich nicht ganz

Zitat:


Session.AddPassword('mwerk');
{Jetzt kannst du auf die Tabelle zugreifen }

Session.RemoveAllPasswords;
Wo muß ich denn diese Session eintragen?

Ich habe die Passwoerter-DB und die Personen DB überprüft. Ich hab keinen leeren Datensatz.

MrSpock 14. Nov 2002 19:09

Hallo m-werk,

immer wenn du auf die Passwoerter Tabelle zugreifen willst, also hier:

Delphi-Quellcode:
procedure TfrmLogin.FormActivate(Sender: TObject);
begin
   Session.AddPassword('mwerk');
   qryUser.Close;
   qryUser.Open;
   cbUser.Clear;
   if qryUser.RecordCount = 0 then
      cbUser.Items.Add('Kein User definiert.')
   else begin
      cbUser.Items.Add('Bitte User auswählen.');
      while not qryUser.EOF do
      begin
         cbUser.Items.Add(qryUserName.Value);
         qryUser.Next
      end
   end;
   cbUser.ItemIndex := 0;
   Session.RemoveAllPasswords;
end;
und natürlich hier:
Delphi-Quellcode:
procedure TfrmLogin.BitBtn1Click(Sender: TObject);
begin
   if Trim(ePasswort.Text) = '' then
   begin
      MessageDlg('Bitte gültiges Passwort eingeben.', mtInformation,
                 [mbOK], 0);
      ActiveControl := ePasswort;
      ModalResult := mrNone;
      EXIT
   end;
   PasswortOK := False;
   qryCheck.Close;
   if Trim(cbUser.Text) <> '' then
   begin
      qryCheck.ParamByName('name').AsString := cbUser.Text;
      try
         Session.AddPassword('mwerk');
         qryCheck.Open;
         if UpperCase(Trim(qryCheckPasswort.Value)) =
            UpperCase(Trim(ePasswort.Text)) then
            PasswortOK := True
         else begin
            PasswortOK := False;
            MessageDlg('Passwort stimmt nicht.', mtError, [mbOK], 0);
            ModalResult := mrNone;
         end;
         Session.RemoveAllPasswords;
      except
         on exception do
         begin
             MessageDlg('User nicht gefunden.', mtError, [mbOK], 0);
            PasswortOK := False;
         end
      end
   end
   else begin
      MessageDlg('Bitte gültigen User auswählen.', mtError, [mbOK], 0);
      PasswortOK := False;
   end;
   qryCheck.Close;
end;
Zu dem unique Name Problem müsstest du mal im Einzelschrittverfahren die Stelle lokalisieren, an der dieser Fehler auftritt.

m-werk 15. Nov 2002 12:03

Hi, jetzt funktioniert das login. Ich habe einfach den Code nochmal übernommen. (Beim code war aber nichts falsch. Es ist wahrscheinlich beim Passwort der DB gehängt.)

Jetzt kann es ans Hauptformular gehen.
Wie gehe ich jetzt vor?

Ich habe schon ein Hauptformular erstellt. (Ist aber noch nichts drinn).
Dieses trägt den Namen 'ArbeitszeitForm'

Wenn ich auf LOGIN klicke, dann soll sich ja diese Hauptform öffnen. Das muss ja auch noch eingebaut werden (Loginform).

MrSpock 15. Nov 2002 12:22

Hallo m-werk,

dass das Hauptformular geöffnet wird, wenn der Login korrekt abgelaufen ist, haben wir ja schon durch den Zugriff auf den Projektquelltext erledigt:

Delphi-Quellcode:
  Application.Initialize;
  frmLogin := TfrmLogin.Create(Application);
  if (frmLogin.ShowModal = 1) and frmLogin.PasswortOK then
  begin
     Application.CreateForm([b]TArbeitszeitForm, ArbeitszeitForm[/b]);
     Application.Run;
  end
  else
     Application.Terminate;
Dabei sollte das CreateForm automatisch erscheinen, wenn du ArbeitsForm als Hauptformular auswählst. Nur den Rest solltest du drumherumstricken.

Dann sollte das Formular sich nach erfolgreichem Einloggen öffnen.
Zum Inhalt werde ich dir heute Abend ein paar Tips geben.

MrSpock 17. Nov 2002 16:22

Hallo m-werk,

da die Arbeitszeittabelle ja auch auf der Personalnummer basiert, würde ich noch zwei Änderungen im bisherigen Programm machen:

Delphi-Quellcode:
if UpperCase(Trim(qryCheckPasswort.Value)) =
            UpperCase(Trim(ePasswort.Text)) then
         begin
            PasswortOK := True;
            PNr := qryCheckpersonalnummer.Value;
         end
An der Stelle, an der das Passwort überprüft wird, solltest du die gleich die Personalnummer in der Variablen PNr merken, die im pulic Bereich des Formulars deklariert werden muss, damit das Hauptformular später darauf zugreifen kann. Damit die Personalnummer in der qryCheck - Datenmenge erscheint, muss der SQL Text wie folgt aussehen:

Code:
SELECT Passwort,personalnummer FROM passwoerter W
    WHERE W.personalnummer =
       (SELECT personalnummer, name FROM personen
          WHERE name = :name)
Außerdem musst du noch das neue Feld "Personalnummer" über den Feldeditor deiner Anwendung hinzufügen.

Jetzt kannst du dir überlegen, wie du die Eingabe auf dem Hauptformular realisierst. Bei speziellen Fragen helfe ich gerne weiter.

m-werk 17. Nov 2002 18:48

Hi, ich hab deinen rat befolgt und nun ein Problem.

Ich habe PNr im Public berech in der Loginform als Boolean deklariert:
Ist das richtig so?

Weiters habe ich auch die SQL-Anweisung in qryCheck geändert.

Aber bei folgenden Code, den ich auch so eingebaut habe kommt eine Fehlermeldung:

Code:
PNr := qryCheckPersonalnummer.Value;
[Fehler] Login.pas(67): Undefinierter Bezeichner: 'qryCheckPersonalnummer'

Was ist da nur falsch? ich habe doch alles befolgt!!

Weiters: Ich habe den Quelltext mir noch mal angesehen. Der ist so richtig, wie du mir auch beschrieben hast, aber wenn ich das Passwort richtig eingebe, dann öffnet sich aber das ArbeitszeitForm NICHT!

MrSpock 17. Nov 2002 19:31

Hallo m-werk,

Zitat:

Außerdem musst du noch das neue Feld "Personalnummer" über den Feldeditor deiner Anwendung hinzufügen.
Diesen Schritt hast du noch nicht ausgeführt. (Doppelklick auf die qryCheck Komponente und alle Felder hinzufügen.)

Poste doch bitte mal den Quelltext des Projektes. Wenn du meinen Code übernimmst (und den korrekten Namen des Hauptfensters überprüft hast), funktioniert es. Beachte bitte, dass das Passwort Groß-/Kleinschreibung unterscheidet!

m-werk 17. Nov 2002 19:41

Hi, das hab ich totall übersehen mit dem Alle Felder hinzufügen.
Das funktioniert jetzt. Ich habe PNr im Public-Teil als String deklariert.

So sieht der Quelltext aus:

Code:
program Arbeitszeitermittlung;

uses
  Forms,
  Login in 'Login.pas' {FrmLogin},
  Arbeitszeit in 'Arbeitszeit.pas' {ArbeitszeitForm};

{$R *.res}

begin
  Application.Initialize;
  frmLogin := TfrmLogin.Create(Application);
  if (frmLogin.ShowModal = 1) and frmLogin.PasswortOK then
  begin
     Application.CreateForm(TArbeitszeitForm, ArbeitszeitForm);
     Application.Run;
  end
  else
     Application.Terminate;
end.
Das ArbeitszeitForm öffnet sich noch immer nicht!

MrSpock 17. Nov 2002 21:12

Hallo m-werk,

es könnte noch an dem ModalResult des Schalters liegen, den der Benutzer im Login-Fenster Drucken kann. Dieser sollte mrOK sein (was der 1 entspricht). Öffne noch einmal frmLogin und stelle den ModalResult des "OK" Schalters auf 1 bzw. mrOK. Sollte das dann auch noch nicht klappen, teste das Programm mal im Einzelschrittmodus.

m-werk 18. Nov 2002 19:53

Hi, das mit mrOK hat funktioniert.

So, es war nun eine mühselige procedure aber nun gehts zur Hauptform.

Ich habe jetzt in der Hauptform eine BDE-Tabelle, DataSource und ein DBText eingefügt.

In der Tabelle habe ich jetzt die DB Personen ausgewählt und Alle Felder hinzugefügt. Weiters habe ich dann die DataSource mit der Tabelle verknüpft und den DBText mit der DataSource und dem Feldnamen verknüpft.

Was muß ich jetzt noch tun, damit mir auch der richtige Wert nach dem Login angezeigt bekomme. Ich bekomme nach dem Login, (egal womit ich mich anmelde) immer nur den ersten Datenbankwert ausgeliefert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:03 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