Holde styr på indhold i en liste.
Hejsa.Jeg har på mit arbejde fået laver et lille program til at holde styr på vores licenser, efter ønske af vores indkøber. :)
Man kan vælge om man vil oprette et nyt eller bruge et der findes. Hvis der findes et, læser den, de faneblade der er og putter dem ind i en ComboBox, som man så kan vælge. Udfra det faneblad der er blevet valgt læser jeg indholdet og sammenligner med en CSV fil. Jeg opretter så en nyt faneblad med nye oplysninger i samme selvvalgte dokument.
Hvis brugeren har lov og det er installeret på samme pc, er farven hvid.
Hvis brugeren har lov og det er installeret på en anden pc, er farven grøn.
Hvis brugeren har lov og det er en ny installation, er farven rød.
Alt det fungere helt fint og koden for det er nedenstående.
if pos('''', Combobox1.Items.Strings[ComboBox1.ItemIndex]) <> 0 then //Sheet
AdoQuery2.SQL.Text := 'SELECT * FROM ['+copy(Combobox1.Items.Strings[ComboBox1.ItemIndex],2,pos('$',Combobox1.Items.Strings[ComboBox1.ItemIndex])-1)+']'
else
AdoQuery2.SQL.Text := 'SELECT * FROM ['+Combobox1.Items.Strings[ComboBox1.ItemIndex]+']';
try
AdoQuery2.Open;
try
ProgressBar2.Max := ListView2.Items.Count -1;
for I := 0 to ListView2.Items.Count - 1 do
begin
ADOQuery2.First;
userFound := false;
List.Clear;
strSearchForUsername := copy(Listview2.Items.Item[I].SubItems.CommaText,1,pos(',',Listview2.Items.Item[I].SubItems.CommaText)-1);
while not ADOQuery2.Eof do
begin
if pos(strSearchForUsername, UpperCase(ADOQuery2.FieldByName('User Name').AsString)) <> 0 then
begin
List.Add(ADOQuery2.FieldByName('Computer Name').AsString);
UserFound := true;
end;
ADOQuery2.Next;
end;
if UserFound then
begin
if pos(Listview2.Items.Item[I].Caption,List.Text) <> 0 then
begin
XLEndList.Add(Listview2.Items.Item[I].Caption + ',' + Listview2.Items.Item[I].SubItems.CommaText+ ',0'); // (Color: White) Same user
end
else
begin
XLEndList.Add(Listview2.Items.Item[I].Caption + ',' + Listview2.Items.Item[I].SubItems.CommaText+ ',2'); // (Color: Green) same user, another computer
end;
end
else
begin
XLEndList.Add(Listview2.Items.Item[I].Caption + ',' + Listview2.Items.Item[I].SubItems.CommaText+ ',1'); // (Color: Red) New User
end;
ProgressBar2.Position := i;
ProgressBar2.Update;
Application.Processmessages;
end;
finally
ADOQuery2.Close;
ADOConnection1.Close;
end;
except
ShowMessage('Unable to read data from Excel, make sure the query ' + AdoQuery2.SQL.Text + ' is meaningful!');
raise;
end;
Nu ligger det sådan at vores indkøber har en bøn som går ud på at i stedet for at vælge hvilken faneblad der skal sammelignes med, skal programmet bare tage alle faneblade og gå dem igennem og se om brugerne har ret til at have en licens.
Jeg har forsøgt mig med dette her:
if checkbox5.Checked then
begin
OldExcelList := TStringList.Create;
OldExcelList.Sorted := true;
OldExcelList.duplicates := dupIgnore;
OldExcelList.Clear;
for Y := 0 to listbox2.Count-1 do
begin
if pos('''', listbox2.Items.Strings[Y]) <> 0 then
AdoQuery2.SQL.Text := 'SELECT * FROM ['+copy(Listbox2.Items.Strings[Y],2,pos('$',Listbox2.Items.Strings[Y])-1)+']'
else
AdoQuery2.SQL.Text := 'SELECT * FROM ['+Listbox2.Items.Strings[Y]+']';
try
AdoQuery2.Open;
try
ProgressBar2.Max := ListView2.Items.Count -1;
for I := 0 to ListView2.Items.Count - 1 do
begin
ADOQuery2.First;
strSearchForUsername := copy(Listview2.Items.Item[I].SubItems.CommaText,1,pos(',',Listview2.Items.Item[I].SubItems.CommaText)-1);
while not ADOQuery2.Eof do
begin
if pos(strSearchForUsername, UpperCase(ADOQuery2.FieldByName('User Name').AsString)) <> 0 then
begin
OldExcelList.Add(UpperCase(AdoQuery2.FieldByName('Computer Name').AsString) + ',' + UpperCase(ADOQuery2.FieldByName('User Name').AsString));
end;
ADOQuery2.Next;
end;
end;
finally
ADOQuery2.Close;
end;
ProgressBar2.Position := i;
ProgressBar2.Update;
Application.Processmessages;
except
ShowMessage('Unable to read data from Excel, make sure the query ' + AdoQuery2.SQL.Text + ' is meaningful!');
raise;
end;
end;
for I := 0 to ListView2.Items.Count -1 do
begin
strSearchForUsername := copy(Listview2.Items.Item[I].SubItems.CommaText,1,pos(',',Listview2.Items.Item[I].SubItems.CommaText)-1);
if pos(strSearchForUsername, OldExcelList.Text) <> 0 then // Findes user
begin
if pos(Listview2.Items.Item[I].Caption,OldExcelList.Text) <> 0 then
begin
XLEndList.Add(Listview2.Items.Item[I].Caption + ',' + Listview2.Items.Item[I].SubItems.CommaText+ ',0'); // (Color: White) Same user
end
else
begin
XLEndList.Add(Listview2.Items.Item[I].Caption + ',' + Listview2.Items.Item[I].SubItems.CommaText+ ',2'); // (Color: Green) same user, another computer
end;
end
else
begin
XLEndList.Add(Listview2.Items.Item[I].Caption + ',' + Listview2.Items.Item[I].SubItems.CommaText+ ',1'); // (Color: Red) New User
end;
end;
end
Men jeg er ikke overbevist om at det fungere. Måske er jeg endt med at jeg ikke kan se skoven for bare af træer.
Men min source ser sådanne ud:
"SELULT3167","AL1","AD","SELUJNNE","Microsoft Windows NT Workstation 6.1","Microsoft Project Professional 2010"
I mit exceldok er der 2 faneblade med det her:
F1
SELULT3043 SELUJNNE John Doe 5412 Project pro
F2
SELULT3167 SELUJNNE John Doe 7220 5412 Project pro
OldExcelList.text:
'SELULT2741,SELUSONA'#$D#$A'SELULT3043,SELUJNNE'#$D#$A'SELULT3167,SELUJNNE'#$D#$A'SETULT1106,SETUBFG'#$D#$A
Som det ses i OldExcelList.text indholder SELUJNNE 2 gange med 2 forskellige computernavne. Og i den sidste for-to-do er jeg ikke sikker på at gør det helt rigtig, for jeg kigger bare efter om de er i listen.
Hvis nu det samme computernavn opstår der 2 gange med forskellige brugere så bliver resultatet ikke korrekt.
Koden for at læse og skrive medtager jeg ikke, da det fungere helt fint.
Håber ikke at der var alt for meget at læse og det var til at forstå. :)