expertenaustausch > comp.* > comp.office-pakete.lotus-smartsuite

Stefan Franz (06.04.2007, 14:07)
Hallo allerseits,

ich habe eine Kundendatenbank, die mit einer Termindatenbank verknüpft
ist.

Es gibt quasi pro Kunden Termineinträge, daß irgendwas erledigt werden
soll bzw. der Kunde was an einem Tag gekauft hat etc.

Nun möchte ich für die Kundenpflege alle Kunden rausfiltern können,
bei den 9 Monate lang keine Aktivitäten in der Termindatenbank drin
stehen, also die 9 Monate lang keinen Umsatz produziert haben.

Ich habe im Moment keine Ahnung, wie ich das anstellen könnte und wäre
über eine Idee sehr dankbar.
Martin Holz (07.04.2007, 09:01)
Stefan Franz wrote:

> Es gibt quasi pro Kunden Termineinträge, daß irgendwas erledigt werden
> soll bzw. der Kunde was an einem Tag gekauft hat etc.
> Nun möchte ich für die Kundenpflege alle Kunden rausfiltern können,
> bei den 9 Monate lang keine Aktivitäten in der Termindatenbank drin
> stehen, also die 9 Monate lang keinen Umsatz produziert haben.
> Ich habe im Moment keine Ahnung, wie ich das anstellen könnte und wäre
> über eine Idee sehr dankbar.


Das sollte doch über eine einfache Suche im Datumsfeld möglich sein - oder?

Also:
Suche im Formular/Arbeitsblatt
Eingabe im Datumsfeld: >=07.07.2006

Das Ergebnis sind dann die Datensätze der letzen 9 Monate.

Wenn Du es automatisieren willst, müsstest Du das IMHO per Script regeln.
Dort kannst Du dann die Formel "Suchdatum = Date-270" hinterlegen und die
Suche damit steuern.

Ich würde das per (ggf. verschachteltem) SQL-Query machen.
Also etwa (ungetestet):

Sub SuchDieLuschen
Dim Suchdatum As Long
Suchdatum = Date - 270 ' 9 Monate * 30 Tage = 270

Dim Kundennummern List As Long ' oder Integer
Dim i As Long ' Zähler

Dim VerbindungTermin As New Connection
Dim SucheTermin As New Query
Dim ErgebnisTermin As New Resultset

