Wywołanie kartotek systemowych w gniazdach tabeli dodatkowej
W programie Wapro Anywhere wprowadzono możliwość wywoływania natywnych kartotek systemowych w celu wyboru rekordu kartoteki, np. wywołać można kartoteki artykułów, kontrahentów, magazynów, pracowników oraz kategorii artykułów. Dzięki temu można w prosty sposób odczytać dane pochodzące z wybranego rekordu - kartoteka po wybraniu wiersza zwraca ID wybranego rekordu, np. id_artykulu, id_magazynu czy id_kontrahenta. Dane przechowywane są w zmiennej @IdWybranegoWierszaKartoteki. Użytkownik może także zainijować w gnieździe powyżej wartość tej zmiennej - dzięki temu kartoteka od razu po otwarciu okna podświetli ten rekord, jeśli istnieje w kartotece.
W poniższym przykładzie przedstawiono przykładowe zastosowanie, które określa możliwość zdefiniowania przez użytkownika w tabeli dodatkowej dla artykułu preferowanych dostawców wraz z priorytetem realizacji.
Przykład 1:
W tym celu należy dodać nową tabelę dodatkową w konteście artykułów,korzystając z menu: Admin | Definicje | Tabele dodatkowe
.
Tabela w przykładzie nazywać się będzie "Dostawcy" oraz posiadać będzie dwie kolumny:
- Dostawca jako teskt z zaznaczeniem opcji Pole wpisywane z przyciskiem do oprogramowania w gnieździe rozszerzeń.
- Priorytet pole jako liczba całkowita.
Pola należy dodać także do przeglądarki utworzonej tabeli dodatkowej.
Po zapisaniu danych należy przejść do kartoteki asortymentowej i wybrać listę tabel za pomocą przycisku Tabele
. Po podświetleniu naszej tabeli należy wybrać przycisk Przeglądaj tabelę
lub klawisz Enter
.
Tabela nie będzie zawierała rekordów, należy wybrać przycisk Dodaj
, aby otworzyć formularz dodawania nowych rekordów, a następnie na nim wybrać kombinację Ctrl+Shif+F12
, aby wyświetlić dostępne gniazda w kontekście tego formularza. Przy polu Dostawca widoczna będzie ikona folderu, która oznacza możliwość otwarcia kartoteki, zanim jednak zacznie on działać należy go oprogramować w gnieździe za pomocą gniazda Przycisk dla pola: Dostawca w sekcji Dodawanie lub Poprawianie wiersza tabeli.
Do gniazda dodamy dwa zdarzenia, pierwsze to zdarzenie o nazwie "WybórWierszaKartoteki" (typ funkcji Kartoteka programu), które będzie odpowiadało za logikę otwarcia określonej kartoteki i przypisanie odpowiedniej wartości do zmiennej @IdWybraegoWierszaKartoteki.
Poniżej przedstawiono konfigurację tego zdarzenia. Nazwa kartoteki programu w tym przypadku to "Kontrahenci", a zmienna "id_kontrahenta = 0" oznacza to, że po otwarciu ma nie być podświetlony konkretny wybrany rekord, tylko pierwszy z listy.
Drugie zdarzenie to nosi nazwę "KS_PodajNazweKontrahentaZgniazda" (typ funkcji Procedura SQL). Zdarzenie to oczekuje, że na serwerze utworzona zostanie procedura składowana o nazwie "KS_PodajNazweKontrahentaZgniazda", procedura przyjmuje dwa parametry:
- @IdWybranegoWierszaKartoteki (typu IN),
- @Dostawca (typu OUTPUT).
Wartość zmiennej @IdWybranegoWierszaKartoteki będzie automatycznie zainicjowana po zdarzeniu pierwszym, zmienna output @Dostawca będzie zainicjowana dopiero w procedurze. Polega to na tym, że należy z odpowiedniej tabeli odczytać odpowiednią kolumnę tej zmiennej dla określonego rekordu. Numer rekordu determinuje właśnie zmienna @IdWybranegoWierszaKartoteki, którą trzeba przyrównać do odpowiedniego identyfikatora - w naszym przypadku sprowadza się to do zapytania umieszczonego w procedurze w postaci:
select @dostawca = nazwa_pelna from kontrahent with (nolock)
where id_kontrahenta = @IdWybranegoWierszaKartoteki
Aby zmienna $Dostawca była widoczna, należy po zdefiniowaniu pierwszego zdarzenia (wybór kartoteki) dodać przykładowy wiersz, otwierając przy tym kartotekę programu, a następnie ją zamykając, lub wykonując opcję Testuj wykonanie dla tego gniazda
. Następnie należy zamknąć i uruchomić program ponownie, aby zmienne zostały zainicjowane w formularzu.
Aby dodać odpowiednią procedurę należy wpisać jej nazwę do pola Nazwa, a następnie wybrać przycisk Pokaż schemat procedury SQL
i zastąpić kod:
if exists (select 1 from sysobjects where name = 'MAGSRC_KS_PodajNazweKontrahentaZgniazda' and type = 'P')
drop procedure MAGSRC_KS_PodajNazweKontrahentaZgniazda
go
create procedure MAGSRC_KS_PodajNazweKontrahentaZgniazda
@IdWybranegoWierszaKartoteki numeric, @DOSTAWCA varchar(255) OUTPUT
as
declare @errmsg varchar(255)
begin
set xact_abort on
set transaction isolation level REPEATABLE READ
begin transaction
select @errmsg = 'Funkcja dodatkowa KS_PodajNazweKontrahentaZgniazda nie została jeszcze zdefiniowana!'
goto Error
if @@trancount>0 commit transaction
goto Koniec
Error:
raiserror (@errmsg,16,1)
if @@trancount>0 rollback tran
goto Koniec
Koniec:
set transaction isolation level READ COMMITTED
return
end
go
do postaci:
if exists (select 1 from sysobjects where name = 'MAGSRC_KS_PodajNazweKontrahentaZgniazda' and type = 'P')
drop procedure MAGSRC_KS_PodajNazweKontrahentaZgniazda
go
create procedure MAGSRC_KS_PodajNazweKontrahentaZgniazda
@IdWybranegoWierszaKartoteki numeric, @DOSTAWCA varchar(255) OUTPUT
as
declare @errmsg varchar(255)
begin
select @dostawca = nazwa_pelna from kontrahent with (nolock)
where id_kontrahenta = @IdWybranegoWierszaKartoteki
end
go
Zmienne inicjowane z formularza, które są kontekstowe dla danego formularza, mają znak "$" poprzedzający. Natomiast podczas definiowania procedury należy pamiętać, iż wszystkie parametry w języku SQL określone są znakiem "@" na początku nazwy zmiennej/parametru. Analogicznie zmienne globalne w systemie oznaczone są znakiem "@" na liście zmiennych.
Wynikiem działania tych dwóch zdarzeń będzie w pierwszym kroku przypisanie odpowiedniej wartości do zmiennej, a w drugim przekazanie tej zmiennej jako filtr do procedury i przypisanie zawartości kolumny Nazwa_pelna tabeli kontrahent do zmiennej @Dostawca w procedurze, a następnie zwrócenie jej do zmiennej $Dostawca w formularzu, co poskutkuje wpisaniem wartości do pola formularza.
Nazwy zmiennych generowane są na podstawie pól zdefiniowanych w strukturze tabeli dodatkowej, więc przy zmianie nazwy kolumny, zmieni się także nazwa zmiennej, jaką należy podawać w kodzie.