Kamil Kliczbor @ asptip.net

23Jul/090

AjaxToolkit Multi-word AutoCompleteExtender

Tworząc dynamiczne strony, często z konieczności potrzebujemy użyć podpowiedzi dla użytkownika. Z pomocą przychodzi oczywiście standardowo AjaxControlToolkit z kontrolką AutoCompleteExtender. Jest to kontrolka, która pozwala na wykorzystanie w wielu scenariuszach. Najprostszym z nich jest wyświetlanie podpowiedzi do wpisanego słowa w postaci listy. A co jeżeli chcielibyśmy, aby nasz "podpowiadator" pomagał przy wpisywaniu każdego słowa osobno ? Otóż można skonfigurować ten komponent tak, żeby nam to ułatwił. Parametry kontrolki:

<ajaxToolkit:AutoCompleteExtender ID="aceTags" runat="server" 

             TargetControlID="tbTags"

             ServiceMethod="GetCompletionList" 

             MinimumPrefixLength="2"

             ServicePath="~/WS/Service.asmx"

             CompletionInterval="400"

             DelimiterCharacters="," 

             ShowOnlyCurrentWordInCompletionListItem="true" />

Krótkie objaśnienie:
ServiceMethod to nazwa metody w webserwisie, do którego się odwołujemy, a
ServicePath to ścieżka do tego webserwisu.
DelimiterCharacters określa jaki znak będzie oddzielał poszczególne elementy,
i wreszcie chyba najważniejsze to to, że ustawienie paramteru ShowOnlyCurrentWordInCompletionListItem na true powoduje, że podpowiadany jest tylko bieżący element z listy.

No i śmiga :)

A teraz kilka błędów:
1. Tworzony web service musi mieć atrybut [ScriptService].
2. Metoda sweb servicu musi być public string[] MojaMetoda (string prefixText, int count), (opcjonalnie można dodać jeszcze jeden parametr - można doczytać). Trzeba zwrócić uwagę, że metoda nie jest statyczna i dodatkowo nie można modyfikować nazwy jej parametrów wejściowych. Sysgnatura metody może być dowolna. Metodę taką trzeba dodatkowo zaopatrzyć w atrybut [ScriptMethod].
3. Jeżeli coś nie działa, sprawdź czy możesz się dobić do webservisu. Ścieżka wygląda na taką modłe http://localhost/WS/Service.asmx, gdzie oczywiście katalog i nazwa serwisu zależą od własnej implementacji. Jeżeli WS jest widoczny, to powinieneś móc sobie wywołać twoją metodę z przeglądarki.
4. Sprawdź czy dobrze się odwołujesz do odpowiedniego WS w kodzie kontrolki.

17Jul/090

Dynamiczne usuwanie default constraint z tabeli

Dynamiczne usuwanie domyślnych wartości tabeli można zrealizować za pomocą poniższego kodu.

DECLARE @@cName NVARCHAR(100)
DECLARE @query NVARCHAR(100)
DECLARE @@counter INT

DECLARE DF_evoyage CURSOR SCROLL
FOR
SELECT NAME --, OBJECT_ID, PARENT_OBJECT_ID, TYPE, TYPE_DESC, PARENT_COLUMN_ID, DEFINITION
FROM SYS.DEFAULT_CONSTRAINTS
WHERE NAME LIKE '%_table_name_%'

OPEN DF_evoyage
FETCH FIRST FROM DF_table INTO @@cName

SET @@counter = 1

WHILE @@FETCH_STATUS = 0
BEGIN
SET @query = 'ALTER TABLE table_name DROP CONSTRAINT ' + @@cName;
PRINT CAST(CAST(@@counter AS NVARCHAR(10)) + ') EXECUTING ' + @query AS NVARCHAR(200))
EXEC sp_executesql @query
FETCH NEXT FROM DF_table INTO @@cName
SET @@counter = @@counter + 1
END

CLOSE DF_table
DEALLOCATE DF_table

Operacja przydaje się w przypadku kiedy np. trzeba dodać identity na kolumnie. Jedyna opcją jest wtedy (dajmy na to że operujemy na tabeli 'tab')
1. Usunięcie constraintów z tabeli tab
2. Utworzenie tabeli TMP_tab
3. Dodanie tych samych defaultów na tabeli TMP_tab
4. Skopiowanie danych z tabeli tab do tabeli TMP_tab
5. Usunięcie tabeli tab
6. Zmiana nazwy tabeli z TMP_tab na tab
7. Dodanie pozostałych constraintów do tabeli tab.

FINITO.