#

Cobukas - Dokumentation zur Portierung

 
 

Buchen Belege
=============


    Struktur der Units cbk30 + cbk39 (buchenBelege)
      auswaehlenBeleg
      verarbeitenBeleg
      aendernBeleg
        Die Prozeduren von aendernBeleg im einzelnen
         1. Die prinzipielle Kontrollstruktur
         2. Die Weiter-Navigation
         3. Die Inhaltsverarbeitung
   UnterProzeduren:  F12 Abspeichern + F6 Ausgleichen


Struktur der Units cbk30 + cbk39
--------------------------------

  Vom Hauptmenü (cbk00.pas) in die Unit 'cbk30dobf.pas'  mit der Option 3

    buchenBelege(letzterBeleg, true);

  ---------------------------------------------------------------------------------------

  buchenBelege(VAR letzerBeleg: integer; belegfrei: boolean);
  --> auswaehlenBeleg (=Setzen der Belegnummer) Es erscheint: 
      ---------------
      (   
      1. die Maske zur Belegverarbeitung
      2. die Belegnummer ('letzterBeleg' + 1) als Vorschlag im Feld01('belegNr')
      3. die Auswahlmöglichkeiten für die Änderung der Belegnummer.

      Der Cursor befindet sich im Feld01(Nummer). Jetzt kann gewählt werden:
      )


      1.Inhalt: Bei Bedarf voreingestellte Belegnummer ändern durch:
       .1 Ab/Auf ± (Pos1=+100 SeiteAuf=+10 PfeilAuf=+1 / Ende=-100 SeiteAb=-10 PfeilAb=-1)
       .2 Neueingabe der Nummer über Taste (F1)

      2.Weiter durch:

        a) F12 - Ende Buchen
        <--Zum Speichern + Hauptmenü .>

        b) RETURN
             Auswahl der Belegnummer +
             Nächstes Feld +

        --> verarbeitenBeleg

  ---------------------------------------------------------------------------------------

   auswaehlenBeleg
   --> verarbeitenBeleg
        ---------------

       ( 
       Die Belegnummer kann nicht mehr erreicht/verändert werden, es sei
       denn durch ESC (Abbruch).

       Um mit der gleichen Routione sowohl alte Belege verändern als auch
       neue eingeben zu können, werden auch neue Belege als schon
       bestehend eingerichtet, allerdings die Werte als leer angenommen.
       Die Neueingabe ist dann also auch eine Veränderung bestehender Werte.
       )

       ... Einrichten der Datenstruktur
  
       --> initialisierenBeleg 

       --> lesenBeleg, wenn alter Beleg (schon im Journal)

       --> zeigenBeleg, wenn nicht neuer Beleg (beleg.bZeile [1].kto <> nulKto)
           (
           beleg.bZeile[1] ist Feld 11 - siehe unten 'aendernBeleg'
           )

       --> aendernBeleg
           (
           Das Ändern erfolgt in der Maske auf dem Bildschirm.
           Die Maske in 17 Zeilen und 3 Spalten eingeteilt:

            0:  01 BelegNummer       02 BelegDatum     03 BelegGrund

            1:  11 KontoNummer+Text  12 UStKennziffer  13 SollBetrag / HabenBetrag
            2:  21 KontoNummer+Text  22 UStKennziffer  23 SollBetrag / HabenBetrag
            .: ...                  ...               ...           / ...
            m:  m1 KontoNummer+Text  m2 UStKennziffer  m3 SollBetrag / HabenBetrag

             m ist "maxBelegzeile" , aktuell = 16
           ) 

        <-- aendernBeleg(abbruchBeleg  OR  zuspeichernBeleg  OR  ende)  .>

        ... speichernBeleg wenn (fertigBeleg  AND  beleg.chg) ins Journal

      <-- verarbeitenBeleg  .>
    <-- auswaehlenBeleg(endeBuchen OR ende)  .>

    ... speichernBuch wenn (jour^.chg AND NOT ende)

  <-- Hauptmenü  .>

  ---------------------------------------------------------------------------------------

  verarbeitenBeleg
  -->...

  --> aendernBeleg
      ------------
      aktZeile = 0 :
      --------------
                          aktSpalte = 2:
      --> aendernDatum
                          aktSpalte = 3:
      --> aendernGrund

          --> holenBeleg (F5)


      aktZeile > 0  AND  aktZeile <= maxBelegZeile
      --------------------------------------------

                          aktSpalte = 1:
      --> aendernKonto

                          aktSpalte = 2:
      --> aendernUStKennziffer

                          aktSpalte = 3:
      --> aendernBetrag


  ---------------------------------------------------------------------------------------


  Die Prozeduren von aendernBeleg im einzelnen
  --------------------------------------------

  Die fünf Prozeduren 'aendernDatum' ... 'aendernBetrag' haben folgenden Aufbau:


   1. Die prinzipielle Kontrollstruktur
   ------------------------------------

      REPEAT

        REPEAT
          lesenZeichen
        UNTIL weiterZeichen OR bearbeitungZeichen

        IF weiterZeichen
          . Zielfeld setzen

        ELSE
          . Einrichten Bearbeitungszustand

          REPEAT
            . Bearbeiten

            REPEAT
              lesenZeichen
            UNTIL bearbeitungZeichen OR weiterRETURN  OR  weiterESC

            IF weiterZeichen
             . Nachbearbeitung
             . Zielfeld setzen

          UNTIL  weiterRETURN  OR  weiterESC
          

        ENDIF
      UNTIL weiterZeichen


   2. Die Weiter-Navigation
   ------------------------
                 
      Das aktuelle Feld muss bekannt sein durch folgende Werte:
        a) aktZeile  und  b) aktSpalte
                    
                  
      Jede der obigen Tasten ändert das aktuelle Feld und muss damit
      einen der beiden oder beide Werte ändern.

      Dieses Wertepaar korrespondiert mit den Werten der "beleg.bZeile", nämlich
                
        aktSpalte = 1 : beleg.bZeile[aktZeile].kto
        aktSpalte = 2 : beleg.bZeile[aktZeile].ustKz
        aktSpalte = 3 : beleg.bZeile[aktZeile].betrag


      a) ESC           <--Abbruch (abbruchBeleg:=true)  .>

      b) F12           <--Zum Speichern (speichernBeleg:=true), wenn kein Saldo .>

      c) F3            Buchungszeile löschen
  
                       Im Feld(m,3) für m >= 1, wenn ein Saldo besteht:
      d) F6            -->Betrag = Saldo + Nächstes Feld

      e) F8            Die nächste Leerzeile herauftauschen in diese Zeile
                           (Nur am Anfang einer Zeile, also Feldx1)

      f) F9            Alle Leerzeilen hinuntertauschen
                           (Nur am Anfang einer Zeile, also Feldx1)

      g) PfeilLinks    <--Voriges Feld (Minimal Feld02)

      h) PfeilAb >     <-- Anfang nächste Zeile (Maximal Feldm1)
                           (Nur am Anfang einer Zeile, also Feldx1)

      i) PfeilAuf      <-- Anfang vorige Zeile (Minimal Feld11)
                           (Nur am Anfang einer Zeile, also Feldx1)

      j) RETURN        -->Nächstes Feld



      Konkret:
  
        --> aendernDatum (0,2)
           RETURN       -> aktSpalte = 3

        --> aendernGrund (0,3)
            RETURN      -> aktSpalte = 1   aktZeile = 1
            PfeilLinks  -> aktSpalte = 2

        --> aendernKonto (m,1) m= 1..maxBelegZeile
            RETURN      -> aktSpalte = 2
            PfeilLinks  -> aktSpalte = 3   aktZeile = -1 (if <1 then 1)
            PfeilAuf    -> aktZeile = -1 (if <1 then 1)
            PfeilAb     -> aktZeile = +1 (if >maxBelegZeile then maxBelegZeile)

        --> aendernUStKennziffer (n,2)
            RETURN      -> aktSpalte = 3
            PfeilLinks  -> aktSpalte = 2
                           
        --> aendernBetrag (n,3)
            RETURN      -> Wenn kein Betrag eingeben ist (text:= ''),
                             dann Umschalten zwischen Soll- und Habenseite
                           sonst
                             Verarbeiten Betrag
                             Wenn noch Zeile frei (aktZeile+1 > maxBelegZeile ?) 
                               dann neue Zeile =>(aktSpalte=1/aktZeile=+1)

            PfeilLinks  -> wenn kein Betrag
                             dann
                               wenn 'V'
                                 dann aktSpalte = 2 bei 'V',
                                   sonst aktSpalte = 1 



   3. Die Inhaltsverarbeitung
   --------------------------

      Die Inhalte werden als Text eingegeben.

      Daher ist mit Beginn der Veränderung der Inhalt der Variablen
      "beleg.bZeile[aktZeile]." (name = kto / betrag) an die Variable
      "text" zu übergeben.

      Für "beleg.bZeile[aktZeile].ustKz" gibt es eine Voreinstellung, die
      mithilfe einer Auswahltabelle verändert werden kann, aber nur bei der
      Vorsteuer. 

      Beginn der Verarbeitung ist eine der Tasten, die zugelassen sind, aber
      nicht zu den obigen Navigations-Tasten gehören.



      Konkret:


      --> aendernKonto (aktZeile,1)  (aktZeile = 1..maxBelegZeile)
          -------------------------

          Konto darf nicht geändert werden. Man kann nur die ganze Buchungszeile löschen.
          if beleg.bZeile[aktZeile].kto <> nulkto  -->  dann keine bearbeitungsZeichen            

          Im ELSE-Bereich 'Bearbeiten'

            beleg.chg := true;

            ...

            RETURN soll die Eingabe der Ziffern beenden und
                   die Prüfung einleiten, ob Kontonummer im Bestand
                     wenn nicht im Bestand, dann
                      - Meldung nicht im Bestand
                      - kein weiter ans nächste Feld



      --> aendernKennziffer (n,2)
          -----------------------

          Wenn UstRelevanz = 'K', dann wird dieses Feld übersprungen,
          wenn             = 'U', dann wird nur die Kennziffer eingetragen
                                  und sofort weitergesprungen, weil zwischen
                                  dem USt-Konto und der Kennziffer eine
                                  feste Zuordnung besteht

          Wenn Betrag schon eingegeben und Steuer schon ermittelt, dann keine
          Änderung der Kennziffer möglich, nur über Zeile löschen und Neueingabe



      --> aendernBetrag (n,3)
          -------------------

          Betragsfeld besteht aus linker und rechter Seite,
          je nach Vorzeichen des Betrages

  
          Betreten des Feldes:
       
            Wenn Keine Kontonummer  - keine Eingabe ! -->(n,1)
            sonst
              Aufforderungstext schreiben (mit  wenn es einen Saldo gibt)

              Wenn Betrag vorhanden -> loeschenBetrag(abbruchBetrag)

                                       Umwandeln in Textform
                                       Soll-Haben-Seite bestimmen

              sonst                 -> Initialisieren Betrag
                                       Soll-Haben-Seite bestimmen:
                                         Wenn 'U' ->Haben, sonst ->Soll)

              Eingabe               

               
               Wenn keinBetrag - Seitenwechsel
               sonst Betrag von Textform ->Zahlenform
                     Weiter nach (n+1, 1)

               
               Alles bleibt beim alten, Verlassen dieses Belegs
  
               
               Betrag löschen

               <0..9><.,>
               Betrag bilden
  
               
               Letzes Zeichen entfernen
             
  
               
               Wenn keinBetrag, Sonst Hinweis

                Ausgleich


           -- loeschenBetrag(abbruchBetrag, belegZeilenNr)

                 Wenn Betrag Steuerbetrag, dann nicht löschen

                 Wenn Betrag einen Steuerbetrag enthielt, dann
                    Prüfung, ob Steuerbetrag in der nächsten Zeile
                    Prüfung, ob die Steuerbeträge in der nächsten Zeile und
                                der aktuellen Zeile identisch sind
                    Wenn das alles o.k., dann
                      Steuerbetrag zu Nettobetrag
                      Steuerbetrag in der aktuellen Zeile löschen
                      Die nächste Zeile (mit dem Steuerbetrag) löschen



