Hier is het vraagstuk (probleem is een groot woord) :
1. PAL wordt gebruikt om songs te selecteren die voldoen aan bepaalde duur (lengte van song).
2. De songs moeten daarnaast ook nog voldoen aan een bepaald CategoryID. (bijv: DanceClassics / 80s / Rock)
Het eerste stuk is opgelost, die PAL is er en werkt goed, echter worden ALLE beschikbare songs bekeken op duur.
In dat gedeelte wordt gebruikt gemaakt van de Tabel 'songlist' uit de SAMDB.
Uit die Tabel worden de volgende velden gebruikt : ID, filename, duration, artist, title.
Van de Tabel 'categorylist' worden de velden : ID, SongID en CategoryID gebruikt.
U begrijpt het al: er moet een link komen tussen de tabel 'songlist' en 'categorylist'.
Want we willen alleen op duur (lengte) geselecteerde songs hebben die voldoen aan een bepaald categoryID.
(Onderaan zal ik de huidige complete PAL zetten.)
Nog wat uitleg:
Nadat er berekend is hoe lang de song mag duren (met een uitloop van een paar seconden), wordt de eerste selectie uitgevoerd met:
Code: Selecteer alles
var D : TDataSet;
D := QUERY('SELECT Songlist.id,Songlist.Filename,Songlist.Duration,Songlist.Artist,Songlist.Title ' +
'FROM songlist ' +
'WHERE Duration >= '+InttoStr(RestTijd) + ' ' +
'AND Duration <= '+InttoStr(RestTijd+5000) ,[],True);
Code: Selecteer alles
var categoryName : String = '70s';
var categoryData : TDataSet = Query('SELECT id FROM category WHERE name = ' + QuotedStr(categoryName),[], true);
WriteLn('Found ID: ' + IntToStr(categoryData['id']));
Code: Selecteer alles
'WHERE songlist.id = categorylist.songid and categorylist.categoryid = ' + IntToStr(categoryData['id']) + ' ' +
De gebruikte SAM is 4.9.x en MySQL 5.1 (maar versie zou niet uit moeten maken).
Tijdstip waarop de PAL moet starten is xx:55:00.
Hieronder de PAL welke momenteel werkt, maar welke dus nog niet goed is :
Code: Selecteer alles
//PAL.Loop:=True;
PAL.LockExecution;
PAL.WaitForTime(T['xx:55:00']);
//variabele voor huidige tijd
var H_uur,H_min,H_sec,H_msec: INteger;
//variabele voor RestTijd;
var RestTijd: Integer;
//variabele voor de tijd waarop opvulmuziek gestart moet worden
var StartTijd: String;
//variabele voor huidige tijd in mseconden
var Nu : Integer;
//variabel voor aantal songs in selectiequery
var AantalSongs : Integer;
//variabele voor query
var D, QInfo : TDataSet;
Randomize;
var myRandomNumber : Integer;
var categoryName : String = '70s';
//bereken de huidige tijd in milliseconden
DecodeTime(Now,H_uur,H_min,H_sec,H_msec);
Nu:= (H_uur*3600000) + (H_min*60000) + (H_sec*1000);
//Resterende tijd tot aan het volgende hele uur berekenen
RestTijd := ((H_uur+1)*3600000) - (nu + Activeplayer.duration - activeplayer.curtime);
//Vind de CatID van variable 'categoryName'
var categoryData : TDataSet = Query('SELECT id FROM category WHERE name = ' + QuotedStr(categoryName),[], true);
WriteLn('Found CatID: ' + IntToStr(categoryData['id']));
////////////selecteer passende song
//omdat de tijd in milliseconden staat, is de kans dat een nummer met exact dezelfde tijd aanwezig is verwaarloosbaar.
//daarom een marge van 10 seconden boven de minimale tijd ingebouwd in de selectievoorwaarde
//ook vanwege eventueel korter draaien van nummers door crossfade instellingen
D := QUERY('SELECT Songlist.id,Songlist.Filename,Songlist.Duration,Songlist.Artist,Songlist.Title ' +
'FROM songlist ' +
'WHERE Duration >= '+InttoStr(RestTijd) + ' ' +
'AND Duration <= '+InttoStr(RestTijd+5000) ,[],True);
//ga naar begin van de selectie
D.First;
//bereken het aantal tracs in de query
while not D.EOF do
begin
AantalSongs := AantalSongs +1;
D.next;
end;
WriteLn('Songs found: '+IntToStr(AantalSongs));
//genereer een random getal, dit getal wordt gebruikt om een wilekeurige track uit de slectie te selecteren
//PAL.UnLockExecution;
myRandomNumber:=(RandomInt(AantalSongs) );
WriteLn('Random nr: '+IntToStr(myRandomNumber));WriteLn('Duration: '+IntToStr(RestTijd));
D.First;
//loop de selectiequery door totdat het juiste nummer gevonden is
AantalSongs:=0;
while not D.EOF do
begin
AantalSongs := AantalSongs +1;
Writeln (D['artist']+' - '+D['title'] );
if AantalSongs = myRandomNumber then
//song is gevonden, plaats nu boven in de queue
begin
Writeln ('Artist: '+D['artist']+' '+'Title: '+D['title' ] );
Queue.AddFile(D['filename'],ipTop);
end;
D.Next;
end;
PAL.UnLockExecution;
(De dubbele songs rechts, zijn nummers die er dus meerdere keren in staan, in diverse categorien.)
Vragen ?