Lukas: Problem bei komplizierter Datenbank-Abfrage

Hallo zusammen!

Ich möchte ein Programm schreiben, welches zwischen verschiedenen Versionen derselben Anwendung unterscheidet und die Namen der geänderten Dateien der Software ausgibt. Dazu habe ich mich entschlossen mit einer Datenbank zu arbeiten, um die verschiedenen Versionen und die Änderungen zu speichern. In diesem Fall mit Access (Access 2000-Dateiformat).

Das Design der Tabelle sieht so aus:

Major | Minor | Patch | Build |       Files
----------------------------------------------------
  0   |   1   |   0   |   21  | test1.txt
  0   |   1   |   1   |   1   | test1.txt;test1.wav
  0   |   2   |   0   |   14  | test1.bmp;test1.xls

Angenommen ich habe Version 0.1.1-1. Dann soll mir die Datenbank die Namen aller Dateien zurückliefern, die sich seit dieser Version geändert haben. In diesem Fall ist das der unterste Eintrag der Version 0.2.0-14.

Aber wie bekomme ich Access dazu, mir die Namen aller Dateien zu geben, die sich geändert haben?

In einer Programmiersprache würde die Abfrage so aussehen:

  
if(Major > 0)  
  return Files;  
else if(Minor > 1)  
  return Files;  
else if(Patch > 1)  
  return Files;  
else if(Build > 1)  
  return Files;  
else  
  return null;  

Wie formuliere ich das mit SQL? Diese Abfrage führt nicht zu dem erwünschten Ergebnis:

  
SELECT  
  Files  
FROM  
  tblVersion  
WHERE  
  Major >= 0 AND  
  Minor >= 1 AND  
  Patch >= 1 AND  
  Build >= 1  

Das kann auch nicht funktionieren, da Patch bei Version 0.2.0-14 niedriger ist als bei Version 0.1.1-1. Aber wie formuliere ich jetzt diese Abfrage mit SQL?

Wenn irgendwas nicht verständlich ist, beantworte ich gerne Rückfragen. Danke schon mal für eure Hilfe!

Viele Grüße,
Lukas

  1. Hallo,

    Das kann auch nicht funktionieren, da Patch bei Version 0.2.0-14 niedriger ist als bei Version 0.1.1-1. Aber wie formuliere ich jetzt diese Abfrage mit SQL?

    Im Prinzip ist ja eine Versionsnummer sowas wie eine Dezimalzahl - warum rechnest Du intern die Versionsnummern nicht in Dezimalzahlen um?

    0.1.1-1. => 111

      
    SELECT  
      Files,  
    FROM  
      tblVersion  
    WHERE  
      ((Major * 1000) + (Minor * 100) + (Patch * 10) + Build) >= 111  
      
    
    

    Syntax hab ich jetzt nicht geprüft, das ist jetzt nur ein Denkansatz.

    Viele Grüße,
    Jörg

    1. Hello,

      Syntax hab ich jetzt nicht geprüft, das ist jetzt nur ein Denkansatz.

      leider nicht mehr als das, bedenke, dass nach Versionsnummernkonzept auch folgende Versionsfolge denkbar ist:
      1.0.0.9
      1.0.0.10
      1.0.0.11
      1.0.1.0

      MfG
      Rouven

      --
      -------------------
      sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
      Vegetarier essen meinem Essen das Essen weg.
  2. Hey!

    Also ich habe jetzt eine Lösung, die wahrscheinlich nicht optimal ist, aber dafür prächtig funktioniert. Wenn jemand einen Verbesserungsvorschlag oder eine komplett andere Idee hat würde ich mich trotzdem über Rückmeldungen freuen :)

    Hier mein C#-Code, der den SQL-Query erzeugt:

      
    SELECT  
      strFiles  
    FROM  
      tblVersion  
    WHERE  
      (intMajor > 0) OR  
      (intMajor = 0 AND intMinor > 1) OR  
      (intMajor = 0 AND intMinor = 1 AND intPatch > 1) OR  
      (intMajor = 0 AND intMinor = 1 AND intPatch = 1 AND intBuild > 1)  
    
    

    Die Version in diesem Beispiel ist 0.1.1-1.

    Danke an alle die sich Gedanken gemacht haben!

    Viele Grüße,
    Lukas

    1. Hallo

      auch wenn du schon eine Lösung gefunden hast.

      Vielleicht wäre dies noch was für dich?

        
      SELECT  Files FROM test ORDER BY CONCAT(`Major`,`Minor`,`Patch`,`Built`) DESC LIMIT 1  
      
      

      Bei deiner Lösung musst du ja für jede Zahl die du übergibst eine Variable einsetzen.

      viele Grüße
      hawk

      1. Hello,

        SELECT  Files FROM test ORDER BY CONCAT(Major,Minor,Patch,Built) DESC LIMIT 1

          
        Es gebe Versionen:  
        1\.9.0.0  
        1\.12.0.0  
          
        Dein Statement wird also die Strings  
        1900  
        11200  
        vergleichen und absteigend sortieren, was leider genau falsch herum herauskommt.  
          
        MfG  
        Rouven  
        
        -- 
        \-------------------  
        sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& ([SelfCode](http://selfspezial.atomic-eggs.com/scode/selfcode.php?encodieren))  
          
        Computer programming is tremendous fun. Like music, it is a skill that derives from an unknown blend of innate talent and constant practice. Like drawing, it can be shaped to a variety of ends: commercial, artistic, and pure entertainment. Programmers have a well-deserved reputation for working long hours but are rarely credited with being driven by creative fevers. Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination, but because their imagination reveals worlds that others cannot see. -- Larry OBrien and Bruce Eckel in Thinking in C#
        
        1. Hallo Rouven
          ach man, du du hast Recht :-)
          habe nur mal mit den Beispieldaten ausprobiert.

          Aber da die führenden Nullen ja nicht beachtet werden klappt es so nicht.
          Danke für den Hinweis.

          vielen Dank und viele Grüße
          hawk