PDA

Vollständige Version anzeigen : Datensatz mit mehreren Filtern


Dekay1986
11.06.2012, 13:33
Hallo,

schon wieder stehe ich vor einem Problem.
Hab in den Anhang eine kleine Test_DB gelegt.

Ich möchte mit Hilfe der Kombinationsfelder meine Datensätze Filtern.

Filter hab ich bisher über Abfragen erstellt,... das ist hier aber eher problematisch.

Was muss ich tun, dass ich im Kombinations einen Namen auswählen kann und dann direkt nach dem gefiltert wird?

Und vor allem, wie bekomm ich die Duplikate aus dem Kombinationsfeldern raus?



Gruß, Daniel Knodel

Atrus2711
11.06.2012, 13:40
Und vor allem, wie bekomm ich die Duplikate aus dem Kombinationsfeldern raus?
In der Datenquelle des Kombis nach dem Feld gruppieren, das eliminiert Duplikate.

Alles weitere zeigt meine Demo (http://www.ms-office-forum.net/forum/showthread.php?t=254941). Statt der Textfelder wären bei dir dann die Kombis auszulesen; funktioniert aber genauso.

Man kann übrigens darüber streiten, ob es sinnvoll ist, "sofort" loszusuchen. Wenn ich nach Name und Alter suchen will, braucht die Datenbank nach der Namenseingabe noch gar nichts zu tun. Wozu halbfertige Ergebnisse anzeigen? Machbar ist es aber trotzdem. Die Suchroutine müsste dann AfterUpdate der drei Kombis loslaufen.

Dekay1986
11.06.2012, 13:49
Danke für die schnelle Antwort.
Werd das gleich ausprobieren, runtergeladen habe ich die Datei schon.
Dennoch noch eine Frage.
Leider kann ich keine Auswahlmöglichkeit zum "Feld Gruppieren" in den Kombi-Eigenschaften Finden.

Atrus2711
11.06.2012, 13:57
Dein Kombi holt die Sätze, die es beim Aufklappen anbietet, aus einer Abfrage. Die muss verändert werden; die Kombifeld-Eigenschaften sind da unschuldig...

Bisher lautet die (schematisch):
SQL: SELECT Feld FROM Tabelle
Damit werden Duplikate gezeigt, weil einfach alle Werte geholt werden.

Die unterschiedlichen Werte erhältst du mit einer Gruppierung in der Abfrage.
SQL: SELECT Feld FROM Tabelle GROUP BY Feld
Wenn Du statt der SQL lieber die grafische Ansicht nutzt, dann geh so vor:

Kombifeld im Entwurf markieren
Eigenschaft Datensatzherkunft sichtbar machen
Cursor in den eingestellten Wert dieser Eigenschaft setzen
Auf das ...-Symbol am Ende der "weißen Zeile" in der Eigenschaft klicken
Du gelangst in die grafisch Abfragenansicht. Stelle dort die Gruppierung ein (großes Summen-Symbol), und stelle in der Spalte, wo das Feld als Spalte erscheint, die Funktion auf Gruppierung (sollte auch so voreingestellt sein)
Zurück zum Kombi und testen.

Lanz Rudolf
11.06.2012, 14:03
Hallo
ich habe hier:
https://dl.dropbox.com/u/46590638/ACC/SuchenFilterSort2003.zip
auch eine Muster MDB
Schau Dir ein mal das Formular FrmKundenListe0x (x = 1 bis 3) an
oder etwas ein wenig anderes
alle Formulare mi
FrmAutoErgaenzFilter Beginend
z.B. FrmAutoErgaenzFilterMitDatenherkunftAendern VorNachName
zum Testen suche mach
1. Müller oder nur Mül
2. z.b Mül,M oder Mül,o oder Mül,*
3. *,o

oder dieses Formular FrmFilterKundenAufFelderImTitel

Dekay1986
11.06.2012, 14:10
Also habe in der grafischen Ansicht Gruppieren ausgewählt.

Wie beschrieben steht nun auch

SELECT Tabelle1.ID, Tabelle1.Vorname FROM Tabelle1 GROUP BY Tabelle1.ID, Tabelle1.Vorname;

da.

Dennoch zeigt er mir die Namen mehrfach an.

Atrus2711
11.06.2012, 14:13
Du hast nach mehreren Feldern (ID, Name) gruppiert, davon war keine Rede. Damit erhältst du die vorkommenden Kombinationen aus ID und Name. Da sind dann Duplikate wahrscheinlich, denn die ID ist ja eben immer unterschiedlich.

Die ID ist in der Datenquelle des Kombis völlig überflüssig. Nimm sie dort raus. Zeige dort nur den Namen (bzw. für die anderen Kombis nur Nachname oder Alter) an, und gruppiere nach dieser Spalte.

Lanz Rudolf
11.06.2012, 14:18
Hallo
zu Doppelte DS kannst Du hier:
https://dl.dropbox.com/u/46590638/ACC/ACCESS%202000BU%20%20Begleitunterlagen.zip
auf Seite 71 -73 auch was Lesen.

Dekay1986
11.06.2012, 14:24
Vielen Dank euch beiden für die Hilfe.

Weiß auch nicht warum die ID da mit drin ist,... hatte Sie beim Kombifeld eigentlich garnicht angegeben.

@Lanz Rodolf,... danke auch dir hab mir deine erste Datei angeschaut,... allgemein hilft dir mir auch weiter,...ist ja ne ganze Menge drin zu finde.

Vielen Dank :-)

Dekay1986
11.06.2012, 14:29
@Atrus, habe die ID raus genommen, da zeigt er mir im Kombifeld nichts mehr an.

Egal auf welche Art und weise ich [Tabelle1].ID raus nehme,... mein Kombifeld bleibt leer.
Habe auch versucht das Kombifeld neu zu erstellen.
Wähle da nur Vorname aus, aber es steht immer [Tabelle1].ID mit drin

Atrus2711
11.06.2012, 14:33
Kontrollier mal die Eigenschaften Spaltenanzahl, Spaltenbreiten und Gebundene Spalte. Deine Datenquelle liefert jetzt nur noch eine Spalte (bisher zwei), so dass du nur diese eine Spalte nutzen kannst. Das Kombi ist noch auf "zweispaltig" gepolt.

Habe auch versucht das Kombifeld neu zu erstellen.
Wähle da nur Vorname aus, aber es steht immer [Tabelle1].ID mit drin
Der Kombifeld-Assisten kann auch nicht alles. Letztlich musst du die Ergebnisse von Assistenten immer nochmal durchgucken. Die ID als Primärschlüssel im Kombifeld zu zeigen ist ja grundsätzlich ein datenbank-konformes Ansinnen, aber in deinem besonderen Fall halt nicht.

Dekay1986
11.06.2012, 14:37
Spitze,... genau das war es.
Vielen Dank.
Funktioniert genau so wie gewollt :-)
Danke Dir für die Bemühungen mit mir.

Atrus2711
11.06.2012, 14:41
Hier mal alles auf einen Blick:
http://www.ms-office-forum.net/forum/showpost.php?p=1450370&postcount=32

Dekay1986
11.06.2012, 14:43
Vielen Dank. :-)
Schau ich mir dann gleich mal an.
Shön das es dich noch so hilfsbereite Leute gibt.
*DAUMEN*

Versuch mich jetzt erstmal mit der Filterung.
Ein Problem ist ja abgehakt :-)

Dekay1986
12.06.2012, 06:51
Also obwohl die Beispiele scheinbar einfach sind, habe ich aufgrund mangelnder Kenntnisse Probleme das ganze auch umzusetzen.

