Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Filtern in einem Access Formular

Mitglied: MoeSys

MoeSys (Level 1) - Jetzt verbinden

30.09.2013 um 13:22 Uhr, 3263 Aufrufe, 18 Kommentare, 3 Danke

Hallo zusammen,

ich habe ein Formular basierend auf eine Abfrage im Access zusammengebastelt.

Nun habe ich ein Textfeld für die Eingabe eines Preises eingefügt.
Nach diesem Preis soll in der DB/Abfrage gesucht werden.
Falls dieser Preis nicht existiert soll der nächste Preis angezeigt werden.
Beispiel: Eingabe 2,10 €
Daten:
2,08 €
2,13 €
2,06 €
Hier wäre der gesuchte Preis 2,08€

Wie schreibt man sowas in VBA bzw. gibt es einen Operator oder eine Funktion die soetwas schon kann?

Vielen Dank im Voraus für eure Hilfe!!!

Mitglied: SlainteMhath
30.09.2013 um 13:32 Uhr
Moin,

Versuch's doch mal mit der Funktio "dlookup" oder der .Filter Eigentschaft des Formulars.

lg,
Slainte
Bitte warten ..
Mitglied: MoeSys
30.09.2013 um 14:06 Uhr
Hi Slainte,

die Filtereigenschaften des Formulars können sowas nicht und wie ich das mit "dlookup" realisieren soll wüsste ich jetzt auch nicht, aber vll stehe ich ja nur auf n Schlauch....

Nochmal zum Verständnis: ich will mich dem eingegebenen Wert annähern
d.h. wenn dieser Wert nicht drin steht soll der nächste (der dieser Eingabe am nächsten ist) genommen werden.

Schönen Gruß
Bitte warten ..
Mitglied: Joe2011
30.09.2013 um 14:29 Uhr
Moin Moin,

dazu eine Frage:

was ist näher an 2,10 €: 2,09 € oder 2,11 €?

Zuerst nach oben oder unten annähern? Kaufmännische Rundung? Rundung auf wieviele Dezimalstellen (nur zum Rechnen)?

Das soll mehr eine Gedankenstütze als eine Lösung sein. Die Lösung haben bestimmt schlauere Köpfe.

Gruss


Joe
Bitte warten ..
Mitglied: SlainteMhath
30.09.2013 um 14:41 Uhr
In etwa so:
01.
dim p as long
02.
 
03.
p = nz(dlookup("Preis","tabelle","Preis=dein feld im formular"),0)
04.
if p=0 then 
05.
  p=nz(dlookup("Preis","tabelle","Preis>dein feld im formular"),0)
06.
  if p=0 then
07.
    p=nz(dlookup("Preis","tabelle","Preis<dein feld im formular"),0)
08.
  end if
09.
end if
Bitte warten ..
Mitglied: MoeSys
30.09.2013 um 14:46 Uhr
Hey Joe,

also wenn 2,09€ und 2,11€ rauskommt dann kommen andere Kriterien dazu, z.B. Preislistendatum etc.
2 Dezimalstellen dürfen auch nur eingegeben werden also keine Rundung ;)

Danke für deine Hinweise!!!
Bitte warten ..
Mitglied: MoeSys
30.09.2013 um 14:48 Uhr
aaah OK versuche ich gleich mal... DANKE!!
Bitte warten ..
Mitglied: MoeSys
30.09.2013 um 15:52 Uhr
das bekomme ich so nicht hin... der button macht gar nix (also nicht mal eine Fehlermeldung)
Was genau ist denn "Preis"? das Feld in der DB oder soll ich das einfach so stehen lassen?
Bitte warten ..
Mitglied: SlainteMhath
01.10.2013 um 08:35 Uhr
Ja natürlich "´macht" der Button nix. Die Variable P musst du dann schon irgendwie weiterverwenden - wie musst du selber entscheiden.

