Problem bei komplizierter Datenbank-Abfrage
Lukas
- datenbank
0 mrjerk0 Rouven
0 Lukas0 hawkmaster0 Rouven
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
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
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
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
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
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#
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