#pragma Library( "XppUI2.LIB" )

#include "Appevent.ch"
#include "Appedit.ch"
#include "Appbrow.ch"
#include "Common.ch"
#include "Font.ch"
#include "Gra.ch"
#include "Xbp.ch"
#include "Dmlb.ch"



PROCEDURE RechHo( cAuf, oDlg1, nFontR, cDruck, nRab,aPos, ASize, cPers ) //Ho // nRab wird noch nicht gebraucht
   LOCAL nEvent, mp1, mp2, oXbp, oBrowse:=oDlg1:cargo // nur damit oBrowse den richtigen Typ hat
   LOCAL oDlg, cTitel, oPbDruck, nRS := IIf(Upper(cDruck)="BL_R",1,2)
   LOCAL nOldArea := Select()
   LOCAL oFocus := SetAppFocus(), cAufName
   LOCAL cArt := Trim(" "), cNt := "R", cBez := Trim(" "), cAufS := Space(6), nB1, nB2
   LOCAL aPP := {{ XBP_PP_COMPOUNDNAME, IIf( nV<=1, FONT_DEFFIXED_SMALL, FONT_DEFFIXED_MEDIUM )}}
   PRIVATE cDatei := IIf(Upper(cDruck)="BL_RA".OR.Upper(cDruck)="BL_VRA","s_rechA","s_stap")// 7.5.2005 
   PRIVATE  lFlucht := .F., nFlucht, cTab := "RET"
   PRIVATE oCB, oRSDA, oFocusF := oBrowse, oEdit
// weil in Makros verwandt:
   PRIVATE nAnz := 1, nt := 0, nRechnr := 0, nGS := 0
   PRIVATE nZeile := 0, a3 := {}
   PRIVATE nSum := 0, aMwSt := { 0, 6, 7, 16, 21 }
   PRIVATE cDru := cDruck
    aPos := IIf(Empty(aPos),{10,30*nV},aPos)
   ASize:= IIf(Empty(ASize),{770*nH,500*nV},ASize)

   SELECT 3                            // Ho
   DbUseArea( , "FOXCDX", "PersRech" ) // Ho
   OrdListAdd( "PersRech" )            // Ho
     
   IF IsFieldVar("gkz")          // alternative Preise fr Stammkunden:
      IIf( !Empty(1->gkz), 5->(DbSeek( 1->gkz, .T. )),)
      IIf( IIf(5->(IsFieldVar("gruppe")), 5->gruppe == "R", 5->etgruppe == "R" ), ;
                              { v_p_s := "vk_pr2eu", v_p_sh := "vk_pr2" }, ;
                              { v_p_s := "vk_preiseu", v_p_sh := "vk_preis" } )
   ENDIF
   IF Upper(AppName()) = "RAGUSEX.EXE"
      v_p_s := "vk_preis1"
   ENDIF

   cAuf3temp := "r_"+StrZero(1->auftrnr,6,0)
   DO WHILE FILE( cDatver+cAuf3temp+".dbf" )
      IF ModalFen( "Rechnung wird schon bearbeitet! ; " + ;
                     "Nochmal versuchen? ; " + ;
                     "(Abbrechen mit ESC) ", ;
                     "A C H T U N G !", ;
                     oDlg1 ) == "ESC"
         RETURN
      ELSE
         IF FErase( cDatver+cAuf3temp+".dbf" ) != 0
            LOOP
         ENDIF
      ENDIF
   ENDDO

   SELECT 8
   USE serie index xserie
   SELECT 3
   IF cDatei = "s_rech"
      FIND &cAuf
      IF Eof()
         SELECT 1
         IF ConfirmBox( oDlg1, "Soll Musterrechnung geladen werden?", ;
                           "Noch keine Rechnung", ;
                           XBPMB_YESNO, ;
                           XBPMB_QUESTION ) == XBPMB_RET_YES
            cAufS := Trim( ModalDialog( "   100", "Muster ausw„hlen:", oDlg1, Int(333*nH), Int(500*nV) ) )
            cAufS := IIf( Empty(cAufS), cAuf, PadL( cAufS, 6 ) )
         ELSE
            cAufS := cAuf
         ENDIF
         SELECT 3
      ELSE
         cAufS := cAuf
      ENDIF

      IF Upper(AppName())=="VELLX.EXE"     // 12.1.2005
         DbCopyExtStruct( "RechStru" )
         SELECT 13
         USE rechstru
         APPEND BLANK
         13->field_name := "kennzart"
         13->field_type := "C"
         13->field_len := 1
         13->field_dec := 0
//         APPEND BLANK
//         13->field_name := "jn"
//         13->field_type := "C"
//         13->field_len := 1
//         13->field_dec := 0
         DbCreateFrom( cDatver+cAuf3temp,,"RechStru")
      ELSE
         COPY STRU TO (cDatver+cAuf3temp)
      ENDIF
      SELECT 13
      USE (cAuf3temp) EXCLUSIVE
      aData1 := Array(FCount())
      aData2 := Array(FCount())
      aDataD := Array(FCount())

      SELECT 3
      DbSeek( cAufS+cPers,.T. )
//      FIND &cAufS
      DO WHILE 3->auftrnr=val(cAufS) .AND. 3->rn=cPers .AND. !Eof()        // Ho
            FOR n := 1 to FCount()
               aData2[n] := FieldGet( n )
            NEXT
            AAdd( a3, Recno() )
            SELECT 13
            APPEND BLANK
            FOR n := 1 to 3->(FCount())     // FCount()    // 13.8.2004
               FieldPut( n, aData2[n] )
            NEXT
               IF cPreisZ == "2" //Upper(AppName())$"BERGX.EXE-SANDERX.EXE" .OR. 
                  nB1 := 13->&b_g     // damit der Preis auf die 2. Zeile kommt
                  nB2 := 13->&b_gh
                  REPLACE 13->&b_g WITH 0
                  REPLACE 13->&b_gh WITH 0
               ENDIF
            REPLACE 13->auftrnr WITH Val(cAuf)
            REPLACE 13->zeile WITH Str(Recno(),2,0)
            IF IsFieldVar("kennzart")     // 12.1.2005   Velleuer
               13->kennzart := 13->kennz
               13->kennz := IIf(13->kennzart<"4","1","2")
            ENDIF
               IF nBezZeil=2
                  IF !Empty(13->bezeich2)
                     13->bezeich2 := Space(45)               // damit die Zeile nicht doppelt kommt!!
                     APPEND BLANK
                     FieldPut( 1, aData2[1] )               // =auftrnr
                     n := FieldPos("BEZEICH2") - 1          // =bezeich   (1. Zeile)
                     FieldPut( n, aData2[n+1] )
                     n := FieldPos("rn")
                     FieldPut( n, aData2[n] )
                     n := FieldPos("kennz")
                     FieldPut( n, aData2[n] )
                     13->zeile := Str(Recno(),2,0)          // wird eine eigenst„ndige Zeile!
                     IF IsFieldVar("kennzart")     // 12.1.2005   Velleuer
                        13->kennzart := 13->kennz
                        13->kennz := IIf(13->kennzart<"4","1","2")
                     ENDIF
                  ENDIF
               ENDIF
               IF cPreisZ == "2"    //Upper(AppName())$"BERGX.EXE-SANDERX.EXE"
                  REPLACE 13->&b_g WITH nB1
                  REPLACE 13->&b_gh WITH nB2
               ENDIF
            SELECT 3
         skip
      ENDDO
      IF cAufS = cAuf
         ASort( a3 )
      ELSE        // wenn erzeugt aus einer Musterrechnung (und "tote" Reste existieren):
         a3 := {}
         3->(DbSeek( cAuf+cPers,.T. ))       // Ho
         DO WHILE 3->auftrnr = Val(cAuf) .AND. 3->rn=cPers .AND. .NOT. 3->(Eof())   // Ho
            DbDelete()
            DbSkip()
         ENDDO
      ENDIF
      SELECT 13
   ELSEIF cDatei = "s_stap"
      DbCopyExtStruct( "StapStru" )
      SELECT 13
      USE stapstru
      APPEND BLANK
      13->field_name := "KASS_BETR"
      13->field_type := "N"
      13->field_len := 8
      13->field_dec := 2
      APPEND BLANK
      13->field_name := "ORIG_SATZ"
      13->field_type := "N"
      13->field_len := 5
      13->field_dec := 0
      DbCreateFrom( cAuf3temp,,"StapStru")
      USE (cAuf3temp) EXCLUSIVE
      aData1 := Array(FCount())
      aData2 := Array(FCount())
      aDataD := Array(FCount())
   ENDIF

   GO BOTT
   DO WHILE Recno() < 50
      APPEND BLANK
      IIf( cDatei = "s_rech", 13->zeile := Str(Recno(),2,0), )
   ENDDO
   GO TOP
   cAufName := " an "+Trim(4->p_vorname)+" "+Trim(4->p_name)+" zum Auftrag "+Str(1->auftrnr,6,0) // Ho
   cTitel := IIf(cDatei="s_rech",IIf(cDruck="bl_r","Rechnung"+cAufName,"Angebot"+cAufName),"Stapelverarbeitung")
   // Standard Dialog erzeugen
   oDlg := AKDialog():new( AppDesktop(), oDlg1:cargo )
   oDlg:tasklist := .T.
   oDlg:title := cTitel
   oDlg:maxButton := .F.
   oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED
   oDlg:create(,, aPos, ASize )
   oDlg:drawingArea:setFontCompoundName( nFontR )
   SetAppFocus(oDlg)       // Fenster muá den Focus haben, damit Parts ihn dann kriegen k”nnen!
   oDlg:lockUpdate(.T.)    // damit der Bildaufbau unsichtbar bleibt

   oDlg:drawingArea:setColorBG( XBPSYSCLR_TRANSPARENT )
   oCB := oDlg:drawingArea
   oRSDA := oDlg:drawingArea
   oRSDA:cargo := oDlg

// jetzt folgt die Erzeugung der Eingabefelder
   oEdit := RechFF():new( oRSDA,oDlg, , ,,, nBz, cDatei, -100, 299, 13 )
   oEdit:cArt := IIf(Upper(cDruck)="BL_B","k",IIf(Upper(cDruck)="BL_GR","g","k"))
   oEdit:cBL_Datei := cDruck
   oEdit:CREATE( oRSDA,oDlg, , ,aPP,, nBz, cDatei, -100, 299, 13 )
//   oEdit:SingleZeile[1]:postblock := {|o| oDlg:isIndexUnique( 1, PadR(Trim(o:editBuffer()),6) ) }
//   oEdit:SingleZeile[1]:validate := oEdit:SingleZeile[1]:postblock
   AEval( oEdit:editControls, {|x| oDlg:addEditControl( x ) } )
