Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Daten sortieren und Datensatz suchen

Begonnen von smily68, Januar 26, 2012, 22:02:57

⏪ vorheriges - nächstes ⏩

smily68

Hallo

Ich habe folgende Konstellation

Ich habe ein Formular Artikel mit einem Unterformular Preise. Die Preise sind Mengenabhängig. Ich habe weiter einen Auftrag mit einem Unterformular Auftragspositionen. Im Unterformular Auftragspositionen kann ich mit einem Kombifeld einen Artike auswählen. Der Preis soll nun entsprechend der eingegebenen Menge von der Preistabelle genommen werden.

Um dieses Ziel zu erreichen muss ich zuerst die Tabelle Preise nach der Spalte Menge sortieren in umgekehrter Reihenfolge, damit die grösste Menge zu oberst ist. So kann ich nach dem ersten Datensatz suchen bei welchem die Menge in der Preistabelle gleich ist oder kleiner ist als die Menge im Auftrag.

Meine Frage ist nun wie sieht der VB Code dafür aus.

Gruss Daniel

DF6GL

Hallo,

eine Möglichkeit:


Abfrage ("abf_Staffelpreis") erzeugen mit:

Select Preis from tblStaffelpreise order by StaffelMenge desc


und im Steuerelementinhalt eines Textfeldes, das den Gesamtpreis anzeigt:

=[Menge] * nz( dlookup("Preis";"abf_Staffelpreis";"Staffelmenge <= " & [Menge]);0)

smily68

Hallo Franz

Dein Vorschlag ist einleuchtend, doch ich habe eine andere Idee, wie ich dieses Problem lösen könnte. Bei meiner Idee geht es mir auch darum, dass ich etwas dazulernen kann. Ich stelle dir meinen VB Code Ansatz vor. Ich habe folgende Probleme von denen ich nicht weiss wie ich sie lösen kann:

- Wie muss ich den findfirst Befehl schreiben, wenn ich mehrere Kriterien habe
- Wie kann ich nach dem Bookmark auf Preisfelde (tblPreisListe.preis_Menge) in eine Variable schreiben

Dim db As DAO.Database
    Dim rsPT As Recordset 'PT PreisTabelle
    Dim Ausgabe
    Dim Datensatz

    Set db = CurrentDb
    Set rsPT = db.OpenRecordset("SELECT * " & "FROM tblPreisListe ORDER BY preis_ArtNr_IDF, preis_Menge DESC", dbOpenDynaset)
   
    rsPT.MoveFirst
    rsPT.FindFirst "preis_ArtNr_IDF = " & Me!cboArtNr ' And ((tblPreisListe.preis_Menge) < [Formulare]![frmAuftrag]![txtMenge] Or (tblPreisListe.preis_Menge) = [Formulare]![frmAuftrag]![txtMenge]))
   
    If Not rsPT.NoMatch Then
        Datensatz = rsPT.Bookmark
    End If

Liege ich mit meinem Ansatz richtig oder völlig daneben? Kannst du mir weiterhelfen.

Gruss Daniel

DF6GL

Hallo,

".. dass ich etwas dazulernen kann"

na gut   ;)

Korrektur Deines Code mit Fragen und Kommentaren:


-- WO soll der Code stehen, bzw. läuft er ab?


Dim db As DAO.Database
    Dim rsPT As DAO.Recordset 'PT PreisTabelle  'hier ist dao wichtig
    Dim dblAusgabe   as Double    ' wenn diese Variable den gefunden Preis aufnehmen soll. Evtl auch als Currency deklarieren
    Dim Datensatz       'brauchen wir nicht
    Dim db as Database    'fehlt

    Set db = CurrentDb     ' ok, wenn deklariert
    Set rsPT = db.OpenRecordset("SELECT * " & " FROM tblPreisListe ORDER BY preis_ArtNr_IDF, preis_Menge DESC", dbOpenSnapshot)     
   
    rsPT.MoveFirst  'überflüssig, der Recordset steht schon auf dem ersten DS, falls es welche gibt.

  rsPT.FindFirst "preis_ArtNr_IDF = " & Me!cboArtNr & " And tblPreisListe.preis_Menge < =" & [Forms]![frmAuftrag]![txtMenge]   " & Or preis_Menge = [Forms]![frmAuftrag]![txtMenge]))   'Form-Verweise auslagern und FORMS schreiben   

weitere Verbesserungen (ME benutzen , Textfelder auf Inhalt prüfen):

rsPT.FindFirst "preis_ArtNr_IDF = " & Me!cboArtNr & " And preis_Menge < ="  & str(nz(Me![txtMenge],0))  ' Str-Funktion nötig, wenn Kommazahlen auftreten können.

    If Not rsPT.NoMatch Then   '  True, wenn mindestens ein DS gefunden wurde.
        Datensatz = rsPT.Bookmark   '  Was soll hier mit dem Bookmark-Wert geschehen? Der kennzeichnet nur einen Datensatz in einem Recordset und dem zugehörenden Recordset-Clone..


'Wenn der erste gefundene Preis Wert (angenommenes Feld:" Preis_Staffelpreis")    in Variable "dblAusgabe" geschreiben werden soll:

dblAusgabe = rsPT!Preis_Staffelpreis

End If


' db-Object-Variable  zerstören
set db=Nothing
.
.
.
.



die Findfirst-Methode mit Nomatch-Prüfung kannst Du einsparen und alles noch weiter vereinfachen, wenn gleich der Select-String die Bedingung beinhaltet:

.
.

Set rsPT = db.OpenRecordset("SELECT * FROM tblPreisListe where  preis_ArtNr_IDF = " & Me!cboArtNr & " And preis_Menge < ="  & str(nz(Me![txtMenge],0))  & "  ORDER BY preis_ArtNr_IDF, preis_Menge DESC", dbOpenSnapshot)

If rsPT.Recordcount > 0 then dblAusgabe = rsPT!Preis_Staffelpreis
.
.


Wenn's noch kürzer sein soll:

Dim dblAusgabe as Double, db as Dao.Database
set db= Currentdb
dblAusgabe =db.OpenRecordset("SELECT  Preis_Staffelpreis FROM tblPreisListe where  preis_ArtNr_IDF = " & Me!cboArtNr & " And preis_Menge < ="  & str(nz(Me![txtMenge],0))  & "  ORDER BY preis_ArtNr_IDF, preis_Menge DESC", dbOpenSnapshot)(0)

set db=Nothing




wobei wir fast beim Dlookup-Ersatz angekommen sind.

Ob Du aber auf diese Weise mehr dazulernst, bleibt abzuwarten...  ;)

(Code unchecked, Tippfehler möglich  8)  )