Kann das ganze vielleicht jemand anhand meiner Beispiel_DB erkären?

Atrus2711
12.06.2012, 08:02
Bitteschön.
Änderungsprotokoll in rot im Formular. Lesen, mit alter Db vergleichen, verstehen bzw. nachfragen.

Dekay1986
12.06.2012, 08:26
Vielen Dank,
lese es mir gerade durch.
Das mit dem Gruppieren hatten ich ja wie gesagt schon hin bekommen.

Das mit der Namensvergebung schleift bei mir noch tüschtisch das stimmt.
Versuch das immer so einfach wie möglich zu gestalten, aber da reichen eben die Namen nicht aus .

Also wie gesagt, Danke Dir erst einmal und ich lese, verstehe und frage ggf's nach.

Dekay1986
12.06.2012, 12:07
Habe das jetzt auf meine eigentliche DB übertragen und es funktioniert super.

Glaub hier kann man nie auslernen.

Danke dir für die vielen Hilfestellungen.

Bin mir sicher da kommt noch die ein oder andere Frage von mir ;-)

DankeDanke :top:

Lanz Rudolf
12.06.2012, 12:26
Hallo
wenn Du Deine "Beispiel_DB " als Zip(Nicht Rar) und Acces 2003 hoch Laden kannst
werde ich sie mir ansehen. :)

Dekay1986
12.06.2012, 12:31
Und da bin ich auch schon wieder.

Gibt es denn auch eine Möglichkeit das gefilterte Ergebnis in einem Bericht o.ä. auszugeben?

Wenn ich dort als Unterformular einen Bericht rein mache, oder einfach nur ein Listenfeld anlege, dann aktualisiert der das ja nicht.

An sich benötige ich die Funktion nicht, aber wäre dennoch interessant.

Dekay1986
12.06.2012, 12:34
Hallo Ruedi,

das Problem wurde inzwischen schon gelöst.
Aber hab in meinem letzten Beitrag noch eine weitere Frage geschildert.
Vielleicht kannst du mir ja da weiter helfen.


--> Im nächsten Beitraf der Anhang der 2000/2003er Version

Dekay1986
12.06.2012, 12:39
Sorry, war 2010er Version.
Hier noch einmal 2000/2003

Atrus2711
12.06.2012, 12:53
Die zusammenmontierte Bedingung kannst du natürlich auch in einem Bericht nutzen, wenn der auf der gleichen Tabelle/Abfrage fußt wie das Formular.

Am einfachsten geht das, indem du im Formular einen Button einfügst, der den Bericht durch folgenden Code öffnet und auf die Treffer eingrenzt:
docmd.OpenReport "DeinReport", acViewPreview,,strKriterium
strKriterium muss natürlich irgendwoher kommen:

Entweder kopierst du den Code, der strKriterium im Formular erzeugt, da noch mal hin (:(),
oder du machst strKriterium zu einer formularweiten Variable, die du dann beim Docmd ausnutzt (:depressed: ),
oder du machst aus dem bisherigen Code eine Funktion, die du dann einsetzt (:) ).

Lanz Rudolf
12.06.2012, 13:00
Hallo
Du könntest Ja Dein Kriterien aus dam (im) Formular in
eine Public Variable Sichern die Du in einem Algemeinen Modul zb. so Definierst
Public StrFilterCriterien as String
und Dan beim erstelen des Filters
StrFilterCriterien = strKriterien
und im Bericht (Daten Herkunft Abfrage) Verwendest Du diesen als Where
oder Beim öffnen des Berichts
DoCmd.OpenReport "DeinBericht, acViewPreview,,StrFilterCriterien

Hilft das ?

Hoppla Martin war Scheller ;)

Dekay1986
12.06.2012, 13:11
Das klingt immer so einfach wie ihr das beschreibt.
;-)
Kann dem auch folgen und verstehe Inhaltlich was gemeint ist.

Du Umsetzung erweist sich dann meist als schwierig.

Aber ich versuche erst einmal mein Glück ;-)

Atrus2711
12.06.2012, 13:12
Programmieren ist aber eben nicht nur Code kloppen, sondern auch strukturieren und gliedern. Dafür brauchst du eigentlich gar kein Access...

Dekay1986
12.06.2012, 13:18
Ja das stimmt wohl.
Leider fehlen mir die kompletten Grundsätze.
Deswegen hatte ich immer versucht alles über Makros zu machen.

Schreibe momentan meine Diplomarbeit (Produktionstechnik) und da ich weitestgehend damit fertig bin mach ich nun hier noch so eine Project_DB.
Hab vorher noch nie etwas derartiges gemacht.
Deswegen fällt das ganze nat. nicht gerade leicht und ich bin froh hier Hilfe zu bekommen.

Atrus2711
12.06.2012, 13:27
Deswegen hatte ich immer versucht alles über Makros zu machen
Auch Makros erfordern eine gewissen Ablaufplanung im Hirn.

Leider fehlen mir die kompletten Grundsätze
Würdest du auch ohne Lizenz in ein Flugzeugcockpit steigen und "mal so eben losdüsen"? Klar, dass du da kaum vom Boden abhebst...

Nix für ungut, aber Access ist schon ein bisschen komplexer als Word oder Excel, was man mit ein bisschen gutem Willen noch selbst durchdringen kann... Ohne Handwerkszeug bzw. -kunst geht da wenig bis gar nix.

Dekay1986
12.06.2012, 13:47
Ja das ganze ist doch wesentlich komplexer als erwartet.
Aber man fängt ja immer irgendwo klein an.

Dennoch lässt es sich sehr gut mit Access arbeiten, auch wenn ich des öfteren auf Probleme stoße.
Man lernt ja nie aus. ;-) und zum glück sind die Anforderungen an diese Projekt_DB überschaubar, so das man das vermutlich bewältigen kann.

Bin ja ganz froh das ich hier nicht Flugzeug fliegen muss ;-) da würde ich mich aber auch nicht ran trauen.

Man Verwechselt doch leicht Access mit einer einfach Word oder Exel Anwendung. Mein Gedanke damals,... wenn ich mit Exel klar kommen, kann Access doch garnicht so schwer sein. ;-)
*Pustekuchen* --> Jugendlicher Leichtsinn

Atrus2711
12.06.2012, 13:51
Guck mal www.access-tutorial.de da gibts eine Kurzeinführung.

Lanz Rudolf
12.06.2012, 14:19
Hallo
auch meine Doc die ich Dir in Beitrag #8 gesendet hab könnte evtl. was helfen

hier noch einmal runterladen oder nur öffnen
https://dl.dropbox.com/u/46590638/ACC/ACCESS%202000BU%20%20Begleitunterlagen.zip

Dekay1986
12.06.2012, 14:38
Das Access Tutorial hab ich schonmal angeschaut, werd ich mir aber heute nochmal genauer durchlesen.

Die unglaublich umfangreiche Anleitung schau ich mir heute abend an.
Habe mir erstmal das Inhaltsverzeichnis ausgedruckt.
Da ist denk ich auch einiges anderes interessantes zu finden.

Danke euch beiden

Dekay1986
03.07.2012, 05:55
Hallo und nochmal ich.
Habe eine kleine Test_DB im Anhang wo wie im Thema beschrieben mittels Kombi_Felder mehrere Datensätze gefiltert werden.
Dieser Filter wird nun an meinen Berich übergeben und ich kann den Bericht aus der Brichtsvorschau ausdrucken.
Nun möchte ich den Bericht aber direkt über nen Button im Hauptformular ausdrucken.
Ohne den Bericht vorher zu öffnen.
Wenn ich nen Button "Bericht_Drucken" erstelle macht er mir ein Makro draus, wo ich aber den Filter nicht übernehmen kann.
Also Druckt er mir immer alle Datensätz.

