[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Numeracja stron w ramach jednego strumienia
 Mialem przygotowac raport,
ktory zawieralby kolejne listy do kontrahentow.
 Dodatkowym wymaganiem bylo, aby raport ten byl w jednym
pliku (drukarskim , dyskowym), ale z podzialem na strony.
 Sam problem wydruku zawartosci nie jest tu wazny,
ale "meczylo" mnie jedno zagadnienie:
  - jak zrobic, aby numeracja stron na liscie do kazdego
    kontrahenta zaczynala sie od 1?
 Typowym rozwiazaniem jest:
   FORM HEADER
      "Str: "
      STRING (PAGE-NUMBER) FORMAT "x(8)"
   WITH FORM nag .
ale wowczas numeracja stron jest ciagla dla wszystkich
kontrahentow.
 Mozna zastosowac wielokrotne:
  OUTPUT STREAM ss TO plik APPEND .
gdzie numeracja stron jest juz prawidlowa, ale:
  - trwa to dlugo (zamykanie i otwieranie plikow);
  - strumien byl otwierany poza procedura.
 Ponizej zamieszczam rozwiazanie, ktore drukuje nastepujace naglowki:
------
Str: 1 (Rap: 1) Kontrahent 1
------
Str: 2 (Rap: 2) Kontrahent 1
------
Str: 1 (Rap: 3) Kontrahent 2
------
Str: 2 (Rap: 4) Kontrahent 2
------
Str: 3 (Rap: 5) Kontrahent 2
------
Str: 1 (Rap: 6) Kontrahent 3
------
 Polecam
JSitarz
-----------------
P.S.
 Dobrze byloby miec mozliwosc obslugi trygera:
   ON PAGE-CHANGE ON STREAM ss DO :
   END . /* On */
  Ktos ma jakis pomysl ?
  
/* ------------------ Program numeracji stron -------------------- */
/* Granica, za ktora zmieniac strone    */
DEFINE VARIABLE v_line_b    AS INTEGER      NO-UNDO .
/* Czy mozna zmieniac strone   */
DEFINE VARIABLE v_zmiana_st AS LOGICAL      NO-UNDO .
/* Numer strony */
DEFINE VARIABLE v_strona    AS INTEGER      NO-UNDO .
/*---------------------------------------------------- */
/* Okreslamy granice dla zmian strony:
 *
 * - Jest to rozmiar strony, odjac
 * - wielkosc ramki dla naglowka (5),
 * - wielkosc pojedynczej ramki (2),
 * - ramki dla podsumowania (6),
 * - zapas (2).
 *
 *  Razem = - 15 .
 */
 ASSIGN
   v_line_b     = PAGE-SIZE - 15 /* Po tym wierszu zmienimy numer strony  */
 .
/* ----------------------------------------------------------- */
FOR EACH kontrahent 
  NO-LOCK .
   FORM HEADER
               
          /* Inne elementy naglowka strony */
      "Str: " + TRIM (STRING (v_strona))
              + " (Rap: "
              + TRIM (STRING (PAGE-NUMBER))
              + ")"                                    FORMAT "x(20)"
          /* Inne elementy naglowka strony */
  
    WITH FRAME phead
         PAGE-TOP
         WIDTH 80
         NO-BOX
    .
  v_strona	= 1 .
  VIEW FRAME phead .
  FOR EACH faktura OF kontrahent
    NO-LOCK .
         /* Wydruk:
          *  - naglowka faktury ;
          *  - naglowka dla kolumn pozycji, oraz (wazne)
          *  - przygotowanie naglowka (HEADER) pozycji dla ewentualnych
          *    nastepnych stron tekstu.
          */
     FOR EACH pozycja OF faktura
      NO-LOCK .
           /* Wydruk pozycji faktury (w kilku wierszach) */
       IF LINE-COUNT < v_line_b THEN DO .
         v_zmiana_st    = TRUE .
       END . ELSE DO . /* If LINE-COUNT >= v_line_b */
         IF v_zmiana_st THEN DO .
           v_zmiana_st      = FALSE .
           v_strona         = v_strona  +  1 .
         END . /* If v_zmiana_st */
       END . /* If LINE-COUNT >= v_line_b */
     END . /* For Each pozycja */
        /* Wydruk:
         *   - podsumowan oraz 
         *   - zablokowanie naglowka pozycji .
         */
  END . /* For Each faktura */
        /* Wydruk:
         *   - podsumowan dla faktury.
         */
     
  HIDE FRAME phead .
END . /* For Each kontrahent */
/* -------------------------------------------------------- */