Jak wywołać kartoteki systemowe w gniazdach tabeli dodatkowej?
W programie Wapro Mag 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 zainicjować 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 zastosowanie, które określa możliwość zdefiniowania preferowanych dostawców wraz z priorytetem realizacji w tabeli dodatkowej dla artykułu.
Przykład 1
Aby zdefiniować dostawców należy dodać nową tabelę dodatkową w kontekście artykułów, korzystając z menu Administrator | Tabele dodatkowe
.
Tabela w przykładzie nazywać się będzie Dostawcy oraz posiadać będzie dwie kolumny:
- Dostawca jako tekst 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 kliknąć przycisk Przeglądaj tabelę
(klawisz Enter
).
Tabela nie będzie zawierała rekordów. Aby otworzyć formularz dodawania nowych rekordów, należy kliknąć przycisk Dodaj
(klawisz Ins
). Następnie należy kliknąć kombinację klawiszy 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, ż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 ta 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 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. Następnie należy ją zamknąć lub wybrać opcję Testuj wykonanie dla tego gniazda
. Aby zmienne zostały zainicjowane w formularzu, należy ponownie uruchomić program.
Aby dodać odpowiednią procedurę, należy wpisać jej nazwę w polu Nazwa, a następnie kliknąć 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
kodem w 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. Podczas definiowania procedury należy pamiętać, że 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.