Kann mir wer helfen wie ich das realisieren kann?

Gruß, Daniel

Atrus2711
03.07.2012, 08:32
Hi,

kopiere den Button samt Code in einen neuen Button für den direkten Ausdruck. In dessen Code änderst du die markierten Stellen ab:

'Bericht öffnen
If Len(strKriterien) = 0 Then
DoCmd.OpenReport stDocName, acNormal
Else
DoCmd.OpenReport stDocName, acNormal, , strKriterien
End If

Dekay1986
03.07.2012, 09:19
Ich bin überrascht wie einfach das ist.
Vielen Dank.
Funktioniert nat. wie gewünscht. :-)

Lanz Rudolf
03.07.2012, 10:41
Hallo
schön das Du eine Lösung gefunden hast :)
in etwa das gleiche steht in meiner Doc
auf Seite 163 "7.22 Filter / Sort von Formular an Report(Bericht) übergeben"

Dekay1986
03.07.2012, 13:32
@Lanz Rudolf.
Dein Skirpt ist spitze.
Als Bettlektüre hat man da ne weile zu lesen. ;)
Gibt eine Menge hilfreiche Sachen drin.
Danke dafür. :)

Dekay1986
10.07.2012, 12:57
Hallo und schon wieder kommt eine Frage von mir:

Ich habe ein Listenfeld in dem alle meine Datensätze angezeigt werden.
Über ein Kombifeld kann ich nun nach "neuen", "angelegten" und "fertigen" Datensätzen Filtern und zusätzlich nach dem Bearbeiter ("Knodel", "Heinrich" u.s.w.)

Alternativ möchte ich nun aber direkt beim öffnen des Formulars nach allen neuen Datensätzen mit dem Bearbeiter Knodel Filtern.
(ganz neues Formular ohne die Kombifelder, nur mit einem Listenfeld)

Es sollen also wenn ich das Formular öffne, nur die DS im Listenfeld angezeigt werden, die den Status "neu" tragen und den Bearbeiter "Knodel".

Dazu möchte ich aber keinen Button o.ä. betätigen.

Vielen Dank schon einmal für Hilfe.

Daniel

Atrus2711
10.07.2012, 13:00
Hi,
das Kriterium kannst du ja zusammensetzen aus den bekannten Werten: User ist Knodel (wer ist das, und warum nicht Barmpf oder Flubi?), und Status ist neu.

Das geeignete Ereignis dazu wäre Form_Open (Formular BeimÖffnen).

Dekay1986
10.07.2012, 13:19
Hatte genau dieses Eregnis gesucht aber (wie so oft) nicht ordentlich geschaut.

Private Sub Form_Open(Cancel As Integer)
Me.Filter = "Status '*" & Knodel & "*'"
Me.Fitler = "Bearbeiter '*" & Neu & "*'"
Me.FilterOn = True
End Sub

Sowas in der Art?

PS.: Knodel.... bin ich ;-) also mein Nachname ;-)

maikek
10.07.2012, 13:24
Jein. Du musst die Kriterien verketten. So wie du es im Beispiel hast, würde der erste Me.Filter einfach durch den zweiten überschrieben.
Private Sub Form_Open(Cancel As Integer)
Me.Filter = "Status = 'Neu' AND Bearbeiter = 'Knodel'"
Me.FilterOn = True
End Sub
maike

Atrus2711
10.07.2012, 13:25
Die Kriterien sollten gleichzeitig wirksam werden (d.h. mit AND verbunden sein) und jeweils einen Vergleich enthalten. Und da die Werte feststehen, gehören sie komplett in die Anführungsstriche.

Private Sub Form_Open(Cancel As Integer)
Me.Filter = "Status = 'Neu' AND Bearbeiter = 'Knodel'
Me.FilterOn = True
End Sub

Dekay1986
10.07.2012, 13:28
Ah okay, würde das auch funktionieren, wenn ich z.b. nach mehreren Bearbeitern Fitlern möchte?

Private Sub Form_Open(Cancel As Integer)
Me.Filter = "Bearbeiter = 'Heinrich' AND Bearbeiter = 'Knodel'
Me.FilterOn = True
End Sub

Also würde der mir jetzt alle Projekte von Heinrich und Knodel anzeigen?

maikek
10.07.2012, 13:30
Nein, jetzt bekommst du alle Datensätze wo Bearbeiter "Heinrich und Knodel" ist. In diesem Fall musst du mit OR verknüpfen:
"Bearbeiter = 'Heinrich' OR Bearbeiter = 'Knodel'"
maike

Atrus2711
10.07.2012, 13:34
Ein beliebter Fehler.
Ein AND interpretiert man landläufig als "Vereinigung": gib mir die Knodelsätze (z.B. 5) und die Heinrichsätze (z.B. 3), d.h. 8 Treffer werden erwartet.

Das ist aber ein Irrtum. Eine Bedingung umreißt nicht das Ergebnis, sondern untersucht jeden einzelnen Datensatz und fragt ihn: "bist du im Feld Benutzer gleichzeitig Heinrich AND Knodel?". Ergebnis: Es gibt keinen Datensatz, bei dem im Feld Bearbeiter der Wert Heinrich und gleichzeitig der Wert Knodel steht. Denn Heinrich ist ungleich Knodel, somit kann das AND nie (!) Sätze finden.

Korrekt wäre
Me.Filter = "Bearbeiter = 'Heinrich' OR Bearbeiter = 'Knodel'oder alternativ
Me.Filter = "Bearbeiter IN ('Heinrich', 'Knodel')

Dekay1986
10.07.2012, 13:38
Ja das macht Sinn.
Ich hatte das auch schonmal über mehrere Kombifelder probiert und hatte eben genau das Resultat.
Kein Datensatz wurde angezeigt.
Was laut der Erklärung ja auch logisch ist.
Also "OR".

Dennoch noch mal kurz zum Filter zurück.
Funktioniert an sich auch super.
Leider zeigt er mir die gefilterten Datensätze nicht im Listenfeld an.

Atrus2711
10.07.2012, 14:09
Stimmt, das Listenfeld sollte filtern, nicht das Formular.

Leider hat ein Listenfeld keine Filter-Eigenschaft. Aber du kannst das Kriterium in seiner Datenherkunft benutzen:

In Form_Open:
Me!DeinListfeld.RowSource = "SELECT * FROM ListfeldtabelleOderAbfrage WHERE Bearbeiter = 'Heinrich' OR Bearbeiter = 'Knodel'"
ListfeldtabelleOderAbfrage ist der Name der Tabelle oder Abfrage, auf der das Listfeld basiert (kennst du).

Dekay1986
10.07.2012, 14:18
Spitze wie immer.
Funktioniert wie gewollt.

Vielen Dank :-)

Dekay1986
11.07.2012, 09:17
Hallo und mir gehen die Fragen nicht aus.

Im Anhang ist eine klein Test_DB.

Ich möchte nach einem Nachnamen oder nach einem Vornamen Filter.
Wahlweise könnte ich nun also mein Kombifeld Vorname oder eben Nachname zum Filtern verwenden.
Gibt es eine Möglichkeit, dass über nur ein Kombifeld zu machen?
Z.B. in dem ich ein Kontrollkästchen verwende, in dem ich nun anklicke, ob ich denn nun nach Vorname oder nach Nachname Filtern möchte?

