Avatar billede kennethv Nybegynder
11. februar 2014 - 14:25 Der er 1 løsning

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å. :)
Avatar billede kennethv Nybegynder
26. marts 2014 - 14:13 #1
Lukkes.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester