#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"



PROCEDURE StapelEingabe( cAuf, oDlg1, nFontR )
   LOCAL nEvent, mp1, mp2, oXbp, oBrowse, bError, oPbBuch
   LOCAL oDlg, aPPCol
   LOCAL aSizeDesktop := AppDesktop():currentSize()
   LOCAL nBSb := aSizeDesktop[1]
   LOCAL nBSh := aSizeDesktop[2]
// folgende Zahlen-Werte basieren auf 800x600:
//   LOCAL nV := nBSb/800         // Korrekturfaktor f_r tats"chliche Aufl"sung
   LOCAL nOldArea := Select()
//   LOCAL oFocus := SetAppFocus()
//////   LOCAL cArt := Space(6), cNt := "R", dDatum := DATE() // siehe unter PRIVATE
   LOCAL lFlucht := .F., nFlucht, cTab := "RET"
   PRIVATE oCB
// weil in Makros verwandt:
   PRIVATE nAnz := 1, nt := 0, nRechnr := 0, nGS := 0
   PRIVATE nZeile := 0, a3 := {}, aData1, aData2, aDataD
   PRIVATE oSleR, oSle, oSleA, oSleL, oSleD, cKauftrnr := cAuf
   PRIVATE nSumme := 0, cArt := Trim("k"), cNt := "R", dDatum := DATE(), nH := 0
//////   PRIVATE nSumme := nSumme0 := nSumme1 := nSumme2 := nSumme3 := 0
// folgende Variablen mssen individuell gesetzt werden ( in R3 und R5 ):
   PRIVATE bezZ1 := "bez" , bezZ2 := "bez2"     // Artikel in Art->
   PRIVATE bezeichZ1 := "bezeich" , bezeichZ2 := "bezeich2"  // Artikel in AUftr
// die WIDTH und PERCENT -Werte f_r APPBROWSE und APPEDIT:
   PRIVATE nBezWb1 := 25 , nBezWb2 := 10 , nBp := 60
   nBezZeil := IIf(nBezZeil!=2,1,2)
   IF nBezZeil = 1 .AND. ( nFontR = FONT_DEFFIXED_MEDIUM .OR. nFontR = FONT_DEFFIXED_LARGE )
      nBezWb1 := 45 ; nBezWe1 := 45
   ENDIF

   IF Upper(AppName()) = "RAGUSEX.EXE"
      v_p_s := "vk_preis1"
   ENDIF

   cStaptemp := "auf5"+LTrim(Str(Int(Seconds()/10)))

   SELECT 3
//   COPY STRU TO (cStaptemp)  // wird zu:
   DbCopyExtStruct( "StapStru" )
   SELECT 14
   USE stapstru
   APPEND BLANK
   14->field_name := "KASS_BETR"
   14->field_type := "N"
   14->field_len := 8
   14->field_dec := 2
   APPEND BLANK
   14->field_name := "ORIG_SATZ"
   14->field_type := "N"
   14->field_len := 5
   14->field_dec := 0
   DbCreateFrom( cStaptemp,,"StapStru")