Ich bin mir sicher auch hierfür hat jemand ne passende Lösung :-)

Dekay1986
11.07.2012, 09:18
Hier die Test_DB

Atrus2711
11.07.2012, 09:23
Wir machnen jetzt einen Programmierer aus dir :)

Das Kriterium für die Suche nach Vornamen und nach Nachnamem kennst du schon.

Bei deinem jetzigen Wunsch wäre das anzusetzende Kriterium eines dieser beiden. Welches genau, hängt von der Auswahl ab, ob Vor- oder Nachname genutzt werden sollen. Für diese Auswahl bietet sich eine Optionsgruppe an, damit man nur einen Wert auswählen kann. Diese Optionsgruppe als ganzes hat einen Wert; 1 für den ersten Eintrag (=Nachname), 2 für den zweiten (=Vorname). Mit einem If kannst du auf diesen Werte abprüfen und dein Kriterium entsprechend ansetzen.

Nebenbei: wäre es nicht einfacher, den Suchbegriff einfach in beiden Felder zu suchen: ... WHERE Vorname = 'Knodel' OR Nachname = 'Knodel'? Es gibt dann vielleicht ein paar unnütze Treffer, aber was solls. Wir reden ja nicht von Millionen von Sätzen, oder?

Dekay1986
11.07.2012, 09:38
Vom Produktionstechniker zum Programmierer ;-) Ich schule um.

Ja so wollte ich es auch erst machen.
Wollte in einem Kombifeld sowohl Vor- und Nachname anzeigen und einfach nach diesen beiden suchen.
Leider kann ich "durch Eingabe" eines Namens dann nur nach der ersten Spalte suchen.
Kann sämtliche Vornamen eingeben eingeben, aber die Nachnamen nicht.

Aber mal abgesehen davon wird das zu unübersichtlich.

In meiner Tatsächlichen Datenbank suche ich nach Projektnummer und Werkzeugnummer.
Um die 18500 Datensätze ;-)

Duplikate kommen nur bei den Werkzeugnummer vor.

Also es wäre tatsächlich schön, wenn ich mein Häckchen bei Vorname setze und ich sehe mein Vorname_Kombifeld oder eben bei Nachname und ich sehe mein Nachname_Kombifeld.

Atrus2711
11.07.2012, 09:41
Also es wäre tatsächlich schön, wenn ich mein Häckchen bei Vorname setze und ich sehe mein Vorname_Kombifeld oder eben bei Nachname und ich sehe mein Nachname_Kombifeld.
Das ist noch einfacher. Du brauchst nur eine Optionsgruppe, die AfterUpdate die relevante Kombibox aktiviert/entsperrt und die irrelevante deaktiviert/sperrt. So kann der User dann nur die relevante Box ausfüllen.

Dekay1986
11.07.2012, 09:47
Ja aber in diesem Falle wären ja beide Kombifelder sichtbar.
Kann man nicht irgendwie 2 Kombifelder übereinander legen und durch Häckchen bei Vorname "AfterUpdate()" setzt der mir das Vorname Kombifeld in den Vordergrund und ich kann dieses benutzen?

Atrus2711
11.07.2012, 09:48
Statt aktivieren/sperren kannst auch auch die Sichtbarkeit beeinflussen: Me!cboVorname.Visible = True 'oder False.

maikek
11.07.2012, 09:55
Du könntest bei Häkchensetzen die Datenherkunft des Kombis auch entsprechend neu setzen, etwa so:
dim strSQLV as String, strSQLN as String
strSQLV = "SELECT ID, Vorname FROM Tabelle"
strSQLN = "SELECT ID, Nachname FROM Tabelle"
If Me.Optionsgruppe = 1 then
Me.Kombifeld.RowSource = strSQLV
Else
Me.Kombifeld.RowSource = strSQLN
End If
maike

Dekay1986
11.07.2012, 10:00
Also die visible Variante funktioniert nat. super.

Private Sub Option23_AfterUpdate()
Me!KombiVorname.Visible = True
Me!Kombinachname.Visible = False
End Sub

Private Sub Option25_AfterUpdate()
Me!Kombinachname.Visible = True
Me!KombiVorname.Visible = False
End Sub

Kann ich die 2 Kontrollkästchen die ich nun verwende miteinander verknüpfen, dass der wenn ich ins Feld Vorname ein Häckchen setz, dass Häckchen bei Nachname raus geht und umgekehrt?

@Maikek: Deine Variante probier ich gleich mal aus.

Atrus2711
11.07.2012, 10:03
Kann ich die 2 Kontrollkästchen die ich nun verwende miteinander verknüpfen, dass der wenn ich ins Feld Vorname ein Häckchen setz, dass Häckchen bei Nachname raus geht und umgekehrt?
Genau das macht eine Optionsbox ganz von alleine.... wozu das mit Code nachbilden?

maikek
11.07.2012, 10:03
Kann ich die 2 Kontrollkästchen die ich nun verwende miteinander verknüpfen, dass der wenn ich ins Feld Vorname ein Häckchen setz, dass Häckchen bei Nachname raus geht und umgekehrt?
Kannst du per Code, einfacher ist: Nimm eine Optionsgruppe.
maike

Dekay1986
11.07.2012, 10:16
Okay, Optionsgruppe kannte ich bisher noch garnicht.
Hier bietet er mir aber kein AfterUpdate an wenn ich ein Kontrollkästchen anwähle.

maikek
11.07.2012, 10:17
Das AfterUpdate gilt für die komplette Optionsgruppe, nicht für das einzelne Kästchen.
maike

Dekay1986
11.07.2012, 10:22
Das hab ich mir schon gedacht.
Aber da Funktioniert dieses:

Private Sub Rahmen34_AfterUpdate()
Me!KombiVorname.Visible = True
Me!Kombinachname.Visible = False
End Sub

ja nicht mehr.

Atrus2711
11.07.2012, 10:23
Du wirst schon unterscheiden müssen, ob die Optionsgruppe als ganzes eine 1 ergibt oder eine 2....

maikek
11.07.2012, 10:25
Nein, da musst du jetzt den Wert der Optionsgruppe hernehmen:
Select Case Me.Optionsgruppe
Case 1
'Visible Einstellungen
Case 2
'andere Visible Einstellungen
Case Else
End Select
Das geht davon aus, dass 1 und 2 die Werte in deiner OG sind.
maike

Dekay1986
11.07.2012, 10:32
@Atrus2711: das ist das was du ganz am anfang sagtest.
@Maikek: So funktioniert es.
Da fallen mir spontan 1000 andere Sachen ein was man damit machen kann.
:-)
Spitzen Lösung und wesentlich übersichtlicher als es vorher mit 2 Kombifeldern war :-)

Atrus2711
11.07.2012, 11:37
Schön, dass es tut. Mich stimmt allerdings die Tatsache nachdenklich, dass du an Code denkst, bevor du auch nur die grundlegendsten Steuerelemente in Formularen kennst....

Dekay1986
11.07.2012, 14:44
Naja bei dem XYZ dachte ich immer an Graphen und habe nie mit dem Gedanken gespielt dieses Steuerelement zu benutzen.
Was da tatsächlich dahinter steckt habe ich nie geprüft ;-)
Hätte ich vielleicht mal machen sollen ;-) .
Einen schönen Nachmittag wünsche ich.

Gruß, Daniel

Dekay1986
13.07.2012, 11:46
Hallo und heute mal eine ganz einfache Frage.

