"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Access 2010 Abfrageproblem

schizo 02.09.2010 - 16:08 23326 13
Posts

schizo

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2488
Hi,

ich bin gerade dabei, unsere Inventarliste professioneller aufzuziehen und habe dafür eine Access DB erstellt, um die ganzen Daten aufzunehmen.
So weit - so gut, jetzt hänge ich jedoch bei der Abfrage, dass ich die eingegebenen Daten abfragen und schön gegliedert ausgeben möchte.

Für die einzelnen Daten habe ich 7 Tabellen erstellt (OS, Hersteller, Gerät, ...)
Wenn ich jetzt eine Abfrage über mehrere Tabellen erstelle erscheint die Fehlermeldung
Zitat
Der Abfrageassistent konnte Ihre Abfrage nicht in der Datenblattansicht öffnen. Möglicherweise hat ein anderer Benutzer eine Quelltabelle exklusiv geöffnet. Ihre Abfrage wird in der Entwurfsansicht geöffnet.

Wenn ich daraufhin in die Datenblattansicht wechseln möchte erscheint die Fehlermeldung
Zitat
Datentypenkonflikt im Ausdruck

Wenn ich die Abfrage von einer einzelnen Tabelle starte erscheinen die Fehlermeldungen nicht. Auch beim Googlen der Fehlermeldungen bin ich auf keinen hilfreichen Eintrag gestoßen. Was könnte es da haben?
Das Dokument ist natürlich nur von mir geöffnet.

DirtyHarry

aka robobimbo
Avatar
Registered: Apr 2001
Location: outer space
Posts: 464
Aufgrund der zweiten Fehlermeldung spekuliere ich mal, dass du in einem WHERE oder einem JOIN zwei unterschiedliche Datentypen miteinander vergleichst und er deshalb einen Fehler bringt.

Zweite Möglichkeit ist, dass ein brechnetes Feld in der Abfrage einen Fehler hat.

Ansonsten --> need more Input :)

schizo

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2488
Die erste Annahme war richtig. Das Problem hab ich inzwischen gelöst:
Ich habe in den Tabellen zwar die ID verknüpft, aber mir in der Tabelle den Datensatz aus der anderen Tabelle anzeigen lassen. Das funktioniert zwar bei den einzelnen Tabellen, sobald ich das ganze aber in eine Abfrage zusammenfassen möchte kommts zu Problemen (ja, das ist das erste mal, dass ich Access verwende :p).

Jetzt steh ich nur noch vor dem Problem, dass ich über ein Formular mit den relevanten Suchbereichen die Abfrage mit Daten speisen möchte.
Bei der vorigen Lösung konnte ich mir die Auswahlmöglichkeiten mittels Kontextmenü anzeigen lassen. Das ist jetzt afaik nicht mehr möglich, oder?
Außerdem habe ich noch das Problem, dass ich wenn ich z.B. den Rechnernamen eingebe, die restlichen Felder des Formulars auch ausgefüllt werden (welche durch eine "on open" Funktion gelöscht werden). Wie kann ich das umgehen?

DirtyHarry

aka robobimbo
Avatar
Registered: Apr 2001
Location: outer space
Posts: 464
Das Suchformular bzw. es reichen auch die Suchfelder, müssen ungebunden sein, dh. keine Datenquelle haben.

In der Abfrage kannst Du dann in den Kriterien direkt auf das Formular verweisen: Wie [Formulare]![Formular1]![Text0] --> "Formular1" das Textfeld "Text0"

schizo

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2488
Kannst du mir ev. noch sagen, wie der korrekte Syntax für Null abfragen lautet?
Ich schaff es partout nicht, Source Felder zu ignorieren, in welchen keine Eingabe getätigt wurde.

edit: Was auch noch gut zu wissen wäre:
Wie kann ich
Code:
'Wie "Rechnername*"
in eine solche Abfrage verpacken?
Bearbeitet von schizo am 03.09.2010, 11:48

DirtyHarry

