Problem z ListView

1

Witam,

Mój problem polega na tym, że wczytuję z INI dane do tabeli ListView:

Wygląd tabeli:
| Data | Pracownik 1 | Pracownik 2 | Pracownik 3 | ** Pracownik 4** | Dodatkowe informacje |

W pliku INI zapisane są dane rachunków pracownikow:

[imie_nazwisko nazwa_obiektu, data]
Pracownik=Mirek Biernacki
Nazwa obiektu=Siegfriedstr.8 , Dusseldorf
Nr rachunku=11
Data wystawienia=2011-07-06
Data wykonania=2011-07-06
Kwota rachunku=72
Suma rachunkow=72
Czas pracy=0700
Godzin=6
Suma godzin=6
Status=Nie zapłacone
Dodatkowe informacje=jakies dodatkowe informacje

Teraz tak... W oknie mam 2 komponenty TDateTimePicker nazwane (Od i Do), combobox z wyborem obiektu (budowli) i przycisk Wyświetl. Na tej podstawie program wyszukuje w INI wszyskich pracownikow wybranego obiektu obiektu, którzy zawierają się w dacie (od i do):

 if (Data_wykonania >= Data_od.Date -1) and (Data_wykonania <= Data_do.Date) then
        begin
            //tutaj dodawanie do listview
        end;

Problem w tym, że jeśli 2 pracowników pracowało na tym samym obiekcie, tego samego dnia (załóżmy, że pracowali razem), to zostaną oni wyświetleni każdy w nowym wierszu. Przykład:

Data wykonania | Pracownik 2 | Pracownik 3 | Pracownik 4 | Dodatkowe informacje
2011-07-14 | Nazwa_pracownika 1 | - | - | -
2011-07-14 | Nazwa_pracownika 2 | - | - | - |

Chciałbym, aby wszyscy pracownicy, którzy posiadają taką samą datę wykonania i w INI posiadają przypisane takie same nazwy obiektów, żeby byli dodawani do osobnej kolumny - Pracownik 2... aż do 4. Przykład:

Data wykonania | Pracownik 2 | Pracownik 3 | Pracownik 4 | Dodatkowe informacje
2011-07-14 | Nazwa_pracownika 1 | Nazwa_pracownika 2 | - | -

coś w sylu

for i := 0 to ListView1.Items.Count -1 do 
if Data_wykonania = ListView1.Items[i].Caption then
begin
    if ListView1.Items[i].SubItems[0] = '' //sprawdzanie czy kolumna 1 (Pracownik 1) jest zajęta
    then ListView1.Items[i].Subitems[0] := INI.ReadString(nazwa_sekcji, Pracownik, '') // Dodaj do pierwszej kolumny 
    else ListView1.Items[i].Subitems[1] := INI.ReadString(nazwa_sekcji, Pracownik, '') // Dodaj do drugiej kolumny 

Z tym, że ten kod się w ogóle nie sprawdza.

