Neuigkeiten:

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

Mobiles Hauptmenü

String Nicht >01.01.2007

Begonnen von hawebe, Juli 03, 2015, 10:47:45

⏪ vorheriges - nächstes ⏩

hawebe

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 & "# "
Gruß aus dem Emsland

DF6GL

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..
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

hawebe

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
Gruß aus dem Emsland

DF6GL

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....
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

hawebe

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.
Gruß aus dem Emsland

ebs17

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."
Mit freundlichem Glück Auf!

Eberhard

Josef P.

#6
Hallo!

Ich vermute, dass folgendes abgefragt werden soll:
... where not exists (select * from .. where Datumsfeld > [Stichtag] AND ...)

hawebe

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.
Gruß aus dem Emsland