Ich habe ein Formular in dem ein bst. Datensatz angezeigt wird.
Über ein Makro öffne ich ein anderes Formular (Projekt Bearbeiten).
In diesem Formular wird mein Aktueller Datensatz angezeigt.
Dazu habe ich als Bedingung folgendes geschrieben.
=="[Projekt]=" &"'" & [KombiProjekt] &"'"
Bis dahin funktioniert es einwandfrei.

Jetzt möchte ich, dass beim Button drücken um eben genau dieses Formular zu öffnen ein Wert in ein Textfeld geschrieben wird.

Dazu habe ich als neue Aktion "CodeAusführen" ausgewählt und folgendes rein geschrieben:
Me!Status= "angelegt"

Wäre ja zu einfach gewesen wenn das funktioniert hätte. ;-)

Gerne hätte ich das ganze auch komplett über eine Code gemacht.
Das ganze sieht so aus.

Me!Status= "angelegt"
DoCmd.OpenForm "Projekt Ändern"

Immerhin funktioniert das schonmal.
Es schleift nur daran, dass er nicht den Datensatz öffnet und den Status ändert, den ich gerade angewählt habe, sondern nat. nur den ersten Datensatz.

Gruß, Daniel

Muss mich berichtigen, den Status ändert er, aber der Aktuelle Datensatz wird nicht geöffnet.

Atrus2711
13.07.2012, 11:54
Du öffnest ein Formular, ok.
Dann willst du einen Wert in ein Textfeld schreiben.

ist dieses Textfeld im "neuen" Form oder im alten?
Ist das Textfeld gebunden oder nicht?

Dekay1986
15.07.2012, 10:35
Es ist ein gebundenes Textfeld.
Beide Formulare greifen auf meine Projekt-Tabelle und die Status-Spalte zu.
Es ist in beiden Formularen das Status-Textfeld zu sehen.
Ich möchte quasi den selben Datensatz im zweiten Formular öffnen und mit dem öffnen des Formulares soll mein Standartwert ("neu") der im Textfeld Status steht durch "angelegt" ersetzt werden.

Atrus2711
16.07.2012, 08:36
Damit änderst du beim Aufruf Werte! Ob das Sinn der Sache ist?! Wäre es nicht sinnvoller, am Ende der Bearbeitung des zweiten Formulars den Wert zu ändern?

Und selbst wenn ja, müsste das Formular erst geöffnet, und dann der Wert geändert werden.

Dekay1986
16.07.2012, 09:13
Es muss leider durch das drücken des Buttons zum öffnen des Formualres passieren.
Das Forumlar was dann geöffnet wird, wird auch an einer anderen Stelle in der Datenbank verwendet und der Status "angelegt" wird später nochmal auf "in Bearbeitung" und "fertig" geändert.

Aktuell ist es so, dass ich in meinem ersten Formular wo der Status "neu" vorliegt ein Kombifeld habe, wo man auf angelegt umstellen kann.
Das ist aber so nicht gewünscht und soll eben autom. passieren.
Nämlich dann, wenn ich das "neue" Projekt anlege und Daten vervollständige.

Atrus2711
16.07.2012, 09:16
Nämlich dann, wenn ich das "neue" Projekt anlege und Daten vervollständige.
Ja eben. "Am Ende des Neuanlegens". Sprich: AfterUpdate des Neuanlageforms.

Dekay1986
16.07.2012, 09:28
Ja das ist so schon richtig.
Aber das problem ist, dass mein Formular "Projekt ändern" aufgerufen wird und dieses auch an anderen Stellen aufgerufen werden kann.
D.h. immer wenn ich mein "Projekt ändern" Formular öffne und dort was bearbeite, wird der Status auf angelegt geändert.
Das darf es aber nicht, da ja auch Änderungen möglich sind, wenn das Projekt schon in Bearbeitung ist.

Dann würde der "in Bearbeitung" Status in angelegt geändert werden, was aber nicht passieren soll/darf.

Atrus2711
16.07.2012, 09:32
Du könntest dem Formular z.B. über OpenArgs eine Info mitgeben, "als was es geöffnet wird" (zum Neuanlagen oder zum Ändern). Und diese Info könnte dann auch AfterUpdate ausgewertet werden, um einzutragen, was passiert ist.

Dekay1986
16.07.2012, 09:40
Wenn ich folgendes "beim klicken" als Ereignisprozedur eingebe:

Me!Status= "angelegt"
DoCmd.OpenForm "Projekt Ändern"

Macht er aus meinem "neu" ein "angelegt" und öffnet mir das entsprechende Formular.

Kann ich da nicht einfach nen Code dran hängen, der mir auch den richtigen Datensatz im nächsten Formular öffnet?

Also Makro funktioniert das ja mit der Bedinung:
=="[Projekt]=" &"'" & [KombiProjekt] &"'"

Atrus2711
16.07.2012, 09:45
Me!Status= "angelegt"
ändert den aktuellen Satz im derzeitigen Formular. Es ging doch um eine Änderung im Formular "Projekt ändern". Das ist aber hier noch gaer nicht geöffnet!
DoCmd.OpenForm "Projekt Ändern"
öffnet dieses Formular und zeigt alle seine Sätze. Wenn du da ein Kriterium übergeben willst, kannst du das als Bedingung formulieren:
docmd.OpenForm "Projekt Ändern",,,"Tabellenfeld = " & Forms!ErstesFormular!TextfeldMitVergleichswert

Diese Bediungng muss also etwas ergeben in der Art von "Projekt = 4712" o.ä.

Dekay1986
16.07.2012, 09:53
Glaub da habe ich mich schlecht ausgedrückt.
Wo der Status geändert wird ist egal.
Wichtig ist nur, dass der Status auf angelegt geändert ist, sobald ich ihn bearbeite.
In meinem ersten Formular habe ich nur die möglichkeit, unter allen meinen neuen Projekten (gefiltert nach Status "neu") einen zu wählen und diesen in meinem "ProjektÄndern" Formular zu öffnen.

Ist das verständlich?

Ich versuch mich mal am Code :)

Dekay1986
16.07.2012, 10:05
Private Sub Befehl36_Click()
Me!Status = "angelegt"
DoCmd.OpenForm "Projekt Ändern",,,"Projekt = " & Forms!Projekt Übernehmen!Projekt
End Sub

Projekt Ändern ist mein Formular was geöffnet werden soll.
Projekt ist der Name meiner Tabelle in der alle Werte stehen.
Projekt Übernehmen ist das Formular in dem ich mich momentan befinden, aus dem heraus "Projekt Ändern" geöffnet werden soll.
Und Projekt ist mein Vergleichswert. Dieser ist im Formular "Projekt Übernehmen" und "Projekt Ändern" vorhanden.

Fehler beim Kompilieren --> Syntaxfehler sagt er mir da

Atrus2711
16.07.2012, 10:10
Namen mit Leerzeichen sollten eckig eingeklammert oder besser ganz vermieden werden.

Dekay1986
16.07.2012, 10:21
Ja das weiß ich, hatte ich aber leider erst zu spät erfahren.

Jetzt sagt er mir Laufzeitfehler 3464 Datentypenkonflikt in Kriterienausdruck.

DoCmd.OpenForm "Projekt ändern", , , "Projekt = " & Forms![Übernehmen Projekt]!Projekt

Auch mit [Projekt ändern] funktioniert es nicht :(

Atrus2711
16.07.2012, 10:24
Welchen Datentyp hat das Feld Projekt?
Heißt dein Formular nun Projekt übernehmen oder Übernehmen Projekt?

Dekay1986
16.07.2012, 10:27
Das Formular heißt "Übernehmen Projekt" soll aber "Projekt Übernehmen" heißen ;).
(hatte Ursprünglich 2 Formulare und eins davon gelöscht)

