Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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

Frage Entwicklung VB for Applications

Mitglied: MoeSys

MoeSys (Level 1) - Jetzt verbinden

30.09.2013 um 13:22 Uhr, 3011 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 ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Datenbanken
gelöst Access Bericht öffnen mit speziellen Filtern (2)

Frage von Dr.Cornwallis zum Thema Datenbanken ...

Microsoft Office
Formular Autofill - Infopath (1)

Frage von TlBERlUS zum Thema Microsoft Office ...

LAN, WAN, Wireless
Freifunk über vorhandene Access Points ausstrahlen (2)

Frage von Uwoerl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Direct Access mit VPN aufbau (6)

Frage von geocast zum Thema Windows Netzwerk ...

Heiß diskutierte Inhalte
Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (9)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...