# Datensätze vergleichen



## Dein Pseudonym (15. März 2010)

Hallo

ich habe eine kleine datenbank programiert mit benutzeranmeldung und ich hab volgendes problem....
 ich will das meine datenbank je nach angemeldeten benutzer die zum benutzer dazugehörigen datensätze ausspuckt
in einer abfrage habe ich die zu suchende variable hinterlegt und in der anderen soll er sie suchen und alle dazugehörigen variablen dazu ausspucken
wie stell ich das am besten an, habe schon einige dinge ausprobiert aber nichts davon funktioniert wie es soll^^

mfg
Dein Pseudonym


----------



## HonniCilest (15. März 2010)

Wo speicherst du die Daten? Ich würde dir XML empfehlen, die könnte in etwa so aussehen:


```
<user name="user01" kennwort=***Schlüssel***>
    <vorname>Muster</vorname>
    <nachname>Frau</nachname>
    ...
</user>
<use name="user02" kennwort=***Schlüssel***>
    <vorname>Muster</vorname>
    <nachname>Mann</nachname>
    ...
</user>
```

Durch diesen "Baum" gehst du dann die Vaterknoten durch und wenn das Attribut "name" mit deinem Benutzernamen udn das Attribut "kennwort" mit dem eingegebenen Kennwort übereinstimmen, so kannst du die Kinderknoten durchlaufen und die Daten holen.

Oder du benutzt bereits hier eine vorgefertigte Datenbank und wendest Selektionen etc. an.


----------



## Yaslaw (15. März 2010)

XML ist nicht die Lösung wenn er mit einer Datenbank arbeitet.

@Dein Pseudonym
öhm, was für ein Name... nunja, ich antworte trotzdem mal.
Aus deiner Beschreibung sehen wir leider nicht was du wirklich schon hast.
Hast du eine eigene Anmeldung gemacht? 
Wenn ja, sind die User in einer Tabelle gespeichert?
Hast du die User in einer globalen Variable in VBA?
Wie sehen deine Tabellen aus? (ohne dises Info können wir dir mit SQL wirklich nicht helfen)


----------



## tombe (15. März 2010)

HonniCilest hat gesagt.:


> Wo speicherst du die Daten? Ich würde dir XML empfehlen, die könnte in etwa so aussehen:
> 
> 
> ```
> ...



Also das der Benutzer zusammen mit den Daten gespeichert werden muss ist klar. Sonst könnte ja nicht nach diesem gefiltert werden. Aber warum soll auch das Paswort dort gespeichert werden?
So wie ich es verstehe hat man ja eh nur dann Zugriff wenn man sich vorher erfolgreich an der Datenbank angemeldet hat.

Gruß Thomas


----------



## HonniCilest (15. März 2010)

Hmm ja, habs wohl ein wenig falsch verstanden ^^

Vorausgestezt ich habe nun richtig verstanden, was er will, dann hilft vermutlich folgender Link:
http://openbook.galileocomputing.de...23_006.htm#mjd946cabe2b84a19aa815b0b2c42ce9da


----------



## Dein Pseudonym (15. März 2010)

Ja eine Funktionierende anmeldung habe ich gebaut und die user sind auch in einer tabelle hinterlegt.
bei der anmeldung des users solte er sich diesen merken, ich habe versucht dies über die column funktion zu lösen weis aber nich obs hinhaut.

' User und Berechtigung merken
    NUser = NetzUser.Column(0)
    Berechtigung = NetzUser.Column(3)
    DsAenderbar = NetzUser.Column(4) 

zitat:
Wie sehen deine Tabellen aus? <------- wie sollen diese denn aussehen? ich würd sagen wie normale tabbellen die mit ein ander verknüpfelt sind ^^

ps: der nickname ist nur eintstanden weil ich einfach keine lust mir einen kreativen nicknamen auszudenken ^^


----------



## tombe (15. März 2010)

Also wenn der Benutzer in der Variable "NUser" nach der Anmeldung gespeichert wird und die Datensätze in einer Form angezeigt werden, dann kannst du dieseVariable ja als Filterkriterium verwenden.

P.S. Du schreibst etwas von einer Datenbank die du programmierst (?) und das im Office Bereich. Deshalb gehe ich jetzt mal von Access aus!!


----------



## Yaslaw (15. März 2010)

Um den Namen zu behalten musst du in entweder temporär in eine Tabelle, ein Forumsfeld das erhalten bleibt oder in VBA speichern.

kein Komentar zu deinen Tabellen. Es ist auch gar nicht wichtig ob du den User bei den Daten speicherst, das ganze Verknüpft ist oder sonstwas.

PS: Ich geh davon aus, das du MS Access meinst, nicht Excel.

Nun, aber da wir hier nicht wirklich konstruktiv vom Fleck kommen und ich keinen Bock habe alle Information die ich brauche um dir zu helfen mühsam dir aus der Nase zu ziehen und erklären muss warum, verabschiede ich mich aus diesem Thread.

Gruss
Yaslaw, mit 15 Jahren aktiver MS Access Definier- und Programmier-Erfahrung


----------



## Dein Pseudonym (16. März 2010)

aso, ja natürlich meine ich ms access. 

so viel ahnung von access hab ich nun auch nich, schulwissen eben... is die erste datenbank die ich komplett selber bastel.


----------



## Dein Pseudonym (16. März 2010)

so habe die die drei dinge nun in einer globalen variable deklariert....

Option Compare Database
Option Explicit

    Global Recht As String
    Global NUser As String
    Global DsAenderbar As String


wenn ich mich anmelde schließt er das anmeldefenster und öffnet automatisch ein neues formular, aber wenn ich mir den aktuell eingelogten benutzer  dann im nächsten formular anzeigen möchte erschein nichts....


----------



## tombe (16. März 2010)

Wie sieht denn das Formular bzw. die Abfrage des Benutzers aus?

Wenn du bei der Anmeldung den Benutzernamen in einer globalen Variablen speicherst, muss dieser Wert/diese Variable überall verfügbar sein. Du kannst ja mal diese Variable überwachen (Debuggen -> Überwachung hinzufügen). Dann siehst du wo sie einen Wert erhält und wo dieser eventuell überschrieben wird.

Gruß Thomas


----------



## Dein Pseudonym (16. März 2010)

das hier ist mein anmeldefenster....

Option Compare Database
Option Explicit

Private Sub Befehl62_Click()

Dim a As Integer

    a = MsgBox("Anmeldung Abbrechen?", 36)
    If a = 6 Then
        DoCmd.Close acForm, Me.Name
    End If

End Sub

Private Sub Befehl69_Click()

' Füllen der Felder überprüfen
    If IsNull(NetzUser) Then
        MsgBox "Bitte wählen Sie einen Mitarbeiter aus.", 64
        Passwort = Null
        NetzUser.SetFocus
        NetzUser.Dropdown
        GoTo ende
    End If
    If IsNull(Passwort) Then
        MsgBox "Bitte geben Sie das Passwort ein.", 64
        Passwort = Null
        Passwort.SetFocus
        GoTo ende
    End If

' Passwortkontrolle
    If Passwort <> NetzUser.Column(1) Then
        MsgBox "Das eingegebene Passwort ist falsch. Bitte wiederholen Sie Ihre Eingabe.", 16
        Passwort = Null
        Passwort.SetFocus
        GoTo ende
    End If

' User und Recht merken
    NUser = NetzUser.Column(0)
    Recht = NetzUser.Column(3)
    DsAenderbar = NetzUser.Column(4)



' Willkommen Dialog
    MsgBox "Anmeldung Erfolgreich"

' Hauptmenü öffnen
    DoCmd.OpenForm "frmGerät"

' Form schliessen
    DoCmd.Close acForm, Me.Name

ende:
End Sub

Private Sub Form_Current()

On Error GoTo fehler

' Datum im Formular anzeigen
    Caption = " " + Format(Now, "dddd dd. mmmm yyyy")

ende:
    Exit Sub

fehler:
    Resume ende

End Sub


----------



## tombe (16. März 2010)

Unformatierter Code zu lesen ist wirklich blöd ! ! ! !

Wo werden denn die Werte für z.B. NetzUser.Column(0) erstellt bzw. enthält es überhaupt einen Wert ?

Außerdem hast du so wie ich das sehe die Sprungmarke "ende" zum einem doppelt definiert und zum anderen ist sie doch unnötig. Schreibe doch einfach gleich "Exit Sub" da hin wo jetzt "GoTo ende" steht.


----------



## Dein Pseudonym (16. März 2010)

Sry wuste nich wie ich das sonst machen sollte....

also die variable NetzUser is ein komdinationsfeld mit 4 gebundenen spalten. und die daten kommen aus einer abfrage. laut überwachung is in NetzUser.Column(0) der user hinterlegt..


----------



## tombe (16. März 2010)

Und was sagt die Überwachung wenn du das andere Formular öffnest 
Oder gib einfach mal in dem Formular ein:


```
Caption = NUser
```


----------



## Dein Pseudonym (16. März 2010)

ah jetz gehts, nun zeigt er den user auch im 2ten formular an. da war nurn kleiner denkfehler drin^^ 

nu hab ich noch das problem mit dem filter...


----------



## tombe (16. März 2010)

So gehts:


```
Private Sub Form_Open(Cancel As Integer)
    Me.RecordSource = "SELECT * FROM tabellenname WHERE dein_feld = '" & NUser & "'"