Der Datentyp von Projekt ist "Text".

Atrus2711
16.07.2012, 10:31
Wenns ein Textfeld ist, muss der Vergleichswert als Text gekennzeichnet sein.
DoCmd.OpenForm "Projekt ändern", , , "Projekt = '" & Forms![Übernehmen Projekt]!Projekt & "'"
Den richtigen Formularnamen (fett) kennst nur du...

Dekay1986
16.07.2012, 10:36
Siehe unten

Dekay1986
16.07.2012, 10:37
Ja den kenne nur ich.
Hab ihn nun auf ProjektÜbernehmen geändert. ;)

Ist es denn auch ratsam ä,ö,ü zu vermeiden?

DoCmd.OpenForm "Projekt ändern", , , "Projekt = '" & Forms![ProjektÜbernehmen]!Projekt & "'"

Wäre der Datentyp "Zahl" gewesen, hätte ich da den anderen Code verwenden können?


Ps.: Es funktioniert nat. wie gewollt

Atrus2711
16.07.2012, 10:39
Ist es denn auch ratsam ä,ö,ü zu vermeiden?
Es könnte Probleme auf anderssprachlichen Systemen verhindern. Aber "auf deutsch" klappts soweit ich weiß.

Wäre der Datentyp "Zahl" gewesen, hätte ich da den anderen Code verwenden können?
Ja.

Dekay1986
16.07.2012, 10:49
Okay dann gewöhn ich mir vorallem Leerzeichen ab und muss mir allgemein eine ordentliche Namensvergabe angewöhnen.
Ist anfangs garnicht so einfach da nen grünen Faden rein zu bringen.
Aber lässt sich ja zum glück alles ändern ;).

Danke Dir :)

Atrus2711
16.07.2012, 10:51
Ändern ist aufwendig, weil nicht alle Bezüge auf die alten Namen erkannt und umgestellt werden können. Außerdem: Arbeit vermeiden, wo immer es geht. :)

Zum Thema gute Namen: http://www.donkarl.com?FAQ1.5

Dekay1986
16.07.2012, 11:00
Ja der Aufwand ist doch relativ groß, war ja bei ProjektÜbernehmen schon einiges zu ändern.

In Zukunft mach ich das besser ;).
DonKarls ist an vielen Stellen sehr hilfreich.
Werd mir mal ne Tabelle mit der Namensvergebung (mit Exel ;) ) machen.

Vielen Dank.

Hab noch ne ganz kniffliche Sache wo ich nicht ganz weiter komme.
Aber da versuch ich mich noch nen bisschen selbst bevor ich um Hilfe bitte :)

Atrus2711
17.07.2012, 07:24
Josefs Fehlervermeidungstipps sind ebenfalls hilfreich, um solche Fallstricke zu mgehen. Siehe "Josefs AccEPT" in meiner Signatur.

Dekay1986
17.07.2012, 19:38
Hallo und nun schreibe ich doch.
Ich habe ein Kombinationsfeld, in dem ich alle meine Projekte anzeigen kann.
Über einen Button möchte ich ermöglichen, verschieden Werte aus den Projekten des Kombinationsfeldes in meinen Aktuellen Datensatz zu übernehmen.
Sinn und Zweck der ganzen Sache ist, neue Projekte mit Daten aus alten Projekten zu füllen, die dem neuen Projekt ähnlich sind.

Dabei handelt es sich um den Inhalt von Insgesamt 18 Feldern.
AG1-AG9 und Zeit1 bis Zeit9

Private Sub Befehl42_Click()
With Me.KombiWerte
Me.AG1 = .Column(3)
Me.AG2 = .Column(4)
.....
Me.Zeit1 = .Column(12)
Me.Zeit2 = .Column(13)
.....
End With
End Sub

Das ganze funktioniert auch sehr gut.
Allerdings nur bis zu der Stelle, wo die Daten die übernommen werden komplett ausgefüllt sind.
Wenn es für AG5-AG9 (u. Zeit5-Zeit9) keinen Wert gibt, dann gibt er mir nen Laufzeitfehler und Feld 'Projekt.AG2' darf keine Zeichenfolge der länge 0 sein.

Macht ja auch Sinn,.. denn wo kein Wert ist, kann auch keiner übernommen werden.
Hatte das ganze schon mit weniger Werten in einer Test_DB probiert, da hatte es funktioniert. Erst jetzt wo es um 18 Werte geht gibt es Probleme.

Atrus2711
18.07.2012, 11:39
Da werden die Felder in der Zieltabelle vermutlich

Leere Zeichenfolgen ablehnen
durch Gültigkeitsregeln das Ausfüllen verlangen
durch Pfichtfelder (Eingabe erforderlich) das Ausfüllen verlangen

Guck halt mal nach in den Feldern, die bemeckert werden.

Dekay1986
18.07.2012, 11:54
Merkwürdig, hatte das schon probiert die leere Zeichenfolge auf ja zu setzen -->der Fehler kam noch.
Jetzt klappt es doch.
Daran lag es. Vielen Dank :)


PS.: Hab mir Josefs Site angeschaut,... auch sehr hilfreich.
Werd mir wohl allgemein mal alle links in deiner Signatur anschaun.
Hilfe zur Selbsthilfe ;)

Vielen Dank

Dekay1986
23.07.2012, 12:06
Hallo und nun habe ich doch wieder ein Problem und weiß nicht weiter.
Ich habe eine Fehlermeldung:

Schreibkonflikt

Dieser Datensatz wurde seit Beginn der Bearbeitung von einem anderen Benutzer geändert. Wenn Sie den Datensatz speichern, werden Sie die Änderungen des anderen Benutzers überschreiben.

Kopieren Ihrer Änderungen in die Zwischenablage ermöglicht es Ihnen, die Änderungen des anderen Benutzers anzusehen und dann Ihre Änderungen einzufügen, wenn Sie es wünschen.

Kannst Du mir sagen wo das her kommt und was ich da machen kann?

Dekay1986
23.07.2012, 12:27
Das Problem tritt immer in einem Formular auf.
Auch wenn dieses mit anderen zusammen geschlossen werden soll.
Habe den Code jetzt so geändert, dass wenn ich von dem Formular aus ein anderes öffne, dieses gleich mit geschlossen wird.
Da tritt der Fehler nicht auf.
Aber das kann ja nicht die Lösung sein.
Hab irgendwas von Recordset gelesen?!

maikek
23.07.2012, 13:04
Moin,
mach für ein neues Problem besser auch einen neuen Thread auf, dadurch erhöhst du deine Chance, dass jemand sich das ansieht.
maike

Atrus2711
23.07.2012, 13:21
Der Fehler kommt gerne, wenn zwei Datenänderungen konkurrieren. Meist ist sowas bedingt durch eine manuelle Änderung in eiem gebundenen Formular (= User A) und eine parallel laufende Änderung per Recordset oder Aktualisierungsabfrage (=User B).

Ob und wo du so eine Kollision eingebaut hast, weißt nur du (bzw. dein Code, den du nicht zeigst).

Dekay1986
23.07.2012, 19:45
Blöder weise weiß ich nicht welche Code das sein könnte.

Vermutlich kommt es irgendwo hier her:


Option Compare Database
Dim strKriterien As String

Private Sub suchen()
Dim aryKriterien() As String
Dim lngKriterien As Long


