Hallo Helfer,
Ich habe mal wieder ein Problem.
Ich möchte in einem Formular einen neuen Datensatz anlegen.
In diesem Datensatz soll eine nicht vergebene Zahl in der zweiten Spalte gesucht werden die mit der ersten Spalte verknüpft ist. zb. 1/48 (Siehe Bild1).
Die erste Spalte hat Zahlen von 1 bis 18 und die zweite zu der ersten Spalte von 1 bis viele und das mehrfach. Also es gibt 1/23, 2/23, 15/134 usw.
Es kann aber auch freie Zahlen zwischendurch geben durch gelöschte Datensätze. (4/23,___, 4/25)
In Bild 2 ist das Formular da könnt ihr sehen wie das aussehen soll.
Erst soll die Erste Zahl ausgewählt werden und mit Dieser Auswahl soll eine dazu passende Zahl gesucht werden.
Diese soll dann im unteren Feld angezeigt werden zum gemeinsamen speichern.
Ich hoffe das ich das halbwegs brauchbar erklärt habe!
Gruß und danke schonmal fürs lesen!!!
Danny
Hallo,
ich kann Dir nicht folgen.
Und die gezeigten Zahlenbeispiele (1/23, 2/23, 15/134) kann ich nicht finden.
ZitatDiese soll dann im unteren Feld angezeigt werden zum gemeinsamen speichern.
Im Regelfall sollten solche zusammengesetzten Werte nicht gespeichert werden, sondern nur die Einzelwerte.
Kannst Du da alles mal genauer erklären.
Und ein Bild des Beziehungsfensters könnte auch hilfreich sein.
Ich hatte es befürchtet :-\,
also noch mal anders. Hier eine Beispieldatei mit dem Problem!
Ich hoffe daraus wirst du jetzt schlauer.
Es soll eine freie Zahl gesucht werden und diese soll dann mit den restlichen Angaben gespeichert werden.
Gruß
Danny
Hallo Danny,
Lege eine Tabelle (i.B. tblZahlen) mit einer Spalte (Zahl) an, die den benötigten Wertebereich (1 - n) enthält.
Dann erhältst du die kleinste, nicht verwendete Zahl mit
SELECT Min(Z.Zahl)
FROM tblZahlen AS Z
WHERE Z.Zahl NOT IN
(SELECT T.ZahlZwei
FROM DeineTabelle AS T)
gruss ekkehard
Hallo,
ich habe nur Access2003 und benötige zwingend eine MDB. Entweder konvertieren, oder auf jemand anders warten.
Hallo Ekkehard,
wie baue ich dann noch in die Abfrage die Auswahl 1 bis 16 aus dem ersten Kombifeld mit ein??
Den benötigten Wertebereich (1 - n) schreibe ich dann wohin und bezieht sich das dann auch auf meine Spalte.
Sorry das ich so blöd frage aber ich stehe gerade auf dem Schlauch.
Gruß
Danny
Hallo MzKlMu(Klaus),
hier nochmal als MDB!!
Gruß und danke
Danny
Im Nach Aktualisierung Ereignis des Kombifelds ermittelst Du die Anzahl der Datensätze (z. Bsp. mit DCount oder in einer Abfrage mit Count), die es zu dieser Nummer schon gibt und die höchste vergebene Nummer des Zielfelds (analog mit DMax oder Max in einer Abfrage). Sind beide gleich (Idealfall), dann ist die höchste Nummer + 1 Dein Zielwert. Wenn nicht, klapperst Du in einer Recordset-Schleife die Zahlen von 1..maximal der höchsten Nummer ab (es muss mindestens eine Lücke geben). Wenn eine Nummer nicht gefunden wurde, ist das Dein Zielwert und die Schleife ist abzubrechen.
SELECT Min(Z.Zahl)
FROM tblZahlen AS Z
WHERE Z.Zahl NOT IN
(SELECT T.ZahlZwei
FROM DeineTabelle AS T
WHERE T.ZahlEins = Forms.DeinForm.DeinKombi)
hallo Lachtaube,
leider habe ich noch nicht so viel Plan.
Ich habe vor 2 Monaten mit Access angefangen aber bei speziellen Abfragen oder VBA stehe ich noch zimlich im Dunkeln :-[
Ich versuche mal aus euren Tipps was zu erstellen.
Gruß und Danke euch allen das ihr mich nicht allein lasst.
Hallo Danny,
Noch einfacher :)
Private Sub DeinKombi_AfterUpdate()
Me!txtZahl2 = DMin( _
"Zahl", _
"tblZahlen", _
"Zahl NOT IN " _
& "(SELECT T.ZahlZwei " _
& "FROM DeineTabelle AS T " _
& "WHERE T.ZahlEins = " & Me!DeinKombi.Value & ")")
End Sub
gruss ekkehard
Danny, ich habe die drei möglichen Resultate, die sich aus der Auswahl eines Buchstabens ergeben, in 3 Textfelder in einen kleinen Dalog eingebaut.
Ich danke euch allen für die Hilfe!!!
Werde alle Varianten heute abend mal einbauen und schauen was für mich und den Anwender das beste ist :).
Super Forum und super Hilfe!!!!!
Gruß
Danny
Hallo Lachtaube,
ich habe zu deinem Programm nochmal ein paar Fragen.
Wenn ich deinen VBA Code in meine Listen übernehmen will und die Bezeichnungen ändere, also Mat gegen tblMat das klappt. Aber wenn ich die alpha_ID gegen BuchID ändere geht das debuggen los.
Brauche ich wirklich in beiden Tabellen die Bezeichnung BuchID und nicht BuchID zu BuchID_F oder so??? Wenn beide gleich sind dann klappt es. Oder ist das jetzt irgendwie Zufall???
Gruß
Brallu
Danny, ich erstelle im Code 3 temporäre Abfragen, welche man auch speichern könnte. Hier ist die erste (und einzig wichtige), die die erste freie Nummer ermittelt.SELECT TOP 1 num + 1
FROM MAT m
WHERE alpha_id = [@alpha_id] AND
NOT EXISTS
( SELECT NULL
FROM MAT
WHERE alpha_id = [@alpha_id] AND
num = m.num + 1 )
ORDER BY 1;Das Prädikat TOP 1 bewirkt, dass bei eindeutigen Feldinhalten, was ja gegeben ist, nur ein Datensatz ermittelt wird. Wir nehmen also eine Nummer (num) aus der Tabelle MAT und addieren 1 hinzu und sortieren gleichzeitig nach der ersten Spalte (num) aufwärts. Nun stellen wir in einem Parameter eine notwendige Randbedingung auf, die sich auf die Id (alpha_id in meinem Beispiel) der Buchstabentabelle (Alpha) bezieht. Gleichzeitig wird ein notwendiger Parameter @alpha_id festgelegt, der später im Code aus dem Kombifeld bestückt wird, um eine Eindeutigkeit zu erzielen. In der zweiten Bedingung wird geprüft, ob es unter der gleichen alpha_id eine num plus 1 gibt. Ist diese Bedingung nicht erfüllt, haben wir das Ziel erreicht.
Die zweite Abfrage zählt die Anzahl der Datensätze für eine mittels Parameter übergebene apha_id.SELECT Count( * )
FROM MAT
WHERE alpha_id = [@alpha_id];
Und die dritte Abfrage ermittelt den höchsten bisher vergebenen Wert für num entsprechend des Parameters für alpha_id.SELECT Max( num )
FROM MAT
WHERE alpha_id = [@alpha_id];
Im Code werden dann die Abfragen der Reihe nach erstellt, der Parameter übergeben und in einem Recordset, welches nur einen Datensatz liefert und auch nur ein Feld besitzt, an die Steuerelemente durchgereicht.
Wo und wie Du Deine buchID oder auch matNummerBuchstabe_F_ID hernimmst ist letztendlich wurscht - wichtig ist, dass sie gültig ist.
PS: das Formular in Deinem Beispiel hat leider einen Schuß weg, weshalb ich es nicht verwenden kann.
Danke für die viele Mühe Lachtaube,
das habe ich gebraucht um das mal zu durchschauen!!!
Das mit dem Formular läuft bei mir, aber war ja eh nur ein vor Entwurf.
Nochmals Danke
Gruß
Danny und bis bald :-\ :)
Hallo Gemeinde und im Besonderen Lachtaube,
Ich habe geglaubt das Thema wäre für mich beendet aber nein es tauchen leider Fehler auf! :'(
Hier noch einmal kurz die Aufgabe.
Es gibt eine Haupttabelle tblMat mit den Daten zu einzelnen Artikeln.
Für jeden Artikel gibt es eine eigene Buchstaben Zahlen Kombination welche sich aus
tblMatStammdaten und tblBuchstabeRZNr ergibt. Die Struktur ist so richtig und wird so gebraucht.
(Materialverwaltung für Kletterzeugs)
Nun zum Problem:
Ich habe die Codezeilen von Lachtaube übernommen und sie berechnen auch eine neue Zahl nach dem auswählen. Allerdings nicht wenn zu einem Buchstaben noch keine Zahl vorhanden ist.
Ich habe meine Datenbank ohne Daten erstellt und es kommen Fehlermeldungen.
Bitte im Beispiel den Buchstaben K auswählen dann kann man das sehen. (Ich hoffe ich habe nicht zu viel rausgelöscht :))
Dann musste ich noch feststellen, dass ich den Datensatz nicht richtig speichern kann weil er nicht die Buchstaben ID verwendet die ausgewählt wurde sondern in der tblBuchstabeRZNr einen neuen Datensatz anlegt mit Zahl statt die buchstabeZuordnungID des Buchstabens zu verwenden.
(kann man sehen im Letzen Datensatz der tblBuchstabeRZNr)
Ich hoffe das Problem lässt sich in der Beispieldatei erkennen und ihr könnt mir helfen!
Ich bin zwar in Access schon besser geworden aber in den VBA Eingeweiden finde ich mich leider immer noch nicht so gut zurecht deswegen hoffe ich auf eure Hilfe.
Ich danke schonmal allen die sich das hier anschauen und hoffe das Problem ist verständlich!
Gruß
Brallu
Danny, schau mal, ob mit dieser Änderung am Code das Problem gelöst ist.
'...
'neueNummeranzeigen
With CurrentDb().CreateQueryDef(vbNullString, QRY1)
.Parameters("@buchstabeZuordnungID") = Me.cboBuchstabe
With .OpenRecordset()
If Not .EOF Then
Me.txtNum = .Fields(0)
Else
Me.txtNum = 1
End If
.Close
End With
End With
End Sub
Hallo Lachtaube,
ich danke dir für die schnelle Hilfe :)
Das mit dem Auswahlfehler klappt jetzt super!!!
Aber das mit dem Speichern klappt noch nicht.
Hat das was mit der qry zu tun???
Hab wohl was übersehen oder nicht verstanden :(
Wenn du da eventuell nochmal kurz drüberschauen könntest???
Gruß und vielen Dank
Danny
Ich verwende selbst nie gebundene Formulare, in den Eingaben über mehrere verknüpfte Tabellen vorgenommen werden (Ausnahme sind 1:1-Beziehungen) und kann deshalb zum Speichern wenig beitragen.
Für das Vorhaben schein aber doch auch ein ungebundenes Formular ausreichend zu sein.
Danke, :) das versuche ich mal und melde mich morgen nochmal!!
Danke :) :)
Gruß
Danny
Hallo Lachtaube und andere Retter,
ich habe ein Problem beim Speichern des neuen Datensatzes! :-[
Bei der Auswahl des Buchstaben wird mit der Buchstaben-ID gearbeitet. Soweit super weil die richtige freie Zahl gesucht und gefunden wird.
Sie wird dann aber als Zahl in der Tabelle tblBuchstabeRzNr gespeichert.
(Hier soll aber gar kein Datensatz zugefügt werden)
So das wenn der Buchstabe C im Formular ausgewählt wird, in der Tabelle tblBuchstabeRzNr unter neuer ID in der 2 Spalte das dann als 3 gespeichert wird. (C wird also als 3 gespeichert)
In der tblMatStammdaten wird dieser Wert dann auch falsch gespeichert.
Leider habe ich keine Ahnung wo hier der Fehler liegt.
Wenn ihr mal auf das Beispiel schauen würdet, würde ich mich riesig freuen! :)
Gruß und Danke
Danny
So ihr lieben, es braucht sich keiner mehr den Kopf raufen!!!
Der Fehler war nur eine Textfeldverknüpfung :-[
Jetzt klappt das super und der Code von Lachtaube funktioniert super so wie er im letzten Beispiel enthalten ist!
Gruß
und ein dickes Danke an Lachtaube :)
Danny