Ich hab das Datemmodell nicht gemacht

muss es aber nutzen, mit SQL.
Eine Fabrik hat 15 Maschinen.
Jede hat einen Belegungsplan
in einer einzelnen Tabellle,
also 15 Tabellen. (zb M1,M2,M3, …M15
Jede Tabelle hat eine Spalte zb NSEK,
in der jede geplante Belegsekunde des Jahres ist.
Für jede geplante Belegungssekunde ein oder mehrere Sätze.
Für jede geplante Belegsekunde und dazugehörigem
Maschinebenutzer der die Nutzung plant, ein Satz.
Geplante sekunde und Maschinebenutzer ist der
Primary Key. Nicht geplante sekunden sind nicht in der Tabelle.
Sie wird also gegen ende des Jahres ziemlich voll.
Wie kann ich nun feststellen
wann ich in einem bestimmten Zeitraum
eine bestimmte Teilmenge der Maschinen
nutzen kann für eine gwewisse Anzahl zusammenhängender
sekunden, möglichst den frühesten Zeitpunkt, wann ich anfangen kann.

ZB. ich will die Maschinen M1,M2,M7
ab der 34567098 sten sekunde bis zur 54567098
sten sekunde im Jahr für eine Zeitraum
von 120 sekunde gleichzeitig nutzen können.

Die sekunde ist als integer abgelegt,
als soundsovielste sekunde im Jahr.

Ich hab keine Problem damit eine zeile zu ändern,
je nach Teilmenge der benötigten Maschine
zb in (‚M1‘,‚M2‘,‚M7‘) oder so,
aber nicht das ganze Skript.
Natürlich muss es effizient sein, jede Tablelle kann
ja bis zu 32 Mio Sätze enthalten.
Temp Tables View, stored Procedures darf ich nicht.
wir nehmen der Einfachheit halber an, dass wir
nur 5 Maschinen insgesamt haben.

Hallo,

darf ich dieses Datenmodell in meiner Vorlesung verwenden. Das ist nicht nur schlecht, nein, das nuss der Teufel höchstpersönlich gewesen sein, der das gemacht hat.

Ich würde das Problem durch ein komplettes Neuaufsetzen der DB lösen. Dann wird auch die DB sauschnell.

Ansonsten würde ich das nicht mit einem Select, sondern mir einer Prozedur lösen. Schließlich musst du ganz viele Datensätze durchforsten und zusammenfassen.

Gruß

Peter

Klar darfst Du es verwenden.
Aber es kommt noch schlimmer.
Wenn dann eine Maschine endgültig
verbindlich belegt wurde,
wird die Kostenstelle des
Maschinennutzers auch verbidlich belastet,
und die Sekundennummer wird negativ gemacht,
damit man es sieht, dass man mit den übrigen
Planbenutzern nicht mehr verhandlen braucht,
der Planer mit den negativen Sekunden hat ja
schon bezahlt. Und dann muss man auch noch nach Maschine
verschiedenene Umrüstzeiten draufrechnen.
Aber ich glaub das ist ein Fleiss- und weniger ein
Detail geistige Leistung, so krieg ich das auch noch hin,
und ich hab diesen Umstand mal rausgelassen.

Tja, das ganze System gibt es schon
mit 15 Dateien und Cobol programmen,
die aber noch anderes erledigen.
Es soll stückweise ersetzt werden.
Andere Fachbereiche kommen mit dem Datenmodell
gut zurecht, so kann man es nicht neu designen,
also nicht, wenn man die Entwicklungskosten für
ihre Anpassungen nicht auch noch tragen will.

Die alten Cobol Hasen haben jetz ‚Mangementaufgaben‘
oder sind in Frührente. sie sagen, sie kennen DB2,
es ist wie Cobol von IBM, und IBM hat DB2 extra so gemacht,
dass es alles kann, was auch Cobol kann, so solle das wohl
kein grundsätzliches Problem sein.
Es will sich keiner mehr daran
erinnern, wo der komplette gültige Quellcode ist,
und was man noch so alles beachten muss.
Sie sagen auch, ich solle ein langsames aber nicht zu langsames
und ein schnelles Skript machen, letzteres darf nur in Ausnahmefällen
benutzt werden. So werden die Planer erzogen, möglichst früh
und zusammenhängend zu planen und die anteiligen
Umrüstkosten im Maschinepark möglichst gering zu halten.

Holla holla,

gut, dass die in Frührente sind.

Also, du kannst eine Prozedur schreiben, die der Reihe nach die Lücken im vorgegebenen Zeitbereich raussucht. Ein Select auf die erste der Maschinen. Zeiträume kleiner als die vorgegebene Dauer kannst Du ignorieren. In diesen Lücken suchst Du in der nächsten Maschine weiter. Und das solange, bis du alle Lücken gefunden hast, die möglich sind.

Ergebnis:
es gibt keine Lücken
es gibt eine Lücke
bei mehreren Lücken kannst Du z.B. Lücken füllen oder in die größte Lücke schreiben.

Gruß

Peter

also das ist schon mal ne zulässige Ausgangslösung.

Tabelle.Feld
Man fülle mit einem Satzt
L.U int, /* untere sekunden Grenze */
L.O int, /* obere sekunden Grenze */
L.A int /Sekundenabstand */

M.N Char /*1 Satz pro benötigter Maschine aus den Maschinen M1-M5*/

Das sind die Tabellen, wo die Belegungssekunden pr Maschine drin sind
M1.N /*Belegsekunde der Maschine 1, viele viele Sätze*/

M2.N /*Belegsekunde der Maschine 2, viele viele Sätze*/

das untenstehende muss man mit union so oft anhängen, wie man Maschinen im Maschinepark hat,wobei man nur im aüsseren Select
FROM M1 where ‚M1‘
M1 durch Tabllennamen für weitere Maschinen
und ‚M1‘ durch dass Kürzel der Maschine ersestzt,
wie man es in der Tablelle m der benötigten Maschinen eingibt.
Das Script ist statisch und braucht erst dann geändert
zu werden, wenn der Maschinenpark wächst.
Unter Umständen muss man natürlich auch der Feldname N variieren,
was man dann auch in dem inneren select ändern muss,
aber nur einmal bevor man es dupilziert.
Ach ja, dann muss man noch was mit union anhängen,
falls alle Maschinentabellen leer sind, das ist aber einfach
und natürlich ein fetch first row only (DB2),
man will ja nur den ersten satz, der reicht ja.
Das Laufzeitverhalten ist noch zufriedenstellend.
Bis zum ende des Jahres ist ja noch ein wenig zeit.
Ich glaub man muss dann was mit einem Full outer join machen,
wenn es zu langsam wird.

select D.N+1 from M1 D where ‚M1‘ in (select m from m)
and D.N between (select L.U from L) and (select L.O - L.A from L)
and not exists(
select T.N from M1 as T where
‚M1‘ in (select m from m)
and T.N between (D.N+1) and (select L.O - L.A from L)
union select T.N from M2 as T where
‚M2‘ in (select m from m)
and T.N between (D.N+1) and (select L.O - L.A from L)
union select T.N from M3 as T where
‚M3‘ in (select m from m)
and T.N between (D.N+1) and (select L.O - L.A from L)
union select T.N from M4 as T where
‚M4‘ in (select m from m)
and T.N between (D.N+1) and (select L.O - L.A from L)
union select T.N from M5 as T where
‚M5‘ in (select m from m)
and T.N between (D.N+1) and (select L.O - L.A from L)
)
union select D.N+1 from M2 D where ‚M2‘ in (select m from m)
usw usw bis M5

Hallo Hannes,
du bist echt zu bedauern. Nicht nur daß das Datenmodell die Ausgeburt der Hölle ist (s.o.), COBOL-Altlasten zu pflegen ist auch ein sehr guter Kündigungsgrund (ich weiß leider wovon ich rede, ich muß mich gerade auch mit einer Reihe von merkwürdigen ‚Erbschaften‘ rumschlagen). GRAUENHAFT.

Mein zutiefst empfundenes Mitgefühl
bernhard