Und bei dlookup hilft auch mal ein Block in die Access Hilfe oder bei google: http://www.techonthenet.com/access/functions/domain/dlookup.php
Bitte warten ..
Mitglied: MoeSys
01.10.2013 um 13:53 Uhr
erstmal danke für deine tipps... wie du schon mitbekommen hast ist dies nicht mein Fachgebiet, ich bin hier der totale DAU...
Nichts desto trotz würde ich gerne nachvollziehen was du meinst..

hier mein angepasster code, vielleicht siehst du ja was ich falsch mache/verstehe.

Dim p As Long

p = Nz(DLookup("Ekp", "unerledigte_RB_Pos", "Ekp=txtEingabePreis"), 0)
If p = 0 Then
p = Nz(DLookup("Ekp", "unerledigte_RB_Pos", "Ekp>txtEingabePreis"), 0)
If p = 0 Then
p = Nz(DLookup("Ekp", "unerledigte_RB_Pos", "Ekp<txtEingabePreis"), 0)
End If
End If
'MsgBox "" & p & ""

Wie du siehst lass ich mir p zum Schluss anzeigen...
Wenn ich nun 2,11€ eingebe dann ist p = 2... obwohl die Abfrage genau diesen Wert (2,11€) enthält!!!

D.h. wenn ich das so schreibe:

Me.Form.Filter = "Ekp = " & Me!txtEingabeMenge & "
Me.Form.FilterOn = True

dann bekomme ich genau das gewünschte Ergebnis, funktioniert natürlich nur wenn dieser Wert in meiner Abfrage vorkommt...

Wie kann ich "Full Gas DAU" deine Methode so anpassen dass der gewünschte Effekt erzielt wird ;)
Bitte warten ..
Mitglied: SlainteMhath
01.10.2013 um 13:59 Uhr
IM Doolkup muss es auch

... "Ekp<" & txtEingabePreis ...

lauten.
Bitte warten ..
Mitglied: MoeSys
02.10.2013 um 10:34 Uhr
Oh ja da haste natürlich Recht, hätte ich auch drauf kommen können.
Das DLookup habe ich nun zum Laufen gebracht danke deiner Unterstützung

Leider funktioniert es damit nicht so wie ich mir das vorstelle.
wenn ich z.B. 2,10 eingebe und in der DB sind 2,11 / 2,12 etc hinterlegt dann spuckt er hierdurch:
p = Nz(DLookup("Ekp", "unerledigte_RB_Pos", "Ekp>txtEingabePreis"), 0)
den ersten Preis den er in der DB findet der größer 2,10 ist, also auch 16,50 (als Beispiel)...

Kann man ihm vll sagen dass er erst die ganze Spalte durchsuchen und nicht beim ersten Wert stehen bleiben soll?
Bitte warten ..
Mitglied: Biber
02.10.2013, aktualisiert um 15:36 Uhr
Moin moeSys,

die Tabelle "unerledigte_RB_Pos" wird ja wahrscheinlich nach Rechnungsnummern und/oder Datum sortiert sein - und in dieser logischen Reihenfolge wird ja gesucht.

Wenn die Tabelle zumindest fachlich richtig ist, was ich nicht beurteilen kann, da ich die Tabellenstrukturen und Beziehungen nicht kenne, dann solltest du auf diese Tabelle einen View (bzw. in Access-Sprech "eine Abfrage" ) erzeugen nach dem Muster
01.
SELECT [die Felder, die du brauchst]
02.
from unerledigte_RB_Pos
03.
order by EKP;
oder
01.
SELECT distinct ekp as ekp
02.
from unerledigte_RB_Pos
03.
;
Speichern als "unerledigte_RB_Pos_nach_ekp" und diese Quelle in deinem DLookup() verwenden.

Grüße
Biber
Bitte warten ..
Mitglied: MoeSys
02.10.2013 um 15:45 Uhr
Hey Biber,

Danke für den Hinweis!!
Genau das habe ich auch schon gemacht, ich komme dem Ganzen schon näher

Was nun immer noch ein kleines Problem ist:
Wenn ich 2,10€ suche und die Abfrage enthält folgende Werte
2,09€
2,14€
2,16€
dann bekomme ich mit dem aktuellen DLookup den Wert 2,14€ zurück und nicht 2,09€, was ja näher an 2,10€ wäre und damit richtiger...

