Hallo Forum,
ich hab zu dem thema zwar einiges gefunden, nur leider überhaupt nicht umsetzen können, da ich so gut wie keine vba und kaum access-wissen habe.
denn muss ich es leider irgendwie hinbekommen.
also ich hab eine abfrage bei der mir verschiede obstsorten mit den dazugehörigen kennzahlen angezeigt werden.
wenn ich jetzt bei den kriterien in der abfrage einfach "neue äpfel" setzte, zeigt er mir diese auch an. wenn ich "neue äpfel oder neue birnen" setzte, zeigt er mir auch die beiden an.
nun möchte ich aber, dass der eingeber aus einer liste mehrer auswählen kann und damit automatisch dieses kriterium setzt.
wie mach ich das am besten? wie les ich die ID´s aus der Liste aus, und was schreib ich als kriterium in die Abfrage?
hab wirklich leider kaum ahnung von vba etc...
Vielen Dank schon mal im Voraus!
Liebe grüße
Hallo,
vielleicht kommst Du mit dem Steuerelement-Assistenten klar.
Erzeug ein Kombifeld (im Formularkopf) und definiere das als Suchkombi. (falls diese Assistent-Funktion noch in Deiner Version vorhanden ist)
Ansonsten mußt Du Dich ein bißschen mit VBA beschäftigen.
Speziell " aus einer liste mehrer auswählen kann und damit automatisch dieses kriterium setzt. " geht nicht so ganz ohne VBA.
danke für deine schnelle antwort,
aber mit dem suchkombi ist es mir ja dann nicht möglich mehr sachen auszuwählen!?
ja ich bin vba auch nicht abgeneigt und hab auch schon einges damit gespielt. nur im wirklichen verstehen tu ich mir halt schwer. oft scheiterts daran, wo gehört welcher code hin oder wenn ich den code für das auslesen der liste habe, was ich dann im kriterium der abfrage schreibe.
hab das so deutlich gemacht, weil ich shcon viele beiträge gelesen habe in denen einfach nur ein code als antwort gepostet wird, was mir so ohne weiteres eher weniger bringen würde....
Hallo,
mit einem Kombi ist keine Mehrfachauswahl möglich.
ok, lad die DB (A2003-Version) mal hier hoch, gezippt und evtl. datenreduziert, dann kann ich (oder jemand Anderer) ein Listenfeld zwecks Mehrfachauswahl zur Suche einbauen.
Danke für deine Hilfe,
also hier jetzt mal die kleine beispielDB.
in der abfrage "qry_lagerung" soll jetzt im feld "obstid" genau die werte angzeigt werden, die alle in der Liste im Formular in "frm_obstwahl" markiert werden.
wie mach ich das am geschicktesten?
Vielen lieben Dank! :)
[Anhang gelöscht durch Administrator]
Hallo,
anbei..
[Anhang gelöscht durch Administrator]
danke schön, das hat mir schon ein klein wenig weitergeholfen.
aber das genau das angesprochene problem, so ganz umsetzen kann ich es einfach nicht.
du hast jetzt das formular an eine abfrage gebunden oder?
ich hab in meiner großen datenbank aber ein ungebundendes HF, darin ein UF das an die Abfrage gebunden ist. Ich wollte nun das die Abfrage das ergebnis liefert aus den in zwei textfeldern im HF eingegeben kriterien sowie die kriterien aus der im HF befindliche Liste.
im beispiel hab ichs jetzt mal richtig aufgebaut. tut mir leid das ich das nicht gleich so gemacht habe, dachte ich würde den transfer dann schaffen... allerdings hab ich mich da getäuscht...
[Anhang gelöscht durch Administrator]
Hallo,
naja, ok...
und auf was soll sich im Form jeweils "Ref ..." beziehen?
[Anhang gelöscht durch Administrator]
Hier soll das kriterium für die referenznummern eingetragen werden.
die werden immer gruppenweise abefragt, z.b. von 0 bis 4 oder von 4 bis 7 usw...
des wird dann in der abfrage über Zwischen [formulare]![frm_obstwahl]![txt_von] Und [Formulare]![frm_obstwahl]![txt_bis]
eingefügt.
ja das funktioniert ja ganz gut, nur das mit der mehrfachauswahl aus der liste ist eben das große problem.
Habe die DB an mein letztes Posting angehängt.
"nur das mit der mehrfachauswahl aus der liste ist eben das große problem."
ja, das ist mir klar, und sowas geht auch nicht als Kriteriumsangabe im Abfrageentwurf.
Ok, danke schön für deine hilfe. hast mich schon ein schritt weiter gebracht.
in meiner großen ursprungs-DB klappts aber immer noch nicht, da muss ich wohl noch ein wenig rumprobieren....
wenn das feld "ref" jetzt keine referenzkennung wär, sondern ein Datum, muss ich da etwas im code ändern?
hab diese beispiel mit der art von auswahl öfter in meiner DB.
Hallo,
wie wär's, wenn Du mal den entspr. Teil der "großen" DB genau so wie er ist extrahierst und hier hereinstellst. ? ::)
Das Generieren von Ähnlichkeits-Lösungen, die eh nicht verwendet werden, macht keinen Spaß..
Hallo,
es ist genau der Teil extrahiert.
das einzige was anders ist, ist das in mehreren formularen genau dieser extrahierte teil vorkommt.
darum meine frage wegen dem datum
Hallo,
dann halt die von/bis-Textfeldwerte in das ISO-Datum konvertieren und den Where-Condition-string passend zusammenbauen:
strKrit1 = " DatumsfeldInDerTabelle between " & Format ( Nz(Me!txt_von, #01/01/1900#),"\#yyyy-mm-dd\#") & " and " & Format(Nz(Me!txt_bis, #12/31/2100#),"\#yyyy-mm-dd\#")
Morgen,
also danke für deine Hilfe, es funktioniert soweit ganz gut, nur an einer stelle nicht, und ich versteh nicht warum:
ich hab jeweils den code immer angepasst, mit der sql von den jeweiligen abfragen, und den formularnamen im code auch angepasst:
Dim strKrit As String, strKrit1 As String, itm, strSQL As String
strSQL = "SELECT tbl_farbe.fname, tbl_kennungen.kbez, tbl_eingabe_detail.erfassungswert, tbl_kennungen.kennid, tbl_farbe.fid, tbl_eingabe.e_datum" & _
"FROM tbl_kennungen INNER JOIN (tbl_farbe INNER JOIN (tbl_eingabe INNER JOIN tbl_eingabe_detail ON tbl_eingabe.eid = tbl_eingabe_detail.erfassung) ON tbl_farbe.fid = tbl_eingabe.firma) ON tbl_kennungen.kennid = tbl_eingabe_detail.kennzahl" & _
"ORDER BY tbl_kennungen.kennid"
For Each itm In Me!liste_kennungen.ItemsSelected
strKrit = strKrit & "," & Me!liste_kennungen.Column(0, itm)
Next
If Len(strKrit) > 1 Then
strKrit = " kennid In (" & Mid(strKrit, 2) & ")"
End If
strKrit1 = " e_datum between " & Format(Nz(Me!txt_datumvon, #1/1/1900#), "\#yyyy-mm-dd\#") & " and " & Format(Nz(Me!txt_datumbis, #12/31/2100#), "\#yyyy-mm-dd\#")
If Len(strKrit) > 1 Then
strKrit = strKrit & " and " & strKrit1
Else
strKrit = strKrit1
End If
strSQL = strSQL & " where " & strKrit
Debug.Print strKrit
Me!uf_zeitraum.Form.RecordSource = strSQL
erkennst du was falsches an dem code?
nach click auf button kommt die fehlermeldung, Syntaxfehler (fehlender Operator) im ausdruck....
und beim debuggen makiert er:
Me!uf_zeitraum.Form.RecordSource = strSQL
Danke nochmal, du hilfst mir sehr :)
Hallo,
es fehlen Leerzeichen vor "From" und "Order"
Schönen guten morgen,
tut mir leid das ich nochmal nachfragen muss, aber ich bekomm nach der lösung des ersten, gleich den zweiten fehler:
Monitoring kann das in Ihrem Ausdruck angesprochene Feld 'uf_zeitraum' nicht finden.
und beim debuggen makiert er die zeile im code:
Me!uf_zeitraum.Form.RecordSource = strSQL
hab geschaut, das uf heißt so und ist auch alles richtig geschrieben.
an was kann das liegen?
danke schön nochmal :)
Hallo,
WO hast Du geschaut?
Ich bin mir sicher, dass Du NICHT im Eigenschaftenfenster unter "Alle" im Eigenschaftenfeld "Name" bei markiertem UFO-Steuerelement nachgelesen hast. ;)
oh man danke, blöder tippfehler... sorry, ich weiß, is nich leicht mit mir ;)
aber wenn ich jetzt sag das wieder ein fehler kommt, gibts ärger oder? ;)
ich verstehs nicht. wenn ich den sql string nehme, eine abfrage draus mache funktioniert er einwandfrei. Wenn ich dann noch per hand das Kriterium In (1;2) eingebe, gibt er mir auch das richtige aus.
woran liegt sowas, dann dann der fehler siehe anhang kommt?
hier mal der sql string wenn ich ihn per hand in eine abfrage bau:
SELECT tbl_company.fname, tbl_figures.kbez, tbl_entry_detail.ewert, tbl_figures.kennid, tbl_company.fid, tbl_entry.e_datum
FROM tbl_figures INNER JOIN (tbl_company INNER JOIN (tbl_entry INNER JOIN tbl_entry_detail ON tbl_entry.eid = tbl_entry_detail.erfassung) ON tbl_company.fid = tbl_entry.firma) ON tbl_figures.kennid = tbl_entry_detail.kennzahl
WHERE (((tbl_figures.kennid) In (1,2)))
ORDER BY tbl_figures.kennid
und hier noch der ganze code:
Private Sub Befehl56_Click()
Dim strKrit As String, strKrit1 As String, itm, strSQL As String
strSQL = " SELECT tbl_company.fname, tbl_figures.kbez, tbl_entry_detail.ewert, tbl_figures.kennid, tbl_company.fid, tbl_entry.e_datum" & _
" FROM tbl_figures INNER JOIN (tbl_company INNER JOIN (tbl_entry INNER JOIN tbl_entry_detail ON tbl_entry.eid = tbl_entry_detail.erfassung) ON tbl_company.fid = tbl_entry.firma) ON tbl_figures.kennid = tbl_entry_detail.kennzahl" & _
" ORDER BY tbl_figures.kennid"
For Each itm In Me!liste_kennungen.ItemsSelected
strKrit = strKrit & ";" & Me!liste_kennungen.Column(0, itm)
Next
If Len(strKrit) > 1 Then
strKrit = " kennid In (" & Mid(strKrit, 2) & ")"
End If
strKrit1 = " e_datum between " & Format(Nz(Me!txt_datevon, #1/1/1900#), "\#dd.mm.yyyy\#") & " and " & Format(Nz(Me!txt_datebis, #12/31/2100#), "\#dd.mm.yyyy\#")
If Len(strKrit) > 1 Then
strKrit = strKrit & " and " & strKrit1
Else
strKrit = strKrit1
End If
strSQL = strSQL & " where " & strKrit
Debug.Print strKrit
Me!uf_timespace.Form.RecordSource = strSQL
End Sub
Bei Debuggen wird die letzte Zeile vor dem End Sub makiert.
Ich weiß, so laien wie ich sollten wohl die finger davon lassen ;)
[Anhang gelöscht durch Administrator]
Hallo,
naja, Ärger hast Du(!) ja schon ;D ;)
Jetzt ist es aber eine andere Fehlermeldung..
strKrit = strKrit & "," & Me!liste_kennungen.Column(0, itm)
Hallo,
das ändert leider nichts am Fehler.
bleibt der gleich :(
ich muss doch wohl jetzt nicht aufgeben?! so kurz vorm ziel
Hallo,
mhmm, debuggen mußt Du halt selber... --> Haltepunkt an den Code-Anfang setzen und mit F8 im Einzelschritt durch fahren. Bei jedem Statement die Variableninhalte prüfen, ob sie die erwarteten Werte haben.
Wie heißt jetzt die akt. Fehlermeldung (nicht nur die Fehlernummer)?
Schreib mal statt Debug.Print strKrit Debug.Print strSQL und kopiere den SQL-String aus dem Direktfenster hierher
Puh, jetz muss ich sagen war ich schon etwas überfordert...
Also, ich hab das mit F8 mal probiert, aber glaub ich nicht hinbekommen, wie ich die werte prüf etc.
Fehler ist der gleiche wie im anghängten bild vorher. Steht ja der text auch dabei.
ich hab dir jetzt hier mal die datenbank meiner ganzen datenbanken ran gehängt, in die das rein soll.
damit du dich vllt mal besser rein finden kannst.
Es geht um das Formular "frm_timespace" und da im genauern um das Unterformular bei "sorty by Date" Hier soll eben wenn möglich die ausgewählten kennzahlen angezeigt werden.
Hilft das was?
[Anhang gelöscht durch Administrator]
Hallo,
es sind halt immer wieder andere Fehler...
so läuft der Code:
Private Sub Befehl56_Click()
Dim strKrit As String, strKrit1 As String, itm, strSQL As String
strSQL = " SELECT tbl_company.fname, tbl_figures.kbez, tbl_entry_detail.ewert, tbl_figures.kennid, tbl_company.fid, tbl_entry.e_datum" & _
" FROM tbl_figures INNER JOIN (tbl_company INNER JOIN (tbl_entry INNER JOIN tbl_entry_detail ON tbl_entry.eid = tbl_entry_detail.erfassung) ON tbl_company.fid = tbl_entry.firma) ON tbl_figures.kennid = tbl_entry_detail.kennzahl"
For Each itm In Me!liste_kennungen.ItemsSelected
strKrit = strKrit & "," & Me!liste_kennungen.Column(0, itm)
Next
If Len(strKrit) > 1 Then
strKrit = " kennid In (" & Mid(strKrit, 2) & ")"
End If
strKrit1 = " e_datum between " & Format(Nz(Me!txt_datevon, #1/1/1900#), "\#mm\/dd\/yyyy\#") & " and " & Format(Nz(Me!txt_datebis, #12/31/2100#), "\#mm\/dd\/yyyy\#")
If Len(strKrit) > 1 Then
strKrit = strKrit & " and " & strKrit1
Else
strKrit = strKrit1
End If
strSQL = strSQL & " where " & strKrit & " ORDER BY tbl_figures.kennid"
Debug.Print strSQL
Me!uf_timespace.Form.RecordSource = strSQL
End Sub
wobei im UF das Feld "Summevonewert" nicht im SQL-String vorkommt und demzufolge als fehlerhaft angezeigt wird.
Ich sehe aber auch nicht, was genau da eigentlich gemacht werden soll...
Vielleicht soll es so aussehen:
Private Sub Befehl56_Click()
Dim strKrit As String, strKrit1 As String, itm, strSQL As String
strSQL = " SELECT tbl_figures.kbez, sum(tbl_entry_detail.ewert) as Summevonewert " & _
" FROM tbl_figures INNER JOIN (tbl_company INNER JOIN (tbl_entry INNER JOIN tbl_entry_detail ON tbl_entry.eid = tbl_entry_detail.erfassung) ON tbl_company.fid = tbl_entry.firma) ON tbl_figures.kennid = tbl_entry_detail.kennzahl"
For Each itm In Me!liste_kennungen.ItemsSelected
strKrit = strKrit & "," & Me!liste_kennungen.Column(0, itm)
Next
If Len(strKrit) > 1 Then
strKrit = " kennid In (" & Mid(strKrit, 2) & ")"
End If
strKrit1 = " e_datum between " & Format(Nz(Me!txt_datevon, #1/1/1900#), "\#mm\/dd\/yyyy\#") & " and " & Format(Nz(Me!txt_datebis, #12/31/2100#), "\#mm\/dd\/yyyy\#")
If Len(strKrit) > 1 Then
strKrit = strKrit & " and " & strKrit1
Else
strKrit = strKrit1
End If
strSQL = strSQL & " where " & strKrit & " group BY tbl_figures.kbez"
Debug.Print strSQL
Me!uf_timespace.Form.RecordSource = strSQL
End Sub
Ja der zweite code scheint ganz gut sein :)
es soll zu jeder ausgewählten kennzahl einer firma, die summe über einen bestimmten zeitraum angezeigt werden.
was ich aber jetzt natürlich wieder im eifer des gefechts vergessen hab, ist das das ganze natürlich noch firmenabhängig sein müsse. also von wert, in dem der firmenname oben in der kombi gewählt wird.
wie füg ich das noch in den code ein? sowas wie [forms]![...] wirds ja da nicht geben oder?
Also leider hab ichs vergeblich versuchst einzubinden.
Hab es über die übliche verknüpfung zum kombifeld versucht [formular]![... was für VBA ja quatsch sein müsste.
Hab es dann auch mit sowas Me!.... versucht. Hat allerdings auch nicht den gewünschten effekt erzielt...
Wie bring ich denn so eine Abhängigkeit in den Code ein?
Das also nur die Werte für eine Firma mit der im Kombifeld bestimmten ID haben...
Hallo,
etwa so :
.
.
.
Private Sub Befehl56_Click()
Dim strKrit As String, strKrit1 As String, itm, strSQL As String
strSQL = " SELECT tbl_company.fname, tbl_figures.kbez, tbl_entry_detail.ewert, tbl_figures.kennid, tbl_company.fid, tbl_entry.e_datum" & _
" FROM tbl_figures INNER JOIN (tbl_company INNER JOIN (tbl_entry INNER JOIN tbl_entry_detail ON tbl_entry.eid = tbl_entry_detail.erfassung) ON tbl_company.fid = tbl_entry.firma) ON tbl_figures.kennid = tbl_entry_detail.kennzahl"
For Each itm In Me!liste_kennungen.ItemsSelected
strKrit = strKrit & "," & Me!liste_kennungen.Column(0, itm)
Next
If Len(strKrit) > 1 Then
strKrit = " kennid In (" & Mid(strKrit, 2) & ")"
End If
strKrit1 = " e_datum between " & Format(Nz(Me!txt_datevon, #1/1/1900#), "\#mm\/dd\/yyyy\#") & " and " & Format(Nz(Me!txt_datebis, #12/31/2100#), "\#mm\/dd\/yyyy\#")
If not isnull(Me!Kombi1) Then strKrit1 = strKrit1 & " and FirmaID=" & Me!Kombi1
If Len(strKrit) > 1 Then
strKrit = strKrit & " and " & strKrit1
Else
strKrit = strKrit1
End If
strSQL = strSQL & " where " & strKrit & " ORDER BY tbl_figures.kennid"
Debug.Print strSQL
Me!uf_timespace.Form.RecordSource = strSQL
End Sub
genau so dacht ich das mir.
Nur wie solls auch anders sein, jetzt Zeigt er mir im Feld Value "#Name?" anstatt der summe.
Ich seh zwar das er die richtige kennzahl auswählt, und auch die richtige anzahl an werten übernommen werden. Nur eben nicht die werte selber.
Hab versuch ein wenig rumzudoktern.
als erstes hab ich in der SQL anweisung aus "tbl_entry_detail.ewert" "sum(tbl_entry_detail.ewert)" gemacht um wieder die summe zu erhalten.
Prombt kommt die fehlermeldung "tbl_company.fname" ist nicht teil der aggregatfunktion.
Da ich das feld eigentlich nicht brauch hab ichs kurzer hand raus genommen.
Aber jetzt kommt der selbe fehler mit dem feld "tbl_figures.kbez"
Was mach ich schon wieder falsch?
Hallo,
habe den falschen Code als Vorlage genommen...
Es dreht sich ja jetzt nicht um den anfänglichen SQL-String, sondern um das Hinzufügen des Kombiwertes zu einem Kriterium..
Private Sub Befehl56_Click()
Dim strKrit As String, strKrit1 As String, itm, strSQL As String
strSQL = " SELECT tbl_figures.kbez, sum(tbl_entry_detail.ewert) as Summevonewert " & _
" FROM tbl_figures INNER JOIN (tbl_company INNER JOIN (tbl_entry INNER JOIN tbl_entry_detail ON tbl_entry.eid = tbl_entry_detail.erfassung) ON tbl_company.fid = tbl_entry.firma) ON tbl_figures.kennid = tbl_entry_detail.kennzahl"
For Each itm In Me!liste_kennungen.ItemsSelected
strKrit = strKrit & "," & Me!liste_kennungen.Column(0, itm)
Next
If Len(strKrit) > 1 Then
strKrit = " kennid In (" & Mid(strKrit, 2) & ")"
End If
strKrit1 = " e_datum between " & Format(Nz(Me!txt_datevon, #1/1/1900#), "\#mm\/dd\/yyyy\#") & " and " & Format(Nz(Me!txt_datebis, #12/31/2100#), "\#mm\/dd\/yyyy\#")
If not isnull(Me!Kombi1) Then strKrit1 = strKrit1 & " and FirmaID=" & Me!Kombi1 'Namen anpassen!!
If Len(strKrit) > 1 Then
strKrit = strKrit & " and " & strKrit1
Else
strKrit = strKrit1
End If
strSQL = strSQL & " where " & strKrit & " group BY tbl_figures.kbez"
Debug.Print strSQL
Me!uf_timespace.Form.RecordSource = strSQL
End Sub
Hallo,
ein dickes dickes Danke schön an dich :) so sieht das ganze sehr gut aus
Gibts diese Danke-Buttons noch? ;)
ein schönheitsfehler hätte ich noch, als ich es versucht hab kam mal wieder ein fehler^^
und zwar die ergebnisse nach dem feld "kennid" aufsteigend zu sortieren. Ich habs mit ORDER BY tbl_figures.kennid im SQL String versucht. das ging aber nicht...
Sorry aber bie VBA muss ich wirklich jeden kleinen mist nachfragen...
Hallo,
welchen Sinn hat es nach der KennID zu sortieren?
Die Abfrage gruppiert nach kbez und dabei geht die ID "verloren"
Wenn die ID und kbez "zusammengehören", kann evtl. dieses funktionieren:
.
.
strSQL = " SELECT tbl_figures.Kennid, tbl_figures.kbez, sum(tbl_entry_detail.ewert) as Summevonewert " & _
.
.
strSQL = strSQL & " where " & strKrit & " group BY tbl_figures.kennid, tbl_figures.kbez"
Super, klasse! Echt vielen lieben Dank! funktioniert einwandfrei :)
Entschuldige das dus mit mir etwas schwerer hattest :)
Ja die Sortierung nach der KennID hat eig nur denn Sinn, dass sie in einer gewissen Reihenfolge untereinander stehen die eben vom Alphabet abweicht.
Zu dem Thema könnte ich jetzt noch was fragen, nur hab ich schon ein schlechtes gewissen, dass ich dich da so "belästig"... ;-)
Kannst es dir ja mal anhören und bescheid geben:
Ich habs schon selbst versucht umzubauen, aber da die Datenherkunft (aus mehreren Abfragen) hab ich natürlich Probleme.
Wenn du in der Beispiel-DB bei "Sort by Qs" mal Firma Huber wählst, FY 10 und Q 1 bis vier, dann auf Show drückst, siehst du die übersicht der quartalzahlen sowie den auflauf berechnet im Formular.
Ist es möglich, genau diese Darstellung so beizubehalten, allerdings eben nur wieder mit den in der Liste ausgewählten Kennzahlen?
Ursprung der Daten sind die Abfragen qry_quaters -> qry_kreuzQ -> qry_quatersoverview
Vielen Dank, und wie gesagt, wenn du sagst soweit reicht es dir, dann kann ich das auch verstehen :)