dane tabelaryczne - wyszukiwanie i sortowanie

Główne forum techniczne dla dyskusji dotyczących problemów przy wytwarzaniu aplikacji PROMOTIC oraz sposobach ich rozwiązania.

dane tabelaryczne - wyszukiwanie i sortowanie

Postby kckc » Mon 10. Feb 2014 10:20:48

Dzień dobry,

W jaki sposób w PM można zrealizować funkcjonalność wyszukiwania (filtrowania) i sortowania w tabelce z wieloma kolumnami (wyszukiwania na liście adresowej) ?

Coś podobnego jak w poniższym przykładzie:
http://tablefilter.free.fr/datademo.htm

Lista byłaby zasilana z danych w bazie danych.
kckc
 
Posts: 5
Joined: Tue 06. Aug 2013 13:05:46

Re: dane tabelaryczne - wyszukiwanie i sortowanie

Postby Kazimierz Heczko » Thu 13. Feb 2014 12:44:23

Witam,

Ta kwestia jest stosunkowo bardzo rozległa, ponieważ pytanie dotyczy zarówno pracy z bazami danych jak również sposobu wyświetlania danych w formie tabeli oraz w jaki sposób można wprowadzać w PROMOTIC-u wartości przez użytkownika.
Ponadto w PROMOTIC-u nie ma gotowego elementu lub obiektu z przedstawioną funkcjonalnością, cały ten temat trzeba sobie zrobić samemu.
I ponieważ nie wiem do końca, która część tego zapytania najbardziej Pana interesuje to w tej chwili odpowiem w następujący, trochę ogólny sposób:

Jeżeli zawartość tabeli będzie odczytywana z bazy danych to właściwie wystarczy tylko określać warunki klauzuli "WHERE" w poleceniu SQL przekazywanym do bazy danych.
A więc wystarczy tylko określić, która kolumna (lub które kolumny) powinne być w jakiś sposób ograniczone (wyfiltrowane), np polecenie SQL dla przedstawionego przykładu, zakładając że nazwy kolumn są jednocześnie nazwami kolumn w bazie danych i że tabela w bazie danych nosi nazwę table1:
Code: Select all
select * from table1 where isocode = 'UZB'  or isocode = 'AGO' and POP between 50 and 500

Powyższe polecenie można wykonać przy pomocy metody RsOpen obiektu PmAdo. Rezultat polecenia SQL można odczytać w formie tablicy dwuwymiarowej np. przy pomocy metody GetRows obiektu AdoRecordset.
Link do opisu interfejsu AdoRecordset:
http://www.promotic.eu/pl/pmdoc/Objects/Promotic/PmAdo/AdoRecordset/Iface.htm
Link do opisu interfejsu Ado:
http://www.promotic.eu/pl/pmdoc/Objects/Promotic/PmAdo/Iface.htm

I po wykonaniu tego typu polecenia wystarczy tylko wyświetlić rezultat (czyli tablicę dwuwymiarową) polecenia SQL w tabeli.
A jeżeli chodzi o to, w jaki sposób można wytworzyć odpowiedniki combobox-ów, to w tabeli (obiekt PmTable) można by zastosować np. zdarzenie FixedCellClicked (po kliknięciu na nazwę kolumny) i za pomocą tego zdarzenia wyświetlić np. okno modalne do wyboru wartości, na którą powinna być ograniczona zawartość w wyświetlanej tabeli i przy pomocy tych parametrów ustawiać sobie polecenie typu SQL w systemie PROMOTIC i następnie go wykonać.

W przypadku potrzeby dokładniejszego rozwinięcia tego tematu proszę o sprecyzowanie, która część tej kwestii jest dla Pana najważniejsza.

Pozdrawiam
Kazimierz Heczko
 
Posts: 69
Joined: Thu 13. Dec 2012 9:28:56

Re: dane tabelaryczne - wyszukiwanie i sortowanie

Postby kckc » Thu 13. Feb 2014 17:52:31

Witam,

Najbardziej interesuje mnie sama tabelka. Akurat jej zawartość nie będzie się często zmieniała, więc może być wypełniona ręcznie (bez pośrednictwa bazy danych) na etapie przygotowywania aplikacji.

