Wykonanie akcji, jeśli nie znaleziono wartości w ListView

0

Witam,
Posłużę się przykładem, mam kod który wpisuje mi dane z bazy sql do listwiew (to akurat działa), następnie sprawdzam czy w listwiew (komórkach) znajdują się interesujące mnie dane

for a := 0 to ListView1.Items.Count - 1  do 
  begin
  if '1' = ListView1.Items[a].SubItems[1] then
    begin
        Label1.Caption := 'informacja';
        x_qc := 1   ;
     end else
	 ....itp 

Ale nie wiem jak zrobić jeżeli nie znajduję '1' bo zmieniły się dane w ListView to wykonaj Komedę
czyli

 If nie znalazłeś '1' w ListView1.Items[a].SubItems[1] then
begin
wykonaj komendę;
end;

Proszę pomóżcie bo mi już mózg wyparował.

2

ale co to jest? chcesz poszukać jakiegoś tekstu w listview?
przykładowy kod z Internetu:

for var c := 0 to ListView1.ItemCount - 1 do
  if ListView1.Items[c].Text = <TextToSearch> then
  begin
    ListView1.Selected := ListView1.Items[c]; 
    break;
  end;
1

@grafo:

var
  i: integer;
  found: boolean;
begin
  found := false;
  for i := 0 to listview.items.Count - 1 do
  begin
    found := listview.items[i].SubItems[1] = '1';
    if found then
      break;
  end;
  if not found then
    begin
      /// jakaś akcja
    end;
end;
2

Podałeś dość mało informacji ale skoro operujesz na bazie danych to masz zapewne jakiegoś dataseta, po którym w pętli przelatujesz i wpisujesz dane do lv. Jeśli tak to szukanie po lv nie jest najwydajniejszym sposobem i zdecydowanie zwykłe

if qDataSet.Locate('nazwa_pola','1',[]) then
  //znalezione

powinno wystarczyć :)

0

@grzegorz_so: robię to tak

  Data1.SQLQuery1.Active := False;
          Data1.SQLQuery1.SQL.Clear;
          Data1.SQLQuery1.SQL.Add('SELECT * FROM [Call] WHERE IsEnable = 1' );
          Data1.SQLQuery1.Active := True;
            while not Data1.SQLQuery1.Eof do
            begin
            if Data1.SQLQuery1.Locate('idSummonSet',1,[]) then
             begin
               label1.Caption := 'text1';
             end ;
             if not Data1.SQLQuery1.Locate('idSummonSet',1,[]) then
             begin
               label1.Caption := 'text2';
             end ;
      if Data1.SQLQuery1.Locate('idSummonSet',7,[]) then
             begin
               label1.Caption := 'text1';
             end ;
          begin
               label1.Caption := 'text3';
             end ;
             if not Data1.SQLQuery1.Locate('idSummonSet',7,[]) then
             begin
               label1.Caption := 'text4';
             end ;

....... itp

ale nie działa mi if not, jeżeli w pobranych danych nie ma idSummonSet = 7 jak debuguję kod to sprawdza mi linię if not Data1 .... ale przeskakuje dalej nie wykonuje instrukcji po then :(

0

@grafo:
Nieczytelny, fatalnie sformatowany kod.
Dlaczego w If nie korzystasz z else tylko masz dwa ify, w drugim warunek jest negacją warunku z pierwszego ifa .
Kod w wierszu 20 wykona się ZAWSZE, tym samym dwa pierwsze ify są zupełnie zbędne.
W sumie to cały kod do poprawki, w tym logika ifów
Wiersze 1 i 15, różne warunki ale to samo podstawienie

 label1.Caption := 'text1';
0

@grzegorz_so:
To już któraś wersja, używałem else,
Chodzi o to że nie mogę uzyskać efektu
w ListView pojawia się cyfra np 7 to wypisuje Label1.caption := 'text1" a jak cyfra 7 znika to wypisuje Label1.Caption := 'Tekst2".
Kombinuję na różne sposoby i nic :(

0

@grafo:
a co robi ten kod ?

  if Data1.SQLQuery1.Locate('idSummonSet',7,[]) then
    begin
        label1.Caption := 'text1';
    end ;

dla cyfry 7 wpisuje 'text1'

0

kurcze.. teraz widzę
używasz Locate w pętli po datasetcie. Tak się nie robi !!

0
  Data1.SQLQuery1.SQL.clear;
  Data1.SQLQuery1.SQL.add('SELECT * FROM [Call] WHERE IsEnable = 1');
  Data1.SQLQuery1.Active := true;

  if Data1.SQLQuery1.Locate('idSummonSet', 7, []) then
    label1.Caption := 'jest siedem'
  else
    label1.Caption := 'nie ma 7';

albo tak

  Data1.SQLQuery1.SQL.clear;
  Data1.SQLQuery1.SQL.add('SELECT * FROM [Call] WHERE IsEnable = 1');
  Data1.SQLQuery1.Active := true;

  label1.Caption:=ifthen( Data1.SQLQuery1.Locate('idSummonSet', 7, []),'jest siedem','nie ma 7');
0

@grzegorz_so:

  Data1.SQLQuery1.SQL.clear;
  Data1.SQLQuery1.SQL.add('SELECT * FROM [Call] WHERE IsEnable = 1');
  Data1.SQLQuery1.Active := true;

  if Data1.SQLQuery1.Locate('idSummonSet', 7, []) then 
    label1.Caption := 'jest siedem' // to się wykonuje 
  else
    label1.Caption := 'nie ma 7'; // to nie działa, a o to tu mi właśnie chodzi 
0

Wykonywać na pewno się wykonuje. Ty to robisz w pętli więc label trzyma wynik ostatniego rekordu. Raportuj to sobie do memo i wtedy sprawdź.

0

To jak to zatrzyma?
jak wyskoczyć z pętli z tymi danymi

0

Nie wiem czy rozumiesz jak działa instrukcja if else.
W ostatnim przykładzie który podałeś wyświetla się warunek po then i instrukcja się kończy. Jeśli nie znaleziono danego wyniku zapytania to wtedy wykonuje się część z else. Wcześniej próbowałeś robić to w pętli i sprawdzać każdy element. Przy pętli jeśli wykorzystał byś pierwsze rozwiązanie @grzegorz_so z break w pętli też by zadziałało prawidłowo.
Nie wstawiasz przypadkiem tego kodu z locate do pętli?
Wklej cały kod procedury który źle działa.
Jeśli twierdzisz że kod nie działa to może problem jest w danych i każdy rekord spełnia zapytania. Sprawdzałeś to?
Albo ustaw sobie w locate zamiast 7 np. 777 lub coś czego tam na pewno nie ma i wtedy porównaj działanie.

0

Bez kodu i pełnego wyniku zapytania trudno coś więcej pomóc.
Coś mi to pachnie problemem XY

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