/* * File : print.ec * Purpose: This file contains the routines to print some reports. * Autor : Andreas Theofilu * * Copyright (C) 1998, 1999 by Theos Soft. */ /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #include #include #include #include #include #include #include #include #include #include #include #include #include "platten.h" #include "printu.h" EXEC SQL include sqlca; EXEC SQL type disk_t is struct { long number; char title[41]; char b_side[41]; char singer[41]; char pressed[11]; char zeit[6]; char zeitb[6]; char lpt[41]; }; EXEC SQL type lpmaster_t is struct { long lpnum; char lptitel[61]; char lpkenn[3]; char lpdate[11]; long lpdiscid; char lpcategory[21]; }; EXEC SQL type lpchild_t is struct { long snum; int spos; char stitel[41]; char ssinger[41]; char szeit[6]; }; typedef struct { long number; char title[41]; char b_side[41]; char singer[41]; char pressed[11]; char zeit[6]; char zeitb[6]; char lpt[41]; } disk_t; typedef struct { long lpnum; char lptitel[61]; char lpkenn[3]; char lpdate[11]; long lpdiscid; char lpcategory[21]; } lpmaster_t; typedef struct { long snum; int spos; char stitel[41]; char ssinger[41]; char szeit[6]; } lpchild_t; void prSingles (); void PageSingleHeader (float *y); void MakeSingleCVS (); void prLps (); float PrintLpsHeader (float y, lpmaster_t *lpmaster); void MakeLpsCVS (); void PrintSingles () { Boolean aret, answer; aret = XmtAskForBoolean (toplevel, "AskPrintSingle", NULL, NULL, NULL, NULL, XmtCancelButton, XmDIALOG_QUESTION, True, &answer, NULL); if (!aret) return; if (answer) /* True = Print Singles */ prSingles (); } void PrintLps () { Boolean aret, answer; aret = XmtAskForBoolean (toplevel, "AskPrintLps", NULL, NULL, NULL, NULL, XmtCancelButton, XmDIALOG_QUESTION, True, &answer, NULL); if (!aret) return; if (answer) /* True = Print Singles */ { XmtDisplayBusyCursor (toplevel); prLps (); XmtDisplayDefaultCursor (toplevel); } } void prSingles () { EXEC SQL BEGIN DECLARE SECTION; disk_t disk; EXEC SQL END DECLARE SECTION; float x, y; char hv0[128], hv1[128]; Boolean Start = True; Boolean FirstPage = True; XmtDisplayBusyCursor (toplevel); if (option.chPrinter == 2) { MakeSingleCVS (); XmtDisplayDefaultCursor (toplevel); return; } if (!PsOpenPrint ((option.chPrinter == 0) ? option.ipPrinter : option.ipFile, option.chPrinter)) { XmtDisplayDefaultCursor (toplevel); return; } PsNewPage (); PsSetMetric (PsPT); PsChooseFont (PsHELVETICA_BOLD, 18); x = 46.0; y = 756.0; PsNewPath (); PsSetPosition (x, y); PsDrawText ("Liste aller Singles nach Interpret(in) sortiert"); if (GetPrintStatus ()) return; y -= 20.0; EXEC SQL declare prsicurs cursor for select * from disk order by singer, title; if (SQLCODE != 0 || CheckSqlError ()) { DisplaySqlError (toplevel); XmtDisplayDefaultCursor (toplevel); return; } EXEC SQL open prsicurs; if (SQLCODE != 0 || CheckSqlError ()) { DisplaySqlError (toplevel); XmtDisplayDefaultCursor (toplevel); return; } EXEC SQL fetch in prsicurs into :disk.number, :disk.title, :disk.b_side, :disk.singer, :disk.pressed, :disk.zeit, :disk.zeitb, :disk.lpt; if (SQLCODE != 0 || CheckSqlError ()) { DisplaySqlError (toplevel); XmtDisplayDefaultCursor (toplevel); EXEC SQL close prsicurs; EXEC SQL free prsicurs; return; } while (SQLCODE == 0) { rtrim (disk.title); rtrim (disk.b_side); rtrim (disk.singer); rtrim (disk.zeit); rtrim (disk.zeitb); rtrim (disk.lpt); if (Start) { if (!FirstPage) PsNewPage (); else FirstPage = False; PageSingleHeader (&y); Start = False; if (GetPrintStatus ()) { EXEC SQL close prsicurs; EXEC SQL free prsicurs; return; } } y -= 11.0; PsNewPath (); PsSetPosition (x, y); sprintf (hv0, "%ld", disk.number); PsDrawText (hv0); PsNewPath (); PsSetPosition (x + 44.0, y); PsDrawText (disk.title); PsNewPath (); PsSetPosition (x + 257.0, y); PsDrawText (disk.singer); PsNewPath (); PsSetPosition (x + 492.0, y); PsDrawText (disk.zeit); y -= 11.0; PsNewPath (); PsSetPosition (x + 44.0, y); PsDrawText (disk.b_side); strcpy (hv0, disk.pressed); if (hv0[0]) { PsNewPath (); PsSetPosition (x + 257, y); PsDrawText (hv0); } PsNewPath (); PsSetPosition (x + 492.0, y); PsDrawText (disk.zeitb); y -= 2.0; PsNewPath (); PsDrawLine (x, y, x + 524.0, y); PsClosePath (PsSTROKE); if (y < 47.0) { PsChooseFont (PsHELVETICA, 8); PsNewPath (); PsSetPosition (526.0, 24.0); sprintf (hv0, "Seite: %d", PsGetPage ()); PsDrawText (hv0); y = 756.0; Start = True; PsShowPage (); if (GetPrintStatus ()) { EXEC SQL close prsicurs; EXEC SQL free prsicurs; return; } } EXEC SQL fetch in prsicurs into :disk.number, :disk.title, :disk.b_side, :disk.singer, :disk.pressed, :disk.zeit, :disk.zeitb, :disk.lpt; } EXEC SQL close prsicurs; EXEC SQL free prsicurs; PsChooseFont (PsHELVETICA, 8); PsNewPath (); PsSetPosition (526.0, 24.0); sprintf (hv0, "Seite: %d", PsGetPage ()); PsDrawText (hv0); PsShowPage (); PsClosePrint (); XmtDisplayDefaultCursor (toplevel); } void PageSingleHeader (float *y) { float x; x = 46.0; PsChooseFont (PsHELVETICA_BOLD, 10); PsNewPath (); PsSetPosition (x, *y); PsDrawText ("Nummer"); PsNewPath (); PsSetPosition (x + 44.0, *y); PsDrawText ("Plattentitel"); PsNewPath (); PsSetPosition (x + 257.0, *y); PsDrawText ("Interpret(in)"); PsNewPath (); PsSetPosition (x + 492.0, *y); PsDrawText ("Zeit"); PsChooseFont (PsHELVETICA, 10); PsNewPath (); PsSetMetric (PsPT); PsSetLineWidth (1); *y = *y - 2.0; PsDrawLine (x, *y, x + 524.0, *y); PsDrawLine (x + 42.0, *y + 10.0, x + 42.0, 36.0); PsDrawLine (x + 255.0, *y + 10.0, x + 255.0, 36.0); PsDrawLine (x + 490.0, *y + 10.0, x + 490.0, 36.0); PsClosePath (PsSTROKE); } /* * Folgende Routine erzeugt eine CVS-Datei, welche als Feldtrenner * jenes Zeichen enthaelt, das unter Optionen angegeben wurde. Weiters * wird auch der unter Optionen angegebene Dateiname verwendet. */ void MakeSingleCVS () { EXEC SQL BEGIN DECLARE SECTION; disk_t disk; EXEC SQL END DECLARE SECTION; int fd; char hv0[1024], hv1[128]; if ((fd = open (option.ipFile, O_RDWR | O_CREAT | O_TRUNC, 0644)) == -1) { XmtDisplayError (toplevel, "ErrorOpenFile", NULL); return; } EXEC SQL declare prsicvscurs cursor for select * from disk order by number; if (SQLCODE != 0 || CheckSqlError ()) { DisplaySqlError (toplevel); return; } EXEC SQL open prsicvscurs; if (SQLCODE != 0 || CheckSqlError ()) { DisplaySqlError (toplevel); return; } EXEC SQL fetch in prsicvscurs into :disk.number, :disk.title, :disk.b_side, :disk.singer, :disk.pressed, :disk.zeit, :disk.zeitb, :disk.lpt; if (SQLCODE != 0 || CheckSqlError ()) { DisplaySqlError (toplevel); EXEC SQL close prsicvscurs; EXEC SQL free prsicvscurs; return; } sprintf (hv0, "NUMBER%cTITLE%cB_SIDE%cSINGER%cPRESSED%cTIMEA%cTIMEB%cLPT%c\n", option.ipTrenn[0], option.ipTrenn[0], option.ipTrenn[0], option.ipTrenn[0], option.ipTrenn[0], option.ipTrenn[0], option.ipTrenn[0], option.ipTrenn[0]); write (fd, hv0, strlen (hv0)); while (SQLCODE == 0) { strcpy (hv1, disk.pressed); rtrim (disk.title); rtrim (disk.b_side); rtrim (disk.singer); rtrim (disk.zeit); rtrim (disk.zeitb); rtrim (disk.lpt); sprintf (hv0, "%ld%c%s%c%s%c%s%c%s%c%s%c%s%c%s%c\n", disk.number, option.ipTrenn[0], disk.title, option.ipTrenn[0], disk.b_side, option.ipTrenn[0], disk.singer, option.ipTrenn[0], hv1, option.ipTrenn[0], disk.zeit, option.ipTrenn[0], disk.zeitb, option.ipTrenn[0], disk.lpt, option.ipTrenn[0]); write (fd, hv0, strlen (hv0)); EXEC SQL fetch in prsicvscurs into :disk.number, :disk.title, :disk.b_side, :disk.singer, :disk.pressed, :disk.zeit, :disk.zeitb, :disk.lpt; } close (fd); } void prLps () { EXEC SQL BEGIN DECLARE SECTION; lpmaster_t lpmaster; lpchild_t lpchild; EXEC SQL END DECLARE SECTION; float x, y; char hv0[256], hv1[256]; if (!PsOpenPrint ((option.chPrinter == 0) ? option.ipPrinter : option.ipFile, option.chPrinter)) return; PsNewPage (); PsSetMetric (PsMILLIMETER); PsChooseFont (PsHELVETICA_BOLD, 18); x = 25.6; y = 270.0; PsNewPath (); PsSetPosition (x, y); PsDrawText ("Sortierte Liste der Langspielplatten, CDs und MCs"); y -= 10.0; PsChooseFont (PsHELVETICA, 10); if (GetPrintStatus ()) return; /* * Im folgenden werden die Daten aus den Tabellen gelesen und * in Postscriptcode umgewandelt. */ EXEC SQL prepare id_ch from 'select * from lpchild where snum = ? order by spos for read only'; if (SQLCODE != 0 || CheckSqlError ()) { DisplaySqlError (toplevel); return; } EXEC SQL declare prlpccurs cursor for id_ch; EXEC SQL declare prlpmcurs cursor for select * from lpmaster order by lptitel; if (SQLCODE != 0 || CheckSqlError ()) { DisplaySqlError (toplevel); return; } EXEC SQL open prlpmcurs; if (SQLCODE != 0 || CheckSqlError ()) { DisplaySqlError (toplevel); return; } EXEC SQL fetch in prlpmcurs into :lpmaster.lpnum, :lpmaster.lptitel, :lpmaster.lpkenn, :lpmaster.lpdate, :lpmaster.lpdiscid, :lpmaster.lpcategory; if (SQLCODE != 0 || CheckSqlError ()) { DisplaySqlError (toplevel); EXEC SQL close prlpmcurs; EXEC SQL free prlpmcurs; return; } while (SQLCODE == 0) { if (y < 130.0) { PsNewPath (); PsChooseFont (PsHELVETICA, 8); PsSetPosition (x + 160, 20); sprintf (hv0, "Seite: %d", PsGetPage ()); PsDrawText (hv0); PsShowPage (); PsNewPage (); PsChooseFont (PsHELVETICA, 10); y = 270.0; if (GetPrintStatus ()) { EXEC SQL close prlpmcurs; EXEC SQL free prlpmcurs; return; } } rtrim (&lpmaster.lpcategory[0]); y = PrintLpsHeader (y, &lpmaster); EXEC SQL open prlpccurs using :lpmaster.lpnum; if (SQLCODE != 0 || CheckSqlError ()) { DisplaySqlError (toplevel); EXEC SQL close prlpmcurs; EXEC SQL free prlpmcurs; return; } EXEC SQL fetch in prlpccurs into :lpchild.snum, :lpchild.spos, :lpchild.stitel, :lpchild.ssinger, :lpchild.szeit; while (SQLCODE == 0) { /* * Drucken eines einzelnen Titels. */ PsNewPath (); PsSetPosition (x, y); sprintf (hv0, "%d:", lpchild.spos); PsDrawText (hv0); PsNewPath (); PsSetPosition (x + 10, y); PsDrawText (rtrim (lpchild.stitel)); PsNewPath (); PsSetPosition (x + 85, y); PsDrawText (rtrim (lpchild.ssinger)); PsNewPath (); PsSetPosition (x + 160, y); PsDrawText (lpchild.szeit); y -= 5.0; /* * Naechsten Datensatz holen. */ EXEC SQL fetch in prlpccurs into :lpchild.snum, :lpchild.spos, :lpchild.stitel, :lpchild.ssinger, :lpchild.szeit; if (SQLCODE == 0 && y < 25) { PsNewPath (); PsChooseFont (PsHELVETICA, 8); PsSetPosition (x + 160, 20); sprintf (hv0, "Seite: %d", PsGetPage ()); PsDrawText (hv0); PsShowPage (); PsNewPage (); y = 270; PsChooseFont (PsHELVETICA, 10); y = PrintLpsHeader (y, &lpmaster); if (GetPrintStatus ()) { EXEC SQL close prlpmcurs; EXEC SQL free prlpmcurs; EXEC SQL close prlpccurs; EXEC SQL free prlpccurs; return; } } } y -= 10; if (SQLCODE == SQLNOTFOUND) EXEC SQL close prlpccurs; else { int save_status = SQLCODE; if (has_trans) EXEC SQL rollback work; SQLCODE = save_status; } if (SQLCODE == 0 || SQLCODE == SQLNOTFOUND) EXEC SQL fetch in prlpmcurs into :lpmaster.lpnum, :lpmaster.lptitel, :lpmaster.lpkenn, :lpmaster.lpdate, :lpmaster.lpdiscid, :lpmaster.lpcategory; } if (SQLCODE < 0) DisplaySqlError (toplevel); PsShowPage (); PsClosePrint (); EXEC SQL close prlpmcurs; EXEC SQL free prlpmcurs; EXEC SQL free prlpccurs; } float PrintLpsHeader (float gy, lpmaster_t *lpmaster) { float x, y; char hv0[256], hv1[128]; x = 25.6; y = gy; PsNewPath (); PsSetPosition (x, y); if (!strcmp (lpmaster->lpkenn, "CD")) sprintf (hv1, "Kategorie/ID: %s (%08x)", lpmaster->lpcategory, lpmaster->lpdiscid); else sprintf (hv1, "Kategorie: %s", lpmaster->lpcategory); sprintf (hv0, "Nummer / Typ: %ld / %s %s", lpmaster->lpnum, lpmaster->lpkenn, hv1); PsDrawText (hv0); PsNewPath (); PsSetPosition (x + 120.0, y); strcpy (hv1, lpmaster->lpdate); sprintf (hv0, "Pressdatum: %s", hv1); PsDrawText (hv0); y -= 5.0; sprintf (hv0, "Tonträgertitel: %s", rtrim (lpmaster->lptitel)); PsNewPath (); PsSetPosition (x, y); PsDrawText (hv0); y -= 10.0; PsChooseFont (PsHELVETICA_BOLD, 10); PsNewPath (); PsSetPosition (x, y); PsDrawText ("Pos."); PsNewPath (); PsSetPosition (x + 10.0, y); PsDrawText ("Songtitel"); PsNewPath (); PsSetPosition (x + 85.0, y); PsDrawText ("Interpret(in) / Gruppe"); PsNewPath (); PsSetPosition (x + 160.0, y); PsDrawText ("Zeit"); PsChooseFont (PsHELVETICA, 10); PsNewPath (); PsSetLineWidth (1); PsDrawLine (x, y - 1.0, x + 170.0, y - 1.0); PsClosePath (PsSTROKE); y -= 6.0; return y; }