//   AEval( oEdit:appendControls, {|x| oDlg:addAppendControl( x ) } )
// bis hierhin geht die Erzeugung der Eingabefelder
   // Tasten zum Editieren an das Xbp???Column Objekt delegieren
   oEdit:BrowseFeld[1]:keyboard := ;
      {|nKey, x, obj| IIf( nKey > 31 .OR. nKey < 256, ;
                           obj:getColumn( obj:colPos ):keyboard( nKey ), ;
                           NIL ) }

   IF cDatei = "s_stap"
      oEdit:AuftrZuStap( a3 )
      oEdit:BrowseFeld[1]:refreshAll()
   ENDIF
   oDlg:drawingArea:setFontCompoundName( nFontR )
   oDlg:setModalState( XBP_DISP_APPMODAL )
   oDlg:show()

//  (frher:wird) wurde hier nicht gebraucht, da der Browser das selbst managed:
// 2.7.04 siehe Žnderung bei XbpGetController:collect():
// oCtrl beinhaltet nur die nicht im Browser liegenden Elemente
   oCtrl := XbpGetController():new( oDlg )      // Controller siehe getcol!!
   oCtrl:create()
   oCtrl:READ( , .F. )
   
   * Shortcuts initialisieren
   oDlg:InitShortCuts( oDlg )

   oEdit:SummenStart()

   oDlg:lockUpdate(.F.)
   oDlg:invalidateRect()

//   oEdit:singleZeile[1]:killInputFocus()
//   SetAppFocus( oEdit:BrowseFeld[1] )
   PostAppEvent( xbeM_LbClick, {50,50},, oEdit:BrowseFeld[1] )
   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      IF nEvent == xbeP_Close .AND. lFlucht != .T.
                  IF oEdit:nSumme0>99999.99 .OR.oEdit:nSumme1>99999.99 .OR.oEdit:nSumme2>99999.99 .OR.oEdit:nSumme3>99999.99 ;
                        .OR.oEdit:nSumme>99999.99
                     ModalFen( "Die Betr„ge der Summen ; " + ;
                              "sind ber 99.999 EUR! ; " + ;
                              "Korrigieren Sie die ; " + ;
                              "falschen Preise! ; Weiter?", ;
                              "A C H T U N G !", ;
                              oDlg:drawingArea )
                     nEvent := xbeP_None
                     LOOP
                  ENDIF
         IF cDatei ="s_rech"
            oEdit:RechnungSpeichern( oRSDA, cDruck, a3 )
         ELSE
//            IF ConfirmBox( oCB, "Žnderungen speichern?", ;
//                           "Stapelverarbeitung beenden.", ;
//                           XBPMB_YESNOCANCEL, ;
//                           XBPMB_QUESTION ) == XBPMB_RET_YES
//               oEdit:StapZuAuftr(oRSDA)
//            ENDIF
         ENDIF
         oEdit:Destroy()
      ELSEIF nEvent == xbeP_Close .AND. lFlucht = .T.
         oEdit:Destroy()
      ENDIF
      IF nEvent == xbeP_Keyboard
         DO CASE
            CASE ( mp1 == xbeK_CTRL_INS .OR. mp1 == xbeK_ALT_E ) .AND. oXbp = oEdit:BrowseFeld[1]
               oEdit:SummenNull()
               oEdit:Satzeinfg()
               oEdit:BrowseFeld[1]:refreshAll()
            CASE mp1 == xbeK_CTRL_DEL .AND. oXbp = oEdit:BrowseFeld[1]
               oEdit:SummenNull()
               oEdit:aZeile := oEdit:SatzLese()
               oEdit:Satzeinfg( .T. )
               oEdit:BrowseFeld[1]:refreshAll()
            CASE mp1 == xbeK_ALT_INS .AND. oXbp = oEdit:BrowseFeld[1]   // 9.5.2004
               oEdit:SummenNull()
               oEdit:Satzeinfg()
               oEdit:SatzSchreibe( oEdit:aZeile )
               oEdit:SummenNach( oEdit:VArea )
               oEdit:BrowseFeld[1]:refreshAll()
            CASE mp1 == xbeK_ALT_DEL .AND. oXbp = oEdit:BrowseFeld[1]   // 9.5.2004
               oEdit:aZeile := oEdit:SatzLese()
            CASE (mp1 == xbeK_F4 .OR. mp1 == xbeK_RETURN) .AND. oXbp:cargo = "cNt"
               IF mp1 != xbeK_F4 
                  oXbp:setdata(oXbp:original)
//                  oXbp:killInputFocus()
//               ELSE
               ENDIF
                  PostAppEvent( xbeP_Keyboard, xbeK_TAB,, oXbp )
               LOOP
            CASE mp1 == xbeK_F4 .AND. oXbp != oEdit:Browsefeld[1]
               PostAppEvent( xbeP_Keyboard, xbeK_TAB,4, oXbp )
               LOOP
            CASE mp1 == xbeK_F5 .AND. oXbp:setParent():setParent():IsDerivedFrom( "XbpGetColumn" ) .AND. ;
                  oEdit:Browsefeld[1]:colPos = nRS .AND. !Upper(AppName())$"MUELLX.EXESINZIGX.EXE"
               PostAppEvent( xbeP_Keyboard, 64,, oXbp )     // dummy, damit KB-Event
               PostAppEvent( xbeP_Keyboard, xbeK_TAB,5, oXbp )
               LOOP
            CASE mp1 == xbeK_F6 .AND. oXbp:setParent():setParent():IsDerivedFrom( "XbpGetColumn" ) .AND. ;
                  oEdit:Browsefeld[1]:colPos = nRS .AND. !Upper(AppName())$"MUELLX.EXESINZIGX.EXE"
               PostAppEvent( xbeP_Keyboard, 64,, oXbp )     // dummy, damit KB-Event
               PostAppEvent( xbeP_Keyboard, xbeK_TAB,6, oXbp )
               LOOP
//            CASE mp1 == xbeK_RETURN .AND. oXbp != oEdit:Browsefeld[1]   // <ENTER> als
            CASE mp1 == xbeK_RETURN .AND. oXbp:setParent():setParent():IsDerivedFrom( "XbpGetColumn" )
                                       //IsMemberVar(oXbp,"vorigerwert")  // <ENTER> als
               IF oEdit:Browsefeld[1]:colPos < IIf(cDatei="s_rech",3,5) // Eingabetaste
                  PostAppEvent( xbeP_Keyboard, xbeK_TAB,, oXbp )        // - wie <TAB>
               ELSE
                  PostAppEvent( xbeP_Keyboard, xbeK_CTRL_RETURN,, oXbp )
               ENDIF
               LOOP
//            CASE mp1 == xbeK_CTRL_RETURN .AND. oEdit:BrowseFeld[1]:colPos != 3 .AND. oEdit:BrowseFeld[1]:colPos != 4 
            CASE mp1 == xbeK_CTRL_RETURN
               IF RecNo()==LastRec()
                  DbSuspendNotifications()
                  DbAppend()
                  13->zeile := Str(Recno(),2,0)
                  DbSkip(-1)
                  DbResumeNotifications()
               ENDIF
               oEdit:Browsefeld[1]:refreshAll()
               oEdit:Browsefeld[1]:down()
               oEdit:Browsefeld[1]:firstCol()
               oEdit:Browsefeld[1]:refreshAll()
               PostAppEvent( xbeP_Keyboard, xbeK_RETURN,, oEdit:Browsefeld[1] )
//            CASE mp1 == xbeK_ESC .AND. !oXbp:isDerivedFrom( "XbpSle" )
            CASE mp1 == xbeK_ESC .AND. ( oXbp:isDerivedFrom( "XbpBrowse" ) .OR. ;
                 oXbp:isDerivedFrom( "XbpPushButton" ) .OR. ;
                 (!Empty(oXbp:cargo) .AND. oXbp:cargo[1] $ "cn"))   //26.12.2004
               IF cDatei = "s_rech"
                  nFlucht := ConfirmBox( oCB, "Žnderungen speichern?", ;
                           "Rechnung beenden.", ;
                           XBPMB_YESNOCANCEL, ;
                           XBPMB_QUESTION )
               ELSE
                  nFlucht := ConfirmBox( oCB, "Abbrechen mit ESC", ;
                           "Stapelverarbeitung beenden.", ;
                           XBPMB_OKCANCEL, ;
                           XBPMB_QUESTION )
                  nFlucht := IIf( nFlucht == XBPMB_RET_OK, XBPMB_RET_NO, nFlucht )
               ENDIF
               IF nFlucht == XBPMB_RET_YES
                  IF oEdit:nSumme0>99999.99 .OR.oEdit:nSumme1>99999.99 .OR.oEdit:nSumme2>99999.99 .OR.oEdit:nSumme3>99999.99 ;
                        .OR.oEdit:nSumme>99999.99
                     ModalFen( "Die Betr„ge der Summen ; " + ;
                              "sind ber 99.999 EUR! ; " + ;
                              "Korrigieren Sie die ; " + ;
                              "falschen Preise! ; Weiter?", ;
                              "A C H T U N G !", ;
                              oDlg:drawingArea )
                     nEvent := xbeP_None
                     LOOP
                  ENDIF
                  lFlucht := .F.
                  PostAppEvent( xbeP_Close)
               ELSEIF nFlucht == XBPMB_RET_NO
                  lFlucht := .T.
                  PostAppEvent( xbeP_Close)
               ELSE
                  SetAppFocus( oEdit:BrowseFeld[1] )
                  LOOP
               ENDIF
            CASE mp1 == xbeK_ESC .AND. !oXbp:setparent():isDerivedFrom( "XbpCellGroup" ) ;
                                 .AND. !oXbp:isDerivedFrom( "XbpIWindow" )
               LOOP
            CASE mp1 == xbeK_ALT_D .OR. mp1 == xbeK_CTRL_D
               nGS := BlattDRG( cDruck,, oDlg:drawingArea,,, "P", "O", @nAnz, @nt )
               SetAppFocus( oPbDruck )
            CASE mp1 == xbeK_ALT_G
               nGS := BlattDRG( cDruck,, oDlg:drawingArea,,, "P", "O", @nAnz, @nt )
               SetAppFocus( oPbDruck )
            CASE mp1 == xbeK_F2 .AND. oEdit:BrowseFeld[1]:colpos = 4 .AND. ;
                     oXbp:IsDerivedFrom("XbpGet") .AND. !oXbp:cargo[1]$"cn"
               PostAppEvent( xbeP_Keyboard, 106,, oXbp )
               PostAppEvent( xbeP_Keyboard, xbeK_DOWN,, oXbp )
               LOOP
            CASE mp1 == xbeK_F1
               ModalDialog( (cDatver+"f1_r3.dbf"), "Bedienungshinweise", oDlg:drawingArea, 680*nH, 460*nV )
            CASE mp1 == xbeK_F10
               IF oEdit:nSumme0>99999.99 .OR.oEdit:nSumme1>99999.99 .OR.oEdit:nSumme2>99999.99 .OR.oEdit:nSumme3>99999.99 ;
                     .OR.oEdit:nSumme>99999.99
                  ModalFen( "Die Betr„ge der Summen ; " + ;
                           "sind ber 99.999 EUR! ; " + ;
                           "Korrigieren Sie die ; " + ;
                           "falschen Preise! ; Weiter?", ;
                           "A C H T U N G !", ;
                           oDlg:drawingArea )
                  LOOP
               ENDIF
               lFlucht := .F.
               PostAppEvent( xbeP_Close)
         CASE (mp1 == xbeK_F5 .AND. IsMemberVar( oXbp, "value" ) ;
                     .AND. oEdit:BrowseFeld[1]:colPos = nRS .AND. Upper(AppName())$"MUELLX.EXESINZIGX.EXE") .OR. ;
              (mp1 == xbeK_CTRL_F5 .AND. IsMemberVar( oXbp, "value" ) ;
                     .AND. oEdit:BrowseFeld[1]:colPos = nRS .AND. !Upper(AppName())$"MUELLX.EXESINZIGX.EXE")
            DbSuspendNotifications()
            oXbp:setdata("")
               SELECT 8
               IF !Bof()
                  skip -1
               ENDIF
               SELECT 13
               REPLACE 13->bezeich WITH 8->b1
               IF Upper(AppName())$"SINZIGX.EXE"
                  REPLACE 13->&b_g WITH 8->&v_p
               ENDIF
               oEdit:BrowseFeld[1]:refreshAll()
               oXbp:vorigerWert := oXbp:value      // 2.7.2004 damit klappt F5/F6 bei Muellx endlich
               oXbp:setData( 8->art )
               oXbp:original := oXbp:vorigerWert   // 2.7.2004
            DbResumeNotifications()
