Autor Wątek: Delphi Subiekt Sfera - Realizacja zamówienia do WZ z usunięciem pozycji  (Przeczytany 1608 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Offline ads33e

  • Nowy użytkownik
  • *
  • Wiadomości: 3
  • Reputacja +0/-0
  • Wersja programu: aktualna
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;

Offline birds22

  • Ekspert
  • *****
  • Wiadomości: 9235
  • Reputacja +1306/-21
  • Wersja programu: Najnowsza
Ostatni raz pisałem coś w Delphi za czasów wersji 5 więc nie wnikałem w kod, ale co do algorytmu to nie lepiej towary bez wagi ustawić na 0 a nie usuwać?
Inny sposób to usunąć wszystko i wpisać od nowa. Oczywiście w tym przypadku jeżeli w zamówieniu masz ceny, rabaty itp to musisz gdzieś to zapisać.

Sławek, Zduńska Wola

Forum Użytkownikow Subiekt GT