Przejdź do głównej zawartości

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:

  1. Dostawca jako teskt z zaznaczeniem opcji Pole wpisywane z przyciskiem do oprogramowania w gnieździe rozszerzeń.
  2. 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:

  1. @IdWybranegoWierszaKartoteki (typu IN),
  2. @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.