aka robobimbo
Avatar
Registered: Apr 2001
Location: outer space
Posts: 464
mit dem eintrag "Ist Nicht Null" in der jeweiligen Spalte bist du die leeren Felder los.

Wenn Du in dem Beispiel von oben "Rechnername*" eingibst, sollte er Dir eigentlich nur mehr Datensätze anzeigen die in der Spalte mit "Rechnername" beginnen anzeigen, funtkioniert auch über das Formularfeld

Das "Wie" ist im Prinzip gleich dem LIKE Operator in SQL

schizo

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2488
Ich steh bei dem Problem leider nach wie vor an.
Bei den Kriterien hab ich derzeit folgende beiden Einträge, welche aber nicht funktionieren:
Code:
Wenn([Formulare]![Abfrage1]![devicename]="";Wie "*";Wenn([Formulare]![Abfrage1]![devicename]!="";[Formulare]![Abfrage1]![devicename]))
Wenn([Formulare]![Abfrage1]![devicename]="";([TBL_devices].[devicename]) Wie "*";Wenn([Formulare]![Abfrage1]![devicename] Ist Nicht Null;[Formulare]![Abfrage1]![devicename]))

Ich möchte nach einem eingegebenen Begriff suchen, wenn dieser nicht Null ist. Sollte dieser Null sein möchte ich das Kriterium Wie "*" anwenden. Nur komm ich absolut nicht auf den korrekten Syntax.

Kann ich mir außerem bei einem ungebundenen Formular korrekte Auswahlmöglichkeiten aus einer Tabelle in einem Kontextmenü anzeigen lassen?

edit: hab Problem1 mal gelöst. Der richtige String lautet
Code:
Wie Wenn([Formulare]![Abfrage1]![devicename]<>"";[Formulare]![Abfrage1]![devicename];"*")
Bearbeitet von schizo am 06.09.2010, 14:35

DirtyHarry

aka robobimbo
Avatar
Registered: Apr 2001
Location: outer space
Posts: 464
Freihändig, alle Angaben ohne Gewähr ;)
Code:
Wenn(
  [Formulare]![Abfrage1]![devicename]="";
  Wie "*";
  Wie [Formulare]![Abfrage1]![devicename]
)

Wenn das Formularfeld leer ist, dann alles anzeigen, anonsten den Inhalt des Textfeldes anwenden.

Alles in eine Wurscht schreiben, habs hier nur auf mehr Zeilen damit es übersichtlicher ist :)

schizo

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2488
Macht beides das selbe, nur andersrum ;)

DirtyHarry

aka robobimbo
Avatar
Registered: Apr 2001
Location: outer space
Posts: 464
Nein, weil im Endeffekt fehlt bei deiner zweiten Zeile beim Wenn das "Wie", sieht man besser wenn man es aufteilt:
Code:
Wenn(
    [Formulare]![Abfrage1]![devicename]="";
    ([TBL_devices].[devicename]) Wie "*";
    Wenn(
        [Formulare]![Abfrage1]![devicename] Ist Nicht Null;
        [Formulare]![Abfrage1]![devicename]
    )
)

Aber eingentlich gehts auch viel einfacher, siehe http://www.donkarl.com?FAQ3.14

schizo

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2488
Jetzt stehe ich noch vor nem anderen Problem:
Ich möchte die Dateneingabe über Formulare realisieren. Da beim Öffnen eines Formulares immer Daten mitgeladen werden verwende ich ein Makro, welches einen neuen Datensatz erstellt.
Ich habe aber eine Eingabe so eingestellt dass eine Seriennummer eingegeben werden kann, welche aus einer anderen Tabelle stammt. Diese ist zwar mit der Tabelle verknüpft in welche ich die Daten schreiben möchte, jedoch werden durch das Makro anscheinend in allen Tabellen ein neuer Datensatz erstellt, welche im Formular vorkommen. Das außert sich dadurch, dass ich bei der Bestätigung eine Fehlermeldung bekomme, dass ein Feld einer verwendeten Tabelle nicht ausgefüllt ist, für welche überhaupt kein Eingabefeld vorhanden ist.
Wie kann ich das umgehen?

