Informix 4gl – REPORT, tworzenie raportów w pliku zewnętrznym
Wiemy już jak pobrać dane z bazy danych przy użyciu Informix 4gl i Informix SQL. Teraz przedstawię w jaki sposób przygotować raport wykorzystując pobrane informacje.
Raport będzie zawierał nagłówek z datą i godziną wygenerowania, wiersz z nazwami kolumn, zrzucone dane oraz stopkę z ilością rekordów z bazy. Wszystkie dane będą rozdzielane separatorem ; (średnik), który również będzie na końcu każdej linii. Raport będzie charakteryzował się różną ilością pól, nagłówek i stopka – dwa pola, rekordy z danymi – trzy pola.
Gotowy program w Informix 4gl przedstawia się zatem następująco:
database school main define x_name char(50), x_surname char(50), x_avg decimal, x_query char(250), x_sep char(1), x_counter integer, x_line CHAR(1000), x_file char(500), x_today datetime year to second LET x_query = "SELECT s.NAME, s.surname, NVL(AVG(p.points),0) FROM students s" LET x_query=x_query clipped, " LEFT JOIN score p ON s.id=p.student_id" LET x_query=x_query clipped, " GROUP BY s.name, s.surname" LET x_file='reports/report.csv' LET x_sep=";" LET x_today=current LET x_counter=0 start report rep_students to x_file LET x_line='report date',x_sep, x_today, x_sep OUTPUT TO REPORT rep_students(x_line) LET x_line='name',x_sep,'surname',x_sep,'avg',x_sep OUTPUT TO REPORT rep_students(x_line) prepare p_wykonaj from x_query declare q_students cursor for p_wykonaj foreach q_students into x_name, x_surname, x_avg LET x_line=x_name clipped,x_sep,x_surname clipped,x_sep,x_avg using "&.&&",x_sep LET x_counter=x_counter+1 OUTPUT TO REPORT rep_students(x_line) end foreach LET x_line="total records",x_sep,x_counter using "<<<<<",x_sep OUTPUT TO REPORT rep_students(x_line) FINISH REPORT rep_students end main report rep_students(x_line) define x_line char(1000) OUTPUT LEFT MARGIN 0 PAGE LENGTH 13 TOP MARGIN 0 BOTTOM MARGIN 0 FORMAT ON EVERY ROW PRINT x_line CLIPPED END REPORT
Standardowo na początku określamy z jakiej bazy (database school) będziemy korzystać, oraz definiujemy zmienne:
x_name, x_surname, x_avg – przypiszemy do nich dane pobrane z bazy: imię, nazwisko oraz średnią liczbę punktów
x_query – zawierać będzie kod zapytania SQL
x_sep – przypiszemy do niej znak separatora
x_counter – wykorzystamy ją jako licznik rekordów
x_line – to będzie linijka raportu
x_file – będzie wskazywała gdzie generować się będzie raport
x_today – będzie zawierała aktualny dzień i godzinę wygenerowania raportu
Po definicji zmiennych przy pomocy słówka LET przechodzimy do przypisania im wartości. Chcemy, aby nasz raport generował się w lokalizacji/pliku wskazanym poprzez zmienną x_file. Można też tak napisać program, aby nazwa/ścieżka pliku raportu była określona jako parametr wywołania programu: więcej opisałem w artykule: Informix-4gl Pętla IF, argumenty programu ARG i wyjście z programu EXIT.
Czasami w gotowych projektach istnieje konieczność zmiany separatora, dlatego zdefiniowałem go jako wartość zmiennej: x_sep.
Przy pomocy słówka kluczowego current przypisujemy aktualną datę i czas do zmiennej x_today.
Przechodzimy do raportu. Przy pomocy start report rozpoczynamy definicję raportu, którego nazwaliśmy rep_students. Jego wynik zapisujemy do pliku, którego ścieżkę zawiera zmienna x_file. Następnie poprzez LET przypisujemy do zmiennej x_line wartość linijki i przekazujemy ją do raportu poprzez:
OUTPUT TO REPORT rep_students(x_line)
Teraz pobieramy dane z bazy przy pomocy PREPARE i CURSOR (metoda ta została opisana pod tym linkiem: Informix 4gl – PREPARE – jak pobrać dane z bazy danych Informix SQL) i przekazujemy do raportu. Następnie zwiększamy licznik:
LET x_counter=x_counter+1
Pozostaje jeszcze dodanie stopki wraz z wartością licznika i przekazanie jej do raportu:
LET x_line="total records",x_sep,x_counter using "<<<<<",x_sep OUTPUT TO REPORT rep_students(x_line)
zakończenie raportu i programu:
FINISH REPORT rep_students end main
Na samym końcu mamy jeszcze parametry raportu, takie jak marginesy czy długość strony.
report rep_students(x_line) define x_line char(1000) OUTPUT LEFT MARGIN 0 PAGE LENGTH 1 TOP MARGIN 0 BOTTOM MARGIN 0 FORMAT ON EVERY ROW PRINT x_line CLIPPED END REPORT
Na koniec jeszcze zawartość pliku report.csv, czyli nasz gotowy raport:
report date;2021-01-19 20:11:09;
name;surname;avg;
Joseph;New;0.00;
John;True;4.50;
David;False;4.00;
total records;3;