0

Suche erstes Datum und erstelle Eintrag

In der Tabelle SONGS listen wir alle Lieder unserer Datenbank. Diese können auf verschiedenen Tonträgern erscheinen welche in der Tabelle PRODUKTE angelegt werden und die Songs über eine n:m Verknüpfung der Tabelle TRACKS (= Songliste eines PRODUKTEs die über SONGs befüllt wird) verknüpft werden. Die PRODUKTE haben jeweils unterschiedliche 'Release' Daten.

Nun möchte ich über einen Trigger allen Songs das jeweils erste 'Release' Datum in der Tabelle PRODUKTE suchen und den kleinsten gefundenen Wert in das Feld 'Erster Release' in der Tabelle SONGS eintragen.

Danke für jede Hilfe!

8 Antworten

null
    • Maurice
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Wie identifizierst du einen Song, sprich: wann sind zwei Songs identisch? Und in welcher Tabelle ist das Datum hinterlegt? Bei PRODUKTE?

      • Reinhard
      • vor 1 Jahr
      • Gemeldet - anzeigen

       ich mach mal ein Beispiel von dem was ich brauche:

      SONG A wurde auf PRODUKT 1 und PRODUKT 2 veröffentlicht. PRODUKT 1 ist am 01.01.1990 erschienen (Datum-Feld im PRODUKT) PRODUKT 2 am 01.03.2000. Nun möchte ich in der Tabelle SONGS ein Datumfeld namens "Erster Release" automatisch befüllen, in dem alle verknüpften PRODUKTE nach dem frühesten Datum durchsucht werden, das Ergebnis dann in "Erster Release" eingetragen wird. Am besten kann ich über einen Trigger nur den jeweiligen Song bearbeiten, und über einen weiteren die Bearbeitung für alle Songs machen. 

      Aktuelle Trigger die ich erfolgreich nutze:

      Songspezifisch:

      'Aufnahmeland (dynamisch)' := 1;
      Aufnahmejahr := year('Erster Release') - 1;
      'Genre (GVL)' := "POPROCK"

      alle Songs:

      let result := dialog("Bestätigen", "Alle Felder mit Standard einpflegen?", ["Ja, bitte", "Nein, lieber nicht"]);
      if result = "Ja, bitte" then
          for i in select Songs do
              if i.'Aufnahmeland (dynamisch)' = null then
                  i.('Aufnahmeland (dynamisch)' := 1);
                  if i.'Genre (GVL)' = null then
                      i.('Genre (GVL)' := "POPROCK");
                      if i.Aufnahmejahr = null then
                          i.(Aufnahmejahr := year('Erster Release') - 1)
                      end
                  end
              end
          end
      end

    • Maurice
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Du solltest dir überlegen, ob das Datum in SONG nicht eher ein Funktionsfeld  sein sollte statt ein Datumsfeld. Das Funktionsfeld ist dann automatisch immer richtig, ein Datumsfeld würde ich in irgendeiner Form gegen Veränderung sichern. Falls du ein Datumsfeld nutzt, würde ich das über einen Trigger in der Tabelle TRACKS steuern. Dort werden ja jedem neuen Produkt (Datenträger) die enthaltenen Songs zugeordnet bzw. ein neuer Song erhält den dazugehörigen Datenträger.

    Nicht klar für mich ist nach wie vor, wie ein Song identifiziert ist. Also z.B. der Song "Kiss" als Studioversion von Prince ist ja auf ganz verschiedenen CDs: Parade, Greatest Hits, etc. Als Life Song (dann wohl ein anderer Song bei dir) wiederum auf versch. Datenträgern/Quellen. Manchmal ist das gleiche Lied in versch. Versionen auf dem gleichen Datenträger. Wie unterscheidest du das? Ich gehe jetzt davon aus, dass ein Song bei dir in irgendeiner Weise eine Art ID hat (nicht zu verwechseln mit der fortlaufenden Nummer-ID in der Datenbank). In einem Formularfeld in der Tabelle SONGS könnte dann stehen (ohne es ausprobiert zu haben):

    let me:= SongID;
    first((select TRACKS) [SongID=me] order by Produkte.Datum).Datum
    

    Dabei ist SongID  ein Feld mit der irgendwie gearteten Identitätsauszeichnung eines Liedes (das es ja auf mehreren Produkten gibt) und Produkte die Feldbezeichnung der Tabelle PRODUKTE in der n:m Tabelle TRACKS. Falls du kein Feld mit SongID hast, musst du die Identität durch bestimmte Kennzeichen im Fomularfeld herstellen (z.B. Länge, Titel, Interpret, Produzent, ...)

    Willst du über einen Trigger arbeiten, dann diesen in der Tabelle TRACKS bei "Trigger nach Änderung"

    let me:= this;
    let meSong := me.Songs.SongID;
    let myDatum := first((select TRACKS) [SongID=me] order by Produkte.Datum).Datum;
    me.Songs.Datum := myDatum

    Dabei ist "Songs" die Feldbezeichnung der Tabelle SONGS in der Beziehungstabelle TRACKS.

      • Reinhard
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Maurice erstmal vielen lieben Dank für Deine ausführliche Antwort, und dass Du so schön mitdenkst. 

      Das Datumsfeld als Funktionsfeld leuchtet mir ein, jedoch gibt es ein paar Dinge, die dagegen sprechen, beispielsweise:

      - Manchmal nehmen wir Songs in die Datenbank des Labels auf, die bereits vor langer Zeit auf einem anderen Produkt bei einem anderen Label released wurden und veröffentlichen diese auf einem neuem eigenen Produkt. Die GVL verlangt dass wir in dem Fall das erste Releasedatum angeben. Wenn es nun kein Produkt bei uns gibt, wäre das Funktionsfeld im Song leer. 

      Eindeutig identifiziert werden die Songs über einen ISRC, eine eindeutige Nummer pro Track. für verschiedene Versionen des selben Titels werden immer neue Tracks erstellt mit neuen ISRCs.

      Ich teste mal Deine Vorschläge und melde mich wieder! Danke.

      • Maurice
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Die Zeile

       

      let myDatum := first((select TRACKS) [SongID=me] order by Produkte.Datum).Datum;
      

      muss aber lauten:

      let myDatum := first((select TRACKS) [SongID=me] order by Produkte.Datum).Produkte.Datum;
      
      • mirko3
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Versuche mal eine Button in der Tabelle Song. Mirko

      for i in select SONGS do
          i.('Erster Release' := min((select PRODUKTE)[Song = i.Song].Release))
      end
      
      • Maurice
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Ich dachte SONG und PRODUKTE hängen über die Tabelle TRACKS (n:m) miteinander zusammen. Aber der Grundgedanke über die i-Schleife mit MIN zu gehen, ist elegant. Bin kein Informatiker: würde mich mal interessieren, welcher Ansatz weniger Ressourcen benötigt. 

      • mirko3
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Hi Maurice. Es war auch nur so eine Idee. Meine, sicher nicht maßgebliche, Erfahrung zeigt, daß ein Funktionsfeld eine ständige Berechnung beim Öffnen eines Records oder der Tabelle zur Folge hat. Soweit irgend möglich verwende ich sie nur in Dashboards. Der Button wird hin und wieder aktiviert oder mit einem Trigger (bei neuem Datensatz) verbunden und dann sind die Einträge fix. Meine Erfahrung mit riesigen Tabellen mit abertausenden Datensätzen ist äußerst gering. Ich hatte mal eine while-Schleife mit create() die nicht stoppen wollte... ;-) Ansonsten, Du weißt ja, Rom und die Wege. Mirko