If (VerbindungTermin.ConnectTo("dBase IV")) Then
Set SucheTermin.Connection = VerbindungTermin
SucheTermin.SQL = | Select ""Datum"",""KD_Nr""
From """ & CurrentDocument.Path
& "Termine.dbf"" Termine Where
(Termine.""Datum"" >= "'"
& Suchdatum & ""') |
Set ErgebnisTermin.Query = SucheTermin

If (ErgebnisTermin.Execute) Then
i = 0
If (ErgebnisTermin.NumRows) Then
Do
Kundennummern(i) = ErgebnisTermin.GetValue(1)
i = i + 1
Loop While (ErgebnisTermin.NextRow)
End If
End If
End If

'Kundennummern mit Datum >= Suchdatum stehen nun
'in der Liste "Kundennummern" und können mit einem
'weiteren Query nach dem o.a. Muster abgefragt werden
EndSub

Gruß
Martin
Stefan Franz (07.04.2007, 12:16)
Hallo Martin Holz <nospam>,

>Stefan Franz wrote:
>Das sollte doch über eine einfache Suche im Datumsfeld möglich sein - oder?
>Also:
>Suche im Formular/Arbeitsblatt
>Eingabe im Datumsfeld: >=07.07.2006
>Das Ergebnis sind dann die Datensätze der letzen 9 Monate.


Das Ergebnis müsste irgendwie negatiert werden. Ich möchte nämlich
alle Kunden, bei denen es KEINE Einträge in den letzen 9 Monate gibt
herausfiltern. (keine Einträge bedeutet kein Umsatz der letzten 9
Monate. Diese Kunden möchte ich nun wieder besuchen)
Martin Holz (07.04.2007, 12:21)
Stefan Franz wrote:

> Hallo Martin Holz <nospam>,
> Das Ergebnis müsste irgendwie negatiert werden. Ich möchte nämlich
> alle Kunden, bei denen es KEINE Einträge in den letzen 9 Monate gibt
> herausfiltern. (keine Einträge bedeutet kein Umsatz der letzten 9
> Monate. Diese Kunden möchte ich nun wieder besuchen)


Dann halt: <= 07.07.2006

Kennst Du keine Vergleichsoperatoren?

Gruß
Martin
Stefan Franz (08.04.2007, 17:52)
Hallo Martin Holz <nospam>,

>Stefan Franz wrote:
>Dann halt: <= 07.07.2006
>Kennst Du keine Vergleichsoperatoren?


Schon, aber die Sache ist etwas komplexer:

Beispiel:
Kunde Hans: Hierzu gibts Einträge am 1.3.2006 und am 1.12.2006
Kunde Martin: Hierzu gibts nur einen Eintrag am 2.3.2006.

Kunde Hans hatte im letzten 3/4 Jahr einen Umsatz produziert.
Kunde Martin nicht.

Wie mache ich es, daß mir nur Kunde Martin erscheint?

Nur mit <> Datum Vergleich geht das nicht.
Viele Grüße

Stefan
Geht net gibt's ned
Martin Holz (09.04.2007, 19:01)
Stefan Franz wrote:

> Beispiel:
> Kunde Hans: Hierzu gibts Einträge am 1.3.2006 und am 1.12.2006
> Kunde Martin: Hierzu gibts nur einen Eintrag am 2.3.2006.
> Kunde Hans hatte im letzten 3/4 Jahr einen Umsatz produziert.
> Kunde Martin nicht.
> Wie mache ich es, daß mir nur Kunde Martin erscheint?
> Nur mit <> Datum Vergleich geht das nicht.


Stimmt.

In diesem besonderen Falle könnte ich mir vorstellen eine weitere Datenbank
zu riskieren, in der der jeweils letzte Umsatz gespeichert wird.
Damit hast Du dann eine komplett saubere Suche.

Ich hatte mal mit "SQL" und "Find" herumgespielt, bin auf die Schnelle aber
zu keinem brauchbaren Ergebnis gekommen.

Wenn die Datenbankstruktur unantastbar ist, geht es IMHO nur über eine
Positiv- und Negativliste.

Also: Zuerst nach allen Kunden suchen ">= Stichtag" und das dann gegen das
Ergebnis von "< Stichtag" abgleichen.

Alle Datensätze aus der Positivliste (< Stichtag) müssten dann noch einmal
gegen die Negativliste geprüft werden. Wenn ein Eintrag der Positivliste in
der Negativliste enthalten ist, muss er aus der Positivliste gestrichen
werden.

Die Positivliste müsste dann innerhalb einer Schleife an den "Find"
übergeben werden ... also etwa so:

Dim MeineSuche As New Find
Forall Kunde in Positivliste
Call MeineSuche.OR ("Name", "=" & Kunde)
End Forall

Call CurrentDocument.Window.FindSort(MeineSuche)

'ne andere Idee habe ich gerade nicht auf Lager.

Gruß
Martin
Martin Holz (09.04.2007, 20:36)
Martin Holz wrote:

> Wenn die Datenbankstruktur unantastbar ist, geht es IMHO nur über eine
> Positiv- und Negativliste.
> Also: Zuerst nach allen Kunden suchen ">= Stichtag" und das dann gegen das
> Ergebnis von "< Stichtag" abgleichen.
> Alle Datensätze aus der Positivliste (< Stichtag) müssten dann noch einmal
> gegen die Negativliste geprüft werden. Wenn ein Eintrag der Positivliste
> in der Negativliste enthalten ist, muss er aus der Positivliste gestrichen
> werden.
> Die Positivliste müsste dann innerhalb einer Schleife an den "Find"
> übergeben werden ... also etwa so:


Ich hab's mal umgesetzt:

Sub SuchLauf
Dim PositivListe List As String
Dim NegativListe List As String
Dim i As Long, j As Long
i = 0
j = 0

Dim Con As New Connection
Dim Qry As New Query
Dim Res As New Resultset

'
' Negativliste zusammenstellen
'
If (Con.connectto("dBase IV")) Then
Set Qry.Connection = Con
Qry.SQL = "SELECT ""Name"" FROM """ & CurrentDocument.Path _
& "Suche.dbf"" WHERE (""Datum"">='" _
& Datenumber(06,07,01) & "')"
' Datum hier einmal berechnet
Set Res.Query = Qry
If (Res.Execute) Then
Do
NegativListe(i) = Res.GetValue(1)
i = i + 1
Loop While Res.NextRow
End If
End If

Dim Con2 As New Connection
Dim Qry2 As New Query
Dim Res2 As New Resultset

'
' Positivliste zusammenstellen und gegen Negativliste abgleichen
'
If (Con2.connectto("dBase IV")) Then
Set Qry2.Connection = Con2
Qry2.SQL = "SELECT ""Name"" FROM """ & CurrentDocument.Path _
& "Suche.dbf"" WHERE (""Datum""<'01.07.2006')"
' Datum hier Hartcodiert
Set Res2.Query = Qry2
If (Res2.Execute) Then
Do
SchlechterKunde = Res2.GetValue(1)

Dim Treffer As Integer
Treffer = False

Forall GuterKunde In NegativListe
If GuterKunde = SchlechterKunde Then
Treffer = True
End If
End Forall

If Treffer = False Then
PositivListe(j) = SchlechterKunde
j = j + 1
End If

Loop While Res2.NextRow
End If
End If

Con.Disconnect
Con2.Disconnect

'
' Ausgabe der Positivliste in der Datenbankansicht
'
Call CurrentApplication.ActiveDocWindow.FindAll
Dim Ausgabe As New Find
Call Ausgabe.And ("Name", "=" & Positivliste(0))
For k = 1 To j-1 Step 1
Call Ausgabe.And ("Name", "=" & Positivliste(k))
Next
Call CurrentApplication.ActiveDocWindow.FindSort(Ausgab e)
End Sub

Anm.: Ich gehe davon aus, dass Du das ganze _nicht_ gegen den Namen (wie in
meinem Beispiel) suchst sondern gegen eine ID.

HTH
Martin
khr (16.04.2007, 09:21)
Wenn die Tabellen über ODBC angesprochen werden, geht es mit einem
einfachen SQL-Befehl:

select name from Kunden t1 where not exists (select * from Termine t2
where t1.knr=t2.knr and t2.datum>xxxxxxx)

Ich würde die Kundentabelle um ein logisches Feld "Auswahl" erweitern.
Du kannst dann im Script in der Schleife bei allen Kunden, die der
select findet, dieses Feld auf true setzen und dann mit einer Suche
auf dieses Feld los gehen.

Mit freundlichen Grüßen
Karlheinz Rößler
Ähnliche Themen