Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: Smartengine am November 08, 2011, 14:50:35

Titel: Acces Zeitberechung(in Tagen) von einem Status
Beitrag von: Smartengine am November 08, 2011, 14:50:35
Grüß euch.

Da ich erst seit einigen Wochen mit Access arbeite steh ich grad vor nem kleinen Problem bei dem ihr mir sicherlich helfen könnt  ;D

Folgende Daten sind vorhanden:

Tabelle:
entry No____Repair order No_____old Status___new Status___Creation Date
123________110123____________0__________1_________ ___04.07.2011
147________110123____________1__________4_________ ___05.07.2011
155________110123____________4__________5_________ ___19.07.2011
157________110156____________0__________1_________ ___04.07.2011
169________110156____________1__________4_________ ___08.07.2011
175________110156____________4__________1_________ ___23.07.2011
199________110156____________1__________7_________ ___24.07.2011
usw.

Was ich nun Brauche ist eine Berechung wie lange, also wie viele Tage die jeweilige Repair order No_ auf Status 1, 2 ,3 usw. war.
Wie man sieht kann ein Status öfters vorkommen, dieser müsste dann zusammengerechnet werden.
Ich hatte mal eine Lösung, wo ich die Tabelle auf sich selbst verlinkt hab, was aber zu fehlerhaften Ergebnissen durch doppeleinträge gezeichnet war.

Vermutlich ist das total einfach aber als Anfänger seh ich den Wald vor lauter Bäumen nicht  ;D

Danke euch schon mal im vorraus
Titel: Re: Acces Zeitberechung(in Tagen) von einem Status
Beitrag von: Beaker s.a. am November 08, 2011, 21:57:51
Hallo Smartengine,
Versuch's Mal damit

SELECT DeineTabelle.ID, DeineTabelle.DeinDatum, _
(SELECT MIN(T.DeinDatum)
FROM DeineTabelle T WHERE DeinDatum > DeineTabelle.DeinDatum) AS
NächstesDatum, DateDiff("D",DeineTabelle.DeinDatum, (SELECT MIN(T.DeinDatum)
FROM DeineTabelle T WHERE DeinDatum > DeineTabelle.DeinDatum)) AS Differenz
FROM DeineTabelle
WHERE (SELECT MIN(T.DeinDatum) FROM DeineTabelle T WHERE DeinDatum >
DeineTabelle.DeinDatum) Is Not Null
Titel: Re: Acces Zeitberechung(in Tagen) von einem Status
Beitrag von: Beaker s.a. am November 08, 2011, 22:16:44
Sorry, war noch gar nicht fertig. Wollte es eigentlich besser formatieren und den Quellennachweis dazu schreiben.
Also

SELECT DeineTabelle.ID,
     DeineTabelle.DeinDatum, _
     (SELECT MIN(T.DeinDatum) FROM DeineTabelle AS T WHERE DeinDatum > DeineTabelle.DeinDatum) AS NächstesDatum, _
     DateDiff("D",DeineTabelle.DeinDatum, (SELECT MIN(T.DeinDatum) FROM DeineTabelle AS T WHERE _
         DeinDatum>DeineTabelle.DeinDatum)) AS Differenz
FROM DeineTabelle
WHERE (SELECT MIN(T.DeinDatum) FROM DeineTabelle AS T WHERE DeinDatum > DeineTabelle.DeinDatum) Is Not Null
(Henry Habermacher)

Tabellen- und Feldnamen musst Du natürlich anpassen.
hth
gruss ekkehard
Titel: Re: Acces Zeitberechung(in Tagen) von einem Status
Beitrag von: Beaker s.a. am November 08, 2011, 22:49:22
Hallo Smartengine,
Ich noch Mal. Gerade noch Mal genau die Frage gelesen (Franz und Peter mögen mir meinen erneuten Schnellschuss vergeben).
Da fehlt natürlich noch der Filter auf die Repair_Order_No