Próbowałem wczytać do StriingListy wszystkie sekcje z INI, i w petli szukac wymaganych danych czyli:

    
    Sekcje := TStringList.Create;
    INI.ReadSections(Sekcje);

    for j := 0 to Sekcje.Count -1 do
    begin
      if INI.ReadString(Sekcje[j], 'Nazwa obiektu', '') = combobox_obiekt.Text then
      begin
        Data_wykonania := INI.ReadDate(Sekcje[j], 'Data wykonania', Data_wykonania);
        

        if (Data_wykonania >= Data_od.Date -1) and (Data_wykonania <= Data_do.Date) then
        begin
          Item := Lista_obiektow.Items.Add;

          Item.Caption := DateToStr(Data_wykonania) + ' ' + DayValues[DayOfWeek(Data_wykonania)];
          Item.SubItems.Add(INI.ReadString(Sekcje[j], 'Pracownik', '');
// Od tego momentu nie wiem jak rozdzielać kolumny
          Item.SubItems.Add(INI.ReadString(Sekcje[j], 'Pracownik', '');
          Item.SubItems.Add(INI.ReadString(Sekcje[j], 'Pracownik', ''));
          Item.SubItems.Add(INI.ReadString(Sekcje[j], 'Pracownik', ''));

          Item.SubItems.Add(INI.ReadString(Sekcje[j], 'Dodatkowe informacje', ''));
        end;
      end;
    end;

Jakieś pomysły ?

0

Wersja - najmniej kodu:
Wewnątrz if'a przeskanuj dotychczas dodane do ListView wierszy jeżeli nie znajdziesz takiej daty to dodawaj wiersz tak jak teraz tylko że zostaw puste kolumny dla Pracownik2,Pracownik3,Pracownik4
Jeżeli zaś znajdziesz to wpisuj w znalezionym wierszu tylko imię nazwisko pracownika w pierwszą pustą kolumnę.

0

Próbowałem tak:

      if INI.ReadString(Sekcje[j], 'Nazwa obiektu', '') = Objekt then
      begin
        Data_wykonania := INI.ReadDate(Sekcje[j], 'Data wykonania', Data_wykonania);
        Nazwa_pracownika := INI.ReadString(Sekcje[j], 'Pracownik', '');

        for k := 0 to Lista_objektow.Items.Count -1 do
        begin
          if (Lista_objektow.Items[k].Caption = DateToStr(Data_wykonania)) then
          begin
            for l := 0 to Lista_objektow.Items[k].SubItems.Count -1 do
            if not (Pos(Nazwa_pracownika, Lista_objektow.Items[k].SubItems[l]) > 0)
            and not (l = 4) then // omin kolmne 4 (dodatkowe informacje)
            begin
              Lista_objektow.Items[k].SubItems[l] := Nazwa_pracownika; // Problem w tym, ze dodaje tekst do wszystkich 3 kolumn, gdzie nie ma takiego pracownika
            end;
          end else
          begin
            if (Data_wykonania >= Data_od.Date -1) and (Data_wykonania <= Data_do.Date) then
            begin
              Item := Lista_objektow.Items.Add;

              Item.Caption := DateToStr(Data_wykonania) + ' ' + DayValues[DayOfWeek(Data_wykonania)];
              Item.SubItems.Add('');
              Item.SubItems.Add('');
              Item.SubItems.Add('');
              Item.SubItems.Add('');

              Item.SubItems.Add(INI.ReadString(Sekcje[j], 'Dodatkowe informacje', ''));
            end;
          end;
        end;

// Musialem dodac, zeby mial jakies poczatkowe dane i petla zaczela dzialac
// bez tego powyzsze end else nie reaguje.

          if Lista_objektow.Items.Count = 0 then
          begin
            if (Data_wykonania >= Data_od.Date -1) and (Data_wykonania <= Data_do.Date) then
            begin
              Item := Lista_objektow.Items.Add;

              Item.Caption := DateToStr(Data_wykonania) + ' ' + DayValues[DayOfWeek(Data_wykonania)];
              Item.SubItems.Add('');
              Item.SubItems.Add('');
              Item.SubItems.Add('');
              Item.SubItems.Add('');

              Item.SubItems.Add(INI.ReadString(Sekcje[j], 'Dodatkowe informacje', ''));
            end;
          end;

Nie dziala tak jak chce.
Dodaje tylko jednego pracownika do wsystkich 3 kolumn ;/

0

Zrobiłem w ten sposób:

    for j := 0 to Sekcje.Count -1 do
    begin
      if INI.ReadString(Sekcje[j], 'Nazwa obiektu', '') = Objekt then
      begin
        Data_wykonania := INI.ReadDate(Sekcje[j], 'Data wykonania', Data_wykonania);
        Nazwa_pracownika := INI.ReadString(Sekcje[j], 'Pracownik', '');

        Praca_od := StrToTime(INI.ReadString(Sekcje[j], 'Czas pracy', ''));
        Liczba_godzin := INI.ReadFloat(Sekcje[j], 'Godzin', 0);
        Praca_do := Praca_od + ((1/24/60)*60*Liczba_godzin);
        Lista_Godzin.Add(FloatToStr(Liczba_Godzin));

        if Lista_objektow.Items.Count = 0 then
        begin
          if (Data_wykonania >= Data_od.Date -1) and (Data_wykonania <= Data_do.Date) then
          begin
            Item := Lista_objektow.Items.Add;

            Item.Caption := DateToStr(Data_wykonania) + ' ' + DayValues[DayOfWeek(Data_wykonania)];

            Item.SubItems.Add(Nazwa_pracownika + ' ' + FloatToStr(Liczba_godzin) + ' (' + FormatDateTime('HH:mm', Praca_od) + ' - ' + FormatDateTime('HH:mm', Praca_do) + ')');
            Item.SubItems.Add('');
            Item.SubItems.Add('');
            Item.SubItems.Add('');

            Item.SubItems.Add(INI.ReadString(Sekcje[j], 'Dodatkowe informacje', ''));
          end;
        end else
        begin
          for k := 0 to Lista_objektow.Items.Count -1 do
          if (Lista_objektow.Items[k].Caption = DateToStr(Data_wykonania) + ' ' + DayValues[DayOfWeek(Data_wykonania)]) then
          begin

              //for l := 0 to Lista_objektow.Items[k].SubItems.Count -1 do
              if Lista_objektow.Items[k].SubItems[0] = ''
              then Lista_objektow.Items[k].SubItems[0] := Nazwa_pracownika + ' ' + FloatToStr(Liczba_godzin) + ' (' + FormatDateTime('HH:mm', Praca_od) + ' - ' + FormatDateTime('HH:mm', Praca_do) + ')'
              else
              if Lista_objektow.Items[k].SubItems[1] = ''
              then Lista_objektow.Items[k].SubItems[1] := Nazwa_pracownika + ' ' + FloatToStr(Liczba_godzin) + ' (' + FormatDateTime('HH:mm', Praca_od) + ' - ' + FormatDateTime('HH:mm', Praca_do) + ')'
              else
              if Lista_objektow.Items[k].SubItems[2] = ''
              then Lista_objektow.Items[k].SubItems[2] := Nazwa_pracownika + ' ' + FloatToStr(Liczba_godzin) + ' (' + FormatDateTime('HH:mm', Praca_od) + ' - ' + FormatDateTime('HH:mm', Praca_do) + ')'
              else
              if Lista_objektow.Items[k].SubItems[3] = ''
              then Lista_objektow.Items[k].SubItems[3] := Nazwa_pracownika + ' ' + FloatToStr(Liczba_godzin) + ' (' + FormatDateTime('HH:mm', Praca_od) + ' - ' + FormatDateTime('HH:mm', Praca_do) + ')';


          end;

              if (Data_wykonania >= Data_od.Date -1) and (Data_wykonania <= Data_do.Date) then
              begin
                Item := Lista_objektow.Items.Add;

                Item.Caption := DateToStr(Data_wykonania) + ' ' + DayValues[DayOfWeek(Data_wykonania)];

                Item.SubItems.Add(Nazwa_pracownika + ' ' + FloatToStr(Liczba_godzin) + ' (' + FormatDateTime('HH:mm', Praca_od) + ' - ' + FormatDateTime('HH:mm', Praca_do) + ')');
                Item.SubItems.Add('');
                Item.SubItems.Add('');
                Item.SubItems.Add('');

                Item.SubItems.Add(INI.ReadString(Sekcje[j], 'Dodatkowe informacje', ''));
          end;
        end;
      end;
    end;

Efekt: Wczytuje poprawnie pracownikow do kolumn (pracownik 1, 2, 3 i 4), ale duplikuje liczbę pozycji równą liczby użytkowników danego dnia. Przykład:

Mamy 3 pracowników:
Pracownik 1
Data wykonania: 2011-07-14
Pracownik 2
Data wykonania: 2011-07-14
Pracownik 3
Data wykonania: 2011-07-14

Wszyscy trzej pracowali na tym samym obiekcie w tym samym dniu (razem).
Efektem tego powinna być tylko pierwszy wiersz kolumny, ale program dodaje duplikaty.

Data wykonania | Pracownik 1 | Pracownik 2 | Pracownik 3 | Pracownik 4 | Dodatkowe informacje
2011-07-14 | Nazwa_pracownika 1 | Nazwa_pracownika 2 | Nazwa_pracownika 3 | - | -
2011-07-14 | Nazwa_pracownika 2 | Nazwa_pracownika 3 | - | - | -
2011-07-14 | Nazwa_pracownika 1 | - | - | - | -

Co jest nie tak ??

0

Poradziłem sobie :) Dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1