//            PostAppEvent( xbeP_Keyboard, xbeK_SH_TAB,5, oXbp )
         CASE (mp1 == xbeK_F6 .AND. IsMemberVar( oXbp, "value" ) ;
                     .AND. oEdit:BrowseFeld[1]:colPos = nRS .AND. Upper(AppName())$"MUELLX.EXESINZIGX.EXE") .OR. ;
              (mp1 == xbeK_CTRL_F6 .AND. IsMemberVar( oXbp, "value" ) ;
                     .AND. oEdit:BrowseFeld[1]:colPos = nRS .AND. !Upper(AppName())$"MUELLX.EXESINZIGX.EXE")
            DbSuspendNotifications()
            oXbp:setdata("")
            SELECT 8
            IF !Eof()
               skip 1
            ENDIF
            SELECT 13
            REPLACE 13->bezeich WITH 8->b1
            IF Upper(AppName())$"SINZIGX.EXE"
               REPLACE 13->&b_g WITH 8->&v_p
            ENDIF
            oEdit:BrowseFeld[1]:refreshAll()
            oXbp:vorigerWert := oXbp:value      // 2.7.2004 damit klappt F5/F6 bei Muellx endlich
            oXbp:setData( 8->art )
            oXbp:original := oXbp:vorigerWert   //
            DbResumeNotifications()
//            PostAppEvent( xbeP_Keyboard, xbeK_SH_TAB,6, oXbp )
         ENDCASE
      ENDIF
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO

   oDlg:setModalState( XBP_DISP_MODELESS )
   oDlg:destroy()
   SELECT 13
   USE         // schlieát WorkArea 13
   SELECT 8    // 14.1.2005
   USE
   SELECT 3                   // Ho
   USE auftr INDEX xaufauf    // Ho
   SetAppFocus( oFocus )
   FErase( cDatver+cAuf3temp+".dbf" )
   Select &nOldArea
RETURN

