Wielkie dzięki!!
Dużo mi pomogłeś, wezmę sobie te rady do serca.
A tak na marginesie, to próbując Twojego kodu, nie do końca to działa...
Tworzy mi kopie tego samego pracownika (tyle razy ile wystepuje w tabeli Pomocniczej to dodaje go do List Objektow w prawo, oraz nie wyświetla innych pracownikow).
Tak wygląda teraz kod działający:
for i := 0 to Lista_Pomocnicza.Items.Count -1 do
begin
data_wykonania := Lista_Pomocnicza.Items[i].Caption;
nazwa_pracownika := Lista_Pomocnicza.Items[i].SubItems[0];
godzin := Lista_Pomocnicza.Items[i].SubItems[1];
czas_pracy := Lista_Pomocnicza.Items[i].SubItems[2];
case Lista_Objektow.Items.Count of
0: begin
Item := Lista_Objektow.Items.Add;
Item.Caption := FormatDateTime('yyyy-mm-dd', StrToDate(data_wykonania)) + ' ' +
DayValues[DayOfWeek(StrToDate(data_wykonania))];
Item.SubItems.Add(nazwa_pracownika + ' ' + godzin + ' Std. <br>(' + czas_pracy + ')');
for J := 0 to 5 do
Item.SubItems.Add('');
end;
else
for J := 0 to Lista_Objektow.Items.Count -1 do
{ WSTAWIAJAC W TO MIEJSCE PETLE FOR K := 0 TO 5 do - kopiuje mi pracownikow w prawo
w jednym wierszu zamiast ich odpowienio rozdzielic wg. dat.
musialem zostawic jak jest.
oczywiscie subitems pozamienialem na K i zostawielm tylko jedna linije, reszte wywalilem.
}
if (Lista_objektow.Items[j].Caption = FormatDateTime('yyyy-mm-dd', StrToDate(data_wykonania)) + ' ' +
DayValues[DayOfWeek(StrToDate(Data_wykonania))]) then
if Lista_objektow.Items[j].SubItems[0] = ''
then Lista_objektow.Items[j].SubItems[0] := Nazwa_pracownika + ' ' + godzin +
' Std. <br>(' + Czas_Pracy + ')'
else
if Lista_objektow.Items[j].SubItems[1] = ''
then Lista_objektow.Items[j].SubItems[1] := Nazwa_pracownika + ' ' + godzin +
' Std. <br>(' + Czas_Pracy + ')'
else
if Lista_objektow.Items[j].SubItems[2] = ''
then Lista_objektow.Items[j].SubItems[2] := Nazwa_pracownika + ' ' + godzin +
' Std. <br>(' + Czas_Pracy + ')'
else
if Lista_objektow.Items[j].SubItems[3] = ''
then Lista_objektow.Items[j].SubItems[3] := Nazwa_pracownika + ' ' + godzin +
' Std. <br>(' + Czas_Pracy + ')'
else
if Lista_objektow.Items[j].SubItems[4] = ''
then Lista_objektow.Items[j].SubItems[4] := Nazwa_pracownika + ' ' + godzin +
' Std. <br>(' + Czas_Pracy + ')'
else
if Lista_objektow.Items[j].SubItems[5] = ''
then Lista_objektow.Items[j].SubItems[5] := Nazwa_pracownika + ' ' + godzin +
' Std. <br>(' + Czas_Pracy + ')';
// bez tego comoboxa wyswietlal by mi duplikaty pracownikow na liscie
// szczerze nie mam pojecia jakim cudem z nim dziala... ;o
if combo_pomoc.ItemIndex = combo_pomoc.Items.IndexOf(data_wykonania) then
begin
combo_pomoc.Items.Add(data_wykonania);
combo_pomoc.ItemIndex := combo_pomoc.Items.Count;
Item := Lista_Objektow.Items.Add;
Item.Caption := FormatDateTime('yyyy-mm-dd', StrToDate(data_wykonania)) + ' ' +
DayValues[DayOfWeek(StrToDate(data_wykonania))];
Item.SubItems.Add(nazwa_pracownika + ' ' + godzin + ' Std. <br>(' + czas_pracy + ')');
for J := 0 to 5 do
Item.SubItems.Add('');
end;
end;
end;
A tak wygląda procedura generująca rachunek:
procedure TForm_Main.Wyswietl_Dane_Obiektow;
var
Item : TListItem;
Duplikator : TStringList;
i, j, k : integer;
suma_godzin : double;
nazwa_pracownika,
data_wykonania,
godzin,
czas_pracy : string;
begin
Lista_Objektow.Clear; // Wyczysc liste obiektow
Lista_Gesamt.Clear; // Wyczysc liste gesamt
Lista_Pomocnicza.Clear; // Wyczysc liste pomocniczna
{
Poniżej znajduje się kod odpowiadający za
wyplenianie tabeli rachunkow
}
//Tworzy polecenie SELECT z wybranym filtrowaniem (obiekt/data od/do)
Zapytanie_obiekty := 'data_wykonania BETWEEN ' + QuotedStr(DateToStr(Data_Od.Date)) + ' AND ' + QuotedStr(DateToStr(Data_Do.Date));
// Wybiera pracownikow z data wykonania pracy z uwzglednieniem filtra
zapytanieSelect('SELECT data_wykonania, pracownik, godzin, czas_pracy, dodatkowe_info ' +
'FROM Rutecki.bills ' +
'WHERE obiekt=' + QuotedStr(combo_objekt.Text) + ' ' +
'AND ' + Zapytanie_obiekty + '', DataModule1.ADOQuery_Edit);
// Petla dodaje do listy wszystkich wyszukanych pracownikow
while not DataModule1.ADOQuery_Edit.Eof do
begin // petla
Item := Lista_Pomocnicza.Items.Add;
Item.Caption := DataModule1.ADOQuery_Edit.FieldValues['data_wykonania'];
Item.SubItems.Add(DataModule1.ADOQuery_Edit.FieldValues['pracownik']);
Item.SubItems.Add(DataModule1.ADOQuery_Edit.FieldValues['godzin']);
Item.SubItems.Add(DataModule1.ADOQuery_Edit.FieldValues['czas_pracy']);
Item.SubItems.Add(DataModule1.ADOQuery_Edit.FieldValues['dodatkowe_info']);
DataModule1.ADOQuery_Edit.Next(); // przerzucamy rekord, w końcu pętla
end;
DataModule1.ADOQuery_Edit.Close(); // zamykamy połączenie.
combo_pomoc.Clear; // wyczysc combo
for i := 0 to Lista_Pomocnicza.Items.Count -1 do
begin
data_wykonania := Lista_Pomocnicza.Items[i].Caption;
nazwa_pracownika := Lista_Pomocnicza.Items[i].SubItems[0];
godzin := Lista_Pomocnicza.Items[i].SubItems[1];
czas_pracy := Lista_Pomocnicza.Items[i].SubItems[2];
case Lista_Objektow.Items.Count of
0: begin
Item := Lista_Objektow.Items.Add;
Item.Caption := FormatDateTime('yyyy-mm-dd', StrToDate(data_wykonania)) + ' ' +
DayValues[DayOfWeek(StrToDate(data_wykonania))];
Item.SubItems.Add(nazwa_pracownika + ' ' + godzin + ' Std. <br>(' + czas_pracy + ')');
for J := 0 to 5 do
Item.SubItems.Add('');
end;
else
for J := 0 to Lista_Objektow.Items.Count -1 do
if (Lista_objektow.Items[j].Caption = FormatDateTime('yyyy-mm-dd', StrToDate(data_wykonania)) + ' ' +
DayValues[DayOfWeek(StrToDate(Data_wykonania))]) then
if Lista_objektow.Items[j].SubItems[0] = ''
then Lista_objektow.Items[j].SubItems[0] := Nazwa_pracownika + ' ' + godzin +
' Std. <br>(' + Czas_Pracy + ')'
else
if Lista_objektow.Items[j].SubItems[1] = ''
then Lista_objektow.Items[j].SubItems[1] := Nazwa_pracownika + ' ' + godzin +
' Std. <br>(' + Czas_Pracy + ')'
else
if Lista_objektow.Items[j].SubItems[2] = ''
then Lista_objektow.Items[j].SubItems[2] := Nazwa_pracownika + ' ' + godzin +
' Std. <br>(' + Czas_Pracy + ')'
else
if Lista_objektow.Items[j].SubItems[3] = ''
then Lista_objektow.Items[j].SubItems[3] := Nazwa_pracownika + ' ' + godzin +
' Std. <br>(' + Czas_Pracy + ')'
else
if Lista_objektow.Items[j].SubItems[4] = ''
then Lista_objektow.Items[j].SubItems[4] := Nazwa_pracownika + ' ' + godzin +
' Std. <br>(' + Czas_Pracy + ')'
else
if Lista_objektow.Items[j].SubItems[5] = ''
then Lista_objektow.Items[j].SubItems[5] := Nazwa_pracownika + ' ' + godzin +
' Std. <br>(' + Czas_Pracy + ')';
if combo_pomoc.ItemIndex = combo_pomoc.Items.IndexOf(data_wykonania) then
begin
combo_pomoc.Items.Add(data_wykonania);
combo_pomoc.ItemIndex := combo_pomoc.Items.Count;
Item := Lista_Objektow.Items.Add;
Item.Caption := FormatDateTime('yyyy-mm-dd', StrToDate(data_wykonania)) + ' ' +
DayValues[DayOfWeek(StrToDate(data_wykonania))];
Item.SubItems.Add(nazwa_pracownika + ' ' + godzin + ' Std. <br>(' + czas_pracy + ')');
for J := 0 to 5 do
Item.SubItems.Add('');
end;
end;
end;
{
Poniżej znajduje się kod odpowiadający za
wyplenianie tabeli Gesamt (podsumowanie godzin pracownikow w osobnej tabelce)
}
Duplikator := TStringList.Create;
Duplikator.Sorted := True;
Duplikator.Duplicates := dupIgnore;
// Tworzy liste pracownikow bez duplikatow
for i := 0 to Lista_Pomocnicza.Items.Count -1 do
Duplikator.Add(Lista_Pomocnicza.Items[i].SubItems[0]);
// Dodaje do listy Gesamt pracownikow
for i := 0 to Duplikator.Count -1 do
begin
Item := Lista_Gesamt.Items.Add;
Item.Caption := Duplikator.Strings[i];
Item.SubItems.Add('');
end;
//********************************
// Sumowanie godzin każdego pracownika
//********************************
for i := 0 to Lista_Gesamt.Items.Count -1 do
begin
suma_godzin := 0; // wyzerowanie sumy
for j := 0 to Lista_Pomocnicza.Items.Count -1 do
if Lista_Gesamt.Items[i].Caption = Lista_pomocnicza.Items[j].SubItems[0] then
begin
suma_godzin := suma_godzin + StrToFloat(Lista_Pomocnicza.Items[j].SubItems[1]);
Lista_Gesamt.Items[i].SubItems[0] := FloatToStr(Suma_Godzin);
end;
end;
//********************************
// Sumowanie godzin wszystkich
// pracownikow razem
//********************************
suma_godzin := 0; // wyzerowanie sumy
for i := 0 to Lista_Gesamt.Items.Count -1 do
suma_godzin := suma_godzin + StrToFloat(Lista_Gesamt.Items[i].SubItems[0]);
label_gesamt.Caption := 'Gesamt....................' + FloatToStr(suma_godzin) + ' Std';
Duplikator.Free; // zwolnij
//********************************
// dopisywanie dodatkowych informacji
//********************************
for I := 0 to Lista_objektow.Items.Count -1 do
for J := 0 to Lista_objektow.Items[i].SubItems.Count -1 do
if not (Lista_objektow.Items[i].SubItems[j] = '')
and not (Lista_objektow.Items[I].SubItems.Count = 5) then
for K := 0 to Lista_Pomocnicza.Items.Count -1 do
if (pos(lista_Pomocnicza.Items[k].Caption, Lista_objektow.Items[i].Caption) > 0)
and (pos(lista_Pomocnicza.Items[k].SubItems[0], Lista_objektow.Items[i].SubItems[j]) > 0) then
if not (pos(lista_Pomocnicza.Items[k].SubItems[0], Lista_objektow.Items[i].SubItems[6]) > 0) then
if Lista_Pomocnicza.Items[k].SubItems[3] <> '' then
Lista_objektow.Items[i].SubItems[6] := '<left>' + Lista_objektow.Items[i].SubItems[6] +
Lista_Pomocnicza.Items[k].SubItems[0] + ': ' + Lista_Pomocnicza.Items[k].SubItems[3] + ' </left>';
if RysujTabele(Lista_objektow, Lista_gesamt, suma_godzin, combo_objekt.Text, ExtractFileDir(Application.ExeName) + '\rachunek.html', true) then
begin
Web.Navigate(ExtractFileDir(Application.ExeName) + '\rachunek.html');
//ShellExecute(Handle,'open', PChar(ExtractFileDir(Application.ExeName) + '\rachunek.html'), nil, nil, SW_NORMAL);
end else Application.MessageBox('Błąd podczas generowania rachunku.', 'Generowanie rachunku', MB_ICONWARNING);
end;