DirtyHarry

aka robobimbo
Avatar
Registered: Apr 2001
Location: outer space
Posts: 464
Das Versteh ich jetzt nicht, bitte etwas genauer erklären :)

Wie werden denn die Daten der anderen Tabellen mitgeladen?

Wie schaust du denn in der anderen Tabelle nach und ermittelst die Seriennummer?

Und welche Befehle arbeitet das Makro ab?

Prinzipiell kenn ich es noch so, dass das Formular grundlegend an eine Tabelle / Abfrage gebunden ist (Datenherkunkft). Mann kann Daten von anderen Tabellen / Abfragen entweder über Dlookup-Formeln oder auch über Ungebundene Steuerelemente mit eigener Datenherkunft (andere Tabelle / Abfrage / SQL-Query) einbinden.

Legst du dann über das Formular oder über ein Makro (so wie ich sie kenne) einen neuen Datensatz an, bezieht sich das dann nur auf die Tabellen die dem Formular zugrundeliegt.

schizo

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2488
Ich erstelle ein Formular mit Datensatzherkunft von den beiden benötigten Tabellen.
Bei der Combobox, in der ich die Seriennummer der anderen Tabelle auslese erstelle ich eine Abfrage der den relativen Schlüssel (keine Ahnung, wie hier der korrekte Ausdruck lautet) der Haupttabelle beinhaltet, welcher auf den Primärschlüssel der zweiten Tabelle zeigt und der Seriennummer der zweiten Tabelle.
Ich habe jetzt eine Combobox mit zwei Spalten, wobei die gebundene Spalte den relativen Schlüssel beinhaltet. Ich möchte die Seriennummer eingeben (welche mit einem Barcodereader abgelesen wird) und dann den relativen Schlüssel für diesen Eintrag in die Haupttabelle schreiben.

Das Makro erstellt einen neuen Datensatz. Hier habe ich zwei Varianten versucht:
Wenn ich nicht definiere, wo der Datensatz erzeugt werden soll ist das Formular zwar leer, aber er benötigt eben eine Eingabe für eine andere Tabellenspalte, welche ich nicht liefere.
Wenn ich zu einem neuen Datensatz in [Tabelle]![TBL_Haupttabelle] gehe sind alle Felder außer der oben erwähnten Combobox ausgefüllt.
Ich habe leider keine vernünftigen HowTos gefunden, welche für meinen Zweck nützlich wären.

schizo

Produkt der Gesellschaft
Avatar
Registered: Feb 2003
Location: Vienna
Posts: 2488
Hab den Fehler gefunden: der Steuerelementinhalt hat auf die andere Tabelle gezeigt. Habs jetzt umgestellt und der Datensatz wird ohne Fehlermeldung in die richtige Tabelle eingetragen.

Nachdem von der Funktionalität her jetzt alles passt noch ne Frage zur Kosmetik: Kann ich irgendwie einstellen, dass die Datensätze erst bei Buttonbetätigung in die Datenbank geschrieben werden und nicht, sobald ein Feld ausgefüllt ist? Derzeit werden die Datenbankfelder ausgefüllt, sobald eine Eingabe in ein Textfeld oder Combobox stattfindet.

So, noch ein kleiner "Fehler", der mir gerade aufgefallen ist:
Wenn ich eine neue Tabelle einrichte, von welcher ich Werte mit einer Combobox wie im vorigen Post abfrage werden mir nur die Werte aufgelistet, welche schon in der Haupttabelle existieren.
Sprich, wenn ich eine Tabelle mit den Einträgen "Server" und "Workstation" habe und ich bis jetzt aber nur Server eingegeben habe kann ich nicht den Typ Workstation auswählen, obwohl dieser in der zweiten Tabelle definiert ist.
Wie kann ich diesen dennoch auswählen?
Bearbeitet von schizo am 10.09.2010, 10:10
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz