Hallo,
es gelingt mir beim besten Willen nicht den Code für eine Datumsabfrage mit NOT und > zu erstellen. Würdet Ihr hier bitte eingreifen und den String korrigieren? Der Code-Teil entstammt einer komplexen Kundenanalyse, die ein Bekannter vor ca. 8 Jahren mal erstellt hatte.
Dim cDummy As String
Dim cDatumvon As String
If Not IsNull(Me!cLetzteLief) Then
cDummy = UCase(Me!cLetzteLief)
cDummy = Replace(cDummy, "NICHT", "NOT")
If InStr(cDummy, "NOT") > 0 Then
cDatumvon = Mid$(cDummy, InStr(cDummy, "NOT") + 3, InStr(cDummy, ">") - 4)
cDatumvon = Mid$(cDummy, InStr(cDummy, ">") + 1, 50)
cDatumvon = Month(cDatumvon) & "/" & Day(cDatumvon) & "/" & Year(cDatumvon)
cDummy = " NOT#, >#" & cDatumvon & "# "
Hallo Ha-Wo,
sorry, aber dieser Code sieht aus wie der Versuch, durch die Brust ins Auge zu treffen und dabei nicht zu wissen, welche Waffe man in Händen hält.... ;-)
Wie lautet der Text der in cLetzteLief drinsteht, wenn der "Code" greifen soll...
Zitateine Datumsabfrage mit NOT und > zu erstellen
Was bedeutet das? Zeig bitte ein konkretes Beispiel..
Hallo Franz,
danke dass Du Dich der Sache annimmst. Es ist eine komplexe Kundenanalyse, die mehrere Felder der Rechnungsdaten enthält.
Im Problemfall geht es um das ungebundene Datumsfeld [cLetzteLief] und die manuelle Eingabe: Nicht >01.01.2007.
Zum besseren Verständnis habe ich den kompletten Code angefügt.
Private Sub filtergo_Click()
On Error GoTo filtergo_Click_Err
Dim cSQLvWhere As String
Dim cSQL As String
Dim cGroup As String
Dim cOrder As String
Dim cHaving As String
Dim cDummy As String
Dim cWhere As String
Dim cPlzs() As String
Dim cWhereDummy As String
Dim cVerkn As String
Dim aa As Double
Dim cDatumvon As String
Dim cDatumbis As String
Dim cPlzvon As String
Dim cPlzBis As String
cWhere = ""
cSQLvWhere = ""
cGroup = ""
cHaving = ""
cOrder = ""
cSQLvWhere = "SELECT [RECHDAT].KuNr, Count([RECHDAT].RechNr) AS Auftraege, Min([RECHDAT].RechDatum) AS ErstesLieferdatum, " & _
"Max([RECHDAT].RechDatum) AS LetztesLieferdatum, Sum([RECHDAT].Endbetrag) AS Umsatzsumme, Last(KUNDEDAT.KuNr) AS Kunde_KuNr, " & _
"Last(KUNDEDAT.Rabatt) AS Kunde_Rabatt, Last(KUNDEDAT.Firma) AS Kunde_Firma, Last(KUNDEDAT.Position) AS Kunde_Position, " & _
"Last(KUNDEDAT.ORT) AS Kunde_ORT, Last(KUNDEDAT.STRASSE) AS Kunde_STRASSE, Last(KUNDEDAT.TelVorw) AS Kunde_TelVorw, " & _
"Last(KUNDEDAT.TelNr) AS Kunde_TelNr, Last(KUNDEDAT.PLZ) AS Kunde_PLZ, Last(KUNDEDAT.Branche) AS Kunde_Branche " & _
"FROM KUNDEDAT INNER JOIN [RECHDAT] ON KUNDEDAT.KuNr = [RECHDAT].KuNr "
cGroup = "GROUP BY [RECHDAT].KuNr "
cOrder = " ORDER BY Sum([RECHDAT].Endbetrag) DESC;"
If Not IsNull(Me!cSuchKuNr) Then
cWhere = "[RECHDAT].KuNr like '" & Me!cSuchKuNr & "' "
End If
If Not IsNull(Me!cLetzteLief) Then
cDummy = UCase(Me!cLetzteLief)
cDummy = Replace(cDummy, "ZWISCHEN", "BETWEEN")
cDummy = Replace(cDummy, "UND", "AND")
cDummy = Replace(cDummy, "NICHT", "NOT")
If InStr(cDummy, "NOT") > 0 Then
cDatumvon = Mid$(cDummy, InStr(cDummy, "NOT") + 3, InStr(cDummy, ">") - 4)
cDatumvon = Mid$(cDummy, InStr(cDummy, ">") + 1, 50)
cDatumvon = Month(cDatumvon) & "/" & Day(cDatumvon) & "/" & Year(cDatumvon)
cDummy = " NOT#, >#" & cDatumvon & "# "
End If
If InStr(cDummy, "BETWEEN") > 0 Then
cDatumvon = Mid$(cDummy, InStr(cDummy, "BETWEEN") + 7, InStr(cDummy, "AND") - 8)
cDatumbis = Mid$(cDummy, InStr(cDummy, "AND") + 3, 50)
cDatumvon = Month(cDatumvon) & "/" & Day(cDatumvon) & "/" & Year(cDatumvon)
cDatumbis = Month(cDatumbis) & "/" & Day(cDatumbis) & "/" & Year(cDatumbis)
cDummy = " BETWEEN #" & cDatumvon & "# AND #" & cDatumbis & "# "
End If
If InStr(cDummy, ">") > 0 Then
cDatumvon = Mid$(cDummy, InStr(cDummy, ">") + 1, 50)
MsgBox cDatumvon
cDatumvon = Month(cDatumvon) & "/" & Day(cDatumvon) & "/" & Year(cDatumvon)
cDummy = "> #" & cDatumvon & "# "
End If
If InStr(cDummy, "<") > 0 Then
cDatumvon = Mid$(cDummy, InStr(cDummy, "<") + 1, 50)
cDatumvon = Month(cDatumvon) & "/" & Day(cDatumvon) & "/" & Year(cDatumvon)
cDummy = "< #" & cDatumvon & "# "
End If
If Not IsNull(Me!cSuchKuNr) And Not IsNull(Me!Zeitraumverkn) Then
Select Case UCase(Me!Zeitraumverkn)
Case "UND"
cVerkn = " And "
Case "ODER"
cVerkn = " or "
End Select
cWhere = cWhere & cVerkn & " [RECHDAT].RechDatum " & cDummy & " "
Else
cWhere = "[RECHDAT].RechDatum " & cDummy & " "
End If
End If
If Not IsNull(Me!cBranche) Then
Select Case UCase(Me!cBranchenVerkn)
Case "UND"
cVerkn = " And "
Case "ODER"
cVerkn = " or "
End Select
If Len(cWhere) > 0 And Not IsNull(Me!cBranchenVerkn) Then
cWhere = cWhere & " " & cVerkn & " KUNDEDAT.BRANCHE = '" & Me!cBranche & "' "
Else
cWhere = " Kundedat.Branche = '" & Me!cBranche & "' "
End If
End If
If Not IsNull(Me!cUmsatz) Then
cHaving = " Having (Sum([RECHDAT].Endbetrag) " & Me!cUmsatz & ") "
End If
If Not IsNull(Me!CPlzBereich) Then
If InStr(UCase(Me!CPlzBereich), "ZWISCHEN") > 0 Then
cDummy = UCase(Me!CPlzBereich)
cDummy = Replace(cDummy, "ZWISCHEN", "BETWEEN")
cDummy = Replace(cDummy, "UND", "AND")
cDummy = Replace(cDummy, "'", "")
cPlzvon = Trim(Mid$(cDummy, InStr(cDummy, "BETWEEN") + 7, InStr(cDummy, "AND") - 8))
cPlzBis = Trim(Mid$(cDummy, InStr(cDummy, "AND") + 3, 50))
cDummy = " BETWEEN '" & cPlzvon & "' AND '" & cPlzBis & "' "
cWhereDummy = "KundeDat.Plz " & cDummy & " "
Else
cDummy = Me!CPlzBereich
If right(Trim(cDummy), 1) <> "," Then
cDummy = cDummy & ","
End If
cPlzs = Split(cDummy, ",")
aa = 0
Do While cPlzs(aa) <> ""
cWhereDummy = cWhereDummy & " KundeDat.Plz " & IIf(InStr(cPlzs(aa), "*") > 0, " like ", " = ") & "'" & cPlzs(aa) & "' or "
aa = aa + 1
Loop
cWhereDummy = left(cWhereDummy, InStrRev(cWhereDummy, "or") - 1)
End If
Select Case UCase(Me!PLZVerkn)
Case "UND"
cVerkn = " And "
Case "ODER"
cVerkn = " or "
End Select
If Len(cWhere) > 0 And Not IsNull(Me!PLZVerkn) Then
cWhere = cWhere & " " & cVerkn & " " & cWhereDummy & " "
Else
cWhere = cWhereDummy
End If
End If
cSQL = cSQLvWhere & IIf(Len(cWhere) > 0, "Where ", "") & cWhere & cGroup & cHaving & cOrder
Forms![frmKundefiltern]![ufrmKundenUmsatz].Form.RecordSource = cSQL
Me!Kombinationsfeld58.Enabled = True
Me!btnExel.Enabled = True
Me!btnExel.SetFocus
Me!filtergo.Enabled = False
filtergo_Click_Exit:
Exit Sub
filtergo_Click_Err:
Call Fehlerbehandlung("Form_frmKundeFiltern ", "filtergo_Click", Erl, "Bemerkungen: ./.")
Resume filtergo_Click_Exit
End Sub
Hallo Ha-Wo,
ich glaube, es ist das Beste, wenn Du Dich mal telefonisch bei mir meldest..
("Nicht > 01.01.2015" dürfte doch das Selbe wie "<= 01.01.2015" sein.. oder?)
Es gibt sicherlich bessere Möglichkeiten, ein SQL-Kriterium (Where-Condition) zu generieren, als solch einen Pseudo-Where-Condition-Interpreter zu erschaffen....
Hallo Franz,
leider habe ich Deine TelNr nicht mehr, aber die Email-Adresse.
Ich werde Dir eine Email mit db zu dem Thema senden.
"Nicht > 10.01.2015" muss es schon sein. Meine Rechnungsdaten umfassen den Zeitraum vom 01.01.2001 bis heute.
"<= 01.01.2015" schliesst nicht aus, dass nach diesem Tag noch eine weitere Rechnung gibt.
Ziel dieser Abfrage ist es, Kunden anzusprechen die seit einigen Jahren nicht mehr bestellt haben. Also in der Zeit "Nicht > 01.01.2007" letzmalig eine Rechnung erhalten haben.
ZitatIm Problemfall geht es um das ungebundene Datumsfeld [cLetzteLief] und die manuelle Eingabe: Nicht >01.01.2007.
Hier geht es offensichtlich um Begrenzung auf Zeiträume. Einen Zeitraum kann man immer darstellen durch einen Beginn und ein Ende. Wenn man also dem User zwei ungebundene
Datumsfelder zur Eingabe bereitstellt, kann unmittelbar und ohne diese in meinen Augen fürchterlichen Berechnungen gefiltert werden.
Der User selber wird zwei solche Felder auch ohne zusätzliche Erklärung verstehen und zusätzlich weniger in der Lage sein, durch Versehen oder Unwissenheit Fehler zu produzieren.
ZitatEs ist eine komplexe Kundenanalyse
Man kann auch einfache Dinge kompliziert machen, in Umkehrung zu ...
"Es ist ein Zeichen von Genialität, schwierige Dinge einfach zu machen."
Hallo!
Ich vermute, dass folgendes abgefragt werden soll:
... where not exists (select * from .. where Datumsfeld > [Stichtag] AND ...)
Hallo,
danke für Eure Anworten. Das Thema ist nunmehr erledigt.
Bei der Problematik war ich auf dem falschen Schiff. "< Datum" oder ">Datum" schließen nicht aus, dass es den selben Kunden sowohl im Ergebnis "<" als auch im Ergebnis ">" geben kann.
Um das auszuschließen muss es in SQL ein maxDatum bzw. minDatum geben.