'Vorname: Textvergleich, resultierende Bedingung z.B. Vorname = 'Lutz'
If Len(Nz(Me!KombiAuswahl)) > 0 Then 'wenn benutzt,
ReDim Preserve aryKriterien(lngKriterien) 'Stapel erweitern,
aryKriterien(lngKriterien) = "Bearbeiter = '" & Me!KombiAuswahl & "'" 'Kriterium auf Stapel legen
lngKriterien = lngKriterien + 1 'Zähler für Stapel erhöhen
End If

If Len(Nz(Me!KombiStatus)) > 0 Then 'wenn benutzt,
ReDim Preserve aryKriterien(lngKriterien) 'Stapel erweitern,
aryKriterien(lngKriterien) = "Status = '" & Me!KombiStatus & "'" 'Kriterium auf Stapel legen
lngKriterien = lngKriterien + 1 'Zähler für Stapel erhöhen
End If


'ggf. weitere Kriterien hier analog einbauen

'Kriterienstapel vereinen
strKriterien = Join(aryKriterien, " AND ")

'Datenquelle des Formulars einstellen (wird im Listenfeld mit aktualisiert)
If Len(strKriterien) = 0 Then
Me.Liste31.RowSource = "SELECT Projekt, Stück, Bezeichnung, [Werkzeug-Nr], Benennung, Art, [Termin-K], [Termin-W] FROM Projekt"
Me.filter = ""
Me.FilterOn = False
Else
Me.Liste31.RowSource = "SELECT Projekt, Stück, Bezeichnung, [Werkzeug-Nr], Benennung, Art, [Termin-K], [Termin-W] FROM Projekt WHERE " & strKriterien
Me.filter = strKriterien
Me.FilterOn = True
End If

End Sub

Private Sub Befehl36_Click()
Me!Status = "angelegt"
DoCmd.OpenForm "Projekt ändern", , , "Projekt = '" & Forms![ProjektÜbernehmen]!Projekt & "'"
DoCmd.Close acForm, "ProjektÜbernehmen" --> durch schließen dieses Formulares habe ich die Fehlermeldung nicht mehr

End Sub

Private Sub Form_Open(Cancel As Integer)
Me!Liste31.RowSource = "Select Projekt, Stück, Bezeichnung, [Werkzeug-Nr], Benennung, Art, [Termin-K], [Termin-W] FROM Projekt WHERE Bearbeiter = 'Heinrich' AND Status ='neu'"

End Sub

Private Sub KombiAuswahl_AfterUpdate()
suchen
End Sub

Private Sub KombiStatus_AfterUpdate()
suchen
End Sub

Private Sub Liste31_DblClick(Cancel As Integer)
Me!Projekt.SetFocus
DoCmd.FindRecord Me!Liste31
Me!Liste31.SetFocus
End Sub

Atrus2711
24.07.2012, 08:05
Vom gezeigten Code dürfte nichts ursächlich sein. <strike>Die Routine Suchen hast du allerdings geheimgehalten</strike>Edit: habs gefunden, sorry. Da dürfte nichts ursächlich sein.

Dekay1986
24.07.2012, 09:06
Was meinst du denn mit Routine Suchen?

Maxel
24.07.2012, 09:12
Was meinst du denn mit Routine Suchen?
Martin meint Deine Sub suchen(). Hat er wohl übersehen...

Dekay1986
24.07.2012, 10:41
Okay ;) .
Tja keine Ahnung was da los ist,... aber wie gesagt, durch das schließen des Formulares "ProjektÜbernehmen" funktioniert es ja auch.
Dennoch ist es komisch das dieser Fehler von jetzt auf gleich aufgetreten ist.
Ich habe nichts aufälliges gemacht.

Die letze Änderung die ich gemacht hatte waren diese 3 Codes.

Private Sub Befehl395_Click()
On Error GoTo Err_Bericht_Click

Const cstrReport As String = "Bericht"
DoCmd.OpenReport "Bericht", acViewNormal, _
, "[Projekt]='" & Me.Projekt & "'"
DoCmd.OpenReport "Bericht", acViewNormal, _
, "[Projekt]='" & Me.Projekt & "'"
DoCmd.Close acForm, "Kalkulation"
DoCmd.Close acForm, "Projekt ändern"
DoCmd.Close acForm, "ProjektÜbernehmen"
Exit_Bericht_Click:
Exit Sub
Err_Bericht_Click:
MsgBox Err.Description
Resume Exit_Bericht_Click
End Sub



Private Sub Befehl396_Click()

On Error GoTo Err_Bericht_Click

Const cstrReport As String = "Bericht"
DoCmd.OpenReport "Bericht", acViewNormal, _
, "[Projekt]='" & Me.Projekt & "'"
DoCmd.OpenReport "Bericht", acViewNormal, _
, "[Projekt]='" & Me.Projekt & "'"
DoCmd.OpenReport "Bericht", acViewNormal, _
, "[Projekt]='" & Me.Projekt & "'"
DoCmd.Close acForm, "Kalkulation"
DoCmd.Close acForm, "Projekt ändern"
DoCmd.Close acForm, "ProjektÜbernehmen"

Exit_Bericht_Click:
Exit Sub
Err_Bericht_Click:
MsgBox Err.Description
Resume Exit_Bericht_Click

End Sub

Private Sub Befehl389_Click()
On Error GoTo Err_Bericht_Click
Dim stDocName As String
stDocName = "Bericht"
strKriterien = "[Projekt]='" & Me![Projekt] & "'"
'Bericht Öffnen
If Len(strKriterien) = 0 Then
DoCmd.OpenReport stDocName, acNormal
Else
DoCmd.OpenReport stDocName, acNormal, , strKriterien
End If
DoCmd.Close acForm, "Kalkulation"
DoCmd.Close acForm, "Projekt ändern"
DoCmd.Close acForm, "ProjektÜbernehmen"
Exit_Bericht_Click:
Exit Sub
Err_Bericht_Click:
MsgBox Err.Description
Resume Exit_Bericht_Click
End Sub

Atrus2711
24.07.2012, 10:50
Mal andersrum gefragt: wo arbeitest du denn mit Recordsets? Könnte dort dann eine manuelle Eingabe dazwischenfunken?

Dekay1986
24.07.2012, 11:35
Das ist eine sehr gute Frage.
Eigentlich an keiner Stelle.
Das Problem trat erst auf, nachdem ich Buttons für das 2mailge drucken erstellt hatte.
Hab grad alles durchgeschaut was irgendwie damit zusammen hängt.
Recordset wird an keiner stelle verwendet.

Atrus2711
24.07.2012, 12:03
Wird irgendwo per Code ein gebundenes Steuerelement mit einem Wert belegt?

Dekay1986
24.07.2012, 12:05
Es gibt beim erstellen eines Projektes den Standartwert "neu" für den Status.
Und im fehlerhaften Formular wird dieser durch "angelegt" ersetzt.

Atrus2711
24.07.2012, 12:08
Evtl. ist das der Fehler. Teste es mal durch "Auskommentieren" der Zeile und erneuten Versuch.