Schönen Gruß
Bitte warten ..
Mitglied: Biber
02.10.2013, aktualisiert um 17:39 Uhr
Moin MoeSys,

dafür ist ein DLookup nicht geeignet.

Was dein Wunsch-Statement leisten sollte, das wäre sinngemäß ja ein
01.
SELECT Min( EKP )
02.
FROM deineEKPAbfrage 
03.
WHERE EKP in ( 
04.
    (2.10 - (select min( abs(EKP - 2.10) ) FROM deineEKPAbfrage ) ) 
05.
  , (2.10 + (select min( abs(EKP - 2.10) ) FROM deineEKPAbfrage ) )
06.
  );
-> in diesem Beispiel taucht dein Suchwert, die "2,10€" an 4 Stellen auf - du kannst aber einen Parameter nur einmal übergeben bzw. einen übergebenen Parameter nur einmal verwenden..

Schreib ein Stück Code/VBA von Hand, die vorgefertigte DLookup-Funktion kann das nicht.
Und VBA mit zwei einzelnen abgefeuerten Statements wäre in diesem Fall auch schneller als ein um jeden Preis in ein Statement geschraubtes SQL.

Oder revidiere die Anforderungen an die Funktionalität: der nächsthöhere oder der nächstniedrigere Preis ist mit DLookup() kein Thema.
Aber der "am nächsten gelegene Preis".

Was soll denn die fachliche Aussage sein, wenn du einen "nächstgelegenen Preis" gefunden hättest bzw wieso wäre denn "2,09€" eher das einleuchtende Ergebnis als "2,14€"?

Grüße
Biber
Bitte warten ..
Mitglied: MoeSys
11.10.2013 um 11:37 Uhr
Hi Biber,

der Code macht genau das was ich brauche, DANKE!!


Was soll denn die fachliche Aussage sein, wenn du einen "nächstgelegenen Preis" gefunden hättest bzw wieso
wäre denn "2,09€" eher das einleuchtende Ergebnis als "2,14€"?

einfach nur weil 2,09€ näher an 2,10€ ist...
der Hintergrund ist folgender:
Man kalkuliert Produkte/Maschinen und bietet diese an.
Die Angebote gelten relativ lange, teilweise mehrere Jahre.
Wenn der Kunde nun nach einem Jahr bestellt versucht man den damals kalkulierten Preis zu halten, obwohl sich in der Zwischenzeit die Materialpreise geändert haben.
Deshalb muss man nach dem "nächstgelegenen Material-Preis" suchen um sich dem damaligen Angebotspreis zu nähern.
Manchmal zahlt man eben auch drauf....

Schönen Gruß
MoeSys
Bitte warten ..
Mitglied: MoeSys
11.10.2013 um 11:52 Uhr
Eins noch:

Wenn ich nun nach 2,05 suche und in der Abfrage sind die Werte 2,04 und 2,06 enthalten dann spuckt mir das Statement 2,04 aus. Passt ja auch soweit.
Schöner wäre es jedoch wenn ich beide Werte angezeigt bekommen könnte.

LG
MoeSys
Bitte warten ..
Mitglied: Biber
11.10.2013, aktualisiert um 23:00 Uhr
Moin MoeSys,

ich hatte dir eine Programmlogik unterstellt, die genau einen Wert erwartet - wenn zwei Werte gleich weit entfernt vom "Wunschwert" sind, dann habe ich mit "SELECT MIN( EKP) ...." den kleineren genommen.

Weil... man spart ja, wo man kann.

