Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Access_Neuling_DomWert mit Datumsvergleich im Kriterium

Begonnen von dschroeder1989, Februar 21, 2017, 17:48:27

⏪ vorheriges - nächstes ⏩

dschroeder1989

Hallo allerseits, ich habe den ganzen Nachmittag Foren durchstöbert und alles Probiert, dennoch kein Erfolg. Ich bin deutlicher Anfänger und mit VBA kann ich nicht viel anfangen.
Ich hoffe einer kann mir Helfen.

Ich habe eine Tabelle [Auftritte] von der ich ausgehend von eingetragenen Fahrt-Kilometern, Fahrtkosten errechne und automatisch eintrage(via Aktualisierungs Abfrage). Den Aufwand betreibe ich, da sich der Km-Satz mit der Zeit ändern wird. Bisher nehme ich den [Kilometer_Betrag] aus der Tabelle [Kilometergeld] mit DMax([Kilometergeld_ID]) und berechne nur wenn zuvor noch keine Fahrkosten eingetragen sind.

Nun der Plan:

Mit DomWert soll aus der Tabelle [Kilometergeld] die einen [Kilometer_Betrag] mit einem Datumsbereich [Dat_von] , [Dat_bis] enthält der richtige Betrag rausgesucht werden. Im Kriterium soll dann "[Kilometergeld]![Dat_von]<[Auftritte]![Auftritt_Dat]<[Kilometergeld]![Dat_von]" stehen.

Ich habe ebenfalls erfolglos mit ZDouble experimentiert.

Danke für die Hilfe

MaggieMay

Hi,
ZitatIch hoffe einer kann mir Helfen.
falls du wider Erwarten auch weibliche Mitstreiter akzeptierst, könntest du evtl. die folgende Frage beantworten:

Was genau möchtest du mit dem folgenden Kriterium bewirken:
[Kilometergeld]![Dat_von]<[Auftritte]![Auftritt_Dat]<[Kilometergeld]![Dat_von]
Kannst du das bitte mit Worten beschreiben?

Und zeig uns bitte dazu auch noch den vollständigen SQL-Code der Abfrage.
Freundliche Grüße
MaggieMay

dschroeder1989

Ich meinte damit natürlich auch "eine" ;-

Das ganze ist ein Kassensystem für unsere Band.
UA. werden Auftritte eingepflegt die an einem bestimmten Auftrittsdatum statt gefunden haben. Und dafür werden Fahrtkosten für die Mitspieler ausbezahlt. Da sich die Kilometerpauschale ändert/ändern kann berechne ich das Sprittgeld aus Kilometern und füge das per Aktualisierungsabfrage ein. Damit nicht im Nachhinein bei Neuberechnung der falsche Kilometersatz verwendet wird. Gibt es eine Tabelle Kilometergeld mit einem Betrag und einem Gültigkeitszeitraum.

D.h. für die Berechnung soll mir DomWert den Korrekten Kilometersatz durch Vergleich mit dem Auftrittsdatum rausgeben.

Da ich nicht in SQL direkt arbeite (Neuling) und meine Syntax falsch ist musste ich etwas tricksen. Ich habe zum Kopieren den Aktualisieren Wert wie ich Ihn mir vorstelle in den SQL-Code eingefügt. 