Dekay1986
24.07.2012, 12:27
Das ist tatsächlich der Fehler.
Nur frag ich mich warum das jetzt erst kommt.
Bis vor kurzem Funktionierte das super und ohne Probleme.
Hatte den Standartwert nun direkt in der Tabelle gesetzt (vorher hatte ichs im direkt aus dem Formular heraus im textfeld gemacht.

Bei beiden fällen passiert das.

Wie kann ich dieses Problem beheben oder reicht es denn aus wie es jetzt ist, dass das formular einfach geschlossen wird.
Da meldet er auch keinen fehler.

Atrus2711
24.07.2012, 12:44
Ein Standardwert ändert aber keine Daten, jedenfalls nicht, wenn er über die gleichnamige Eigenschaft gesetzt wurde. Wenn du jedoch irgendwo einen Feldwert automatisch überschreibst, dann ist das keine Standardwert, sondern eine automatische Datenänderung. Und die kann dann mit der manuellen Datenänderung kollidieren.

Ich meine mich zu erinnern, dass wir auch dadrüber damals diskutiert hatten.

Dekay1986
24.07.2012, 14:23
Ja das hattest du schonmal angeprochen.
Es hatte halt bis jetzt funktioniert deswegen ist das bisschen merkwürdig.
Aber nuja,... ich experimentier mal ein bisschen rum und schreibe ggfs. nochmal.
Danke Dir erst einmal :)

Dekay1986
08.08.2012, 12:07
Hallo und schon wieder eine Frage.

Ich habe ein Formular, in dem ich meine Datensätze Filter.
Speziell möchte ich alle Datensätze anzeigen, die den Status erledigt, neu und angelegt haben. (Dazu 3 Kombifelder)
Folgenden Code verwende ich dazu und es funktioniert auch sehr gut.

Private Sub suchen()
Dim aryKriterien() As String
Dim lngKriterien As Long


'Vorname: Textvergleich, resultierende Bedingung z.B. Vorname = 'Lutz'
If Len(Nz(Me!KombiStatus)) > 0 Then 'wenn benutzt,
ReDim Preserve aryKriterien(lngKriterien) 'Stapel erweitern,
aryKriterien(lngKriterien) = "Status = '" & Me!KombiStatus & "'" 'Kriterium auf Stapel legen
lngKriterien = lngKriterien + 1 'Zähler für Stapel erhöhen
End If

If Len(Nz(Me!KombiStatus1)) > 0 Then 'wenn benutzt,
ReDim Preserve aryKriterien(lngKriterien) 'Stapel erweitern,
aryKriterien(lngKriterien) = "Status = '" & Me!KombiStatus1 & "'" 'Kriterium auf Stapel legen
lngKriterien = lngKriterien + 1 'Zähler für Stapel erhöhen
End If

If Len(Nz(Me!KombiStatus2)) > 0 Then 'wenn benutzt,
ReDim Preserve aryKriterien(lngKriterien) 'Stapel erweitern,
aryKriterien(lngKriterien) = "Status = '" & Me!KombiStatus2 & "'" 'Kriterium auf Stapel legen
lngKriterien = lngKriterien + 1 'Zähler für Stapel erhöhen
End If

'ggf. weitere Kriterien hier analog einbauen

'Kriterienstapel vereinen
strKriterien = Join(aryKriterien, " OR ")

'Datenquelle des Formulars einstellen (wird im Listenfeld mit aktualisiert)
If Len(strKriterien) = 0 Then
Me.RecordSource = "SELECT * FROM Projekt1"
Else
Me.RecordSource = "SELECT * FROM Projekt1 WHERE " & strKriterien
End If

End Sub

Jetzt möchte ich aber zusätzlich noch noch einen Filter setzen, um aktive und inaktive Datensätze zu filtern.

Setze ich den Code in den Aktuellen mit ein, filtert er nat. alle raus, mit Status erledigt, neu angelegt und zusätzlich alle aktiven bzw. inaktiven.
Ich möchte aber nat. nur die Aktiven Datensätze die erledigt, neu oder angelegt sind.
Habe versucht den Filter mit AND zu verwenden, aber da nutz er beim öffnen des berichtes immer den Filter den ich als letztes gewählt habe)

Gibt es einen Möglichkeit, dass er mir vor anfang an beim öffnen des Formulares gleich alle Datensätze nach aktiv oder inaktiv Filtert und dieser Filter die ganze Zeit gesetzt bleibt?

Gruß, Daniel

Atrus2711
08.08.2012, 12:13
Das Aktiv/Inaktiv-Kennzeichen müsste sich als UND-Kriterium mit den bisherigen OR-Kriterien verbinden.

Es müsste sich etwas ergeben in der Art von strKriterium = "Aktiv = True AND (...), wo bei der Klammerinhalt das ist, was der bisherige Code ermittelt.

Erkennst du, was also zu tun ist?

Dekay1986
08.08.2012, 12:26
Ich habe es gerade mit einer Abfrage probiert, die beim öffnen des Formulares ausgeführt wird und nur nach aktiven Filtert.
Dieser Filter geht aber verloren, sobald ich einen anderen Filter setze.

Nein steig leider nicht wirklich dahinter.
Das mit dem OR und AND weiß ich.
Habe mich aber glaub ich auch ein bisschen falsch ausgedrückt.
Ich habe 2 Spalten.
Spalte 1: Status (erledigt, neu, angelegt)
Spalte 2: WaStatus (aktiv, inaktiv)

Ich möchte also bevor ich nach Status (neu, erledigt...) Filter einen festen Filter "nur aktive Datensätze" Filtern.

Ein Code den ich "beim öffnen" des Formulares ausführe um meine Spalte "WaStatus" nach aktiven zu Filtern wäre mein Lösungsansatz.

Atrus2711
08.08.2012, 12:33
Es gibt nur ein Gesamtkriterium. Das bestand bisher aus den Elementen, die der bisherige Code liefert und die allesamt als Alternativen galten (OR-Kriterium). Jetzt kommt ein neues Teilkriterium dazu, dass die alten Kriterien auf die von mir gezeigte Weise ergänzt und den Filter so strenger macht.

Versuche, das für einen gegebenen Beispielfall testweise im Code hardzucodieren:

'...
'Kriterienstapel der Alternativen vereinen, wie bisher
strKriterien = Join(aryKriterien, " OR ")
'Statuskriterium ergänzen
strKriterien = "Status = 'Neu' AND (" & strKriterien & ")"
'...

Dekay1986
08.08.2012, 12:45
Das Filtern funktioniert nun super.
Er Filtert allgemein nach aktiv und zusätzlich nach erledigt, neu und angelegt.

Einziges Problem ist, wenn ich alle Fitler entferne.
Macht er mir einen Laufzeitfehler 3075.
Syntaxfehler (fehlenderOperator) in Abfrageausdruck 'WAStatus = 'aktiv' AnD ()'

Beim debuggen verweisst er auf:
'Datenquelle des Formulars einstellen (wird im Listenfeld mit aktualisiert)
If Len(strKriterien) = 0 Then
Me.RecordSource = "SELECT * FROM Projekt1"
Else
Me.RecordSource = "SELECT * FROM Projekt1 WHERE " & strKriterien End If

Wenn ich bei der Fehlermeldung auf "Beenden" gehe wird aber trotzdem ordentlich gefiltert.
(Nämlich nach allen "aktive" Datensätzen.

Maxel
08.08.2012, 12:52
Du wirst die Länge von strKriterien abfragen müssen und danach entscheiden, ob der ersten Filterbedingung eine zweite per " AND (...)" folgen soll.

Atrus2711
08.08.2012, 12:54
Das war ja auch nur ein Beispiel , kein einsatzreifer Code. Ich wollte zum Nachdenken anregen, zum Forschen nach Ähnlichkeiten...

Du wirst schon prüfen müssen, ob der Status überhaupt vom User als Kriterium genutzt wurde. So, wie du das bei den anderen Kriterien auch schon getan hast... (hint hint)

Wenn ja, kommt das Kriterium dazu.
Wenn nein, gelten nur die "alten" Kriterien.

Dekay1986
08.08.2012, 13:02
Dann werd ich mal mein Glück versuchen.
Danke Dir erst einmal. :)