End Sub
```

Die entsprechenden Werte für die Tabelle bzw. das Feld musst du noch anpassen!!


----------



## Dein Pseudonym (16. März 2010)

da schreit er mich an syntaxfehler in from klausel


----------



## tombe (16. März 2010)

Zeig mal die SQL Anweisung bzw. prüfe mal ob der Wert der Variablen NUser und das Feld in der Tabelle vom gleichen Datentyp sind.


----------



## Dein Pseudonym (17. März 2010)

hab noch mal nachgeguckt waren vom gleichen datentyp allerdings die anderen beiden globalen variablen nicht, hab das mal geändert. jetzt macht er zwar das formular auf aber wenn ich durch die datensätze navigieren will sagt er eine ereignisprozedur/makro hat einen fehler verursacht. mit den sql anweisungen hab ich mich irgendwie gestritten da is bei mir irgendwie immer der wurm drin.

Me.RecordSource = "SELECT * FROM tbl-Netzwekuser WHERE NetzwerkUserID = '" & NUser & "'"


----------



## tombe (17. März 2010)

Ich denke mal es liegt an dem Bindestrich im Tabellennamen. Ändere die SQL-Anweisung mal ab und setze den Tebellennamen in eckige Klammern:


```
Me.RecordSource = "SELECT * FROM [tbl-Netzwekuser] WHERE NetzwerkUserID = '" & NUser & "'"
```

Ach so und in welche Prozedur hast du diese Anweisung geschrieben, in die "Form_Open"


----------



## Dein Pseudonym (17. März 2010)

hatte ich auch gedacht das es daran liegt aber das hat auch keinen effekt...

ja habs in die form open geschrieben, wieso?


----------



## tombe (17. März 2010)

Dein Pseudonym hat gesagt.:


> ja habs in die form open geschrieben, wieso?



Weil es da hingehört und für den Fall das du es versehentlich in eine andere Prozedur geschrieben hättest das der Grund für den Fehler sein könnte.

Gut wenn wir so nicht weiterkommen, welche Access Version benützt du Ich habe hier Access 2000. Wenn das passt, dann stell mal deine Datenbank hier rein und ich schau mal drauf !! Kannst ja zur Not eine Kopie davon machen und sensible Daten vorher löschen bzw. ändern.


----------



## Dein Pseudonym (17. März 2010)

ich hab hier Access 2003.

da muss ich dann aber komplett alle datensätze löschen wenn ich die online stellen will..... 

aussedem kann ich doch garkeine dateien als gast anhängen


----------



## tombe (17. März 2010)

Gut dann halt nochmal anders.

Sofern es nicht zu viele Tabellen sind, schreb hier mal rein wie sie heißen und welche Felder (Namen und Datentyp) sie beinhalten. Dann beschreibst du noch ein bisschen wie du die Anmeldung machst und wie es von da weitergeht. Dann stell ich das mal so gut es geht bei mir nach und setzt diese DB hier rein.


----------



## Yaslaw (17. März 2010)

Dein Pseudonym hat gesagt.:


> aussedem kann ich doch garkeine dateien als gast anhängen


Nachdem Tombe sich so viel Mühe gibt, währe es eh langsam an der Zeit sich hier anzumelden....


----------



## Dein Pseudonym (17. März 2010)

hab mich jetz einfach doch angemeldet....

die DB is jetz komplett leer is nur noch das grundgerüst, ich hoffe du kannst damit etwas anfangen. sieht vllt ein wenig chaotisch aus einige abf waren nur zum test, datei hab ich als zip angehängt .


----------



## Yaslaw (17. März 2010)

Die Form_Open() ist leer. Du überschreibst diene Source im Form-Current(). Das macht wenig Sinn.
Wenn du auf einen Datensatz kommst, willst du die Datenbasis auswechseln. Das ist wie den Stuhl auswechseln auf dem du gerade sitzt, während due sitzt.


----------



## tombe (17. März 2010)

Hm,
ich bekomme die Datei nicht geöffnet!!

Welches Format hat die DB ist es jetzt 2003 oder hast du sie im 2000 Format gespeichert.


----------



## Yaslaw (17. März 2010)

Habs mal zu Access2000 konvertiert. (mit Access2007.. ich hoffe es ist lesbar)

Zusätzlich habe ich auch mal den User x mit Passwort x erstellt, damit man testen kann.


----------



## tombe (17. März 2010)

Ich bin schon eine arme Sau (oder bin ich einfach nur zu blöd) !


----------



## Yaslaw (17. März 2010)

Hmm. habs mit winrar gepackt.

mdb kann ich nicht ungezippt hochladen.

nun versuch ichs anderst. Die angehängte Datei ist kein zip! die Endung auf mdb umbenennen und dann hast du es.


----------



## tombe (17. März 2010)

@yaslaw:
Danke für die eMail. Jetzt konnte ich die DB öffnen !!

@Dein Pseudonym:
Erster Fehler so wie ich es sehe ist der das du die SQL Anweisung doch nicht in die Form_Open (beim Öffnen) Prozedur geschrieben hast sondern bei Form_Current (beim Anzeigen).
Was mir jetzt allerdings noch viel komischer vorkommt ist das du mit der Abfrage nur ermittelst ob der angemeldete Benutzer die Rechte zum Ändern hat. Es hat nichts damit zu tun das irgendwelche (von diesem Benutzer angelegte) Datensätze herausgefiltert werden. Außerdem die Abfrage die du als Dtenherkunft in dem Formular hinterlegt hast, gibt nicht im geringsten die Felder zurück die im Formular enthalten sind.

Erkläre mir bitte mal was du beim Öffnen des Formulars "frmGerät" jetzt wirklich machen willst.


----------



## Dein Pseudonym (18. März 2010)

tombe hat gesagt.:


> Erster Fehler so wie ich es sehe ist der das du die SQL Anweisung doch nicht in die Form_Open (beim Öffnen) Prozedur geschrieben hast sondern bei Form_Current (beim Anzeigen).


da hatte ich glaub ich nochmal rumgespielt da es eh nicht ging, hab wohl vergessen das zurückzuändern



tombe hat gesagt.:


> Was mir jetzt allerdings noch viel komischer vorkommt ist das du mit der Abfrage nur ermittelst ob der angemeldete Benutzer die Rechte zum Ändern hat. Es hat nichts damit zu tun das irgendwelche (von diesem Benutzer angelegte) Datensätze herausgefiltert werden.


wenn du die abfragen netzuser meinst, die abfrage solte eigentlich nur herrausfiltern ob der benutzeraccout aktiv is oder nich. das mit dem ändern hatte ich nur erstmal eingebaut erfüllt aber noch keine funktion.



tombe hat gesagt.:


> Außerdem die Abfrage die du als Dtenherkunft in dem Formular hinterlegt hast, gibt nicht im geringsten die Felder zurück die im Formular enthalten sind.
> Erkläre mir bitte mal was du beim Öffnen des Formulars "frmGerät" jetzt wirklich machen willst.


die abfragen u. die 2 formulare waren eigentlich erstmal nur provisorisch zum testen wie ich das am besten bewerkstelligt bekomme das wenn sich da ein benutzer einloggt er auch nur die datensätze zu sehen bekommt zu denen er zugewiesen ist. sprich jeder benutzer ist einem bestimmten ort zugewiesen und er soll auch nur die daten sehen die an diesem ort sind. ob er die daten nun ändern darf oder nich, wollt ich später noch einbauen machen. ich hatte die ganze datenbank auch erst versucht geräteorientiert zu gestallten aber das hatte irgendwie alles nich so hingehauen.


----------



## tombe (18. März 2010)

Hi,

also wirklich weiter komme ich mit deiner Datenbank leider nicht. Da keine Datenvorhanden sind habe ich versucht einige einzugeben um mit ihnen zu arbeiten. Du hast aber fast überall irgendwelche Felder mit Autowert und irgendwelche Verknüpfungen die das Anlegen/Bearbeiten so gu twie unmöglich machen. Zumindest dann wenn man nicht weiß wie die Daten in Verbindung zueinander stehen.

Ich habe deshalb jetzt nur mal einen kleiner Schritt in Sachen Berechtigung nach dem Öffnen des Formulars "frmGeräte":


```
Private Sub Form_Open(Cancel As Integer)
Dim sql As String
Dim recht As Integer

