Biuletyn techniczny CDN OPT!MA 11.0.1 Przykłady uŝycia zapytań SQL w schematach księgowych, filtrach, zestawieniach księgowych, księgowaniach okresowych, definicji formatów przelewów i atrybutach dla Biura Rachunkowego Copyright 2006 COMARCH SA
Spis treści SPIS TREŚCI... 2 1 SCHEMATY KSIĘGOWE... 3 2 FILTRY... 4 3 ZESTAWIENIA KSIĘGOWE... 5 4 KSIĘGOWANIA OKRESOWE... 7 5 FORMATY PRZELEWÓW... 8 6 ATRYBUTY W MODULE BIURO RACHUNKOWE... 9 Przykłady schematów księgowych w CDN OPT!MA Str. 2
1 Schematy księgowe Jak działa schemat? Dane zawarte w elemencie schematu (stałe, makra) tłumaczone są na zapytanie SQL Przykładowa pozycja schematu księgowego: Rysunek 1 Pozycja schematu księgowego Fragment zapytania związany z ww. pozycją: SELECT... '419' AS KontoWN, '' AS KontoMA, VaN_Dokument AS Opis, SUM(VaT_Netto) AS Kwota FROM CDN.VATNAG JOIN CDN.VatTab ON VaN_VaNId = VaT_VaNId LEFT OUTER JOIN CDN.Kategorie As KatElem ON VaT_KatId = KatElem.Kat_KatId WHERE VaN_VaNId =1 AND (IsNull(KatElem.Kat_KodSzczegol,'') ='ENERGIA') GROUP BY... Tłumaczenie schematu. Makra (@Nazwa) są zamieniane na nazwy kolumn lub wyraŝenia SQL Teksty jeśli parser uzna to za konieczne są otaczane apostrofami (') - JeŜeli wyraŝenie nie zawiera Ŝadnego makra i nie zaczyna się od apostrofu jest automatycznie otaczane apostrofami WyraŜenie oznaczające kwotę jest sumowane (SUM()) - Wszystkie pozostałe wyraŝenia (konta, opis, słowniki) trafiają do GROUP BY Do sekcji FROM trafiają tabele powiązane z uŝytymi makrami Przykłady schematów księgowych w CDN OPT!MA Str. 3
Do WHERE trafia przetłumaczony warunek ze schematu + warunek na ID księgowanego dokumentu Na makrach moŝna wykonywać operacje zgodne ze składnią SQL W schemacie moŝna uŝywać funkcji SQL W schemacie moŝna uŝywać nazw kolumn pod warunkiem, Ŝe tabela znalazła się w zapytaniu NaleŜy pamiętać o zasadzie otaczania tekstów apostrofami przykład warunku: '' <> VaN_KorektaDo jest OK, bo zaczyna się od apostrofu VaN_KorektaDo <> '' AND @Rejestr = KOR jest OK., bo zawiera makro VaN_KorektaDo <> '' jest źle, bo parser zrobi z tego 'VaN_KorektaDo <> ''' Przykłady uŝycia niestandardowych wyraŝeń w Warunku, Opisie lub Polach Konto Winien/Ma schematu księgowego, zawiera Biuletyn JakUkładacZaawansowaneSchematyKsięgowe, który znajduje się w sekcji Najczęściej zadawanych pytań w Obszarze CDN OPT!MA na stronie walidowanej dla Partnerów: https://www.cdn.com.pl/cdnpartnerzy/v_optima/index_optima_faq.aspx 2 Filtry Program posiada na kaŝdej liście moŝliwość określenia dodatkowego filtru uŝytkownika. Np. za pomocą tak zwanego filtra zaawansowanego. Tworzenie takiego filtra wspomagane jest poprzez konstruktor filtra. Rysunek 2 Filtr na liście pozycji Sposób uruchomienia filtra oraz korzystania z kreatora filtra omówiony jest w podręczniku do Konfiguracji programu CDN OPT!MA. Natomiast rezultat pracy samego kreatora moŝna znaleźć na zakładce ZAAWANSOWANE konstruktora filtra. Przykłady schematów księgowych w CDN OPT!MA Str. 4
Rysunek 3 Konstruktor filtra Znajdują się tam dwa pola: Filtr SQL Zawiera informacje dla filtra okna (wyświetlanie dokumentów na listach) Filtr ISAM Filtr wykorzystywany przez wydruki w Raport Writer. Filtr ISAM posiada inną składnię niŝ sam filtr SQL. Ponad to same moŝliwości filtra ISAM (W SKŁADNI Clarion) są mniejsze niŝ moŝliwości filtra SQL. Kreator pozwala stworzyć tylko takie struktury filtra, które mogą być utworzone zarówno dla filtra ISAM jak i w filtra SQL, w niektórych sytuacjach moŝe to być niewystarczające do stworzenia zadanego filtra. Jeśli występuje potrzeba stworzenia bardziej zaawansowanego filtrowania z uŝyciem składni SQL, moŝna fragment filtra SQL wprowadzić bezpośrednio do pola Filtr SQL. Pozostawiając puste okno filtru ISAM. Wówczas filtrowanie będzie aktywne jedynie dla list natomiast do wydruków filtr ten nie będzie przekazywany. Filtr wprowadzany w okno Filtr SQL jest dodawany do części WHERE zapytania tworzącego listę. Tak więc pola uŝyte bezpośrednio w filtrze muszą być polami z tabel tworzących zapytanie. Jeśli zamierzamy odwołać się do pól z innych tabel moŝemy to wykonać tylko stosując odpowiednie konstrukcje SQL np. pod zapytania lub funkcje serwerowi. Przykłady niestandardowego tworzenia filtrów moŝna znaleźć w biuletynie pod tytułem JakieSaDodatkoweMozliwosciFiltrowaniaListWProgramie, który jest dostępny w Obszarze CDN OPT!MA, w sekcji najczęściej zadawanych pytań na stronie walidowanej dla Partnerów. https://www.cdn.com.pl/cdnpartnerzy/v_optima/index_optima_faq.aspx 3 Zestawienia księgowe W definicji kwoty pozycji zestawienia księgowego moŝna uŝywać zapytań SQL oraz funkcji serwerowych (np. CHOOSE, ROUND). Przykłady schematów księgowych w CDN OPT!MA Str. 5
3.1 Zapytania SQL Przykład 1 PoniŜszy przykład zapytania sumuje kwotę netto faktur sprzedaŝy w Rejestrze sprzedaŝy VAT, które mają zaznaczony parametr "SprzedaŜ detaliczna", data sprzedaŝy obejmuje okres podany w kolumnie zestawienia. SQL('Select Sum(VaN_RazemNetto) From CDN.VatNag Where VaN_Typ = 2 And VaN_Detal = 1 AND VaN_DataOpe Between '&DataOdSQL&' And '&DataDoSQL) Przykład 2 Przykład 2 zwraca sumę netto, faktur sprzedaŝy pochodzących z podrejestru o nazwie SPRZEDAś, których data sprzedaŝy zawiera się pomiędzy określonym zakresem dat: SQL('select Sum(VaN_RazemNetto) from CDN.VatNag where VaN_Typ=2 and VaN_Rejestr=''SPRZEDAś'' and VaN_DataZap BETWEEN CONVERT(datetime,''2006-09-01'',120) and CONVERT(datetime,''2006-09-30'',120)') UWAGA: Wartość w polach tekstowych np. VaN_Rejestr=''SPRZEDAś'' naleŝy otaczać podwójnym apostrofem (NIE cudzysłowiem). Przykład 3 W przykładzie podano sposób na pobranie kwoty z konkretnej gałęzi zestawienia, które zostało policzone w innej bazie danych. W przypadku, gdy chcemy pobrać dane z tabeli w innej bazie danych naleŝy w ramach zapytania uŝyć [Kwalifikowanej nazwy serwera] i [Kwalifikowanej nazwy bazy danych], a dalej jak w normalnym zapytaniu. SQL('SELECT ZKW_Wartosc FROM[NAZWA- KOMPUTERA\CDN_OPTIMA].[CDN_Prezentacja_KH].[CDN].[ZestKsiWyniki] WHERE ZKW_ZkpId=594') 3.2 Funkcje serwerowe: JeŜeli - wstawia wywołanie funkcji CHOOSE w postaci CHOOSE('warunek','jeŜeli prawda','jeŝeli fałsz'). Działanie funkcji jest takie, Ŝe jeśli warunek jest spełniony, to pobierana jest pierwsza wartość, a jeśli nie, to druga. Przykład funkcji: jeśli Obroty Wn są większe niŝ obroty Ma, to bierze róŝnicę tych obrotów, w przeciwnym wypadku przyjmuje wartość 0, czyli: CHOOSE (@ObrotyWn(101)>@ObrotyMa(101), @ObrotyWn(101)-@ObrotyMa(101), 0) Przykłady schematów księgowych w CDN OPT!MA Str. 6
Wartość bezwzględna - wstawia wywołanie funkcji ABS w postaci ABS('liczba'). Funkcja wyciąga wartość bezwzględną kwoty (czyli bez minus) np. ABS(@PerSaldo(101)). Zaokrąglenie - wstawia wywołanie funkcji ROUND w postaci ROUND('liczba','precyzja'). Funkcja ROUND(@ObrotyWn(101),1) obliczy wartość obrotów na koncie i zaokrągli wynik do pełnych złotych, zaś funkcja ROUND(@ObrotyWn(400) * @ObrotyWn(701) / @ObrotyWn(702), 0.01) obliczy wyraŝenie i zaokrągli wynik działania do groszy. Część całkowita - wstawia wywołanie funkcji INT w postaci INT('liczba'). Funkcja wyciąga część całkowitą z wartości, np. jeśli persaldo konta 201 jest równe 512000,63 to INT(@PerSaldo(201)) = 512000 Numer kolumny - nie jest to funkcja systemowa Clariona, natomiast zwraca numer aktualnie przetwarzanej kolumny. Funkcja moŝe być szczególnie przydatna przy zestawieniach międzyokresowych, gdy zmieni się plan kont np. w kolumnie pierwszej mamy zestawienie za okres poprzedni, a w drugiej za bieŝący. Koszty, które przedtem były na koncie 401 teraz są na 402. Wykorzystamy do tego funkcję CHOOSE(warunek, jeŝeli prawda, jeŝeli fałsz) Przykład: CHOOSE(@Kolumna()=1, @ObrotyWn(401), @ObrotyWn(402)) czyli jeŝeli kolumna ma numer 1 (czyli pochodzi z poprzedniego okresu obrachunkowego), to podaj obroty konta 401, jeŝeli ma inny numer to podaj obroty konta 402 lub jeŝeli mamy np. 3 kolumny, za trzy kolejne lata obrachunkowe: CHOOSE(liczba, wartość dla 1, wartość dla 2, wartość dla 3)) CHOOSE(@Kolumna(), @ObrotyWn(401), @ObrotyWn(402), @ObrotyWn(403)) czyli jeŝeli kolumna 1 (oznaczająca np. rok 2002) to obroty 401, jeŝeli kolumna 2 (oznaczająca rok 2003) to 402, jeŝeli kolumna 3 (rok 2004) to 403. Gdyby pojawiła się w zestawieniu kolumna 4, dla której nie jest określona wartość, to zostanie pobrana ostatnia wartość czyli @ObrotyWn(403). 4 Księgowania okresowe W Księgowaniach okresowych, podobnie jak w Zestawieniach księgowych, w definicji kwot moŝna uŝywać zapytań SQL i funkcji serwerowych. Konstrukcja zapytań i funkcji jest w obydwu przypadkach taka sama więc przykłady dla Zestawień księgowych moŝna zastosować równieŝ w definicji Księgowania okresowego. Przykłady schematów księgowych w CDN OPT!MA Str. 7
JeŜeli w definicji kwoty Księgowania okresowego uŝyjemy wyraŝeń '&DataOdSQL&' lub '&DataDoSQL to będą się one odwoływały do dat Za okres na formatce, która pojawia się przed uruchomieniem Księgowania okresowego. Rysunek 4 Generowanie księgowania okresowego Przykład 1 JeŜeli we wszystkich miesiącach poza listopadem ma być księgowana kwota 150 zł a w listopadzie 100 zł to zapytanie moŝe wyglądać następująco: SQL('Select CASE when MONTH('&DataOdSQL&' )=11 then 100 else 150 end ' ) W tym przypadku miesiąc jest pobierany z daty Za okres od. 5 Formaty przelewów W definicji formatów przelewów jest dostępne pole Zapytanie SQL. Dzięki niemu moŝna pobierać do pliku z przelewami róŝne informacje, których nie moŝna pobrać za pomocą predefiniowanych pól. Przykład 1 Zapytania, które pobiera 20-sty i 21-wszy znak numeru rachunku np. symbole 51, 53, 53 pobrane z numeru rachunków bankowych ZUS: SELECT SUBSTRING(BZd_RachunekNr,20,2) FROM CDN.BnkZdarzenia WHERE Bzd_BzdId={ZdarzenieID} Przykład 2 Jak wyŝej z tym, Ŝe przed wycięciem z numeru rachunku są usuwane spacje i myślniki: SELECT SUBSTRING(REPLACE(REPLACE(BZd_RachunekNr, ' ', ''), '-', ''),20,2) FROM CDN.BnkZdarzenia WHERE Bzd_BzdId={ZdarzenieID} Przykład 3 Pobranie samego miasta z adresu kontrahenta: Przykłady schematów księgowych w CDN OPT!MA Str. 8
SELECT Pod_Miasto FROM CDN.PodmiotyView JOIN CDN.BnkZdarzenia ON BZd_PodmiotID = Pod_PodId WHERE BZd_PodmiotTyp = Pod_PodmiotTyp AND Bzd_BzdId={ZdarzenieID} Przykład 3 Pobranie tylko kodu pocztowego z adresu kontrahenta - jeŝeli kod nie jest wypełniony - pole ma być puste: SELECT CASE WHEN Pod_KodPocztowy='00-000' THEN '' ELSE Pod_KodPocztowy END FROM CDN.PodmiotyView JOIN CDN.BnkZdarzenia ON BZd_PodmiotID = Pod_PodId where BZd_PodmiotTyp = Pod_PodmiotTyp AND Bzd_BzdId={ZdarzenieID} 6 Atrybuty w module Biuro Rachunkowe Atrybuty w module Biuro Rachunkowe mogą posiadać m.in. następujące typy: Lista SQL, SQL Konfiguracja, SQL Firma. PoniŜej przykłady zapytań dla wyŝej wymienionych typów atrybutów: 6.1 Lista SQL (obecnie są to wyłącznie listy pomocnicze pobierane z bazy konfiguracyjnej): 1. Najbardziej typowy przykład, to pobieranie listy operatorów (jak na standardowym atrybucie Operator): Select Ope_Kod From CDN.Operatorzy 2. Listę walut: Select WNa_Symbol From CDN.WalNazwy 3. Listę typów kursów: Select WKu_Nazwa From CDN.WalKursy 4. Listę stanowisk komputerowych: Select Sta_Nazwa From CDN.StanowiskaKomp 6.2 SQL Konfiguracja (odwoływanie się do pojedynczych danych - w sensie pojedynczy wiersz, a nie lista - zapisanych w bazie konfiguracyjnej): 1. Najprościej moŝna odwołać się do pól z tabeli Bazy - wpisując nazwę pola np. chcąc wyświetlić datę i czas ostatniego wykonania archiwizacji wystarczy na zakładce SQL wpisać: Przykłady schematów księgowych w CDN OPT!MA Str. 9
Baz_TS_Arch 2. Chcąc odwołać się do innej tabeli, trzeba zrobić Select MoŜna w nim wykorzystać zmienne @Rok, @Miesiąc, @OpeId (Id bieŝącego operatora) oraz odwołanie do pola Baz_BazId (Id bieŝącej bazy), np. chcemy wyświetlić informację, ilu operatorów ma przypisany zakaz do danej bazy: Select Count(*) From CDN.BazZakazy Where Bza_BazId = Baz_BazId 6.3 SQL Firma Są to wszystkie atrybuty "buforowane". Najbardziej typowe zastosowanie, to wyciąganie róŝnych informacji z konfiguracji firmy - wtedy moŝna skorzystać z funkcji CDN.fn_Konfiguracja, przy czym trzeba wiedzieć, gdzie w bazie zapisana jest dana informacja. Funkcja ma cztery parametry: @Tryb - 1 oznacza odwołanie do konfiguracji "niehistorycznej", 2 do historycznej, @Klucz - dla trybu 1 oznacza numer rekordu w tabeli CDN.Firma, dla trybu 2 oznacza "ścieŝkę" dla parametru, @Rok, @Miesiac - wykorzystywane tylko dla trybu 2 (historycznego). 1. Jeśli chcemy uzyskać informację, czy w bazie jest ustawiona praca rozproszona, trzeba najpierw ustalić, Ŝe ta informacja jest zapisana w tabeli Firma, na wierszu o numerze 1470, i przyjmuje wartości: 1- brak 2 - dz. SprzedaŜy 3 - księgowość 4 - oddział XL WyraŜenie będzie wyglądać tak: Case CDN.fn_Konfiguracja(1, '1470', 0, 0) When '1' Then 'BRAK' When '2' Then 'DZ. HANDLOWY' When '3' Then 'KSIĘGOWOŚĆ' When '4' Then 'ODDZIAŁ XL' End MoŜna teŝ odwoływać się do innych danych np. księgowych, z tym, Ŝe w tym przypadku naleŝy uwaŝać, bo duŝa ilość atrybutów tego typu lub ich nieprawidłowa konstrukcja moŝe mieć wpływ na wydajność. 2. Ciekawy moŝe być atrybut pokazujący, czy w dzienniku w danym miesiącu znajdują się jakieś zapisy w buforze: Case When Exists (Select * From CDN.DekretyNag Where DeN_Bufor=1 And Year(DeN_DataDok)=@Rok And Month(DeN_DataDok)=@Miesiac) Then 'JEST BUFOR' Else 'NIE MA BUFORA' End 3. Atrybut wyświetlający liczbę poleceń księgowania: Przykłady schematów księgowych w CDN OPT!MA Str. 10
Select Count(Distinct DeN_DeNId) From CDN.DekretyNag Where Year(DeN_DataDok) =@Rok And Month(DeN_DataDok) =@Miesiac 4. PoniŜsze zapytanie sprawdza czy są jakieś nie zamknięte zadania w CRM w danym miesiącu: Case When Exists (Select * From CDN.CRMKontakty Where CRK_Bufor=1 And CRK_Zadanie=1 and Year(CRK_DataDok)=@Rok And Month(CRK_DataDok)=@Miesiac) Then 'SĄ ZADANIA' Else 'NIE MA ZADAŃ' End Przykłady schematów księgowych w CDN OPT!MA Str. 11