Dokumentacja techniczna systemu wydruków tekstowych w systemie GW-MAX 1. Struktura definicji raportu 2. Język skryptowy 3. Makra 4. Funkcje 5. Formuły Ad 1. Definicja raportu zawiera się w zwykłym pliku tekstowym podzielonym na sekcje. Każda sekcja zaczyna się od nazwy ujętej w nawiasach prostokątnych a kończy się napisem [end] ujętym w nawiasach prostokątnym. Sekcje możemy podzielić w zależności od funkcji jaką pełni w danym raporcie. W systemie wydruków rozróżnia się następujące typy: - specjalna (sekcja w której jest zawarty program w języku skryptowym definicji wydruku, zaczyna się od [main] a kończy [end]) - sekcja polecenia sql (w którym zawartość jest poleceniem sql, nazwa dowolna byle się nie powtórzyła) - sekcja wydruków (która jest definicją opisu szaty wydruku tekstowego, nazwa dowolna byle się nie powtórzyła) Ad 2. Język skryptowy jest kolejnym dialektem języka Basic, w którym kolejne polecenia są wykonywane w kolejności występowania a zmiana miejsca gdzie ma być wykonana następna instrukcja następuje po jawnej instrukcji goto do zawartej etykiety napisanej od znaku dwukropek :. Każdy wiersz zaczynający się od znaku średniku ;, lub wykrzyknik! lub dwa myślniki wierszem komentarza i nie podlega interpretacji. Instrukcje skoku: - goto(<etykieta>) wykonuje skok bezwarunkowy do pierwszego wystąpienia etykiety w skrypcie. - if_end_goto(<etykieta>) wykonuje skok warunkowy jeśli ostatni instrukcja next(<tabela>) odczytała ostatni rekord, lub czytany rekord jest niedostępny. - if_break_page_goto( <etykieta>) wykonuje skok warunkowy jeśli ilość wierszy drukowanych przekroczyła deklarowaną ilość na stronę. - if_goto( <warunek>,<etykieta>) wykonuje skok warunkowy jeśli warunek zwróci wartość 1 - <etykieta> jest tekst ujęty w apostrofy lub wartość funkcji reprezentującą nazwę etykiety, gdzie etykieta jest deklarowana zawsze od początku wiersza znakiem dwukropek. Polecenia: - sql( <sekcja_sql>) - funkcja wysyła do sql`a polecenie zawarte w sekcji. Funkcja zwraca pełną sekcje jaka została wysłana do serwera. - sql(<sekcja_sql>, <nazwa_tabelki>) - funkcja wysyła polecenie sql z poziomu tabelki. Funkcja zwraca pełną sekcje jaka została wysłana do serwera. - next(<nazwa_tabelki>) funkcja wczytuje kolejny rekord tabelki, ustawionej polecenim sql((<sekcja_sql>, <nazwa_tabelki>). W przypadku wystąpienie błędu podczas operacji czytania funkcja zwraca łańcuch znaków opisujących błąd (funkcjami errorcode() i fileerror()) w przeciwnym wypadku zwraca łancuch pusty. - print(<sekcja_wydruku>) funkcja zapisuje w pliku wynikowym wartość jaką zwraca wykonanie sekcji wydruku. Funkcja zwraca wszystkie wiersze jakie drukuje oddzielając znakami chr( 13) i chr( 10) Ascii. 1
- <sekcja_sql> - jest to sekcja zawartm kodem sql, w którym mogą wystąpić makra, jako parametry wykonania polecenia. - <nazwa_tabelki> - jest to nazwa tabelki utworzona automatycznie na potrzeby pobrania wartości z poleceń sql do wykonywanego raportu. Opis nazwy i pól została opisna w załączniku A dokumentacji. - Istnieje możliwość zmiany działania funkcji print( <sekcja_wydruku>) za pomocą następujących modyfikatorów (modyfikator wpisujemy zawsze na początku wiersza i oddzielamy znakami nawiasów ostrych (znaki. < modyfikator1, modyfikator2, >)) - <sl> - nie drukuj tego wiersza jeśli jest pusty (suppress line) - <on> - nie kończ tego wiersza znakami chr( 13) i chr( 10) (overprint next) Ustawienia właściwości: set_prop( <właściwość>, <wartość>) instrukcja ta służy ustawiania właściwosci raportownika. Dostępne właściwości: - 'line_page' - ustawia licznik ilości wierszy na strone - 'times' ustawia ile poleceń skryptu ma być przetwarzana na 0,5 sek. - document ustawia licznik dokumentów wydrukowanych - sum_document dodaje <wartość> do licznika dokumentów wydrukowanych - 'line' ustawia licznik wierszy wydrukowanych - page ustawia licznik stron - 'sum_page' dodaje <wartość> do licznika stron wydrukowanych - break ustawienie wartości 1 przerywa wykonywanie raportu Zmienne pomocnicze: - set_var( <zmienna>, <wartość>) instrukcja sprawdza czy zmienna jest już zdefiniowana, jeśli nie to definiuje i ustawia wartość - sum_var(<zmienna>, <wartość>) instrukcja sprawdza czy zmienna jest już zdefiniowana, jeśli nie to definiuje i dodaje wartość - maksymalna długość nazwy zmiennej to 64 znaki, a wartość jaka to 1024 znaków, czyli 1KB znaków w którym może się zawierać liczba, wartość, data, łańcuch znaków. - Wartość może być przedstawiona jako makro dynamiczne, np. (set_var( data_od, ^Podaj datę od kiedy d1^ ) ) Pomocne polecenia do wykonywania analizy przebiegu wykonywania wydruku: - set_debug( <info_debug>) gdzie <info_debug> jest wartością zapisywaną w pliku log`a modułu. - set_breakpoint( <numer>) gdzie <numer> jest numerem pułapki (np. 1,2, 10) Ad 3. W systemie rozróżnia się następujące makra: - makra dynamiczne, gdzie wartość jaką one zwracają jest wprowadzana przez użytkownika podczas wykonywania wydruku - makra statyczne, gdzie wartość jest już znana tylko trzeba pobrać wartość. Makra dynamiczne: Makro ^opis s^ ^opis sml^ ^opis d^ ^opis d1^ ^opis i^ Opis Makro pozwalające na wprowadzenie dowolnego ciągu znaków (max 200 zn.) Makro pozwalające na wprowadzenie dowolnego tekstu znaków (max 2048 zn.) w tym CR i NL Makro pozwalające na wprowadzenie daty, zwraca format rrrr/mm/dd Makro pozwalające na wprowadzenie daty, zwraca format daty clariona Makro pozwalające na wprowadzenie liczby całkowitej 2
^opis b^ Makro pozwalające wybór tak lub nie (tak zwraca 1 nie 0) ^opis n^ Makro pozwalające na wprowadzenie kwoty (max 13.2) format kwoty ^opis mr^ Makro pozwalające na wprowadzenie miesiąca i roku, zwracające ilość miesięcy liczona mc+(rok*12) ^opis t^ Makro pozwalające na wprowadzenie godziny w formacie Clariona Makra słownikowe: Makro ^opis yro^ ^opis ysm^ ^opis ysu^ ^opis yko^ ^opis yo^ ^opis yrob^ Opis Makro wyboru z słownika rejonów, zwraca nazwę rejonu (YRO_Nazwa 30 zn.) Makro wyboru z słownika miejscowości, zwraca nazwę miejscowości (YSM_Nazwa 30 zn.) Makro wyboru z słownika ulic, zwraca nazwę ulicy (YSU_Nazwa 30 zn.) Makro wyboru z listy kontrahentów Makro wyboru z listy obiektów Makro wyboru z listy formuł obciążeń Makra statyczne: ^<nazwa> macro^ - makro pobierające następujące wartości: Nazwa Opis Uid Identyfikator operatora wykonującego wydruk Db Nazwa bazy danych serwera sql Server Nazwa lub adres serwera uid_rule Rola operatora wykonującego wydruk uid_master Przełożony operatora wykonującego wydruk uid_name_prefix Tytuł operatora wykonującego wydruk uid_name Imię operatora systemu GW-MAX uid_surname Nazwisko operatora systemu GW-MAX Uid_surname_name Nazwisko i imię operatora systemu GW-MAX version_software Pełna nazwa systemu GW-MAX modul_software Symbol modułu full_name_modul Pełna nazwa modułu windows_version Wersja systemu operacyjnego sql_host_id Identyfikator sesji sql Workstation Identyfikator stacji roboczej Makra specjalne: gku:rok_finansowy Wybrany rok finansowy w konfiguracji operatora systemu GW-MAX gku:akronim_uzytkownik Wybrany akronim kartoteki użytkownika w konfiguracji operatora systemu GW-MAX - ekwiwalentem tego makra jest funkcja macro(<nazwa>), która może być używana w kodzie programu. ^<nazwa> prop^ - makro pobierające wartości ustawione przez set_prop(...), lub inne Nazwa line_page Times Line Opis Zwraca jak ilość wierszy jest ustawiona Zwraca jaka jest ustawiona szybkość przetwarzania skryptu Zwraca aktualny licznik wiersza na stronie 3
- ekwiwalentem tego makra jest funkcja prop(<nazwa>), która może być używana w kodzie programu. ^<nazwa> formula^ - makro zwracające wartości formuł, jakie są podpięte do kartoteki wydruku. - ekwiwalentem tego makra jest funkcja formula(<nazwa>), która może być używana w kodzie programu. ^<nazwa> filtr^ - makro zwracające wartość filtra jaka jest przekazywana przez procedurę wydruku. - ekwiwalentem tego makra jest funkcja filtr(<nazwa>), która może być używana w kodzie programu. ^<nazwa> printer^ - makro zwracające wartość znaku sterującego zdefiniowanego na kartotece drukarki znakowej. - ekwiwalentem tego makra jest funkcja printer(<nazwa>), która może być używana w kodzie programu. ^<nazwa> var^ - makro zwracające wartość zmiennej zdefiniowanej w kodzie programu wydruku - ekwiwalentem tego makra jest funkcja var(<nazwa>), która może być używana w kodzie programu. Ad 4. Użyty język skryptowy używa wszystkich funkcji wbudowanych w generator aplikacji Clarion, zdefiniowane poniżej są uzupełnieniem do zadań specjalistycznym. Funkcje zwracające wartości jak makra: macro(<nazwa_makra>) formula(<nazwa_formuły>) filtr(<nazwa_filtru>) printer(<symbol_znaku_sterujacego>) var(<nazwa_zmiennej) prop(<nazwa_wlasciwosci>) Dodatkowe: fun_slownie_kwota( <kwota>) zwraca łańcuch znaków wyrażających kwotę złotych słownie. fun_slownie_liczba( <liczba>) zwraca łańcuch znaków wyrażających liczbę całkowitą słownie. fun_szukaj_zamien(<tekst>,<szukaj>,<zamień>) - funkcja zwraca tekst w którym zostaje wyszukany tekst <szukaj> i zamieniony na <zamień>. if(<warunek>,<wartość>) funkcja zwraca <Wartośc> jeśli warunek jest różny od zera. ifelse(<warunek>,<wartość_1>,<wartość_2>) funkcja zwraca <Wartość_1> jeśli warunek jest różny od zera, w przeciwnym wypadku zwraca <Wartość_2>. fun_format( <akcja>,<typ_formatowania>,<parametr_formatowania>,<łańcuch_formatowany>) funkcja służy do formatowania łańcuchów tekstowych, gdzie parametr <akcja> steruje zachowaniem. <akcja> = 1-formatuj, 2-zwracaj tekst <typ_formatowania> = 1-dziel tekst na równe części określone w < parametr_formatowania> <parametr_formatowania> = określa dodatkowe parametry formatowania (0- bez justowania, 1-do środka, 2-do prawej, 3-do lewej) <łańcuch_formatowany> = łańcuch znaków w jednym wierszu (max. 250) podlegający formatowaniu <akcja> = 2-zwracaj tekst z wybranego wiersza tekstu formatowanego <typ_formatowania> = 0-tak jak było wpisane, 1-centruj, 2-do lewej, 3-do prawej <parametr_formatowania> = numer wiersza w którym jest tekst formatowany (gdzie max. Długość wiersza nie może przekroczyć 250 zn.) <łańcuch_formatowany> = w tej akcji realizowanej przez funkcje parametr nie wymagany komunikat( <tekst>) funkcja wyświetla okienko z przyciskiem ok 4
fun_daj_odsetki(<dataz>,<datanadzien>,<dług>) zwraca wartość odsetek wyliczona z podanej kwoty na podstawie tabeli odsetek zdefiniowanej w administratorze/słowniki/odsetki <DataZ> - data/termin zapłaty (wymagalności zapłaty) <DataNaDzien> - data na kiedy są liczone odsetki <Dług> - kwota bazowa z której są liczone odsetki Ad 5. Formuły (Clarion) spełniają w systemie funkcje słowników tekstów w których mogą być zawarte makra statyczne i dynamiczne. W osobnym rozdziale są omówione formuły zgodne z Crystal Report. 5
Załącznik A W języku skryptowym dostępne w pamięci następujące tabelki: YUzytkownik YBank_Uzytkownik YObiekt YAdres_Obiekt YFaktura YBank_Kontrahent YKartoteka_WZ_Rozliczenie_Obiekt YKartoteka_WO_Rozliczenie_Obiekt YHistoria_Cennik YCennik YOperator YTM_Zadanie YKontrahent YWodomierz YWodomierz_Odczyt YWodomierz_Uzytkowany YCennik_Towar_Usluga YHistoria_Cennik_Towar_Usluga YWydruki0 YWydruki1 YWydruki2 YWydruki3 YWydruki4 YWydruki5 YWydruki6 YWydruki7 YWydruki8 YWydruki9 Specyfikacja tymczasowej tabelki automatycznie tworzonej do każdego wydruku Generalnie mamy tabelki YTWydruk1,, YTWydruk9, jako tabelki tymczasowe dla sesji czyli w SQL tworzone z nazwą #YTWydruk1,, #YTWydruk9 I jedna tabelka specjalna YTWydruk0, w SQL tworzona, jako ##YTWydruk0, czyli dostępna globalnie Definicja pól (gdzie w poszczególnych tabelkach pola są numerowane zgodnie z nazwą tabelki, jak YTWydruk5 to pola YT5_S1, YT5_S2 itd.) : #YTWydruk1 ( YT1_S1 YT1_S2 YT1_S3 YT1_S4 YT1_S5 YT1_S6 YT1_S7 YT1_S8 YT1_S9 YT1_S10 YT1_S11 YT1_S12 YT1_S13 YT1_S14 YT1_S15 6
YT1_S16 YT1_S17 YT1_S18 YT1_S19 YT1_S20 YT1_D1 decimal(17, 6), YT1_D2 decimal(17, 6), YT1_D3 decimal(17, 6), YT1_D4 decimal(17, 6), YT1_D5 decimal(17, 6), YT1_D6 decimal(17, 6), YT1_D7 decimal(17, 6), YT1_D8 decimal(17, 6), YT1_D9 decimal(17, 6), YT1_D10 decimal(17, 6), YT1_L1 int, YT1_L2 int, YT1_L3 int, YT1_L4 int, YT1_L5 int, YT1_L6 int, YT1_L7 int, YT1_L8 int, YT1_L9 int, YT1_L10 int) 7
Warsztat pracy informatyka Polecenie SQL do utworzenia tymczasowych tabelek CREATE TABLE dbo.##ytwydruk0 (YT0_S1 YT0_S2 YT0_S3 YT0_S4 YT0_S5 YT0_S6 YT0_S7 YT0_S8 YT0_S9 YT0_S10 YT0_S11 YT0_S12 YT0_S13 YT0_S14 YT0_S15 YT0_S16 YT0_S17 YT0_S18 YT0_S19 YT0_S20 YT0_D1 decimal(17, 6),YT0_D2 decimal(17, 6),YT0_D3 decimal(17, 6),YT0_D4 decimal(17, 6),YT0_D5 decimal(17, 6),YT0_D6 decimal(17, 6),YT0_D7 decimal(17, 6),YT0_D8 decimal(17, 6),YT0_D9 decimal(17, 6),YT0_D10 decimal(17, 6),YT0_L1 int,yt0_l2 int,yt0_l3 int,yt0_l4 int,yt0_l5 int,yt0_l6 int,yt0_l7 int,yt0_l8 int,yt0_l9 int,yt0_l10 int) CREATE TABLE dbo.#ytwydruk1 (YT1_S1 YT1_S2 YT1_S3 YT1_S4 YT1_S5 YT1_S6 YT1_S7 YT1_S8 YT1_S9 YT1_S10 YT1_S11 YT1_S12 YT1_S13 YT1_S14 YT1_S15 YT1_S16 YT1_S17 YT1_S18 YT1_S19 YT1_S20 YT1_D1 decimal(17, 6),YT1_D2 decimal(17, 6),YT1_D3 decimal(17, 6),YT1_D4 decimal(17, 6),YT1_D5 decimal(17, 6),YT1_D6 decimal(17, 6),YT1_D7 decimal(17, 6),YT1_D8 decimal(17, 6),YT1_D9 decimal(17, 6),YT1_D10 decimal(17, 6),YT1_L1 int,yt1_l2 int,yt1_l3 int,yt1_l4 int,yt1_l5 int,yt1_l6 int,yt1_l7 int,yt1_l8 int,yt1_l9 int,yt1_l10 int) CREATE TABLE dbo.#ytwydruk2 (YT2_S1 YT2_S2 YT2_S3 YT2_S4 YT2_S5 YT2_S6 YT2_S7 YT2_S8 YT2_S9 YT2_S10 YT2_S11 YT2_S12 YT2_S13 YT2_S14 YT2_S15 YT2_S16 YT2_S17 YT2_S18 YT2_S19 YT2_S20 YT2_D1 decimal(17, 6),YT2_D2 decimal(17, 6),YT2_D3 decimal(17, 6),YT2_D4 decimal(17, 6),YT2_D5 decimal(17, 6),YT2_D6 decimal(17, 6),YT2_D7 decimal(17, 6),YT2_D8 decimal(17, 6),YT2_D9 decimal(17, 6),YT2_D10 decimal(17, 6),YT2_L1 int,yt2_l2 int,yt2_l3 int,yt2_l4 int,yt2_l5 int,yt2_l6 int,yt2_l7 int,yt2_l8 int,yt2_l9 int,yt2_l10 int) CREATE TABLE dbo.#ytwydruk3 (YT3_S1 YT3_S2 YT3_S3 YT3_S4 YT3_S5 YT3_S6 YT3_S7 YT3_S8 YT3_S9 YT3_S10 YT3_S11 YT3_S12 YT3_S13 YT3_S14 YT3_S15 YT3_S16 YT3_S17 YT3_S18 YT3_S19 YT3_S20 YT3_D1 decimal(17, 6),YT3_D2 decimal(17, 6),YT3_D3 decimal(17, 6),YT3_D4 decimal(17, 6),YT3_D5 decimal(17, 6),YT3_D6 decimal(17, 6),YT3_D7 decimal(17, 6),YT3_D8 decimal(17, 6),YT3_D9 decimal(17, 6),YT3_D10 decimal(17, 6),YT3_L1 int,yt3_l2 int,yt3_l3 int,yt3_l4 int,yt3_l5 int,yt3_l6 int,yt3_l7 int,yt3_l8 int,yt3_l9 int,yt3_l10 int) CREATE TABLE dbo.#ytwydruk4 (YT4_S1 YT4_S2 YT4_S3 YT4_S4 YT4_S5 YT4_S6 YT4_S7 YT4_S8 YT4_S9 YT4_S10 YT4_S11 YT4_S12 YT4_S13 YT4_S14 YT4_S15 YT4_S16 YT4_S17 YT4_S18 YT4_S19 YT4_S20 YT4_D1 decimal(17, 6),YT4_D2 decimal(17, 6),YT4_D3 decimal(17, 6),YT4_D4 decimal(17, 6),YT4_D5 decimal(17, 6),YT4_D6 decimal(17, 6),YT4_D7 decimal(17, 6),YT4_D8 decimal(17, 6),YT4_D9 decimal(17, 6),YT4_D10 decimal(17, 6),YT4_L1 int,yt4_l2 int,yt4_l3 int,yt4_l4 int,yt4_l5 int,yt4_l6 int,yt4_l7 int,yt4_l8 int,yt4_l9 int,yt4_l10 int) CREATE TABLE dbo.#ytwydruk5 (YT5_S1 YT5_S2 YT5_S3 YT5_S4 YT5_S5 YT5_S6 YT5_S7 YT5_S8 YT5_S9 YT5_S10 YT5_S11 YT5_S12 YT5_S13 YT5_S14 YT5_S15 YT5_S16 YT5_S17 YT5_S18 YT5_S19 8
YT5_S20 YT5_D1 decimal(17, 6),YT5_D2 decimal(17, 6),YT5_D3 decimal(17, 6),YT5_D4 decimal(17, 6),YT5_D5 decimal(17, 6),YT5_D6 decimal(17, 6),YT5_D7 decimal(17, 6),YT5_D8 decimal(17, 6),YT5_D9 decimal(17, 6),YT5_D10 decimal(17, 6),YT5_L1 int,yt5_l2 int,yt5_l3 int,yt5_l4 int,yt5_l5 int,yt5_l6 int,yt5_l7 int,yt5_l8 int,yt5_l9 int,yt5_l10 int) CREATE TABLE dbo.#ytwydruk6 (YT6_S1 YT6_S2 YT6_S3 YT6_S4 YT6_S5 YT6_S6 YT6_S7 YT6_S8 YT6_S9 YT6_S10 YT6_S11 YT6_S12 YT6_S13 YT6_S14 YT6_S15 YT6_S16 YT6_S17 YT6_S18 YT6_S19 YT6_S20 YT6_D1 decimal(17, 6),YT6_D2 decimal(17, 6),YT6_D3 decimal(17, 6),YT6_D4 decimal(17, 6),YT6_D5 decimal(17, 6),YT6_D6 decimal(17, 6),YT6_D7 decimal(17, 6),YT6_D8 decimal(17, 6),YT6_D9 decimal(17, 6),YT6_D10 decimal(17, 6),YT6_L1 int,yt6_l2 int,yt6_l3 int,yt6_l4 int,yt6_l5 int,yt6_l6 int,yt6_l7 int,yt6_l8 int,yt6_l9 int,yt6_l10 int) CREATE TABLE dbo.#ytwydruk7 (YT7_S1 YT7_S2 YT7_S3 YT7_S4 YT7_S5 YT7_S6 YT7_S7 YT7_S8 YT7_S9 YT7_S10 YT7_S11 YT7_S12 YT7_S13 YT7_S14 YT7_S15 YT7_S16 YT7_S17 YT7_S18 YT7_S19 YT7_S20 YT7_D1 decimal(17, 6),YT7_D2 decimal(17, 6),YT7_D3 decimal(17, 6),YT7_D4 decimal(17, 6),YT7_D5 decimal(17, 6),YT7_D6 decimal(17, 6),YT7_D7 decimal(17, 6),YT7_D8 decimal(17, 6),YT7_D9 decimal(17, 6),YT7_D10 decimal(17, 6),YT7_L1 int,yt7_l2 int,yt7_l3 int,yt7_l4 int,yt7_l5 int,yt7_l6 int,yt7_l7 int,yt7_l8 int,yt7_l9 int,yt7_l10 int) CREATE TABLE dbo.#ytwydruk8 (YT8_S1 YT8_S2 YT8_S3 YT8_S4 YT8_S5 YT8_S6 YT8_S7 YT8_S8 YT8_S9 YT8_S10 YT8_S11 YT8_S12 YT8_S13 YT8_S14 YT8_S15 YT8_S16 YT8_S17 YT8_S18 YT8_S19 YT8_S20 YT8_D1 decimal(17, 6),YT8_D2 decimal(17, 6),YT8_D3 decimal(17, 6),YT8_D4 decimal(17, 6),YT8_D5 decimal(17, 6),YT8_D6 decimal(17, 6),YT8_D7 decimal(17, 6),YT8_D8 decimal(17, 6),YT8_D9 decimal(17, 6),YT8_D10 decimal(17, 6),YT8_L1 int,yt8_l2 int,yt8_l3 int,yt8_l4 int,yt8_l5 int,yt8_l6 int,yt8_l7 int,yt8_l8 int,yt8_l9 int,yt8_l10 int) CREATE TABLE dbo.#ytwydruk9 (YT9_S1 YT9_S2 YT9_S3 YT9_S4 YT9_S5 YT9_S6 YT9_S7 YT9_S8 YT9_S9 YT9_S10 YT9_S11 YT9_S12 YT9_S13 YT9_S14 YT9_S15 YT9_S16 YT9_S17 YT9_S18 YT9_S19 YT9_S20 YT9_D1 decimal(17, 6),YT9_D2 decimal(17, 6),YT9_D3 decimal(17, 6),YT9_D4 decimal(17, 6),YT9_D5 decimal(17, 6),YT9_D6 decimal(17, 6),YT9_D7 decimal(17, 6),YT9_D8 decimal(17, 6),YT9_D9 decimal(17, 6),YT9_D10 decimal(17, 6),YT9_L1 int,yt9_l2 int,yt9_l3 int,yt9_l4 int,yt9_l5 int,yt9_l6 int,yt9_l7 int,yt9_l8 int,yt9_l9 int,yt9_l10 int) 9