Filtrowanie przez właściwość Filter w TDbf

0

Dzien dobry,
ja pisze w Lazurusie program, który obsługuje bazę DBF. Mam w niej pole nr_faktury które wygląda tak NNN/YY (numer faktury, slash dwie cyfry roku 123/15, gdzie lata są od 98 do jak na razie 17). Jak moge zrobić filtr abym podał na zakres numerów faktur i rok a TBGrid pokazał mi tylko te faktury z danego zakresu z danego roku?

Filtrowanie typu:

dbf1.Filter := 'nr_faktury >= "123/15" and nr_faktury<="153/15"'  

wyświetla dane z innych lat np. 130/98, 130/99 itd :(

0

Co prawda nie piszę w Lazarusie ale pracuję z DBFami w innym środowisku. Wydaje mi się, że nie możesz porównać numeru w takiej postaci ze slashem. Może wytnij z numeru faktury substringiem sam rok i wtedy nałoż filtr lub samą pierwszą część. Czyli:

dbf1.Filter := SubStr('nr_faktury',4) >=  "15" AND SubStr('nr_faktury',4) <= "17"
0
  • czym otwierasz DBFy?
  • jakiego są typu (jakie indeksy)?
  • masz indeks na tym polu?

jak napisał @qblacksheep pole to jest tekstowe i tak też jest porównywane - wyniki są prawidłowe. Nie masz osobnego pola z rokiem faktury?

0

Problem polega na tym, że numeracja co roku startuje od 1, więc czy moje filtry czy:

dbf1.Filter := SubStr('nr_faktury',4) >= "15" AND SubStr('nr_faktury',4) <= "17"

będą powodowały wyświetlenie pasujących numerów faktur, ale i w różnych latach :(

Używam TDbf, TDataSource, TDBNavigator i TBGrid. Fragment pliku *.lfm:

object fry: TDbf
    IndexDefs = <    
      item
        SortField = 'NR_FAKTURY'
        Options = [ixUnique]
      end>
    TableName = 'baza.DBF'
    TableLevel = 4
    Active = True
    FilterOptions = []
  end

Nie mam oddzielnego pola z rokiem ani data faktury w tej bazie :(

0

Jeśli to Twoja aplikacja i baza, to dodaj do DBF-a z fakturami pole z datą (ftDate) oraz numerem kolejnym (ftInteger). Wtedy nie będzie problemów z filtrowaniem.
Albo możesz zmienić sposób nadawania fakturom numeru tak aby można były sprawnie filtrować po samym numerze (string), np faktura nr '2017/09/00135', czyli faktura nr 135 z września 2017 roku.
Jeśli struktura tabeli jest już zdefiniowana i nie możesz jej zmienić to nie pozostaje nic innego jak utworzyć w aplikacji jakiś DataSet, oraz przeszukać całą tabelę sprawdzając numer faktury (parsując i wycinając z niej rok, miesiąc, numer kolejny ...) , i jeśli spełnia warunek daty i numeru do dopisać ją do dataset'u.
Nie znam TDbf ale znam dbf'fy. Być może będą w tym pomocne jakieś indeksy związane z tabelą.

0
grzegorz_so napisał(a):

...

Jeśli struktura tabeli jest już zdefiniowana i nie możesz jej zmienić to nie pozostaje nic innego jak utworzyć w aplikacji jakiś DataSet, oraz przeszukać całą tabelę sprawdzając numer faktury (parsując i wycinając z niej rok, miesiąc, numer kolejny ...) , i jeśli spełnia warunek daty i numeru do dopisać ją do dataset'u.

Dziękuje za odpowiedź :)
Czy można prosić o wskazówkę, jak w szybki i prosty sposób przekopiować bazę z dbf na DataSet?

1

użyłem datasetu typu Tclientdataset, nie wiem czy taki jest w Lazarusie

   /// utworzenie datasetu
  destDataSet := TClientDataSet.create(nil);

  /// dodanie pól
  with sourceDataset do
  begin
    for i := 0 to Fields.count - 1 do
      destDataSet.FieldDefs.Add(Fields[i].FieldName, fields[i].DataType, Fields[i].Size);
  end;
  destDataSet.CreateDataSet;

  /// kopiowanie danych 
  sourceDataset.First;
  while not sourceDataset.eof do
  begin
    if (tutaj walidacja) then
    begin
      destDataSet.Append;
      for i := 0 to sourceDataSet.Fields.count - 1 do
        destDataSet.Fields[i].Value := sourceDataset.Fields[i].Value;
      destDataset.post;
    end;
    sourceDataset.Next;
  end;
0

dziękuję :)

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