//
   aData1 := Array(FCount())
   aData2 := Array(FCount())
   aDataD := Array(FCount())

   SELECT 8
   USE serie index xserie
   SELECT 14
   USE (cStaptemp) EXCLUSIVE
   GO BOTT
   DO WHILE Recno() < 50
      APPEND BLANK
   ENDDO
   GO TOP

   // Standard Dialog erzeugen
   oDlg := GuiStdDialog( "Stapel-Verarbeitung von Kassenbuchungen", oDlg1, nV, nFontR, @oBrowse ) //@!!
      oDlg:drawingArea:setColorBG( GRA_CLR_CYAN )
   oCB := oDlg:drawingArea

   // Browser im Fenster erzeugen
   oBrowse := GuiBrowseDb( oDlg:drawingArea,,, nV )
   oBrowse:softTrack := .F.

   AddColumns( oBrowse,,"S" )

   // Der Browser fuellt das gesamte Fenster aus
   oDlg:drawingArea:resize := ;
       {|mp1,mp2,obj| obj:childList()[1]:setSize(mp2) }

   // Tasten zum Editieren an das Xbp???Column Objekt delegieren
   oBrowse:keyboard := ;
      {|nKey, x, obj| IIf( nKey > 31 .OR. nKey < 256, ;
                           obj:getColumn( obj:colPos ):keyboard( nKey ), ;
                           NIL ) }


   oSleR := XbpSLE():new( oDlg:drawingArea, ,  {int(5*nV),int(440*nV)}, {int(20*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oSleR:bufferLength := 1
   oSleR:setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
   oSleR:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
   oSleR:group := XBP_WITHIN_GROUP
   oSleR:dataLink := {|x| IIf( PCOUNT()==0, cNt, cNt := Upper(x)  ) }
   oSleR:create():setData()

   oPbRech := XbpPushButton():new( oDlg:drawingArea,, {int(30*nV),int(440*nV)}, {int(40*nV),int(25*nV)} )
   oPbRech:caption := "~Rechg"
   oPbRech:group := XBP_WITHIN_GROUP
   oPbRech:create()
   oPbRech:activate := {|| StapZuAuftr( oCB ), ;
                                SetAppFocus( oBrowse ) }

   oSle := XbpStatic():new( oDlg:drawingArea,,  {int(70*nV),int(440*nV)}, {int(90*nV),int(25*nV)})
   oSle:caption := "Kassensumme:"
   oSle:clipSiblings := .T.
   oSle:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
   oSle:create()
   oSle := XbpSLE():new( oDlg:drawingArea,,  {int(170*nV),int(440*nV)}, {int(80*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oSle:bufferLength := 8
   oSle:setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
   oSle:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
   oSle:group := XBP_WITHIN_GROUP
   oSle:dataLink := {|x| IIf( PCOUNT()==0, Transform( nSumme, '99999.99' ), nSumme := Val(x) ) }
   oSle:create():setData()

   oSleA := XbpStatic():new( oDlg:drawingArea,,  {int(250*nV),int(440*nV)}, {int(70*nV),int(25*nV)})
   oSleA:caption := "Auftrag:"
   oSleA:clipSiblings := .T.
   oSleA:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
   oSleA:create()
   oSleA := XbpSLE():new( oDlg:drawingArea,,  {int(330*nV),int(440*nV)}, {int(60*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oSleA:bufferLength := 6
   oSleA:setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
   oSleA:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
   oSleA:group := XBP_WITHIN_GROUP
   oSleA:dataLink := {|x| IIf( PCOUNT()==0, Transform( 14->auftrnr, '999999' ), 14->auftrnr := Val(x) ) }
   oSleA:create():setData( cAuf )

   oSleL := XbpStatic():new( oDlg:drawingArea,,  {int(390*nV),int(440*nV)}, {int(70*nV),int(25*nV)})
   oSleL:caption := "Leistung:"
   oSleL:clipSiblings := .T.
   oSleL:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
   oSleL:create()
   oSleL := XbpSLE():new( oDlg:drawingArea,,  {int(470*nV),int(440*nV)}, {int(60*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oSleL:bufferLength := 6
   oSleL:setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
   oSleL:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
   oSleL:group := XBP_WITHIN_GROUP
   oSleL:dataLink := {|x| IIf( PCOUNT()==0, cArt, cArt := x ) }
   oSleL:create():setData( cArt )

   dDatum := DATE()
   oSleD := XbpStatic():new( oDlg:drawingArea,,  {int(530*nV),int(440*nV)}, {int(70*nV),int(25*nV)})
   oSleD:caption := "Datum:"
   oSleD:clipSiblings := .T.
   oSleD:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
   oSleD:create()
   oSleD := XbpSLE():new( oDlg:drawingArea,,  {int(610*nV),int(440*nV)}, {int(80*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oSleD:bufferLength := 10
   oSleD:setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
   oSleD:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
   oSleD:group := XBP_WITHIN_GROUP
   oSleD:dataLink := {|x| IIf( PCOUNT()==0, DtoC(dDatum), dDatum := CtoD(x) ) }
   oSleD:create():setData( DtoC(dDatum) )

   oPbBuch := XbpPushButton():new( oDlg:drawingArea,, {int(710*nV),int(440*nV)}, {int(40*nV),int(25*nV)} )
   oPbBuch:caption := "~buche"
   oPbBuch:group := XBP_WITHIN_GROUP
   oPbBuch:create()
   oPbBuch:activate := {|| BlattDRG( "bl_buch",, oDlg:drawingArea,,, "P", "O", @nAnz, @nt ), ;
                                SetAppFocus( oBrowse ) }

   cKauftrnr := AuftrZuStap( oSleA:getData(), a3 )
   GO TOP
  // Browser anzeigen und Focus geben
// ((( warum ist die folgende Zeile in den anderen Modulen geREMt ?? )))
//                -->weil Tastatur sonst tot bei zwischenzeitlichem Programmwechsel
//   SetAppFocus(oDlg)       // Fenster muá den Focus haben, damit Parts ihn dann kriegen knnen!
   oDlg:setModalState( XBP_DISP_APPMODAL )
   oDlg:show()
   oBrowse:show()
   SetAppFocus( oBrowse )

   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      IF nEvent == xbeP_Keyboard
         DO CASE
            CASE (mp1 == xbeK_ALT_B .OR. mp1 == xbeK_RETURN) ;
                  .AND. oXbp:isDerivedFrom( "XbpPushButton" )
               PostAppEvent( xbeP_Activate,,, oPbBuch )
            CASE mp1 == xbeK_CTRL_INS .AND. oXbp = oBrowse
               nSumme := 0
               R3TSatzeinfg()
               oBrowse:refreshAll()
            CASE mp1 == xbeK_CTRL_DEL .AND. oXbp = oBrowse
               nSumme := 0
               R3TSatzeinfg( .T. )
               oBrowse:refreshAll()
            CASE mp1 == xbeK_CTRL_RETURN
               oBrowse:down()
               oBrowse:firstCol()
               oBrowse:refreshAll()
               PostAppEvent( xbeP_Keyboard, xbeK_RETURN,, oBrowse )
            CASE mp1 == xbeK_ESC .AND. (oXbp = oBrowse .or. oXbp == oSle .or. oXbp == oPbBuch)
               nFlucht := ConfirmBox( oCB, "beenden?", ;
                           "Programm Stapeleingabe...", ;
                           XBPMB_YESNOCANCEL, ;
                           XBPMB_QUESTION, XBPMB_DEFBUTTON2 )
               IF nFlucht == XBPMB_RET_YES
//                  lFlucht := .F.
//                  PostAppEvent( xbeP_Close)
//               ELSEIF nFlucht == XBPMB_RET_NO
                  lFlucht := .T.
                  PostAppEvent( xbeP_Close)
               ELSE
                  SetAppFocus( oBrowse )
                  LOOP
               ENDIF
            CASE mp1 == xbeK_F1
               ModalDialog( (cDatver+"f1_se.dbf"), "Bedienungshinweise", oDlg:drawingArea, 680*nV, 460*nV )
            CASE mp1 == xbeK_F10
               lFlucht := .F.
               PostAppEvent( xbeP_Close)
            CASE mp1 == xbeK_RETURN .AND. oXbp == oSleA
               DbSuspendNotifications()
  // holt zu diesem Auftrag die 6000er-Artikel :
               cKauftrnr := AuftrZuStap( oSleA:getData(), a3 )
               GO TOP
               oBrowse:refreshAll()
               SetAppFocus(oBrowse)
               DbResumeNotifications()
            CASE mp1 == xbeK_RETURN .AND. oXbp == oSleL
               DbSuspendNotifications()
               IF oSleL:getData() = "k"
  // holt zu diesem Auftrag die Kassen-Artikel :
                  cKauftrnr := AuftrZuStap( oSleA:getData(), a3 )
               ELSE
  // holt zu den letzten 60 Tagen die Artikel einer 1000er-Gruppe :
                  cKauftrnr := ArtZuStap( oSleL:getData(), a3 )
               ENDIF
               GO TOP
               oBrowse:refreshAll()
               SetAppFocus(oBrowse)
               DbResumeNotifications()
            CASE mp1 == xbeK_F4 .AND. oBrowse:colPos = 2  .AND. IsMemberVar( oXbp, "value" )
               DbSuspendNotifications()
               cAuf := IIf(!Empty(14->auftrnr),Str(14->auftrnr,6,0),oSleA:getData())
               cArt := PadR( oXbp:value, 6 )
               6->(DbSeek( cArt, .F. ))
               IF .NOT. 6->(Eof())
                  RZeileSpeichern( cAuf, 14 )
               ELSE
                  SET SOFTSEEK ON
                  RechBSuch( cAuf, cArt, oDlg:drawingArea, nFontR, GRA_CLR_RED, 14 )
                  SET SOFTSEEK OFF
                  oXbp:setData( 14->zugr_z_st )
               ENDIF
               oBrowse:refreshAll()
               DbResumeNotifications()
            CASE (mp1 == xbeK_RETURN .OR. mp1 == xbeK_TAB .OR. mp1 == xbeK_SH_TAB) ;
                           .AND. oBrowse:colPos = 2  .AND. IsMemberVar( oXbp, "value" )
               cArt := PadR( oXbp:value, 6 )
               IF !Empty(cArt) .AND. cArt != 14->zugr_z_st .AND. Val(cArt)>3
                  DbSuspendNotifications()
                  cAuf := IIf(!Empty(14->auftrnr),Str(14->auftrnr,6,0),oSleA:getData())
                  6->(DbSeek( cArt, .F. ))
                  IF .NOT. 6->(Eof())
                     RZeileSpeichern( cAuf, 14 )
                  ELSE
                     SET SOFTSEEK ON
                     RechBSuch( cAuf, cArt, oDlg:drawingArea, nFontR, GRA_CLR_RED, 14 )
                     SET SOFTSEEK OFF
                     oXbp:setData( 14->zugr_z_st )
                  ENDIF
                  oBrowse:refreshAll()
                  DbResumeNotifications()
               ENDIF
            CASE mp1 == xbeK_F4 .AND. oBrowse:colPos = 3  .AND. IsMemberVar( oXbp, "value" )
                  cAuf := IIf(!Empty(14->auftrnr),Str(14->auftrnr,6,0),oSleA:getData())
                  cBez := Trim( oXbp:value )
                  SET SOFTSEEK ON
                  RechBSuch( cAuf, cArt, oDlg:drawingArea, nFontR, GRA_CLR_DARKCYAN, 14, cBez )
                  SET SOFTSEEK OFF
                  oXbp:setData( 14->&bezeichZ1 )
                  oBrowse:refreshAll()
            CASE (mp1 == xbeK_RETURN .OR. mp1 == xbeK_TAB .OR. mp1 == xbeK_SH_TAB) ;
                           .AND. oBrowse:colPos = 3 .AND. IsMemberVar( oXbp, "value" )
               IF 14->&bezeichZ1 != oXbp:value .or. Empty(14->kennz)
                  REPLACE 14->&bezeichZ1 WITH oXbp:value
                  DbSuspendNotifications()
                  R3TSummenVor( 14 )
                  ckennz := 14->kennz
                  cNt := 14->rn
                  cAuf := IIf(!Empty(14->auftrnr),Str(14->auftrnr,6,0),oSleA:getData())
                  IF Val(14->zugr_z_st) == 0
                     DbSkip(-1)
                     cKennz := 14->kennz
                     cNt := 14->rn
                     DbSkip()
                  ELSEIF Val(14->zugr_z_st) < 4
                     ckennz := Str(Val(14->zugr_z_st),1,0)
                     IF Upper((cNt := oSleR:getData())) == "R"
                        cNt := " "
                     ELSEIF Val((cNt := oSleR:getData())) > 0
                     ENDIF
                  ENDIF
                  REPLACE 14->auftrnr WITH Val(cAuf)
                  REPLACE 14->kennz WITH cKennz
                  REPLACE 14->rn WITH cNt
                  oBrowse:refreshAll()
                  R3TSummenNach( 14 )
                  DbResumeNotifications()
               ENDIF
            CASE (mp1 == xbeK_F4 .OR. mp1 == xbeK_RETURN .OR. mp1 == xbeK_TAB .OR. mp1 == xbeK_SH_TAB) ;
                   .AND. oBrowse:colPos = 4 .AND. IsMemberVar( oXbp, "value" )
               IF 14->&b_g != oXbp:value .AND. !Empty(14->&bezeichZ1)
                  R3TSummenVor( 14 )
                  REPLACE 14->&b_g WITH oXbp:value
                  R3TSummenNach( 14 )
               ENDIF
         CASE (mp1 == xbeK_F5 .AND. IsMemberVar( oXbp, "value" ) ;
                     .AND. oBrowse:colPos = 2 .AND. Upper(AppName())!="MUELLX.EXE") .OR. ;
              (mp1 == xbeK_CTRL_F5 .AND. IsMemberVar( oXbp, "value" ) ;
                     .AND. oBrowse:colPos = 2 .AND. Upper(AppName())="MUELLX.EXE")
            DbSuspendNotifications()
               cAuf := IIf( !Empty(14->auftrnr), Str(14->auftrnr,6,0), oSleA:getData())
               SELECT 8
               IF !Bof()
                  skip -1
               ENDIF
               cArt := 8->art
               SELECT 14
               oFocusF := SetAppFocus()
               cTab := RechBSuch( cAuf, cArt, oDlg:drawingArea, nFontR,, 14 )
               oBrowse:refreshAll()
            DbResumeNotifications()
            IIf( cTab="TAB",, oBrowse:down() )
            oBrowse:refreshAll()
            oFocusF := oBrowse
         CASE (mp1 == xbeK_F5 .AND. IsMemberVar( oXbp, "value" ) ;
                     .AND. oBrowse:colPos = 2 .AND. Upper(AppName())="MUELLX.EXE") .OR. ;
              (mp1 == xbeK_CTRL_F5 .AND. IsMemberVar( oXbp, "value" ) ;
                     .AND. oBrowse:colPos = 2 .AND. Upper(AppName())!="MUELLX.EXE")
            DbSuspendNotifications()
               SELECT 8
               IF !Bof()
                  skip -1
               ENDIF
               SELECT 14
               REPLACE 14->bezeich WITH 8->b1
               oBrowse:refreshAll()
               oXbp:setData( 8->art )
            DbResumeNotifications()
            oFocusF := oBrowse
         CASE (mp1 == xbeK_F6 .AND. IsMemberVar( oXbp, "value" ) ;
                     .AND. oBrowse:colPos = 2 .AND. Upper(AppName())!="MUELLX.EXE") .OR. ;
              (mp1 == xbeK_CTRL_F6 .AND. IsMemberVar( oXbp, "value" ) ;
                     .AND. oBrowse:colPos = 2 .AND. Upper(AppName())="MUELLX.EXE")
            DbSuspendNotifications()
               cAuf := IIf( !Empty(14->auftrnr), Str(14->auftrnr,6,0), oSleA:getData())
               SELECT 8
               IF !Eof()
                  skip 1
               ENDIF
               cArt := 8->art
               SELECT 14
               cTab := RechBSuch( cAuf, cArt, oDlg:drawingArea, nFontR,, 14 )
               oBrowse:refreshAll()
            DbResumeNotifications()
            IIf( cTab="TAB",, oBrowse:down() )
            oBrowse:refreshAll()
         CASE (mp1 == xbeK_F6 .AND. IsMemberVar( oXbp, "value" ) ;
                     .AND. oBrowse:colPos = 2 .AND. Upper(AppName())="MUELLX.EXE") .OR. ;
              (mp1 == xbeK_CTRL_F6 .AND. IsMemberVar( oXbp, "value" ) ;
                     .AND. oBrowse:colPos = 2 .AND. Upper(AppName())!="MUELLX.EXE")
            DbSuspendNotifications()
               SELECT 8
               IF !Eof()
                  skip 1
               ENDIF
               SELECT 14
               REPLACE 14->bezeich WITH 8->b1
               oBrowse:refreshAll()
               oXbp:setData( 8->art )
            DbResumeNotifications()
         ENDCASE
      ENDIF
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO

   IF lFlucht = .F.
//      StapZuAuftr( oCB )   // gliedert die Stapeldatei in die Auftragsdatei ein
   ENDIF

   oDlg:setModalState( XBP_DISP_MODELESS )
   oDlg:destroy()
//   SetAppFocus( oFocus )
   USE
   SELECT 8
   USE
   FErase( cDatver+cStaptemp+".dbf" )
   Select &nOldArea
RETURN

FUNCTION AUFTRzuSTAP( cAuf, a3 )
   LOCAL nt, nOldArea := SELECT(), cL
   LOCAL nAnf := IIf( !Empty(cL := oSleL:getData()), Val(oSleL:getData()), 0 )
   LOCAL nEnd := IIf( !Empty(nAnf), nAnf + 1000, 999999 )
   nSumme := 0    // PRIVATE der vorigen Ebene
   SELECT 14
   ZAP
   SELECT 3
   DbSuspendNotifications()
   FOR nt := 0 TO IIf(Upper(AppName())="MUELLX.EXE",4,3)
      FIND &cAuf
      DO WHILE 3->auftrnr=val(cAuf) .and. .not. eof()
         IF Val( 3->rn ) = nt .AND. IIf( cL = "k", 3->neu == "ka", ;
                     (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 14
            APPEND BLANK
            For n := 1 to FCount()-2
               FieldPut( n, aData2[n] )
            NEXT
            REPLACE 14->kass_betr WITH 14->&b_g
            REPLACE 14->orig_satz WITH ATail( a3 )
            nsumme += IIf(Empty(14->gebucht), 14->kass_betr, 0 )
            IF nBezZeil=2
               IF !Empty(14->bezeich2)
                  14->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] )
//                  14->zeile := Str(Recno(),2,0)          // wird eine eigenstndige Zeile!
               ENDIF
            ENDIF
            SELECT 3
         ENDIF
         SKIP
      ENDDO
   NEXT
   oSle:setdata( Str( nSumme,8,2 ) )
   1->(DbSeek(cAuf,.F.))
   DbResumeNotifications()
   SELECT &nOldArea
RETURN cAuf

FUNCTION ARTzuSTAP( cArt, a3 )
   LOCAL nt, nOldArea := SELECT(), dDatum := CtoD(oSleD:getData())
   LOCAL nRec, a1 := {}, n, c1 := Trim(" ")
   nSumme := 0    // PRIVATE der vorigen Ebene
   SELECT 14
   ZAP         // lscht bisherigen Inhalt komplett ohne zu fragen!
   IF !Empty(oSleA:getData())
      c1 := oSleA:getData()
   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 += Str(x,6,0)+" " } )
   ENDIF
   SELECT 3
   DbSuspendNotifications()
   GO BOTTOM
   DO WHILE !Bof()
      IF Str(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 14
            APPEND BLANK
            For n := 1 to FCount()-2
               FieldPut( n, aData2[n] )
            NEXT
            REPLACE 14->kass_betr WITH 14->&b_g
            REPLACE 14->orig_satz WITH ATail( a3 )
            nsumme += IIf(Empty(14->gebucht), 14->kass_betr, 0 )
            IF nBezZeil=2
               IF !Empty(14->bezeich2)
                  14->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] )
//                  14->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
RETURN cArt

PROCEDURE STAPzuAUFTR( oDlg1 )
   LOCAL c3, n, nOldArea := SELECT(), nZeile, nRec
      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 14
      DELETE ALL FOR Empty(14->auftrnr)
      PACK
      GO TOP
      DO WHILE !Eof()
         FOR n := 1 to FCount()
            aData2[n] := FieldGet( n )
         NEXT
         c3 := ATail(aData2)     // = 14->orig_satz
         SELECT 3
         IF !Empty(c3)
            GO c3
            nZeile := NIL
            //  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
            DbSeek(Str(14->auftrnr,6,0),.F.)
            DO WHILE 3->auftrnr == 14->auftrnr .AND. !Eof()
               nZeile := Val(3->zeile)
               SKIP
            ENDDO
            APPEND BLANK
            3->auftrnr := 14->auftrnr
         ENDIF
         IF 3->&b_g != 14->&b_g     // Korrektur der Rechnungssummen in BEST.dbf
            SELECT 1
            DbSeek(Str(14->auftrnr,6,0),.F.)
            Satzsp( oDlg1 )
            DO CASE
               CASE Val(3->rn) = 0
                  1->&r_b_0 := 1->&r_b_0 - 3->&b_g + 14->&b_g
               CASE Val(3->rn) = 1
                  1->&r_b_1 := 1->&r_b_1 - 3->&b_g + 14->&b_g
               CASE Val(3->rn) = 2
                  1->&r_b_2 := 1->&r_b_2 - 3->&b_g + 14->&b_g
               CASE Val(3->rn) = 3
                  1->&r_b_3 := 1->&r_b_3 - 3->&b_g + 14->&b_g
            ENDCASE
            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), )
         DbRUnlock( RecNo() )                                              // ... und unlock
      //  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 14
         SKIP
      ENDDO
      1->(DbGoto(nRec))
      1->(DbResumeNotifications())
   SELECT &nOldArea
RETURN

PROCEDURE STAPzuKASSE( oDlg1, dDatum )    // wird z.Zt. noch garnicht gebraucht !
   LOCAL nOldArea := SELECT()
      SELECT 9
      use kbbuch index xkbbuch
      SELECT 14
//      DELETE ALL FOR Empty(14->auftrnr) .or. Empty(14->orig_satz)
//      PACK
      GO TOP
      DO WHILE !Eof()
         SELECT 1
         DbSeek(Str(14->auftrnr,6,0),.F.)
         SELECT 9
         append blank
         repl datum with dDatum
         repl &a_g with 14->kass_betr
         repl auftrnr with str(14->auftrnr,6,0)
         repl txnr with "10"
         repl tx with "Barvorlage "+1->name
         SELECT 14
         SKIP
      ENDDO
      SELECT 9
      USE
   SELECT &nOldArea   
RETURN

// Bucht die Kassen-Summe des Stapels in die Kasse
// markiert die Auftragszeilen als gebucht ("x")
FUNCTION STAPsummezuKASSE( oDlg1, dDatum )
   LOCAL nOldArea := SELECT(), nSumme := 0, n, nRec
   IF !Empty(sszk)
      RETURN Str(nSumme,9,2)
   ENDIF
   ASize(a3,0)
      SELECT 9
      USE kbbuch index xkbbuch
      SELECT 14
      DbSuspendNotifications()
         nRec := RecNo()
         GO TOP
         1->(DbSeek( Str(14->auftrnr,6,0), .F. ))  // fr den Verstorbenen-Namen
         DO WHILE !Eof()
            nSumme += IIf( Empty(14->gebucht), 14->kass_betr, 0 )
            AAdd(a3,14->orig_satz)
            SKIP
         ENDDO
         GO nRec
      DbResumeNotifications()
      SELECT 9
      append blank
      repl datum with dDatum
      repl &a_g with nSumme
      repl auftrnr with cKauftrnr
      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(nSumme,9,2)