On Error Resume Next

sql = "SELECT Berechtigung FROM [tbl-Netzwekuser] WHERE NetzwerkUserID = '" & NUser & "'"
Me.RecordSource = sql

recht = Me.Recordset.Fields("Berechtigung")

sql = "SELECT * FROM [tbl-Geräte]"
Me.RecordSource = sql

If recht = 8 Then
    Me.AllowEdits = False
    Me.AllowDeletions = False
    Me.AllowAdditions = False
    Me.DataEntry = False
End If

End Sub
```

Hier wird geprüft ob der Benutzer als Berechtigung den Wert 8 (Autowert in der Tabelle ) hat. In diesem Fall darf er nur lesen aber nichts ändern, löschen oder neue Daten eingeben.

Übrigens gefährlicher Schreibfehler bei den Tabellen. Du hast eine Tabelle mit dem Namen "tbl-Netzwekuser". Wer nicht wirklich genau hinschaut und diesen Namen von Hand eingibt wird immer einen Fehler erhalten weil er sicherlich "tbl-Netzwe*R*kuser" schreibt !!

Gruß Thomas


----------



## Dein Pseudonym (18. März 2010)

hab das mal bei mir ein gebaut, da sagt er mir zwar das datensätze vorhanden sind, allerdings zeigt er mir diese nicht an.

vllt. mach ich die datenbank auch nochmal neu.... wenn nicht mal jemand der sich damit auskennt in meiner DB zurecht findet.....das einzige was bis jetz richtig funktioniert ist ja gerad mal die anmeldung...

ich wuste halt nicht wie ich die DB anders aufbauen sollte...

ich brauch halt ne DB in der ich auf die geräte zugreifen kann und er mir genau sagen kann wo diese stehen, ggf. was sich dort noch befindet, genaue details des ortes, wer dafür zuständig ist und wie ich diesen kontaktiere.... so das sich die leute von dort einloggen können und das dann alles reinschreiben können.


----------



## tombe (18. März 2010)

Ich hab dir da mal was gebastelt.

Es gibt eine Tabelle Ansprechpartner, Standort und Geräte und dann gibt es ein Formular Geräte.

In diesem Formular werden zuerst mal alle vorhandenen Geräte angezeigt. So und ganz oben gibt es nun ein Listenfeld welches die Namen aller Ansprechpartner enthält. Klickt man auf einen der Namen, so werden die Geräte auf diesen Ansprechpartner gefiltert.

Das ganze ist optisch nur mal so auf die schnelle zusammengeschustert und es werden auch beim Standort nicht der Ort selber sondern nur dessen ID angezeigt. Aber es soll ja auch "nur" die Funktion selber zeigen.

ACHTUNG: Die Datenbank ist nicht wirklich gezippt sondern einfach die Endung "MDB" in "ZIP" geändert.

Gruß Thomas


----------



## Dein Pseudonym (18. März 2010)

so in der art habe ich mir das vorgestellt.... vllt hab ich einfach nur zu kompliziert gemacht... bei dir fuktioniert es ja ganz einfach...


----------



## tombe (18. März 2010)

Ich würde an deiner Stelle vielleicht nochmal alles überdenken und auch wenn es im ersten Moment frustrierend ist nochmal komplett von vorne anfangen.
Die Fehler die jetzt durch die Verknüpfungen und Abfragen drin sind bekommst du so vielleicht gar nicht mehr raus oder findest im Laufe der Zeit immer noch was wo Probleme macht!!

Hilfe dabei bekommst du hier ganz sicher.


----------



## Dein Pseudonym (18. März 2010)

ist vllt. das beste. ich Danke dir auf jeden fall schonmal für deine hilfe und geduld


----------

