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, 3252 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
Datenbanken
Access 2010 Filter zurücksetzen
gelöst Frage von Dr.CornwallisDatenbanken6 Kommentare

Liebe Gemeinde, wieder mal ein Access/VBA Problem: ich habe eine Abfrage, SQL Code: Diese Abfrage ist mit einem Formular ...

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 ...

Datenbanken

Access Checkbox mit Kombifeld und dann filtern

Frage von atomas42Datenbanken

Hallo, ich habe ein Kalkulationsprogramm unter Access geschrieben, was auch so weit für uns gut funktioniert. Ich würde jetzt ...

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 ...

Neue Wissensbeiträge
Sicherheit
Adminrechte dank Bug in Intel HD Graphics Treiber
Information von DerWoWusste vor 27 MinutenSicherheit

->Intel HD graphics 4200 und neuer (4400, 4600 520,530,620, 630,) sind auf jeden Fall betroffen und bereinigte Treiber sind ...

Router & Routing

Endlich: Reines Kabel-TV Modem in D erhältlich !

Information von aqui vor 2 TagenRouter & Routing9 Kommentare

Mit dem Technicolor TC4400-EU Modem sind nun auch Breitband Router ohne integriertes Modem oder Firewalls wie z.B. die pfSense ...

Netzwerkgrundlagen
The Illustrated TLS Connection
Information von Lochkartenstanzer vor 3 TagenNetzwerkgrundlagen1 Kommentar

Moin, Unter findet man eine gelungene Erläuterung von TLS. Fördert sehr das verständnis darüber, was da passiert. lks

Windows 10

Zuverlässiger Remove-AppxProvisionedPackage Ausführen in W10-1803

Tipp von NetzwerkDude vor 5 TagenWindows 104 Kommentare

Moin, Remove-AppxProvisionedPackage hat in 1709 recht zuverlässig funktioniert, in 1803 ist es leider so das es gerne mail failed ...

Heiß diskutierte Inhalte
Netzwerkprotokolle
OpenVPN auf dem Client Verständnisfrage
gelöst Frage von bk900042Netzwerkprotokolle23 Kommentare

Hallo Community, möchte OpenVPN benutzen, um mich über VPN per RDP zu einem Server zu verbinden und auch GIT ...

Windows Server
AD User wird immer wieder gesperrt
Frage von YellowcakeWindows Server18 Kommentare

Hey ich habe einen User (ein GL User - Natürlich was denn sonst) der immer wieder gesperrt wird. Ich ...

Netzwerkmanagement
Netzwerklaufwerk verbinden nicht möglich
gelöst Frage von SteiniMNetzwerkmanagement13 Kommentare

Hallo Leute, ich bin neu hier und brauche eure Hilfe. Danke schon mal im Voraus. Ich habe folgendes Problem: ...

Switche und Hubs
OpenSource oder Freeware zur Verwaltung von Switchen
gelöst Frage von JonskezSwitche und Hubs12 Kommentare

Hallo, gibt eine kostenlose Verwaltungssoftware für Switche (überwiegend HP/Aruba)? Es sollte möglich sein, aus der Ferne z.B. die Firmware ...