//////// hier steht noch ein alter Zopf: (der aber gebraucht wird!)
//////FUNCTION RechnungsNr(cRArt)
//////LOCAL cRechnr := space(5), nOldArea := SELECT()
//////// die Variable xR existiert nur bei "ENDE + Druck" => nur dann wird RNr vergeben
//////   IF IsMemVar("xR") .OR. Val(cRArt)>9998       // mit "9999" wird aktueller Wert ermittelt
//////      1->(DbRlock())                            // mit >10000 wird Wert in 9->nextre eingetragen
////////      cMWSTDAT := cDatver+"mwstdat"
////////** Netzwerkversionen mssen die Rechnungsnummer vom zentralen Server beziehen:
//////      IF Upper(AppName())$"RUDOX.EXESONNEX.EXEBERGX.EXESTAPPX.EXESINZIGX.EXE"
//////         cMWSTDAT := cDatver + "mwstdat"
//////      ELSEIF Upper(AppName())$"MENGX.EXEMUELLX.EXE"   // "Mandanten" im selben Rg-Nrn-Kreis!
//////         cMWSTDAT := cNetver + "mwstdat"              // im Bestattungsdaten-Verzeichnis
//////      ELSE
//////         cMWSTDAT := "mwstdat"
//////      ENDIF
//////      SELECT 9                                  // (beides wird fr Spin in BRegieFVo gebraucht)
//////      USE (cMWSTDAT)
//////      9->(DbRLock())
//////      cRechnr := Str(IIf( Val(cRArt)>10000, 9->nextre := Val(cRArt), 9->nextre ),5,0)
//////      IF Upper(AppName())== "SONNEX.EXE" // bei Sonnex muá in der best.dbf die L„nge von rechnr 6 Stellen sein !!
//////         DO CASE
//////            CASE cRArt == "0" .OR. cRArt == " "
//////               cRechnr := IIf( !Empty(1->rechnr), 1->rechnr, 1->rechnr := Right(Str(9->nextre++ ,5,0),3) ;
//////                                 + Right(Str(Year(DATE())),1) + Transform(Month(DATE()),"@L0 99") )
//////            CASE cRArt == "1"
//////               cRechnr := IIf( !Empty(1->rechnrn), 1->rechnrn, 1->rechnrn := Right(Str(9->nextre++ ,5,0),3) ;
//////                                 + Right(Str(Year(DATE())),1) + Transform(Month(DATE()),"@L0 99") )
//////            CASE cRArt == "2"
//////               cRechnr := IIf( !Empty(1->rechnrn2), 1->rechnrn2, 1->rechnrn2 := Right(Str(9->nextre++ ,5,0),3) ;
//////                                 + Right(Str(Year(DATE())),1) + Transform(Month(DATE()),"@L0 99") )
//////            CASE cRArt == "3"
//////               cRechnr := IIf( !Empty(1->rechnrn3), 1->rechnrn3, 1->rechnrn3 := Right(Str(9->nextre++ ,5,0),3) ;
//////                                 + Right(Str(Year(DATE())),1) + Transform(Month(DATE()),"@L0 99") )
//////         ENDCASE
//////      ELSEIF Upper(AppName()) $ "AAAX.EXESTAPPX.EXELANGEX.EXESANDERX.EXEKLEMMX.EXE" 
//////         IF Month(DATE())!=Val(SubStr(Str(9->nextre,5,0),2,2))
//////            9->nextre := 0
//////            9->nextre := (Year(DATE())-2000)*10000 + Month(DATE())*100 + 1
//////         ENDIF
//////         DO CASE
//////            CASE cRArt == "0" .OR. cRArt == " "
//////               cRechnr := IIf( !Empty(1->rechnr), 1->rechnr, 1->rechnr := Right(Str(Year(DATE())),1) ;
//////                                 + Transform(Month(DATE()),"@L0 99") + Right(Str(9->nextre++ ,5,0),2) )
//////            CASE cRArt == "1"
//////               cRechnr := IIf( !Empty(1->rechnrn), 1->rechnrn, 1->rechnrn := Right(Str(Year(DATE())),1) ;
//////                                 + Transform(Month(DATE()),"@L0 99") + Right(Str(9->nextre++ ,5,0),2) )
//////            CASE cRArt == "2"
//////               cRechnr := IIf( !Empty(1->rechnrn2), 1->rechnrn2, 1->rechnrn2 := Right(Str(Year(DATE())),1) ;
//////                                 + Transform(Month(DATE()),"@L0 99") + Right(Str(9->nextre++ ,5,0),2) )
//////            CASE cRArt == "3"
//////               cRechnr := IIf( !Empty(1->rechnrn3), 1->rechnrn3, 1->rechnrn3 := Right(Str(Year(DATE())),1) ;
//////                                 + Transform(Month(DATE()),"@L0 99") + Right(Str(9->nextre++ ,5,0),2) )
//////         ENDCASE
////////         IF Month(DATE())!=Val(SubStr(Str(9->nextre,5,0),2,2))
////////            9->nextre := Val(cRechnr) - Val(SubStr(cRechnr,4,2)) + 1
////////            cRechnr := Str(9->nextre,5,0)
////////            1->rechnr := IIf( !Empty(1->rechnr), cRechnr, 1->rechnr )
////////            9->nextre++
////////         ENDIF
//////      ELSEIF Upper(AppName()) $ "MENGX.EXE" 
//////         IF Month(DATE())!=Val(SubStr(Str(9->nextre,5,0),1,2)) - 10
//////            9->nextre := 0
//////            9->nextre := Month(DATE())*1000 + 10001
//////         ENDIF
//////         DO CASE
//////            CASE cRArt == "0" .OR. cRArt == " "
//////               cRechnr := IIf( !Empty(1->rechnr), 1->rechnr, 1->rechnr := Right(Str(Year(DATE())),1) ;
//////                                 + Transform(Month(DATE()),"@L0 99") + Right(Str(9->nextre++ ,5,0),3) )
//////            CASE cRArt == "1"
//////               cRechnr := IIf( !Empty(1->rechnrn), 1->rechnrn, 1->rechnrn := Right(Str(Year(DATE())),1) ;
//////                                 + Transform(Month(DATE()),"@L0 99") + Right(Str(9->nextre++ ,5,0),3) )
//////            CASE cRArt == "2"
//////               cRechnr := IIf( !Empty(1->rechnrn2), 1->rechnrn2, 1->rechnrn2 := Right(Str(Year(DATE())),1) ;
//////                                 + Transform(Month(DATE()),"@L0 99") + Right(Str(9->nextre++ ,5,0),3) )
//////            CASE cRArt == "3"
//////               cRechnr := IIf( !Empty(1->rechnrn3), 1->rechnrn3, 1->rechnrn3 := Right(Str(Year(DATE())),1) ;
//////                                 + Transform(Month(DATE()),"@L0 99") + Right(Str(9->nextre++ ,5,0),3) )
//////         ENDCASE
////////         IF Month(DATE())!=Val(SubStr(Str(9->nextre,5,0),1,2)) - 10
////////            9->nextre := Val(SubStr(cRechnr,2,5)) - Val(SubStr(cRechnr,4,3)) + 10001
////////            cRechnr := IIf( Empty(1->rechnr), Right(Str(Year(DATE())),1) ;
////////                              + Transform(Month(DATE()),"@L0 99") + Right(Str(9->nextre,5,0),3), 1->rechnr )
////////            1->rechnr := IIf( Empty(1->rechnr), cRechnr, 1->rechnr )
////////            9->nextre++
////////         ENDIF
//////      ELSEIF Upper(AppName()) $ "BERGX.EXE"     // cSystem + Rg-Nr. = 6stellig !!!
//////         IF Month(DATE())!=Val(SubStr(Str(9->nextre,5,0),2,2))
//////            9->nextre := 0
//////            9->nextre := (Year(DATE())-2000)*10000 + Month(DATE())*100 + 1
//////         ENDIF
//////         DO CASE
//////            CASE cRArt == "0" .OR. cRArt == " "
//////               cRechnr := IIf( !Empty(1->rechnr), 1->rechnr, 1->rechnr := cSystem+Right(Str(Year(DATE())),1) ;
//////                                 + Transform(Month(DATE()),"@L0 99") + Transform(Right(Str(9->nextre++ ,5,0),2),"@L0 99") )
//////            CASE cRArt == "1"
//////               cRechnr := IIf( !Empty(1->rechnrn), 1->rechnrn, 1->rechnrn := cSystem+Right(Str(Year(DATE())),1) ;
//////                                 + Transform(Month(DATE()),"@L0 99") + Transform(Right(Str(9->nextre++ ,5,0),2),"@L0 99") )
//////            CASE cRArt == "2"
//////               cRechnr := IIf( !Empty(1->rechnrn2), 1->rechnrn2, 1->rechnrn2 := cSystem+Right(Str(Year(DATE())),1) ;
//////                                 + Transform(Month(DATE()),"@L0 99") + Transform(Right(Str(9->nextre++ ,5,0),2),"@L0 99") )
//////            CASE cRArt == "3"
//////               cRechnr := IIf( !Empty(1->rechnrn3), 1->rechnrn3, 1->rechnrn3 := cSystem+Right(Str(Year(DATE())),1) ;
//////                                 + Transform(Month(DATE()),"@L0 99") + Transform(Right(Str(9->nextre++ ,5,0),2),"@L0 99") )
//////         ENDCASE
////////         IF Month(DATE())!=Val(SubStr(Str(9->nextre,5,0),2,2))
////////            9->nextre := Val(SubStr(cRechnr,2,5)) - Val(SubStr(cRechnr,5,2)) + 1
////////            cRechnr := cSystem+Str(9->nextre,5,0)
////////            1->rechnr := IIf( !Empty(1->rechnr), cRechnr, 1->rechnr )
////////            9->nextre++
////////         ENDIF
//////      ELSE        // nextre in mwstdat ist Rechnungsnummer und wird einfach weitergez„hlt
//////         DO CASE
//////            CASE cRArt == "0" .OR. cRArt == " "
//////               cRechnr := IIf( !Empty(1->rechnr), 1->rechnr, 1->rechnr := Str(9->nextre++ ,5,0) )
//////            CASE cRArt == "1"
//////               cRechnr := IIf( !Empty(1->rechnrn), 1->rechnrn, 1->rechnrn := Str(9->nextre++ ,5,0) )
//////            CASE cRArt == "2"
//////               cRechnr := IIf( !Empty(1->rechnrn2), 1->rechnrn2, 1->rechnrn2 := Str(9->nextre++ ,5,0) )
//////            CASE cRArt == "3"
//////               cRechnr := IIf( !Empty(1->rechnrn3), 1->rechnrn3, 1->rechnrn3 := Str(9->nextre++ ,5,0) )
//////         ENDCASE
//////      ENDIF
//////      USE
//////      1->(DbRUnlock())
//////   ELSE
//////      DO CASE
//////         CASE cRArt == "0" .OR. cRArt == " "
//////            cRechnr := IIf( !Empty(1->rechnr), 1->rechnr, cRechnr )
//////         CASE cRArt == "1"
//////            cRechnr := IIf( !Empty(1->rechnrn), 1->rechnrn, cRechnr )
//////         CASE cRArt == "2"
//////            cRechnr := IIf( !Empty(1->rechnrn2), 1->rechnrn2, cRechnr )
//////         CASE cRArt == "3"
//////            cRechnr := IIf( !Empty(1->rechnrn3), 1->rechnrn3, cRechnr )
//////      ENDCASE
//////   ENDIF
//////   SELECT &nOldArea
//////RETURN cRechNr
////////=================================================================
//////
//////CLASS RechFF FROM DialogFF
//////   EXPORTED:
//////   VAR VArea         // Area der Temp-Datei
//////   VAR cAuf          // Auftragsnummer als String
//////   VAR cArt          // Artikelnummer
//////   VAR aRechFelder   // die Feldnamen eines Satzes
//////   VAR aMwSt         // die gesetzlichen MwSt-S„tze
//////   VAR aZeile        // der Inhalt eines Satzes
//////   VAR cBL_Datei     // die Druckdatei ( bl_r.dbf etc.)
////////   VAR nBrutto
////////   VAR Summen
//////   VAR cNt
//////   VAR nSummeV
//////   VAR nSumme0
//////   VAR nSumme1
//////   VAR nSumme2
//////   VAR nSumme3
//////   VAR nSumme
//////   VAR nSummeK       // Kassenbetrags-Summe beim Stapel
////////   VAR nGewinnS
//////   METHOD INIT
//////   METHOD CREATE
//////   METHOD destroy
//////   METHOD notify
//////   METHOD SwapIn
//////   METHOD SwapOut
//////   METHOD Preis
//////   METHOD Preisaktivieren
//////   METHOD RSuch
//////   METHOD ZeileSpeichern
//////   METHOD Satzeinfg
//////   METHOD Satzlese
//////   METHOD SatzSchreibe
//////   METHOD SummenStart
//////   METHOD SummenNull
//////   METHOD SummenVor
//////   METHOD SummenNach
//////   METHOD SummenSet
////////   METHOD BruttoPreis
////////   METHOD RabattNeu
//////   METHOD RechBetr
//////   METHOD ArtikelMehr
//////   METHOD ArtikelWeniger
//////   METHOD RechnungSpeichern
//////   METHOD RDatum
//////   METHOD RechFolge
//////   METHOD AUFTRzuSTAP
//////   METHOD ARTzuSTAP
//////   METHOD STAPzuAUFTR
//////   METHOD STAPzuKASSE
//////   METHOD STAPsummezuKASSE
//////ENDCLASS
//////
//////METHOD RechFF:INIT( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
//////   LOCAL aStructure := 3->(DbStruct())
//////
//////   ::DialogFF:INIT( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
//////   ::Fancy := cLeistBM
//////   ::VArea := nA
//////   ::cAuf := StrX(1->auftrnr,6,0)
//////   ::cArt := "k"
//////   ::BEArea := {}
//////   AAdd( ::BEArea, oParent )
//////   ::BENr := Len( ::BEArea )
//////   ::aRechFelder := {}
//////   AEval( aStructure, {|a| AAdd( ::aRechFelder, a[1] ) } )    // Array mit allen Feldnamen
//////   ::aMwSt := { 0, 7, 16 }
//////   ::aZeile := {}
//////   ::cNt := "A"               // Ho
//////   ::nSummeV := 1->&v_m
//////   ::nSumme0 := 0
//////   ::nSumme1 := 0
//////   ::nSumme2 := 0
//////   ::nSumme3 := 0
//////   ::nSumme := 0
//////   ::nSummeK := 0
////////   ::nGewinnS := 0
//////RETURN self
//////
//////METHOD RechFF:CREATE( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
//////   ::DialogFF:CREATE( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
//////   (nA)->(DbRegisterClient(self))     // reicht es, wenn das Fenster als Ganzes registriert ist??
//////RETURN self
//////
//////METHOD RechFF:Destroy()
//////   ::DialogFF:destroy()
//////RETURN .T.
//////
//////METHOD RechFF:notify( nEvent, mp1, mp2 )
//////   LOCAL nRec, oFocus,i
//////      IF nEvent == xbeDBO_Notify             // Notify-Ereignis
//////         IF mp1 == DBO_MOVE_DONE             // Skip ist beendet
//////// bewirkt eine unerwnschte Verdoppelung der up/down-Schritte:
////////            IF !SetAppFocus():isDerivedFrom( "XbpBrowse" ) .AND. Len(::BrowseFeld) > 0
////////               (::VArea)->(DbSuspendNotifications())
////////               nRec := (::VArea)->(RecNo())
////////               FOR i := 1 TO Len(::BrowseFeld)
////////                  ::BrowseFeld[i]:refreshAll()
////////               NEXT
////////               (::VArea)->(DbGoto( nRec ))
////////               (::VArea)->(DbResetNotifications())
////////            ENDIF
//////         ENDIF
//////      ENDIF
//////RETURN self
//////
//////METHOD RechFF:swapIn( aFelder, nA1, nA2, aFelder2 )   // nA1 <==< nA2
//////   PRIVATE c, c2
//////   DEFAULT aFelder TO ::aRechFelder , ;
//////            aFelder2 TO ::aRechFelder , ;
//////            nA1 TO 3 , ;
//////            nA2 TO 13
//////            
//////   (nA1)->(DbRLock())
//////   IF Empty(aFelder2)
//////      FOR i := 1 TO Len(aFelder)    // aFelder2 darf mehr Felder haben als aFelder
//////         c := aFelder[i]
//////         (nA1)->&c := (nA2)->&c
//////      NEXT
//////   ELSE
//////      FOR i := 1 TO Len(aFelder)
//////         c := aFelder[i]
//////         c2 := aFelder2[i]
//////         (nA1)->&c := (nA2)->&c2
//////      NEXT
//////   ENDIF
//////   (nA1)->(DbRUnLock())
//////RETURN self
//////
//////METHOD RechFF:swapOut( aFelder, nA1, nA2, aFelder2 ) // nA1 >==> nA2
//////   PRIVATE c, c2
//////   DEFAULT aFelder TO ::aRechFelder , ;
//////            aFelder2 TO ::aRechFelder , ;
//////            nA1 TO 3 , ;
//////            nA2 TO 13
//////
//////   IF Empty(aFelder2)
//////      (nA2)->(DbRLock())
//////      FOR i := 1 TO Len(aFelder)    // aFelder2 darf mehr Felder haben als aFelder
//////         c := aFelder[i]
//////         (nA2)->&c := (nA1)->&c
//////      NEXT
//////      (nA2)->(DbRUnLock())
//////   ELSE
//////      (nA2)->(DbRLock())
//////      FOR i := 1 TO Len(aFelder)
//////         c := aFelder[i]
//////         c2 := aFelder2[i]
//////         (nA2)->&c2 := (nA1)->&c
//////      NEXT
//////      (nA2)->(DbRUnLock())
//////   ENDIF
//////RETURN self
//////
//////METHOD RechFF:Preis(oXbp)
//////   LOCAL cVar := oXbp:cargo
//////   cVar := IIf( cVar="&", &(SubStr(cVar,2,Len(cVar)-1)),cVar) 
//////      DbSuspendNotifications()
//////         oEdit:SummenVor( ::VArea, oXbp, oXbp:vorigerWert )
//////         (::VArea)->&cVar := oXbp:value
//////         oEdit:BrowseFeld[1]:refreshAll()
//////         oEdit:SummenNach( ::VArea, , oXbp, oXbp:value )
//////      DbResumeNotifications()
//////RETURN self
//////
//////METHOD RechFF:Preisaktivieren(oXbp)
//////   DbSuspendNotifications()
//////      oEdit:SummenVor( ::VArea )
//////      IF oXbp:value$" nN0#"
//////         (::VArea)->&b_g := 0
//////      ELSEIF oXbp:value$"<"
//////         (::VArea)->preis := (::VArea)->&b_g
//////      ELSEIF oXbp:value$"j"
//////         (::VArea)->&b_g := (::VArea)->preis
//////      ENDIF
//////      oEdit:BrowseFeld[1]:refreshAll()
//////      oEdit:SummenNach( ::VArea ) 
//////   DbResumeNotifications()
//////RETURN self
//////
//////METHOD RechFF:RSuch( oDlg1, cProg, nAnf, nEnd, nA, nCol, oXbp )
//////   LOCAL cNt := ::cNt, aMwSt := ::aMwSt, cKennz, nRec
//////   LOCAL nOldArea := SELECT()
//////   LOCAL aPP := {{ XBP_PP_COMPOUNDNAME, IIf( nV<=1, FONT_DEFFIXED_SMALL, FONT_DEFFIXED_MEDIUM )}}
//////   LOCAL lFlucht := .F.
////////   DbSuspendNotifications()
//////      IF LastAppEvent(@mp1,@mp2,@Xbp) == xbeP_Keyboard
//////         IF mp1 ==xbeK_F6 .OR. ( Val(oXbp:value)>0 .AND. Val(oXbp:value)<9 )
//////            RETURN self
//////         ENDIF
//////      ELSEIF NextAppEvent(@mp1,@mp2,@Xbp) == xbeM_LbDown .AND. ;
//////            ( Val(oXbp:value)>0 .AND. Val(oXbp:value) < IIf(IsFieldVar("kennzart"),9,4)) //12.1.2005
//////            RETURN self
//////      ENDIF
//////   DbSelectArea( nA )         // in nA-> steht die Artikeldatei
//////   DbSuspendNotifications()
//////   IF nCol == 1         // die Spalte mit zugr_z_st
//////      nRec := RecNo()
//////      IF LastAppEvent(@mp1,@mp2,@Xbp) == xbeP_Keyboard
//////         IF mp1 == xbeK_TAB .AND. ( mp2 == 5 .OR. mp2 == 6 )     // <F4>
//////            IF mp2 == 5
//////               IF !8->(Bof())
//////                  8->(DbSkip( -1))
//////               ENDIF
//////            ELSE
//////               IF !8->(Eof())
//////                  8->(DbSkip())
//////               ENDIF
//////            ENDIF
//////            DbSeek( 8->art, .T. )
//////            lFlucht := ::Such( oDlg1, cProg, nAnf, nEnd, nA, nRec, ;
//////                                          {10*nV,30*nV}, {int(700*nV),int(250*nV)}, aPP )
//////            IF lFlucht = .T.
//////               (::VArea)->zugr_z_st := oXbp:vorigerWert
//////            ENDIF
//////         ELSE
//////            DbSeek( (::VArea)->zugr_z_st, .F. )
//////            IF Eof()
//////               DbSeek( (::VArea)->zugr_z_st, .T. )
//////               lFlucht := ::Such( oDlg1, cProg, nAnf, nEnd, nA, nRec, ;
//////                                             {10*nV,30*nV}, {int(700*nV),int(250*nV)}, aPP )
//////               IF lFlucht = .T.
//////                  (::VArea)->zugr_z_st := oXbp:vorigerWert
//////               ENDIF
//////            ENDIF
//////         ENDIF
//////      ELSEIF NextAppEvent(@mp1,@mp2,@Xbp) == xbeM_LbDown // 17.11.2004
//////         DbSeek( (::VArea)->zugr_z_st, .F. )
//////         IF Eof()
//////            DbSeek( (::VArea)->zugr_z_st, .T. )
//////            lFlucht := ::Such( oDlg1, cProg, nAnf, nEnd, nA, nRec, ;
//////                                          {10*nV,30*nV}, {int(700*nV),int(250*nV)}, aPP )
//////            IF lFlucht = .T.
//////               (::VArea)->zugr_z_st := oXbp:vorigerWert
//////            ENDIF
//////         ENDIF
//////      ENDIF 
//////   ENDIF
//////   IF nCol == 2
//////      nRec := RecNo()
//////      IF LastAppEvent(@mp1,@mp2,@Xbp) == xbeP_Keyboard
//////         IF mp1 == xbeK_TAB .AND. mp2 == 4      // <F4>
//////            6->(DbSetFilter( {|| Upper(Trim((::VArea)->bezeich))$Upper(6->bez) } ))
//////            IIf( !(6)->(Bof()), 6->(DbGotop()), )
//////            lFlucht := ::Such( oDlg1, cProg, nAnf, nEnd, nA, nRec, ;
//////                                          {10*nV,30*nV}, {int(700*nV),int(250*nV)}, aPP )
//////            IF lFlucht = .T.
//////               (::VArea)->bezeich := oXbp:vorigerWert    // 12.1.2005
//////            ENDIF
//////            6->(DbClearFilter())
//////         ELSE
//////            ckennz := IIf((::VArea)->(IsFieldVar("kennzart")),(::VArea)->kennzart,(::VArea)->kennz) // 12.1.2005
//////            cAuf := StrX((::VArea)->auftrnr,6,0)
//////            IF Val((::VArea)->zugr_z_st) == 0 .AND. (::VArea)->auftrnr == 0 // noch erg„nzen auf alphanumerische ArtNr!
//////               (::VArea)->(DbSkip(-1))
//////               cKennz := IIf((::VArea)->(IsFieldVar("kennzart")),(::VArea)->kennzart,(::VArea)->kennz) // 12.1.2005
//////               cAuf := StrX((::VArea)->auftrnr,6,0)
//////               (::VArea)->(DbSkip())
//////            ELSEIF Val((::VArea)->zugr_z_st) < IIf((::VArea)->(IsFieldVar("kennzart")),9,4) //12.1.2005
//////               ckennz := Str(Val((::VArea)->zugr_z_st),1,0)
//////            ENDIF
//////            (::VArea)->auftrnr := Val(cAuf)
//////            IF (::VArea)->(IsFieldVar("kennzart"))        // 12.1.2005
//////               (::VArea)->kennzart := ckennz
//////               (::VArea)->kennz := IIf(ckennz<"4","1","2")
//////            ELSE
//////               (::VArea)->kennz := cKennz
//////            ENDIF
//////            (::VArea)->rn := IIf(Val(::cNt)=0," ",::cNt)
//////            lFlucht := .T.
//////         ENDIF
//////      ELSEIF NextAppEvent(@mp1,@mp2,@Xbp) == xbeM_LbDown // 17.11.2004
//////         ckennz := IIf((::VArea)->(IsFieldVar("kennzart")),(::VArea)->kennzart,(::VArea)->kennz) // 12.1.2005
//////         cAuf := StrX((::VArea)->auftrnr,6,0)
//////         IF Val((::VArea)->zugr_z_st) == 0 .AND. (::VArea)->auftrnr == 0 // noch erg„nzen auf alphanumerische ArtNr!
//////            (::VArea)->(DbSkip(-1))
//////            cKennz := IIf((::VArea)->(IsFieldVar("kennzart")),(::VArea)->kennzart,(::VArea)->kennz) // 12.1.2005
//////            cAuf := StrX((::VArea)->auftrnr,6,0)
//////            (::VArea)->(DbSkip())
//////         ELSEIF Val((::VArea)->zugr_z_st) < IIf((::VArea)->(IsFieldVar("kennzart")),9,4) //12.1.2005
//////            ckennz := Str(Val((::VArea)->zugr_z_st),1,0)
//////         ENDIF
//////         (::VArea)->auftrnr := Val(cAuf)
//////         IF (::VArea)->(IsFieldVar("kennzart"))        // 12.1.2005
//////            (::VArea)->kennzart := ckennz
//////            (::VArea)->kennz := IIf(ckennz<"4","1","2")
//////         ELSE
//////            (::VArea)->kennz := cKennz
//////         ENDIF
//////         (::VArea)->rn := IIf(Val(::cNt)=0," ",::cNt)
//////         lFlucht := .T.
//////      ENDIF
//////   ENDIF
//////   DbResumeNotifications()
//////   SELECT &nOldArea
//////   IF lFlucht = .F.               // ESC-Taste: lFlucht = .T.
//////      ::ZeileSpeichern()
////////////////testen!!//////////////      IIf(mp2==6,PostAppEvent( xbeP_Keyboard, xbeK_SH_TAB,6, oXbp ),)
//////   ENDIF
//////   ::BrowseFeld[1]:refreshAll()
//////   (::VArea)->(DbSkip(0))
//////RETURN self
//////
//////METHOD RechFF:ZeileSpeichern( )
//////   LOCAL cKennz, cKennzart, cNt
//////         DbSuspendNotifications()
//////      (::VArea)->auftrnr := 1->auftrnr
//////      (::VArea)->zeile := Str( Recno(),2,0 )
//////      IF IsFieldVar("kennzart")        // 14.1.2005
//////         (::VArea)->kennzart := 6->ausg
//////         (::VArea)->kennz := IIf(6->ausg<"4","1","2")
//////      ELSE
//////         (::VArea)->kennz := 6->ausg
//////      ENDIF
//////      (::VArea)->mwst_schl := 6->mwst_schl
//////      (::VArea)->zugr_z_st := 6->art_lei
//////      (::VArea)->neu := IIf( 6->konto="1000", "ka", IIf( 6->konto="g", SubStr(6->konto,1,2), "  " ))
//////      (::VArea)->bezeich := 6->bez
//////      ::SummenVor( ::VArea )
//////      IF cPreisZ == "1" //!Upper(AppName())$"BERGX.EXE-SANDERX.EXE"
//////         (::VArea)->&b_g := 6->&v_p_s
//////         IF Upper(AppName())="RAGUSEX.EXE"
//////            REPLACE (::VArea)->menge WITH 1
//////            REPLACE (::VArea)->ges_preis WITH 6->&v_p_s
//////         ENDIF
//////         IIf( IsFieldVar("&b_gh"), (::VArea)->&b_gh := 6->&v_p_sh, )
//////         IIf( IsFieldVar("preis"), (::VArea)->preis := (::VArea)->&b_g, )  // 13.8.2004
//////      ENDIF
//////      IF Upper(::cNt) == "R"
//////         ( ::VArea )->rn := " "
//////      ELSEIF Val(::cNt) > 0
//////         ( ::VArea )->rn := ::cNt
//////      ENDIF
//////      ::SummenNach( ::VArea )
//////      IF nBezZeil == 2
//////         IF !Empty(6->bez2)
//////            ckennz := (::VArea)->kennz
//////            IF IsFieldVar("kennzart")        // 14.1.2005
//////               ckennzart := (::VArea)->kennzart
//////            ENDIF
//////            cNt := (::VArea)->rn
//////            (::VArea)->(DbSkip())
//////            IIf( (::VArea)->(Eof()), (::VArea)->(DbAppend()), IIf(!Empty((::VArea)->bezeich),::Satzeinfg(),))
//////            (::VArea)->bezeich := 6->bez2
//////            (::VArea)->auftrnr := 1->auftrnr
//////            (::VArea)->kennz := ckennz
//////            IF IsFieldVar("kennzart")        // 14.1.2005
//////               (::VArea)->kennzart := ckennzart
//////            ENDIF
//////            (::VArea)->rn := cNt
//////            (::VArea)->zeile := Str( Recno(),2,0 )
//////            IF cPreisZ == "2"  //Upper(AppName())="BERGX.EXE"
//////               (::VArea)->&b_g := 6->&v_p_s
//////               (::VArea)->&b_gh := 6->&v_p_sh
//////            ENDIF
//////            (::VArea)->(DbSkip(-1))
//////         ELSE
//////            IF cPreisZ == "2" //Upper(AppName())$"BERGX.EXE-SANDERX.EXE"
//////               (::VArea)->&b_g := 6->&v_p_s
//////               (::VArea)->&b_gh := 6->&v_p_sh
//////            ENDIF
//////         ENDIF
//////     ENDIF
//////         DbResumeNotifications()
//////RETURN self
//////
//////METHOD RechFF:SatzEinfg( lDel )
//////   LOCAL nA := SELECT()
//////   LOCAL aBlattSE := {} , aBlattZSE[FCount()]
//////   LOCAL nRec := RecNo()
//////   lDel := IIf( lDel<>NIL, lDel, .F. )
//////   APPEND BLANK
//////   aBlattZSE := ::SatzLese()                    // liest eine leere Zeile
//////   GO 1
//////   DO WHILE .NOT. Eof()
//////      IF !Deleted()
//////         IF nRec = Recno() .AND. !lDel
//////            AAdd( aBlattSE, aBlattZSE )         // fgt eine leere Zeile ein
//////            AAdd( aBlattSE, ::SatzLese() )
//////         ELSEIF nRec = Recno() .AND. lDel       // l„át den aktuellen Satz aus
//////         ELSE
//////            AAdd( aBlattSE, ::SatzLese() )
//////         ENDIF
//////      ENDIF
//////      SKIP
//////   ENDDO
//////   ZAP                                          // l”scht die Datei ganz
//////   FOR i := 1 to Len( aBlattSE )                // baut die Datei neu auf:
//////      APPEND BLANK
//////      aBlattZSE := aBlattSE[i]
//////      For n := 1 to FCount()
//////         FieldPut( n, aBlattZSE[n] )
//////      NEXT
//////      IF (::VArea)->(IsFieldVar("zeile"))
//////         (::VArea)->zeile := Str( Recno(), 2, 0 )
//////      ENDIF
//////      ::SummenNach( ::VArea, 0 )
//////   NEXT
//////   ::SummenSet()
//////   GO nRec
//////RETURN self
//////
//////METHOD RechFF:SatzLese()
//////   LOCAL aValue := Array( FCount() )
//////   FOR n := 1 TO FCount()
//////      aValue[n] := FieldGet(n)
//////   NEXT
//////RETURN aValue
//////
//////METHOD RechFF:SatzSchreibe(aValue)
//////   IF Empty(aValue)
//////      ::aZeile := ::SatzLese()
//////      aValue := ::aZeile 
//////   ENDIF
//////   FOR n := 1 TO FCount()
//////      FieldPut( n, aValue[n] )
//////   NEXT
//////   IF (::VArea)->(IsFieldVar("zeile"))
//////      (::VArea)->zeile := Str( Recno(), 2, 0 )
//////   ENDIF
//////RETURN self
//////
//////METHOD RechFF:SummenStart()
//////   (::VArea)->(DbSuspendNotifications())
//////   ::cNt := (::VArea)->rn                 // Ho
//////   SUM (::VArea)->&b_g TO ::nSumme0 FOR Val( (::VArea)->rn ) = 0
//////   SUM (::VArea)->&b_g TO ::nSumme1 FOR Val( (::VArea)->kennz ) = 1 .AND. Val( (::VArea)->rn ) < 4
//////   SUM (::VArea)->&b_g TO ::nSumme2 FOR Val( (::VArea)->kennz ) = 2 .AND. Val( (::VArea)->rn ) < 4 
//////   SUM (::VArea)->&b_g TO ::nSumme3 FOR Val( (::VArea)->rn ) > 0 .AND. Val( (::VArea)->rn ) < IIf(Upper(AppName())$"MUELLX.EXE-AAAX.EXE",5,4) 
//////   ::nSumme := ::nSumme0 + ::nSumme3
//////   IF IsFieldVar("kass_betr")
//////      ::nSummeK := ::nSumme
//////   ENDIF
//////   ::SummenSet()
//////   (::VArea)->(DbGotop())
//////   (::VArea)->(DbResumeNotifications())
//////RETURN self
//////
//////METHOD RechFF:SummenNull()
//////   ::nSummeK := ::nSumme := ::nSumme0 := ::nSumme1 := ::nSumme2 := ::nSumme3 := 0
//////RETURN self
//////
//////METHOD RechFF:SummenVor( nA, oXbp, nWert ) // reduziert die Summe um die aktuelle Zeile
//////      LOCAL nM := 1  //(nA)->menge
//////      DEFAULT nWert TO (nA)->&b_g * nM
//////      IF Empty(oXbp) .OR. (!Empty(oXbp) .AND. oXbp:cargo != "kass_betr")
//////         IF (nA)->rn = " " .or. (nA)->rn = "0"
//////            ::nSumme0 := ::nSumme0 - nWert         //Handel
//////         ENDIF
//////         IF (nA)->kennz = "1" .AND. Val((nA)->rn) < 4
//////            ::nSumme1 := ::nSumme1 - nWert
//////         ENDIF
//////         IF (nA)->kennz = "2" .AND. Val((nA)->rn) < 4
//////            ::nSumme2 := ::nSumme2 - nWert
//////         ENDIF
//////         IF Val((nA)->rn) > 0 .AND. Val((nA)->rn) < IIf(Upper(AppName())$"MUELLX.EXE-AAAX.EXE",5,4)
//////            ::nSumme3 := ::nSumme3 - nWert
//////         ENDIF
//////      ELSEIF (!Empty(oXbp) .AND. oXbp:cargo = "kass_betr")
////////      IF IsFieldVar("kass_betr") .AND. oXbp:cargo == "kass_betr"
//////         ::nSummeK -= nWert
//////      ENDIF
//////RETURN self
//////
//////METHOD RechFF:SummenNach( nA, s, oXbp, nWert )   // addiert zur Summe die aktuelle Zeile
//////      LOCAL nM := 1  //(nA)->menge
//////      DEFAULT nWert TO (nA)->&b_g * nM
//////      IF Empty(oXbp) .OR. (!Empty(oXbp) .AND. oXbp:cargo != "kass_betr")
//////         IF (nA)->rn = " " .or. (nA)->rn = "0"
//////            ::nSumme0 := ::nSumme0 + nWert
//////            IIf( cDatei = "s_rech", ::XbpObjekt( ::SingleZeile, "nSumme0" ):setdata(), )
//////         ENDIF
//////         IF (nA)->kennz = "1" .AND. Val((nA)->rn) < 4
//////            ::nSumme1 := ::nSumme1 + nWert
//////            IIf( cDatei = "s_rech", ::XbpObjekt( ::SingleZeile, "nSumme1" ):setdata(), )
////////            ::singleZeile[::XbpNummer( ::SingleZeile, "nSumme1" )]:setdata()
//////         ENDIF
//////         IF (nA)->kennz = "2" .AND. Val((nA)->rn) < 4
//////            ::nSumme2 := ::nSumme2 + nWert
//////            IIf( cDatei = "s_rech", ::XbpObjekt( ::SingleZeile, "nSumme2" ):setdata(), )
////////            ::singleZeile[::XbpNummer( ::SingleZeile, "nSumme2" )]:setdata()
//////         ENDIF
//////         IF Val((nA)->rn) > 0 .AND. Val((nA)->rn) < IIf(Upper(AppName())$"MUELLX.EXE-AAAX.EXE",5,4)
//////            ::nSumme3 := ::nSumme3 + nWert
//////            IIf( cDatei = "s_rech", ::XbpObjekt( ::SingleZeile, "nSumme3" ):setdata(), )
////////            ::singleZeile[::XbpNummer( ::SingleZeile, "nSumme3" )]:setdata()
//////         ENDIF
//////      ELSEIF (!Empty(oXbp) .AND. oXbp:cargo = "kass_betr")
////////      IF IsFieldVar("kass_betr") .AND. oXbp:cargo == "kass_betr"
//////         ::nSummeK += nWert
//////         ::XbpObjekt( ::SingleZeile, "nSummeK" ):setdata()
//////      ENDIF
//////         IF s == 0
//////            RETURN
//////         ENDIF
//////         ::nSumme := ::nSumme0 + ::nSumme3
//////            ::XbpObjekt( ::SingleZeile, "nSumme" ):setdata()
////////      ::singleZeile[::XbpNummer( ::SingleZeile, "nSumme" )]:setdata()
//////RETURN self
//////
//////METHOD RechFF:SummenSet()
//////      ::singleZeile[::XbpNummer( ::SingleZeile, "cNt" )]:setdata()
//////      ::singleZeile[::XbpNummer( ::SingleZeile, "nSumme0" )]:setdata()
//////      ::singleZeile[::XbpNummer( ::SingleZeile, "nSumme1" )]:setdata()
//////      ::singleZeile[::XbpNummer( ::SingleZeile, "nSumme2" )]:setdata()
//////      ::singleZeile[::XbpNummer( ::SingleZeile, "nSumme3" )]:setdata()
//////      ::nSumme := ::nSumme0 + ::nSumme3
//////      ::singleZeile[::XbpNummer( ::SingleZeile, "nSumme" )]:setdata()
//////      IF IsFieldVar("kass_betr")
//////         ::singleZeile[::XbpNummer( ::SingleZeile, "nSummeK" )]:setdata()
//////      ENDIF
//////RETURN self
//////
//////METHOD RechFF:RechBetr( aN, nA1, oDlg1 )
//////   (nA1)->(satzsp( oDlg1 ))
//////   (nA1)->&r_b_0 := aN[1]
//////   (nA1)->&r_b_1 := aN[2]
//////   (nA1)->&r_b_2 := aN[3]
//////   (nA1)->&r_b_3 := aN[4]
//////   (nA1)->&r_s := (nA1)->&r_b_0 + (nA1)->&r_b_1 + (nA1)->&r_b_2 + (nA1)->&r_b_3
//////   (nA1)->&t_l := (nA1)->&r_s - (nA1)->&v_m
//////   (nA1)->(DbRUnlock( Recno() ))
//////RETURN self
//////
//////METHOD RechFF:ArtikelMehr(oDlg1,nA,nM)          // Bestandskorrektur, weil in das Lager genommen
//////   DEFAULT nA TO 3, nM TO 1
//////   6->(DbSeek( (nA)->zugr_z_st, .F. ))
//////   IF !6->(Eof())
//////      6->(Satzsp( oDlg1 ))
//////      6->bestand += nM
//////      6->mgjahr -= nM
//////      6->&u_z -= (nA)->&b_g
//////      6->(DbRUnlock( Recno() ))
//////   ENDIF
//////RETURN self
//////
//////METHOD RechFF:ArtikelWeniger(oDlg1,nA,nM)       // Bestandskorrektur, weil aus dem Lager gegeben
//////   DEFAULT nA TO 3, nM TO 1
//////   6->(DbSeek( (nA)->zugr_z_st, .F. ))
//////   IF !6->(Eof())
//////      6->(Satzsp( oDlg1 ))
//////      6->bestand -= nM
//////      6->mgjahr += nM
//////      6->&u_z += (nA)->&b_g
//////      6->(DbRUnlock( Recno() ))
//////   ENDIF
//////RETURN self
//////
//////METHOD RechFF:RechnungSpeichern( oDlg1, cDruck, a3 )
//////   LOCAL nZeile := 0, ckennz
//////   ::SummenNull()    // Summen werden hier anders zusammengesetzt:
//////   (::VArea)->(DbSuspendNotifications())
//////      (::VArea)->(DbGotop())
//////      DO WHILE !(::VArea)->(Eof())
//////         (::VArea)->kennz := IIf(IsFieldVar("kennzart"),(::VArea)->kennzart,(::VArea)->kennz)   //12.1.2005
//////         IIf( !Empty((::VArea)->kennz), (::VArea)->auftrnr := Val(::cAuf), (::VArea)->(DbDelete()) )
//////         (::VArea)->(DbSkip())
//////      ENDDO
//////      PACK
////////      (::VArea)->(DbCreateIndex( "xRtemp", Str((::VArea)->auftrnr,6,0)+(::VArea)->kennz+(::VArea)->zeile ))
////////      INDEX on Str((::VArea)->auftrnr,6,0)+(::VArea)->kennz+(::VArea)->zeile TO xRtemp
//////      3->(DbSeek( ::cAuf ))
//////      DO WHILE !(::VArea)->(Eof())
//////         ++nZeile
//////         IF nZeile <= Len( a3 )
//////            3->(DbGoto( a3[nZeile] ))
//////            IF Upper(cDruck) != "BL_VR"   // Angebot „ndert nicht die Artikelbest„nde
//////               IF 3->auftrnr == Val(::cAuf) // 17.3.03: jetzt hier:
////////  Artikel-Daten korrigieren:   (Mengen,Preise,Volumina)
//////                  oEdit:ArtikelMehr(oDlg1)            // bisherigen Bestand wieder ins Lager
//////               ENDIF
//////            ENDIF
//////            IIf( 3->auftrnr == Val( ::cAuf ), 3->(Satzsp( oDlg1 )), 3->(SatzAppend()) )  // entweder lock ...
//////         ELSE
//////            3->(SatzAppend())                                                   // ... oder append
//////         ENDIF
//////         (::VArea)->zeile := Str( nZeile,2,0 )
//////         ::SwapIn()        // 3er-Satz <==< (::VArea)er-Satz
//////         IF Upper(cDruck) != "BL_VR"   // Angebot „ndert nicht die Artikelbest„nde
////////  Artikel-Daten korrigieren:   (Mengen,Preise,Volumina)
//////                  oEdit:ArtikelWeniger(oDlg1)            // neuen Bestand aus dem Lager
//////         ENDIF
//////         DO CASE        // Summen neu zusammensetzen: Haupt- und 3 Nachtragsrechnungen
//////            CASE Val((::VArea)->rn) == 0
//////               ::nSumme0 += (::VArea)->&b_g
//////            CASE Val((::VArea)->rn) == 1
//////               ::nSumme1 += (::VArea)->&b_g
//////            CASE Val((::VArea)->rn) == 2
//////               ::nSumme2 += (::VArea)->&b_g
//////            CASE Val((::VArea)->rn) == 3
//////               ::nSumme3 += (::VArea)->&b_g
//////         ENDCASE
//////         (::VArea)->(DbSkip())
//////      ENDDO
//////      ::RechBetr( {::nSumme0,::nSumme1,::nSumme2,::nSumme3}, 1, oDlg1 )
//////      SELECT 3
//////      DO WHILE nZeile < Len( a3 ) .AND. !3->(Eof())
//////         3->(DbGoto( a3[++nZeile] ))
//////         IIf( 3->auftrnr == Val( ::cAuf ), 3->(SatzDelete()), )
//////      ENDDO
//////   (::VArea)->(DbResumeNotifications())
//////RETURN self
//////
//////METHOD RechFF:RDatum(cTtmm)     // 2.5.04 : in bl_r statt date()
//////   LOCAL dDatum := DATE(), nAuf, nRec := RecNo()
//////   IF Empty(cTtmm)
//////      IF Upper(AppName())$"KREMERX.EXE"
//////         dDatum := DATE()
//////      ELSE
//////         dDatum := IIf( nt=0, IIf(!Empty(1->beerd_dat),1->beerd_dat,DATE()), DATE() )
//////      ENDIF
//////   ELSE
//////      IF nt!=0
//////         DbSuspendNotifications()
//////         nAuf := 13->auftrnr
//////         DO WHILE nAuf == 13->auftrnr
//////            IF nt != Val(13->rn)
//////               SKIP
//////               LOOP
//////            ENDIF
//////         ENDDO
//////         IF nAuf != 13->auftrnr
//////            GO nRec
//////         ENDIF
//////      ENDIF
//////      dDatum := CtoD( SubStr(13->ttmm,1,2)+"."+SubStr(13->ttmm,3,2)+"."+ ;
//////                  IIf( !Empty(1->beerd_dat),Str(Year(1->beerd_dat)), ;
//////                     IIf( !Empty(1->gestorben),Str(Year(1->gestorben)), ;
//////                        IIf(Month(DATE()) >= Val(SubStr(13->ttmm,3,2)), Str(Year(DATE()),4), ;
//////                           Str(Year(DATE())-1,4) ))) )
//////      IF nt!=0
//////         GO nRec
//////         DbResumeNotifications()
//////      ENDIF
//////   ENDIF
//////RETURN dDatum
//////
//////METHOD RechFF:RechFolge()        // am 14.11.2004 war dafr kein Aufrufspunkt zu erkennen...
//////   LOCAL mp1, mp2, oXbp
//////      IF LastAppEvent(@mp1,@mp2,@oXbp) == xbeP_Keyboard
//////         IF !mp1 ==xbeK_F4
//////            oXbp:setdata(oXbp:vorigerWert)
//////            RETURN self
//////         ENDIF
//////      ENDIF
//////RETURN self
//////
//////METHOD RechFF:AUFTRzuSTAP( a3 )
//////   LOCAL nt, nOldArea := SELECT(), cL
//////   LOCAL nAnf := IIf( !Empty(::cArt), Val(::cArt), 0 )
//////   LOCAL nEnd := IIf( !Empty(nAnf), nAnf + 1000, 999999 )
//////   ::cAuf := StrX(Val(::cAuf),6,0)
//////   ::nSumme := 0; ::nSummeK := 0
//////   DbSuspendNotifications()
//////   SELECT 13
//////   ZAP
//////   SELECT 3
//////   DbSuspendNotifications()
//////   FOR nt := 0 TO IIf(Upper(AppName())$"MUELLX.EXE-AAAX.EXE",4,3)
//////      DbSeek( ::cAuf, .F. )
//////      DO WHILE 3->auftrnr=val(::cAuf) .and. .not. eof()
//////         IF Val( 3->rn ) = nt .AND. IIf( ::cArt = "k", 3->neu == "ka", ;
//////                     IIf( ::cArt = "g", 3->neu = "g", ;
//////                     (Val(3->zugr_z_st) >= nAnf .AND.  Val(3->zugr_z_st) < nEnd) ) )
//////            For n := 1 to FCount()
//////               aData2[n] := FieldGet( n )
//////            NEXT
//////            AAdd( a3, Recno() )
//////            SELECT 13
//////            APPEND BLANK
//////            For n := 1 to FCount()-2
//////               FieldPut( n, aData2[n] )
//////            NEXT
//////            REPLACE 13->kass_betr WITH 13->&b_g
//////            REPLACE 13->orig_satz WITH ATail( a3 )
//////            ::nsumme += IIf(Empty(13->gebucht), 13->&b_g, 0 )
//////            ::nsummeK += IIf(Empty(13->gebucht), 13->kass_betr, 0 )
//////            IF nBezZeil=2
//////               IF !Empty(13->bezeich2)
//////                  13->bezeich2 := Space(45)               // damit die Zeile nicht doppelt kommt!!
//////                  APPEND BLANK
//////                  FieldPut( 1, aData2[1] )               // =auftrnr
//////                  n := FieldPos("BEZEICH2") - 1          // =bezeich   (1. Zeile)
//////                  FieldPut( n, aData2[n+1] )
//////                  n := FieldPos("rn")
//////                  FieldPut( n, aData2[n] )
//////                  n := FieldPos("kennz")
//////                  FieldPut( n, aData2[n] )
//////                  13->zeile := Str(Recno(),2,0)          // wird eine eigenst„ndige Zeile!
//////               ENDIF                                     // wenn mit dem alten Programm erzeugt
//////            ENDIF
//////            SELECT 3
//////         ENDIF
//////         SKIP
//////      ENDDO
//////   NEXT
////////////   oSle:setdata( Str( nSumme,8,2 ) )
////////////   1->(DbSeek(cAuf,.F.))
//////   DbResumeNotifications()
//////   SELECT &nOldArea
//////   IF ::cArt = "g"
//////      SORT on neu TO gsort
//////      ZAP
//////      APPEND FROM gsort
//////   ENDIF
//////   DO WHILE Recno() < 50
//////      APPEND BLANK
//////   ENDDO
//////   GO TOP
//////   DbResumeNotifications()
//////RETURN self
//////
//////METHOD RechFF:ARTzuSTAP( a3 )    // 5.6.04 stillgelegt
//////   LOCAL nt, nOldArea := SELECT()   //, dDatum := CtoD(oSleD:getData())
//////   LOCAL nRec, a1 := {}, n, c1 := Trim(" ")
//////   nSumme := 0    // PRIVATE der vorigen Ebene
//////   DbSuspendNotifications()
//////   SELECT 13
//////   ZAP         // l”scht bisherigen Inhalt komplett ohne zu fragen!
//////   IF !Empty(::cAuf)
//////      c1 := ::cAuf
//////   ELSE
//////      SELECT 1
//////      DbSuspendNotifications()
//////         nRec := RecNo()
//////         SET ORDER TO 0
//////         GO BOTTOM
//////         DO WHILE dDatum - 1->gestorben <= 60 .AND. !Bof()     // letzte 60 Tage !
//////            AAdd(a1,1->auftrnr)
//////            SKIP -1
//////         ENDDO
//////         GO nRec
//////         SET ORDER TO 1
//////      DbResumeNotifications()
//////      AEval( a1, {|x,n| c1 += StrX(x,6,0)+" " } )
//////   ENDIF
//////   SELECT 3
//////   DbSuspendNotifications()
//////   GO BOTTOM
//////   DO WHILE !Bof()
//////      IF StrX(3->auftrnr,6,0)$c1 .AND. 3->zugr_z_st = ::cArt
//////            For n := 1 to FCount()
//////               aData2[n] := FieldGet( n )
//////            NEXT
//////            AAdd( a3, Recno() )
//////            SELECT 13
//////            APPEND BLANK
//////            For n := 1 to FCount()-2
//////               FieldPut( n, aData2[n] )
//////            NEXT
//////            REPLACE 13->kass_betr WITH 13->&b_g
//////            REPLACE 13->orig_satz WITH ATail( a3 )
//////            nsumme += IIf(Empty(13->gebucht), 13->kass_betr, 0 )
//////            IF nBezZeil=2
//////               IF !Empty(13->bezeich2)
//////                  13->bezeich2 := Space(45)               // damit die Zeile nicht doppelt kommt!!
//////                  APPEND BLANK
//////                  FieldPut( 1, aData2[1] )               // =auftrnr
//////                  n := FieldPos("BEZEICH2") - 1          // =bezeich   (1. Zeile)
//////                  FieldPut( n, aData2[n+1] )
//////                  n := FieldPos("rn")
//////                  FieldPut( n, aData2[n] )
//////                  n := FieldPos("kennz")
//////                  FieldPut( n, aData2[n] )
////////                  13->zeile := Str(Recno(),2,0)          // wird eine eigenst„ndige Zeile!
//////               ENDIF
//////            ENDIF
//////            SELECT 3
//////      ENDIF
//////      SKIP -1
//////   ENDDO
////////////   oSle:setdata( Str( nSumme,8,2 ) )
//////   DbResumeNotifications()
//////   SELECT &nOldArea
//////   GO TOP
//////   DbResumeNotifications()
//////RETURN self
//////
//////METHOD RechFF:STAPzuAUFTR( oDlg1 )
//////   LOCAL c3, n, nOldArea := SELECT(), nZeile, nRec, cArt, cNt
//////      IF cLon = "N"
//////         IF ModalFen( "K E I N Benutzer darf jetzt ; " + ;
//////                        "w„hrend der Eingliederung ; " + ;
//////                        "Rechnungen  bearbeiten! ;  Weiter? ;" + ;
//////                        "(abbrechen mit <ESC>)", ;
//////                        "A C H T U N G !", ;
//////                        oDlg1 ) == "ESC"
//////            RETURN
//////         ENDIF
//////      ENDIF
//////      1->(DbSuspendNotifications())
//////      nRec := 1->(RecNo())
//////      SELECT 13
//////      GO TOP
//////      13->(DbSuspendNotifications())
////////      DELETE ALL FOR Empty(13->auftrnr)
////////      PACK
//////      GO TOP
//////      DO WHILE !Eof()
//////         IF Empty(13->auftrnr)
//////            SKIP
//////            LOOP
//////         ENDIF
//////         FOR n := 1 to FCount()
//////            aData2[n] := FieldGet( n )
//////         NEXT
//////         c3 := ATail(aData2)     // = 13->orig_satz
//////         SELECT 3
//////         IF !Empty(c3)     // Satz gibt es schon in auftr.dbf
//////            GO c3
//////            nZeile := NIL  // damit unten die Zeile nicht ver„ndert wird
//////            ::ArtikelMehr(oDlg1)    // alter Wert zurck in das Lager
//////            cNt := 3->rn
////////////            //  Artikel-Daten korrigieren:   // alten Inhalt abziehen
////////////                     cArt := 3->zugr_z_st
////////////                     SELECT 6
////////////                     FIND &cArt
////////////                     Satzsp( oDlg1 )
////////////                     REPLACE 6->bestand WITH 6->bestand+1
////////////                     REPLACE 6->mgjahr WITH 6->mgjahr-1
////////////                     REPLACE 6->umsatz WITH 6->umsatz - 3->betrag
////////////                     REPLACE 6->umsatzeu WITH 6->umsatzeu - 3->betrageu
////////////                     DbRUnlock( Recno() )
////////////                     SELECT 3
////////////            //
//////         ELSE              // Satz gibt es noch nicht in auftr.dbf
//////            DbSeek(StrX(13->auftrnr,6,0),.F.)
//////            DO WHILE 3->auftrnr == 13->auftrnr .AND. !Eof()
//////               nZeile := Val(3->zeile) // bis zur letzten Zeile vorbl„ttern
//////               cNt := 3->rn
//////               SKIP
//////            ENDDO
//////            APPEND BLANK
////////            3->auftrnr := 13->auftrnr
////////            3->rn := cNt      // Rg/NRg
//////         ENDIF
//////         IF 3->&b_g != 13->&b_g     // Korrektur der Rechnungssummen in BEST.dbf
//////            SELECT 1
//////            DbSeek(StrX(13->auftrnr,6,0),.F.)
//////            Satzsp( oDlg1 )
//////            DO CASE
//////               CASE Val(3->rn) = 0
//////                  1->&r_b_0 := 1->&r_b_0 - 3->&b_g + 13->&b_g
//////               CASE Val(3->rn) = 1
//////                  1->&r_b_1 := 1->&r_b_1 - 3->&b_g + 13->&b_g
//////               CASE Val(3->rn) = 2
//////                  1->&r_b_2 := 1->&r_b_2 - 3->&b_g + 13->&b_g
//////               CASE Val(3->rn) = 3
//////                  1->&r_b_3 := 1->&r_b_3 - 3->&b_g + 13->&b_g
//////            ENDCASE
//////            1->&r_s := 1->&r_s - 3->&b_g + 13->&b_g
//////            1->&t_l := 1->&t_l - 3->&b_g + 13->&b_g
//////            DbRUnlock( RecNo() )
//////            SELECT 3
//////         ENDIF
//////         Satzsp( oDlg1 )
//////         FOR n := 1 to FCount()
//////            FieldPut( n, aData2[n] )
//////         NEXT
//////         IIf( !Empty(nZeile), 3->zeile := Str(++nZeile,2,0), )
//////         3->rn := cNt      // Rg/NRg
//////         DbRUnlock( RecNo() )                                              // ... und unlock
//////         ::ArtikelWeniger(oDlg1)    // neuer Wert aus dem Lager
////////////      //  Artikel-Daten korrigieren:
////////////               cArt := 3->zugr_z_st
////////////               SELECT 6
////////////               FIND &cArt
////////////               Satzsp( oDlg1 )
////////////               REPLACE 6->bestand WITH 6->bestand-1
////////////               REPLACE 6->mgjahr WITH 6->mgjahr+1
////////////               REPLACE 6->umsatz WITH 6->umsatz + 3->betrag
////////////               REPLACE 6->umsatzeu WITH 6->umsatzeu + 3->betrageu
////////////               DbRUnlock( Recno() )
////////////      //
//////         SELECT 13
//////         SKIP
//////      ENDDO
//////      GO TOP
//////      13->(DbResumeNotifications())
//////      1->(DbGoto(nRec))
//////      1->(DbResumeNotifications())
//////      ::BrowseFeld[1]:refreshAll()
//////   SELECT &nOldArea
//////RETURN self
//////
//////METHOD RechFF:STAPzuKASSE( oDlg1, dDatum )    // wird z.Zt. noch garnicht gebraucht !
//////   LOCAL nOldArea := SELECT()
//////      SELECT 9
//////      use kbbuch index xkbbuch
//////      SELECT 13
////////      DELETE ALL FOR Empty(13->auftrnr) .or. Empty(13->orig_satz)
////////      PACK
//////      GO TOP
//////      DO WHILE !Eof()
//////         SELECT 1
//////         DbSeek(StrX(13->auftrnr,6,0),.F.)
//////         SELECT 9
//////         append blank
//////         repl datum with dDatum
//////         repl &a_g with 13->kass_betr
//////         repl auftrnr with strX(13->auftrnr,6,0)
//////         repl txnr with "10"
//////         repl tx with "Barvorlage "+1->name
//////         SELECT 13
//////         SKIP
//////      ENDDO
//////      SELECT 9
//////      USE
//////   SELECT &nOldArea   
//////RETURN self
//////
//////// Bucht die Kassen-Summe des Stapels in die Kasse
//////// markiert die Auftragszeilen als gebucht ("x"), dDatum stammt aus dem Belegdruck
//////METHOD RechFF:STAPsummezuKASSE( oDlg1, dDatum )
//////   LOCAL nOldArea := SELECT(), nSummeK := 0, n, nRec, a3 := {}
//////   IF !Empty(sszk)   // Variable wurde beim Belegdruck erzeugt, damit keine doppelten Buchungen..
//////      RETURN 1 // != Empty() !   //Str(nSummeK,9,2)
//////   ENDIF
////////   ASize(a3,0)
//////      SELECT 9
//////      USE kbbuch index xkbbuch
//////      SELECT 13
//////      DbSuspendNotifications()
//////         nRec := RecNo()
//////         GO TOP
//////         1->(DbSeek( StrX(13->auftrnr,6,0), .F. ))  // fr den Verstorbenen-Namen
//////         DO WHILE !Eof()
//////            nSummeK += IIf( Empty(13->gebucht), 13->kass_betr, 0 )
//////            AAdd(a3,13->orig_satz)
//////            SKIP
//////         ENDDO
//////         GO nRec
//////      DbResumeNotifications()
//////      SELECT 9
//////      append blank
//////      repl datum with dDatum
//////      repl &a_g with nSummeK
//////      repl auftrnr with ::cAuf
//////      repl txnr with "10"
//////      repl tx with "Barvorlage "+1->name
//////      SELECT 9
//////      USE
//////      SELECT 3
//////      FOR n := 1 TO Len(a3)
//////         GO a3[n]
//////         Satzsp(oDlg1)
//////         3->gebucht := "x"
//////         DbRUnlock(RecNo())
//////      NEXT
//////   SELECT &nOldArea   
//////RETURN Str(nSummeK,9,2)
