23
« Ostatnia wiadomość wysłana przez ads33e dnia Maj 24, 2025, 22:22:52 »
Mam dane wczytane z zamówienia do SringGrid. Uzupełniam kolumnę ilość pobierając dane z wagi. Następnie za pomocą kodu poniżej próbuję przekształcić zamówienie na WZ.
Problemem jest, że w przypadku usunięcia z listy jakiejkolwiek pozycji ilości na WZ zostają nieprawidłowo przypisane. Wiem, że problem jest z przesuniętymi indeksami.
Połowicznie poradziłem sobie porównując dane po symbolu towaru ale problem pojawia się jeżeli na dokumencie dany asortyment jest powielony.
var
i, puste, j: Integer;
UserChoice: Integer;
oWZ, oPozycja: OleVariant;
bGenerujWZ: Boolean;
TempFloat: Double;
id: string;
begin
puste := 0;
bGenerujWZ := False;
// 1. Sprawdź, które pozycje nie zostały zważone (puste ilości w kolumnie 4)
for i := 1 to StringGrid1.RowCount - 1 do
begin
if Trim(StringGrid1.Cells[4, i]) = '' then
Inc(puste);
end;
// 2. Zapytaj użytkownika, co zrobić z niezważonymi pozycjami
if puste > 0 then
begin
UserChoice := MessageDlg(
'Nie wszystkie pozycje zostały zważone. Wygenerować WZ tylko dla zważonych?',
mtConfirmation, [mbYes, mbCancel], 0
);
if UserChoice = mrCancel then
Exit;
bGenerujWZ := (UserChoice = mrYes);
end
else
bGenerujWZ := True; // Wszystko zważone - generuj WZ
if not bGenerujWZ then
Exit;
// 3. Utwórz nowy dokument WZ w Subiekcie
oWZ := glowne.oSubiekt.SuDokumentyManager.DodajWZ;
if VarIsEmpty(oWZ) or VarIsNull(oWZ) then
begin
ShowMessage('Nie udało się utworzyć dokumentu WZ!');
Exit;
end;
// 4. Powiąż WZ z zamówieniem (metoda NaPodstawie)
try
oWZ.NaPodstawie(Zamowienie);
except
ShowMessage('Błąd podczas powiązywania WZ z zamówieniem!');
oWZ.Anuluj;
Exit;
end;
// 5. Przejdź przez wszystkie wiersze StringGrid i znajdź odpowiadające pozycje w WZ
for i := 1 to StringGrid1.RowCount - 1 do
begin
Id := Trim(StringGrid1.Cells[0, i]); // Pobierz id pozycji z kolumny 0 -> Pobrane z zamówienia StringGrid1.Cells[0, i] := Poz.Id;
// Znajdź pozycję w WZ odpowiadającą temu id
for j := 1 to oWZ.Pozycje.Liczba do
begin
oPozycja := oWZ.Pozycje.Element[j];
if oPozycja.Id = Id then
begin
if (Trim(StringGrid1.Cells[4, i]) <> '') and
TryStrToFloat(StringGrid1.Cells[4, i], TempFloat) then
begin
oPozycja.IloscJm := TempFloat; // ustaw zważoną ilość
end
else if bGenerujWZ then
begin
oPozycja.Usun; // Usuń pozycję, jeśli użytkownik wybrał tylko zważone
end;
Break; // Znaleziono i przetworzono pozycję, można wyjść z pętli
end;
end;
end;
// 6. Sprawdź, czy WZ ma jakiekolwiek pozycje
try
if oWZ.Pozycje.Liczba > 0 then
begin
oWZ.Zapisz;
ShowMessage('Utworzono WZ: ' + VarToStr(oWZ.NumerPelny));
okno_zamowienie.Close();
glowne.Pobierz_Zamowienia.Click;
end
else
begin
ShowMessage('Brak pozycji do zważonych. Anulowano.');
oWZ.Anuluj;
end;
except
on E: Exception do
begin
ShowMessage('Błąd podczas zapisywania WZ: ' + E.Message);
oWZ.Anuluj;
end;
end;
end;