Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Acces Zeitberechung(in Tagen) von einem Status

Begonnen von Smartengine, November 08, 2011, 14:50:35

⏪ vorheriges - nächstes ⏩

Smartengine

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
Wenn Sie das hier lesen können, brauchen sie keine Brille 8)

Beaker s.a.

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
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)

Beaker s.a.

#2
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
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)

Beaker s.a.

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
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)

Smartengine

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.
Wenn Sie das hier lesen können, brauchen sie keine Brille 8)

database

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

ebs17

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

database

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]