Wenn du beide Werte anzeigen willst, dann einfach mit "SELECT EKP FROM..." (also ohne MIN()-Aggregatsfunktion.

Wie aber auch schon oben geschrieben - ich würde es nicht um jeden Preis in EINE SQL-Abfrage quetschen aus Performanzgründen.
Ich würde zuerst mit "SELECT. min( abs(EKP - 2.10) ) FROM deineEKPAbfrage " den kleinsten Abstand vom Wunschwert ermitteln und mit diesem Wert ein zweites Statement hinterherjagen (Statement wie oben, aber das Ergebnis von Statement1 eingesetzt).

Falls du das über irgendeinen VBA-Schnipsel machst.

Grüße
Biber
Bitte warten ..
Mitglied: MoeSys
14.10.2013 um 09:38 Uhr
Hi Biber,

vielen Dank für die hilfreichen Tipps, funktioniert besten

Schönen Gruß
MoeSys
Bitte warten ..
Ähnliche Inhalte
Microsoft Office
Access 2013 - Formular entwerfen
Frage von QugartMicrosoft Office2 Kommentare

Hallo zusammen! Ich habe mit Access selber noch nie gearbeitet und bräuchte da dringend Hilfe. Vorhanden ist eine Datenbank ...

Microsoft Office
Access 2016: Formular richtig umbenennen
gelöst Frage von honeybeeMicrosoft Office1 Kommentar

Hallo, wenn das Formular in Access in der Formularansicht angezeigt wird, ist auf der Registerkarte des Formulares ein anderer ...

Microsoft Office

Access 2013 - Übernehmen von Access Formular aus Backupdatei

gelöst Frage von MuseumMLMicrosoft Office8 Kommentare

Ein Formulara ist aus einer aktuellen Datenbank verschwunden. Der Benutzer hat diese wohl aus Versehen gelöscht. Wie kann ich ...

VB for Applications

Access-Formular über Checkbox neu sortieren

gelöst Frage von AximandVB for Applications4 Kommentare

Hallo, ich tätige meine ersten Anfänge in Access und brauche mal den ein oder anderen Denkanstoß, da ich im ...

Neue Wissensbeiträge
Humor (lol)
Administrator.de Perlen
Tipp von DerWindowsFreak2 vor 1 TagHumor (lol)3 Kommentare

Hallo, Heute beim stöbern auf dieser Seite bin auf folgenden Thread aus dem Jahre 2006 gestossen: Was meint ihr? ...

Erkennung und -Abwehr
OpenSSH-Backdoor Malware erkennen
Tipp von Frank vor 2 TagenErkennung und -Abwehr

Sicherheitsforscher von Eset haben 21 Malware-Familien untersucht. Die Malware soll Hintertüren via OpenSSH bereitstellen, so dass Angreifer Fernzugriff auf ...

iOS
WatchChat für Whatsapp
Tipp von Criemo vor 5 TageniOS5 Kommentare

Ziemlich coole App für WhatsApp User in Verbindung mit der Apple Watch. Gibts für iOS sowohl als auch für ...

iOS
IOS hat nen Cursor!
Tipp von Criemo vor 6 TageniOS5 Kommentare

Nette Funktion im iOS. iPhone-Mauszeiger aktivieren „Nichts ist nerviger, als bei einem Tippfehler zu versuchen, den iOS-Cursor an die ...

Heiß diskutierte Inhalte
Festplatten, SSD, Raid
SSD zeigt falsche Werte
Frage von karl2014Festplatten, SSD, Raid25 Kommentare

Ich habe ein Problem mit der SSD in meinem Laptop mit Windows 10. Es ist eine 1Tb Platte die ...

Grafikkarten & Monitore
PCIe 1.0 Grafikkarte für 3840x2160
Frage von Windows10GegnerGrafikkarten & Monitore24 Kommentare

Hallo, mein Vater hat einen neuen Monitor gekauft, welcher eine native Auflösung von 3840*2160 hat. Diese muss jetzt auch ...

Windows 10
Windows Enterprise 1809 Eval nicht bootbar
Frage von Sunny89Windows 1022 Kommentare

Hallo zusammen, bevor ich mich jetzt noch stundenlang rumärger wollte ich euch fragen, ob Ihr die gleichen Probleme habt ...

Ubuntu
Installation freerdp 2.0.0-rc4
Frage von kristovUbuntu20 Kommentare

Hallo, möchte freerdp 2.0.0-rc4 auf linux mint 18.3 installieren, habe aber keine Ahnung, wie das funktioniert. freerdp 1.1 ist ...