SELECT DeineTabelle.Entry_No,
            DeineTabelle.Repair_Order_No, ...
.
... WHERE (SELECT MIN(T.DeinDatum) FROM DeineTabelle AS T WHERE DeinDatum > DeineTabelle.DeinDatum) Is Not Null AND _
DeineTabelle.Repair_Order_No = Bla

Geht so aber trotzdem nicht, da Du ja zwei Statusfelder hast.
Das würde ich ändern, da Du doch nur den aktuellen Status brauchst; will sagen, wenn sich der Status ändert, schreibst Du einen neuen DS mit dem neuen.
Also
entry No____Repair order No_____Status___Creation Date
123________110123____________1_______04.07.2011
147________110123____________4_______05.07.2011
155________110123____________5_______19.07.2011

So sollte es dann funktionieren.
gruss ekkehard
Titel: Re: Acces Zeitberechung(in Tagen) von einem Status
Beitrag von: Smartengine am November 09, 2011, 06:08:21
Guten Morgen Ekkehard.
Das mit dem 2. Status weglassen ist kein Problem.
Werde es dann sobald ich Zeit habe Testen. Heute is nur irgendwie Meeting-Day bei mir^^

Danke dir.
Titel: Re: Acces Zeitberechung(in Tagen) von einem Status
Beitrag von: database am November 12, 2011, 21:24:36
Hallo,
ZitatIch hatte mal eine Lösung, wo ich die Tabelle auf sich selbst verlinkt hab, was aber zu fehlerhaften Ergebnissen durch doppeleinträge gezeichnet war

Hierzu musst du in deine Tabelle ein Feld mit (als Autowert z.B. TabID) als Primärschlüssel einfügen, da der Join auf sich selbst in dem Fall eine fortlaufende Nummer benötigt
Danach kannst du die Tagesdifferenzen wie folgt berechnen lassen - Mit dem erwähnten Join auf sich selbst


SELECT T1.[entry No], T1.[Repair Order No], T1.[old Status], T1.[new Status], T2.[Creation Date] AS CD2, T1.[Creation Date] AS CD1, CD1-CD2 AS Differenz
   FROM DeineTabelle AS T1
       LEFT JOIN DeineTabelle AS T2
       ON T1.TabID = T2.TabID + 1
WHERE T1.[old Status] > 0
Titel: Re: Acces Zeitberechung(in Tagen) von einem Status
Beitrag von: ebs17 am November 12, 2011, 22:58:26
SELECT T.entryNo      ,
       T.RepairOrderNo,
       T.oldStatus    ,
       T.newStatus    ,
       T.CreationDate ,
       T.CreationDate - NZ(SELECT MAX(X.CreationDate)
                        FROM    DeineTabelle X
                        WHERE   X.CreationDate  < T.CreationDate
                        AND     X.RepairOrderNo = T.RepairOrderNo
                        ), T.CreationDate) AS Diff
FROM DeineTabelle T


MfGA
ebs
Titel: Re: Acces Zeitberechung(in Tagen) von einem Status
Beitrag von: database am November 13, 2011, 08:52:29
Hallo,

Zitat...Wie man sieht kann ein Status öfters vorkommen, dieser müsste dann zusammengerechnet werden...
Die Summen von identen Statuseinträgen berechnest du dann über eine neue Abfrage.
In der Annahme, dass du meinem Tipp in #5 für die Ermittlung der Standzeiten gefolgt bist und die Abfrage unter dem Namen 'qryDifferenzen' abgespeichert hast
erzeugst du eine neue Abfrage und fügst in der SQL Ansicht dieser neuen Abfrage die folgende SQL ein:


SELECT qryDifferenzen.[Repair Order No], qryDifferenzen.[old Status], Sum(qryDifferenzen.[Differenz]) AS Statussumme
FROM qryDifferenzen
GROUP BY qryDifferenzen.[Repair Order No], qryDifferenzen.[old Status]