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;