{erste Programmierung:

            Wenn Betrag vorhanden:
              Soll- oder Haben-Betrag ? (soll := true/false)
              Position des Cursors entsprechend

          Weiter

            ...

          Änderung

            Keine Kontonummer  - keine Eingabe!

            Wenn Betrag vorhanden:
              Saldo ändern + Betrag löschen


            o  rechtsPfeil = hin und her zwischen Soll und Haben,
                             löscht die bisherige Eingabe

            o  F6    Ausgleichen

            ...
}

UnterProzeduren:  F12 Abspeichern + F6 Ausgleichen
--------------------------------------------------
        
         o  F6         Ausgleichen 

                       Nur im Feld(m,3) für m >= 1:
                       Nur wenn ein Saldo besteht
                        -  wenn ein Betrag (mit Steuer) besteht:
                            -  wenn Steuer:  Saldo = Saldo ./. Steuer
                            -  Saldo = Saldo ./. Betrag
                        -  Betrag = Saldo + Nächstes Feld
                       Sonst: Hinweis, dass kein Saldo


         o  F12        Abspeichern

                       F12 nicht anzeigen und nicht zulassen, wenn
                         -  Saldo <> 0.0  UND
                         -  überhaupt ein Betrag vorhanden ist

                       Muss überprüft werden (Abfrage Function 'keinBetrag'
                       bei
                        a) Anzeige der Funktionsmöglichkeiten
                        b) Taste betätigt (hier auch, weil Taste immer
                           möglich (sonst zu schwierig zu programmieren)
                           

                       Dann kontrolieren, ob Soll-Beträge und Haben-Beträge
                       ausgeglichen sind.
                         (
                         Sollte man annehmen, weil ja kein Saldo da ist.
                         Dient auch nur zur Überprüfung der Programmierung!
                         )