UPDATE Auftritte_Ber, Kilometergeld SET Auftritte_Ber.Fahrtkosten = ([Auftritte_Ber]![Kilometer]*( DOMWERT("[Kilometer_Betrag]";"[Kilometergeld]; "[Kilometergeld]![Dat_von]<[Auftritte]![Auftritt_Dat]<[Kilometergeld]![Dat_von]")))
WHERE (((Auftritte_Ber.Fahrtkosten) Is Null) AND (([Auftritte_Ber]![Auftritt_Kerndaten_ID])=[Formulare]![Auftritte]![Auftritt_Kerndaten_ID]));

Vielen Dank

Beaker s.a.

Hallo,
(Luftcode, Korrekturen erbeten)
UPDATE Auftritte_Ber AS AB
   SET AB.Fahrtkosten = AB!Kilometer *
         (SELECT K.Kilometer_Betrag
          FROM Kilometergeld AS K
          WHERE AB.Auftritt_Dat BETWEEN K.Dat_von AND K.Dat_bis)
WHERE AB.Fahrtkosten Is Null AND AB.Auftritt_Kerndaten_ID =
Forms!Auftritte!Auftritt_Kerndaten_ID


gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MaggieMay

Hi,
ZitatD.h. für die Berechnung soll mir DomWert den Korrekten Kilometersatz durch Vergleich mit dem Auftrittsdatum rausgeben.
Sorry, aber das erklärt nicht, was du dir bei dem Ausdruck
[Kilometergeld]![Dat_von]<[Auftritte]![Auftritt_Dat]<[Kilometergeld]![Dat_von]
gedacht hast.

Oder willst du tatsächlich mit einem Zeitbereich (von-bis) vergleichen, wie von ekkehard vermutet?
Freundliche Grüße
MaggieMay

dschroeder1989

Danke euch beiden!

Ja ich möchte mit einem Zeitbereich vergleichen. Das Kilometergeld ist in einem Bereich gültig und wenn der Auftritt in dem Bereich liegt soll der entsprechende Betrag verwendet werden.

Habe den Code eben in die SQL-Ansicht kopiert, da kam Syntaxfehler.
Ich habe keine Ahnung wo der zu suchen ist.

BTW das Von_Datum ist theoretisch auch redundant, es könnte auch das vorherige Bis_Datum +1 Tag sein. Macht es aber nur noch komplizierter.

Beaker s.a.

Hallo,
ZitatHabe den Code eben in die SQL-Ansicht kopiert, da kam Syntaxfehler.
Vielleicht postest du den, und auch deinen SQL-Versuch.
Wahrscheinlich ist das Formular einfach nicht geöffnet. Das ist in diesem
Zusammenhang Voraussetzung.
Zitatdas Von_Datum ist theoretisch auch redundant, es könnte auch das vorherige Bis_Datum +1 Tag sein.
Das müsste dann so gehen.
UPDATE Auftritte_Ber AS AB
   SET AB.Fahrtkosten = AB!Kilometer *
         (SELECT K.Kilometer_Betrag,
                 (MAX(K.Dat_bis) +1) AS DVon
          FROM Kilometergeld AS K
          WHERE AB.Auftritt_Dat BETWEEN DVon AND K.Dat_bis)
WHERE AB.Fahrtkosten Is Null AND AB.Auftritt_Kerndaten_ID =
Forms!Auftritte!Auftritt_Kerndaten_ID


@Regulars
Bitte, bitte korrigiert das. Ich habe das nicht getestet, sondern echt so aus
der hohlen Hand hingeschrieben, auch ohne Kenntnis der Daten.
Wenn das so richtig ist, bin ich stolz auf mich. Ansonsten bin ich ja lernfähig.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

DF6GL

#7
Hallo,


an

Zitat... = AB.Kilometer *
         (SELECT K.Kilometer_Betrag,
                 (MAX(K.Dat_bis) +1) AS DVon
          FROM Kilometergeld AS K
          WHERE AB.Auftritt_Dat BETWEEN DVon AND K.Dat_bis)...

mußt Du noch arbeiten, weil die Unterabfrage mehr als einen Wert in der Selectliste aufweist und zudem mehr als einen DS (Wert) liefern könnte.


Zudem:

SET AB.Fahrtkosten = AB.Kilometer *


dschroeder1989

Zitat von: Beaker s.a. am Februar 23, 2017, 18:15:23
Hallo,
ZitatHabe den Code eben in die SQL-Ansicht kopiert, da kam Syntaxfehler.
Vielleicht postest du den, und auch deinen SQL-Versuch.
/quote]



Ich habe den von Ihnen oben einfach in die SQL Ansicht kopiert.

dschroeder1989

Entschuldigt bitte die Formatierung... ich habs bisher weder geschafft ein Code Feld zu verwenden noch anscheinend korrekt zu zitieren.

Das mit der Redundanz ist auch erstmal nicht so wichtig, so lange das andere funktioniert.

Hätte ich den Code von Ekkehard nicht einfach in die SQL Ansicht einer Abfrage kopieren sollen? Wegen dem ID Vergleich mit dem Formular bekomme ich doch nur eine Parameterabfrage wenn ich die Anfrage ausführe... und das Formular nicht geöffnet ist, oder.

Vielen Dank
David

Beaker s.a.

Hallo Franz,
Danke.
Zitatweil die Unterabfrage mehr als einen Wert in der Selectliste aufweist
Klar, logisch, wird ja also Faktor verwendet.
Also erstmal wie zuerst (mit Korrektur)

UPDATE Auftritte_Ber AS AB
   SET AB.Fahrtkosten = AB.Kilometer *
         (SELECT K.Kilometer_Betrag
          FROM Kilometergeld AS K
          WHERE AB.Auftritt_Dat BETWEEN K.Dat_von AND K.Dat_bis)
WHERE AB.Fahrtkosten Is Null AND AB.Auftritt_Kerndaten_ID =
Forms!Auftritte!Auftritt_Kerndaten_ID

Zitatzudem mehr als einen DS (Wert) liefern könnte.
Daran hatte ich auch gedacht, aber ohne die Daten zu kennen, bin ich
erstmal davon ausgegangen, dass da nur ein DS zurück kommt.

Könnte man das mit "MAX(K.Kilometer_Betrag) AS Foo" lösen?
Und auch das Startdatum direkt mit MAX + 1 berechnen?
.
(SELECT MAX(K.Kilometer_Betrag) AS KBetrag
          FROM Kilometergeld AS K
          WHERE AB.Auftritt_Dat BETWEEN (MAX(K.Dat_von)+1) AND K.Dat_bis)
.


@David
Sorry, wenn ich deinen Thread hier zum selber lernen "missbrauche".
Aber ich denke, dass am Ende auch eine Lösung für dich dabei herauskommt.
ZitatWegen dem ID Vergleich mit dem Formular bekomme ich doch nur eine Parameterabfrage wenn ich die Anfrage ausführe... und das Formular nicht geöffnet ist, oder.
Hast du es ausprobiert? Und den Fehler mit dem "!" korrigiert?

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

dschroeder1989

Kein Problem, so hat jeder was von dem Problem ;-

also ich habe jetzt folgendes in die SQL Ansicht eingefügt (das von der Antwort zuvor):

UPDATE Auftritte_Ber AS AB
   SET AB.Fahrtkosten = AB.Kilometer *
         (SELECT K.Kilometer_Betrag
          FROM Kilometergeld AS K
          WHERE AB.Auftritt_Dat BETWEEN K.Dat_von AND K.Dat_bis)
WHERE AB.Fahrtkosten Is Null AND AB.Auftritt_Kerndaten_ID =
Forms!Auftritte!Auftritt_Kerndaten_ID

Da kam Syntaxfehler in Updateanweisung.

Das Mit dem nicht geöffneten Formular kenne ich von der vorherigen einfachen Lösung.
Aber um sicherzugehen war es gerade offen.

Beaker s.a.

Hallo David,
ZitatDa kam Syntaxfehler in Updateanweisung.
Mehr nicht?
Normal wird bei einem SQL-Fehler doch auch der String mit angezeigt.
Bei dir nicht?
Mach mal Folgendes. Öffne im VBA Editor ein allgemeines Modul und
schreibe folgende Testprozedur.
Public Sub TestSQL()
    Dim sSQL As String
    sSQL = _
        "UPDATE Auftritte_Ber AS AB " _
      & "SET AB.Fahrtkosten = AB.Kilometer * " _
          &  "(SELECT K.Kilometer_Betrag " _
           & "FROM Kilometergeld AS K " _
           & "WHERE AB.Auftritt_Dat BETWEEN K.Dat_von AND K.Dat_bis) " _
    & "WHERE AB.Fahrtkosten Is Null AND AB.Auftritt_Kerndaten_ID = " _
                  & "Forms!Auftritte!Auftritt_Kerndaten_ID"

Debug.Print sSQL

End Sub


Dann öffnest du das Direktfenster mit Strg-G, setzt den Cursor in die
Prozedur und drückst F5. Da sollte dann der fertige SQL-String der
Abfrage auftauchen, und du kannst sehen was da nicht stimmt.
Zusätzlich kopierst du den String und postest ihn hier.
Am aller einfachsten wäre natürlich eine Beispiel-DB; - am Besten als
.mdb.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

DF6GL

Hallo,

wenn
ZitatIch habe eine Tabelle [Auftritte]

dann sollte die auch aktualisieret werden:


TOP 1 sorgt dafür, dass Access(Jet)  auch nur einen zurück gelieferten DS annimmt.   Zudem:  Namen auf Identität prüfen...

UPDATE Auftritte  AS AB
   SET AB.Fahrtkosten = AB.Kilometer *
         (SELECT TOP 1 K.Kilometer_Betrag
          FROM Kilometergeld AS K
          WHERE AB.Auftritt_Dat BETWEEN K.Dat_von AND K.Dat_bis)
WHERE AB.Fahrtkosten Is Null AND AB.Auftritt_Kerndaten_ID =
Forms!Auftritte!Auftritt_Kerndaten_ID



Wenn's nicht mit der Unterabfrage klappt, kann zum Test auch die Dlookup-Funktion herhalten:


UPDATE Auftritte AS AB
   SET AB.Fahrtkosten = AB.Kilometer * Dlookup("Kilometer_Betrag","Kilometergeld","Auftritt_Dat BETWEEN" &   [Dat_von] & " AND " & [Dat_bis])
WHERE AB.Fahrtkosten Is Null AND AB.Auftritt_Kerndaten_ID =
Forms!Auftritte!Auftritt_Kerndaten_ID




Beaker s.a.

Hallo Franz,
Welche Tabelle da jetzt aktualisiert werden soll weiss ich natürlich nicht,
DM wurde ja nicht vollständig gezeigt. Also bin ich von der Abfrage im
OP ausgegangen.
Zitatauch nur einen zurück gelieferten DS annimmt.
"nur einen" ist klar. Nur, ist das auch der richtige in einem unsortierten RS ?
Wäre MAX da nicht besser?

Dlookup("Kilometer_Betrag","Kilometergeld","Auftritt_Dat BETWEEN" &   [Dat_von] & " AND " & [Dat_bis])
Kann das richtig sein? "Auftritt_Dat" ist IMO kein Feld von "Kilometergeld".
Oder was sehe ich da mal wieder nicht?

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)