Tak więc najistotniejsza byłaby tabelka, w której można:
sortować po wybranej kolumnie
wyszukiwać po tekście - wyświetlać tylko te wiersze, które zawierają dany ciąg znaków (tak jak dla kolumna 'XRAT' w przykładzie: http://tablefilter.free.fr/datademo.htm )
kckc
 
Posts: 5
Joined: Tue 06. Aug 2013 13:05:46

Re: dane tabelaryczne - wyszukiwanie i sortowanie

Postby Kazimierz Heczko » Tue 18. Feb 2014 12:09:43

Witam,

Najprostszym z punktu widzenia sortowania byłoby zastosowanie obiektu PmDataTable, w którym jest dostępna funkcja sortowania według jednej kolumny.
W celu zesortowania według kilku kolumn należałoby tabelę zesortować według kolumny ostatniej w liście sortowania.
Np. jeżeli tabela powinna być zesortowana według np. kolumn:
nazwa, miejscowość, kwota_zamowienia
to najpierw powinno się tabelę zesrotować wg kolumny kwota_zamowienia, następnie wg miejscowości i na końcu wg nazwy.

W tym przypadku można w prosty sposób zapewnić sortowanie w aplikacji w obiekcie PmDataTable przy pomocy metody Sort
http://www.promotic.eu/pl/pmdoc/Objects/Promotic/PmDataTable/Meth/Sort.htm.

Natomiast filtrowanie można zapewnić w ten sposób, że do każdej kolumny należałoby przygotować nowy element graficzny, jeżeli tabela posiada z góry znaną i niezmienną ilość kolumn.
Ewentualnie można by do tabeli dodać jeden wiersz POD nagłówkiem, w którym można by wpisywać wartości do filtrowania.

Niestety w chwili obecnej tabela nie ma możliwości edycji w oknie przeglądarki webowej.

Następnie przy odczytaniu zawartości z obiektu PmDataTable (np. przy pomocy metody GetArray tego obiektu) należy w pętli wpisać poszczególne wartości poszczególnych wierszy.

Przykład takiego wypełniania tabeli jest do dyspozycji w przykładowej aplikacji w katalogu systemu PROMOTIC, w podkatalogu Examples\Others\AppDB.
W tym katalogu znajduje się aplikacja, które pokazuje między innymi sposób pracy z obiektem PmTable - wyświetlenie w nim wartości z dwuwymiarowej tablicy danych.
Niżej dodaję przykładowy skrypt, ktory zapewnia wyświetlenie danych w tabeli z tablicy dwuwymiarowej uzyskanej przy pomocy metody wytworzonej przez projektanta o nazwie LoadData.
W tym skrypcie można oczywiście dodać ewentualne pominięcie wiersza w tabeli, jeżeli taki wiersz nie powinien być wyświetlony.

Code: Select all
Dim oTable, arrData, i, j

Set oTable  = pMe.Items("/ax0").Acx

arrData = pMe.PmPanel.Methods.LoadData()

if IsArray(arrData) then
   oTable.RemoveRow -3
   for i = 0 to UBound(arrData, 2)

' w tym miejscu należałoby sprawdzać, czy należy wytworzyć nowy wiersz w tabeli czy też nie w zależności od wymagań.
' wartości do porównywania można odczytywać np. z drugiego wiersza tabeli (jeżeli ten wiersz zostałby przeznaczony do wprowadzania wartości filtra)
' lub z oddzielnych elementów graficznych typu pmiText lub pmiWCombo
' odnośnie filtra w drugim wierszu tabeli należało by wtedy nie usuwać tego wiersza z tabeli, lub przed jego usunięciem zapamiętać wszystkie wartości z tego wiersza
' i po jego wytworzeniu ponownie je przypisać.

     oTable.InsertRow -2
     for j = 0 to UBound(arrData, 1)
       oTable.CellText(-2, j) = arrData(j, i)
     next
   next
end if

oTable.Draw


Pozdrawiam
Kazimierz Heczko
 
Posts: 69
Joined: Thu 13. Dec 2012 9:28:56


Return to Nie wiem jak zrobić...

Who is online

Users browsing this forum: No registered users and 4 guests

cron