**BRegieSE.prg   -  Regie-Zentrum fr Bestattungsverwaltung
//                    stapelweise Fremdrechnungen zu einem Auftrag eingeben

#include "Gra.ch"
#include "Xbp.ch"
#include "Appevent.ch"
#include "Appedit.ch"
#include "Appbrow.ch"
#include "Font.ch"
#include "Dmlb.ch"

FUNCTION StapelEingabe( oDlg1 )
   LOCAL oDlg, nEvent, mp1, mp2, oPbSuch, oXbp2, aEdit := {}
   LOCAL aSizeDesktop := AppDesktop():currentSize()
   LOCAL nBSb := Min(aSizeDesktop[1],nBSbreit)		//06.11.2025 16:49
   LOCAL nBSh := Min(aSizeDesktop[2],nBShoch)		//06.11.2025 16:49
// folgende Zahlen-Werte basieren auf 800x600:
   LOCAL nH := nBSb/800         // Korrekturfaktor fr tats„chliche Aufl”sung
   LOCAL nV := nBSh/600, nHV := nH/nV  //+07.06.2011 17:28
   LOCAL nOldArea := Select(), nRec1 := RecNo()		//+11.10.2021 14:47 nRec1
   LOCAL aEditcontrols
   LOCAL lFlucht := .F., nFlucht
   LOCAL aData1 := Array(3->(FCount()))
   LOCAL aData2 := Array(3->(FCount()))
   LOCAL aDataD := Array(3->(FCount()))
   LOCAL aData5 := {}
   PRIVATE oCB
   PRIVATE oSle
   PRIVATE cAuf := Str( 1->auftrnr,6,0 )

	DbSuspendNotifications()		//+11.10.2021 14:48
   cAuf5temp := "auf5"+LTrim(Str(Int(Seconds()/10)))
   SELECT 3
   COPY STRU TO (cDatver+cAuf5temp)

   SELECT 14
   USE (cAuf5temp) EXCLUSIVE
   GO BOTT
   DO WHILE Recno() < 50
      APPEND BLANK
   ENDDO
   GO TOP

//   cBFont := IIf( nBSb < 700, "8.Arial", "10.Arial" )

   oDlg := AKDialog():new( AppDesktop(), oDlg1 )
   oDlg:tasklist := .T.
   oDlg:title := "Eingabe von erhaltenen Rechnungen ïauf Stapelï"
   oDlg:maxButton := .F.
   oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED
   oDlg:create(,, {10,30*nV}, {int(770*nH),int(500*nV)} )

//   oDlg:drawingArea:setFontCompoundName( cBFont )
   oDlg:drawingArea:setColorBG( GRA_CLR_CYAN )
   oCB := oDlg:drawingArea

   oSle := XbpStatic():new( oDlg:drawingArea, ,  {int(400*nH),int(160*nV)}, {int(90*nH),int(25*nV)})
   oSle:caption := "~Auftrags-Nr.:"
   oSle:clipSiblings := .T.
   oSle:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
   oSle:create()
   oSle := XbpSLE():new( oDlg:drawingArea, ,  {int(500*nH),int(160*nV)}, {int(80*nH),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oSle:bufferLength := 6
   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, Trim(cAuf), cAuf := x ) }
   oSle:create():setData( cAuf )

   oPbSuch := XbpPushButton():new( oDlg:drawingArea, , {int(600*nH),int(160*nV)}, {int(40*nH),int(25*nV)} )
   oPbSuch:caption := "~Such"
   oPbSuch:group := XBP_WITHIN_GROUP
   oPbSuch:create()
   oPbSuch:activate := {|| StapAufSuch( cAuf := Padl(Trim(oSle:editBuffer()),6) , oDlg ), ;
                                SetAppFocus( oSle ) }

   APPBROWSE ;
        PARENT oDlg:drawingArea ;
        POSITION TOP ;
        FONT &cBFont ;
        SIZE 60,100 PERCENT

   APPFIELD auftrnr CAPTION "Auftrag" WIDTH 5
   APPFIELD zugr_z_st CAPTION "Art-Nr." WIDTH 5
   APPFIELD bezeichf1 CAPTION "Leistung (Zeile1)" WIDTH 25
   APPFIELD bezeichf2 CAPTION "Leistung (Zeile2)" WIDTH 10
   APPFIELD &b_g CAPTION "Betrag/"+w_g WIDTH 6
//   APPFIELD rn CAPTION "K" READONLY
   APPFIELD rn CAPTION "L" READONLY
   APPFIELD kennz CAPTION "K" READONLY

   APPDISPLAY MODELESS

   APPEDIT INTO oEdit ;
        PARENT oDlg:drawingArea ;
        POSITION BOTTOM ;
        FONT &cBFont ;
        SEEK StapArtSuch( IIf( 14->Auftrnr > 0, Str( 14->Auftrnr,6,0 ), ;
                                Padl(Trim(oSle:editBuffer()),6) ), oDlg ) ;
        TRIGGER "StapEinfg" ON INSERT ;
        TRIGGER "StapAend" ON UPDATE ;
        TRIGGER "StapEntf" ON DELETE ;
        SIZE 30,100 PERCENT

   APPFIELD auftrnr INTO oEdit CAPTION "Auftrag" WIDTH 5
   APPFIELD zugr_z_st INTO oEdit CAPTION "Art-Nr." WIDTH 5
   APPFIELD bezeichf1 INTO oEdit CAPTION "Leistung (Zeile1)" WIDTH 25
   APPFIELD bezeichf2 INTO oEdit CAPTION "Leistung (Zeile2)" WIDTH 10
   APPFIELD &b_g INTO oEdit CAPTION "Betrag/"+w_g WIDTH 6
//   APPFIELD rn INTO oEdit CAPTION "K" READONLY
   APPFIELD rn INTO oEdit CAPTION "L" READONLY
   APPFIELD kennz INTO oEdit CAPTION "K" READONLY

   APPDISPLAY oEdit MODELESS

   oDlg:setModalState( XBP_DISP_APPMODAL )
   oDlg:show()
   oFocus := SetAppFocus( oSle )

   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      IF nEvent == xbeP_User
         nRec := Recno()
         14->(DbGoBottom())
         14->(DbGoTop())
         14->(DbGoto(nRec))
      ENDIF
      IF nEvent == xbeM_LbClick
      DO CASE
         CASE oXbp == oSle
            SetAppFocus( oSle )
         CASE oXbp:isDerivedFrom( "XbpPushButton" ) .AND. ValType(oXbp:caption) == "N"
            IF oXbp:caption == 27
               oEdit:SAVE()
            ENDIF
      ENDCASE
      ENDIF
      IF nEvent == xbeP_Keyboard
      DO CASE
//         CASE mp1 == xbeK_RETURN
//            PostAppEvent( xbeP_Activate,,, oXbp)
         CASE mp1 == xbeK_ALT_A
            SetAppFocus( oSle )
         CASE mp1 == xbeK_ALT_S
            PostAppEvent( xbeP_Activate,,, oPbSuch)
         CASE mp1 == xbeK_ALT_R
            Tauftr_aus_Fauftr()		// erzeugt die TAUFTR_stap.dbf aus der FAUFTR.DBF
         CASE mp1 == xbeK_F10
            IF oXbp:isDerivedFrom( "XbpSle" ) .and. oXbp != oSle
               oEdit:save()
               SetAppFocus( oDlg )
            ENDIF
            PostAppEvent( xbeP_Close)
         CASE mp1 == xbeK_ESC
            nFlucht := ConfirmBox( oCB, "Eingaben speichern?", ;
                        "Programm STAPEL-EINGABE beenden.", ;
                        XBPMB_YESNOCANCEL, ;
                        XBPMB_QUESTION )
            IF nFlucht == XBPMB_RET_YES
               lEinfg := .F.
               lFlucht := .F.
               PostAppEvent( xbeP_Close)
            ELSEIF nFlucht == XBPMB_RET_NO
               lEinfg := .F.
               lFlucht := .T.
               PostAppEvent( xbeP_Close)
            ELSE
            ENDIF
         CASE mp1 == xbeK_F1
            ModalDialog( (cDatver+"f1_SE.dbf"), "Bedienungshinweise", oDlg, 680*nH, 460*nV )
         CASE mp1 == xbeK_F2
            oEdit:goTop()
         CASE mp1 == xbeK_F3
            oEdit:goPrevious()
         CASE mp1 == xbeK_F4
            oEdit:goNext()
         CASE mp1 == xbeK_F5
            oEdit:goBottom()
         CASE mp1 == xbeK_F6
            oEdit:SEEK()
         CASE mp1 == xbeK_F7 .and. oXbp:isDerivedFrom( "XbpSle" )
            oEdit:save()
            SetAppFocus( oEdit )
         CASE mp1 == xbeK_F7
            oEdit:edit()
         CASE mp1 == xbeK_F8
            oEdit:insert()
         CASE mp1 == xbeK_F9
            oEdit:DELETE()
            PostAppEvent( xbeP_User )
         CASE mp1 == xbeK_RETURN .and. oXbp:isDerivedFrom( "XbpSle" )
            IF oXbp:cargo[1] = "ZUGR_Z_ST"
               FOR i := 1 TO 7
                  DO CASE
                  CASE FieldInfo( FieldPos(oEdit:scrollArea:childList()[i]:cargo[1]), FLD_TYPE ) = "C"
                     AAdd( aEdit, oEdit:scrollarea:childlist()[i]:editbuffer())
                  CASE FieldInfo( FieldPos(oEdit:scrollArea:childList()[i]:cargo[1]), FLD_TYPE ) = "D"
                     AAdd( aEdit, CtoD(oEdit:scrollarea:childlist()[i]:editbuffer()))
                  CASE FieldInfo( FieldPos(oEdit:scrollArea:childList()[i]:cargo[1]), FLD_TYPE ) = "N"
                     AAdd( aEdit, Val( oEdit:scrollarea:childlist()[i]:editbuffer()))
                  ENDCASE
               NEXT
               StapAend( aEdit )
               aEdit := {}
            ENDIF
      ENDCASE
      ENDIF
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO

   oDlg:setModalState( XBP_DISP_MODELESS )
   oDlg:destroy()
   SetAppFocus( oFocus )

   IF lFlucht == .F.               // ESC-Taste: lFlucht = .T.

            IF ModalFen( "K E I N Benutzer darf jetzt ; " + ;
                           "w„hrend der Eingliederung ; " + ;
                           "Rechnungen  bearbeiten! ;  Weiter?", ;
                           "A C H T U N G !", ;
                           oDlg1 ) == "ESC"
            ENDIF
      SELECT 11
      USE tauftr EXCLUSIVE
      SELECT 14
      DELETE FOR 14->auftrnr = 0 .OR. ( Empty(14->zugr_z_st) .AND. Empty(14->bezeichf1))
      PACK
      INDEX on Str(auftrnr,6,0) TO temp      // sollte bleiben, Auftrag geht dann in einem Rutsch
      IF .NOT. Bof()
         GO TOP
      ENDIF
   // hier folgt die Stapel-Žnderung fr die Auftr.dbf und die tauftr.dbf :
   // die S„tze der StapTemp.dbf werden mit Zeile versehen an Auftr.dbf angeh„ngt
   // die Bewegung wird als neue Bewegung an Tauftr.dbf angeh„ngt

      DO WHILE .NOT. Eof()
         IF rn <> "3"
            SKIP
            LOOP
         ENDIF
         cAuf := Str( auftrnr,6,0 )
         SELECT 3
         Find &cAuf
// erst einmal die bisherigen Abrechnungs-Zeilen einlesen:
// ( in das Array aData5, damit man die komplette Aufstellung an die tauftr anh„ngt!)
         nZeile := 0
         DO WHILE 3->auftrnr == Val( cAuf ) .AND. .NOT. 3->(Eof())
            IF rn == "3"
////               FOR n := 1 to FCount()
////                  aData2[n] := FieldGet( n )
////               NEXT
////               aData1 := aData2
               n4 := 0
////               aDataD := SatzDiff( 14, @aData1, @aData2, "AUFTR" )
               AAdd( aData5, {auftrnr,kennz,zeile,neu,zugr_z_st,bezeich,bezeichf1,bezeichf2,betrag,betrageu,mwst_schl,gebucht,ttmm,rn,kzbez} )
               AAdd( aData5, {auftrnr,kennz,zeile,neu,zugr_z_st,bezeich,bezeichf1,bezeichf2,betrag,betrageu,mwst_schl,gebucht,ttmm,rn,kzbez} )
               AAdd( aData5, SatzDiff( 14, ;
               {auftrnr,kennz,zeile,neu,zugr_z_st,bezeich,bezeichf1,bezeichf2,betrag,betrageu,mwst_schl,gebucht,ttmm,rn,kzbez}, ;
               {auftrnr,kennz,zeile,neu,zugr_z_st,bezeich,bezeichf1,bezeichf2,betrag,betrageu,mwst_schl,gebucht,ttmm,rn,kzbez}, ;
               "AUFTR" ) )

               ++nZeile
            ENDIF
            3->(DbSkip())
         ENDDO
// jetzt die neuen Abrechnungs-Zeilen zu diesem Auftrag dranh„ngen:
         SELECT 14
         DO WHILE 14->auftrnr == Val(cAuf) .AND. .NOT. 14->(Eof())
            REPLACE 14->zeile WITH Str( ++nZeile,2,0 )
            For n := 1 to FCount()
               aData2[n] := FieldGet( n )
            NEXT
            SELECT 3
            APPEND BLANK            // neue Zeilen werden eben ohne zu kucken angefgt - ok!
               aData1 := Satzget( 3, Recno() )
            Satzsp( oCB )
            FOR n := 1 to FCount()
               FieldPut( n, aData2[n] )
            NEXT
               n4 := 0
               aDataD := SatzDiff( 14, @aData1, @aData2, "AUFTR" )
               AAdd( aData5, aData1 )
//               AAdd( aData5, {auftrnr,kennz,zeile,neu,zugr_z_st,bezeich,bezeichf1,bezeichf2,betrag,betrageu,mwst_schl,gebucht,ttmm,rn,kzbez} )
               AAdd( aData5, {auftrnr,kennz,zeile,neu,zugr_z_st,bezeich,bezeichf1,bezeichf2,betrag,betrageu,mwst_schl,gebucht,ttmm,rn,kzbez} )
               AAdd( aData5, SatzDiff( 14, ;
               aData1, ;
               {auftrnr,kennz,zeile,neu,zugr_z_st,bezeich,bezeichf1,bezeichf2,betrag,betrageu,mwst_schl,gebucht,ttmm,rn,kzbez}, ;
               "AUFTR" ) )
//               AAdd( aData5, SatzDiff( 14, ;
//               {auftrnr,kennz,zeile,neu,zugr_z_st,bezeich,bezeichf1,bezeichf2,betrag,betrageu,mwst_schl,gebucht,ttmm,rn,kzbez}, ;
//               {auftrnr,kennz,zeile,neu,zugr_z_st,bezeich,bezeichf1,bezeichf2,betrag,betrageu,mwst_schl,gebucht,ttmm,rn,kzbez}, ;
//               "AUFTR" ) )
            DbRUnlock( Recno() )
            SELECT 14
            SKIP
         ENDDO
         IIf( !14->(Eof()), 14->(DbSkip(-1)), )
         SELECT 11
//////         LOCATE FOR auftrnr == Val( cAuf ) .AND. rn == "3"
//////   // Wenn Tripel zu dieser Auftrnr schon vorhanden:
//////   // lokalisieren eines freien, unberspielten Tripels:
//////         DO WHILE auftrnr == Val( cAuf ) .AND. rn == "3" .AND. .NOT. Eof()
//////            cTTFlag := TTFlag
//////            IF SUBSTR( cTTFlag, VAL( cSystem ), 1 ) <> "1" ;
//////                   .AND..NOT. "2"$cTTFlag
//////               EXIT
//////            ENDIF
//////            SKIP 2
//////            CONTINUE
//////         ENDDO
         FOR i := 1 TO Len(aData5)-2 STEP 3
//////            IF auftrnr == Val( cAuf ) .AND. rn == "3" .AND. .NOT. Eof()
//////               SatzPut( 11, RecNo(), aData5[i], "0" )
//////               SKIP
//////               SatzPut( 11, RecNo(), aData5[i+1], "0" )
//////               SKIP
//////               SatzPut( 11, RecNo(), aData5[i+2], "0" )
//////               CONTINUE
//////            ELSE
               APPEND BLANK
               SatzPut( 11, RecNo(), aData5[i], "0" )
               APPEND BLANK
               SatzPut( 11, RecNo(), aData5[i+1], "0" )
               APPEND BLANK
               SatzPut( 11, RecNo(), aData5[i+2], "0" )
//////               SKIP     // ? wird das hier auch gebraucht?
//////            ENDIF
         NEXT
         aData5 := {}
         SELECT 3
         SKIP
         SELECT 14
         SKIP           // ist doch schon oben passiert ! ...und jetzt revidiert!
      ENDDO
      USE
      SELECT 11
      USE
   ELSE
      USE                 // schlieáen der TEMP-Datei
   ENDIF
//   FErase( cDatver+cAuf5temp+".dbf" )
   Select &nOldArea
   DbGoto(nRec1)					//+11.10.2021 14:46
   DbResumeNotifications()		//+11.10.2021 14:46
RETURN .T.

FUNCTION StapArtSuch( cAuf, oDlg1 )
   LOCAL oDlg, nEvent, mp1, mp2
   LOCAL aSizeDesktop := AppDesktop():currentSize()
   LOCAL nBSb := aSizeDesktop[1]
   LOCAL nBSh := aSizeDesktop[2]
// folgende Zahlen-Werte basieren auf 800x600:
   LOCAL nH := nBSb/800         // Korrekturfaktor fr tats„chliche Aufl”sung
   LOCAL nV := nBSh/600, nHV := nH/nV  //+07.06.2011 17:28
   LOCAL nOldArea := Select()
   LOCAL lFlucht := .F.
   PRIVATE oCB

   SELECT 6
   GO TOP
//   cBFont := IIf( nBSb < 700, "7.Arial", "8.Arial" )

   oDlg := AKDialog():new( AppDesktop(), oDlg1 )
   oDlg:tasklist := .T.
   oDlg:title := "Artikel/Leistung ausw„hlen"
   oDlg:maxButton := .F.
   oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED
   oDlg:create(,, {10,10*nV}, {int(740*nH),int(460*nV)} )
   oCB := oDlg:drawingArea

//   oDlg:drawingArea:setFontCompoundName( "8.Arial" )
   oDlg:drawingArea:setColorBG( GRA_CLR_DARKCYAN )

   APPBROWSE ;
        PARENT oDlg:drawingArea ;
        POSITION TOP ;
        FONT &cBFont ;
        SIZE 95,100 PERCENT

   APPFIELD art_lei CAPTION "Art-Nr."
   APPFIELD bezf1 CAPTION "Leistung (Zeile1)" WIDTH 25
   APPFIELD bezf2 CAPTION "Leistung (Zeile2)" WIDTH 10
   APPFIELD &v_p_s CAPTION "Preis/"+w_g

   APPDISPLAY MODELESS

   oDlg:setModalState( XBP_DISP_APPMODAL )
   oDlg:show()

   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      IF nEvent == xbeM_LbDblClick
            PostAppEvent( xbeP_Close)
      ENDIF
      IF nEvent == xbeP_Keyboard
      DO CASE
         CASE mp1 == xbeK_RETURN .or. mp1 == xbeK_F10
            PostAppEvent( xbeP_Close)
         CASE mp1 == xbeK_ESC
            lFlucht := .T.
            PostAppEvent( xbeP_Close)
      ENDCASE
      ENDIF
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO
   oDlg:setModalState( XBP_DISP_MODELESS )
   oDlg:destroy()

   SELECT 14
   IF lFlucht = .F.               // ESC-Taste: lFlucht = .T.
      IF Val( 14->zugr_z_st ) > 0
         LOCATE FOR Val(14->zugr_z_st) == 0
         IF Eof()
            APPEND BLANK
         ENDIF
      ENDIF
//      REPLACE 14->auftrnr WITH Val( cAuf )
      REPLACE 14->rn WITH "3"
      REPLACE 14->kennz WITH 6->ausg
      REPLACE 14->mwst_schl WITH 6->mwst_schl
      REPLACE 14->zugr_z_st WITH 6->art_lei
      REPLACE 14->bezeichf1 WITH 6->bezf1
      REPLACE 14->bezeichf2 WITH 6->bezf2
      REPLACE 14->&b_g WITH 6->&v_p_s
      REPLACE 14->&b_gh WITH 6->&v_p_sh
      DbCommit()
   ENDIF
   Select &nOldArea
RETURN APPOP_PROCEED

FUNCTION StapAufSuch( cAuf, oDlg1 )
   LOCAL oDlg, nEvent, mp1, mp2
   LOCAL aSizeDesktop := AppDesktop():currentSize()
   LOCAL nBSb := aSizeDesktop[1]
   LOCAL nBSh := aSizeDesktop[2]
// folgende Zahlen-Werte basieren auf 800x600:
   LOCAL nH := nBSb/800         // Korrekturfaktor fr tats„chliche Aufl”sung
   LOCAL nV := nBSh/600, nHV := nH/nV  //+07.06.2011 17:28
   LOCAL nOldArea := Select()
   LOCAL lFlucht := .F.
   PRIVATE oCB

   SELECT 3
   GO TOP
//   cBFont := IIf( nBSb < 700, "8.Arial", "10.Arial" )

   oDlg := AKDialog():new( AppDesktop(), oDlg1 )
   oDlg:tasklist := .T.
   oDlg:title := "Aufstellung zu " + cAuf
   oDlg:maxButton := .F.
   oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED
   oDlg:create(,, {10,10*nV}, {int(740*nH),int(460*nV)} )
   oCB := oDlg:drawingArea

//   oDlg:drawingArea:setFontCompoundName( "8.Arial" )
   oDlg:drawingArea:setColorBG( GRA_CLR_DARKCYAN )

   FIND &cAuf

   APPBROWSE ;
        PARENT oDlg:drawingArea ;
        POSITION TOP ;
        FONT &cBFont ;
        SIZE 95,100 PERCENT

   APPFIELD auftrnr CAPTION "Auftrag" WIDTH 5
   APPFIELD zugr_z_st CAPTION "Art-Nr." WIDTH 5
   APPFIELD bezeichf1 CAPTION "Leistung (Zeile1)" WIDTH 25
   APPFIELD bezeichf2 CAPTION "Leistung (Zeile2)" WIDTH 10
   APPFIELD &b_g CAPTION "Betrag/"+w_g WIDTH 6
   APPFIELD kennz CAPTION "K" READONLY

   APPDISPLAY MODELESS

   oDlg:setModalState( XBP_DISP_APPMODAL )
   oDlg:show()

   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      IF nEvent == xbeM_LbDblClick
            PostAppEvent( xbeP_Close)
      ENDIF
      IF nEvent == xbeP_Keyboard
      DO CASE
         CASE mp1 == xbeK_RETURN .or. mp1 == xbeK_F10
            PostAppEvent( xbeP_Close)
         CASE mp1 == xbeK_ESC
            lFlucht := .T.
            PostAppEvent( xbeP_Close)
      ENDCASE
      ENDIF
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO
   oDlg:setModalState( XBP_DISP_MODELESS )
   oDlg:destroy()

   SELECT 14
   IF lFlucht = .F.               // ESC-Taste: lFlucht = .T.
      nRec := Recno()
      IF EMPTY( 14->auftrnr )
         REPLACE 14->auftrnr WITH 3->auftrnr
      ENDIF
      GO TOP
      GO nRec
      cAuf := Str( 3->auftrnr,6,0 )
      oSle:setdata( cAuf )
   ENDIF
   Select &nOldArea
RETURN APPOP_PROCEED

FUNCTION StapEinfg(aRechPos)
RETURN APPOP_PROCEED


FUNCTION StapAend(aRechPos)
   n1a := IIf( Empty(aRechPos[1]), Val(oSle:getData()), aRechPos[1] )
   cArt := aRechPos[2]
   c6b1 := aRechPos[3]
   c6b2 := aRechPos[4]
//+23.07.2008 12:46
//////   IF xdmeu="D"
//////      n6v := aRechPos[5]
//////      n6veu := n6v/xFaktor
//////   ELSE
      n6veu := aRechPos[5]
//////      n6v := n6veu*xFaktor
//////   ENDIF
   SELECT 6
   FIND &cArt
   IF Eof()
      c6b1 := c6b2 := ""
      n6v := n6veu := 0
   ELSE
      c6b1 := IIf( Len(aRechPos[3])=0, 6->bezf1, c6b1 )
      c6b2 := IIf( Len(aRechPos[4])=0, 6->bezf2, c6b2 )
//+23.07.2008 12:46      n6v := IIf( aRechPos[5] = 0, 6->vk_preis, n6v )
      n6veu := IIf( aRechPos[5] =0, 6->vk_preiseu, n6veu  )
   ENDIF
   SELECT 14
   REPLACE 14->auftrnr WITH n1a
   REPLACE 14->rn WITH "3"
   REPLACE 14->kennz WITH "2"
   REPLACE 14->mwst_schl WITH "0"
   REPLACE 14->zugr_z_st WITH cArt
   REPLACE 14->bezeichf1 WITH c6b1
   REPLACE 14->bezeichf2 WITH c6b2
//+23.07.2008 12:46   REPLACE 14->betrag WITH n6v
   REPLACE 14->betrageu WITH n6veu
   DbCommit()
   nRec := Recno()
   GO TOP
   GO nRec
RETURN APPOP_PROCEED


FUNCTION StapEntf(aRechPos)
   IF AScan( aRechPos, {|x| ! Empty(x) } ) == 0
      RETURN APPOP_PROCEED
   ENDIF
   IF ConfirmBox( oCB, "Soll der Datensatz gel”scht werden?", ;
                        "Datensatz l”schen", ;
                        XBPMB_YESNO, ;
                        XBPMB_QUESTION ) == XBPMB_RET_NO
      RETURN APPOP_IGNORE
   ENDIF
RETURN APPOP_PROCEED

//+20.07.2019 08:49
// Rekonstruiert die TT-Dateien aus den TTFL\F-Dateien
FUNCTION Tauftr_aus_Fauftr()
	LOCAL cDatum := "20"+AllTrim(oSle:editBuffer())
	LOCAL nOldArea := SELECT(), nF, nT
   LOCAL aData1, aData2, aDataD, nAuf, nZeile, cVerskz
   PRIVATE nDiff := 0 , n4 := 0
   
	IF Len(cDatum) < 8 .AND. Val(cDatum) < 20000001
		msgbox("Geben Sie ein Datum ein jjmmtt !")
		RETURN .F.
	ENDIF
	
	// AUFTR
   cFDatei := cDatver + "TTFL\F" + SubStr(Str(1->auftrnr,6,0),1,2) + "AUFTR.DBF"		//+05.11.2019 13:51
	DbUseArea(.T.,,cFDatei,"fa")	// Sammel-TDatei
	nF := SELECT()												// (Logbuch)
	LOCATE FOR cDatum <= DtoS(fa->TTDATUM)
	nauf := fa->auftrnr

	DbUseArea(.T.,,cDatver+"TAUFTR.dbf")			// TDatei
	COPY STRUCTURE TO (cDatver+"TAUFTR_stapel.dbf")
	DbUseArea(,,cDatver+"TAUFTR_stapel.dbf","ta")			// TDatei
	nT := SELECT()
	DO WHILE !fa->(Eof())

   	aData1 := SatzGet( nF, fa->(RecNo()) )		// lesen aus FAUFTR.dbf
   	IF nAuf != aData1[1] .AND. !ta->(Bof())	// ein Null-Tripel zur Abgrenzung
			ta->(DbAppend())
			ta->(DbAppend())
			ta->(DbAppend())
			nauf := aData1[1]								// die folgende Auftragsnummer
		ENDIF
		ta->(DbAppend())
		SatzPut( nT, ta->(RecNo()), aData1,,3 )	// schreiben in tauftr_stapel.dbf
		
		fa->(DbSkip())
	ENDDO
	fa->(DbCloseArea())

	ta->(DbAppend())					// am Ende auch noch ein Null-Tripel
	ta->(DbAppend())
	ta->(DbAppend())
	ta->(DbCloseArea())

	// BEST ////////////////////////////////////////////////////////////////
	cFDatei := cDatver+"TTFL\F" + SubStr(Str(1->auftrnr,6,0),1,2) + "BEST.DBF"			//+05.11.2019 14:12
	DbUseArea(.T.,,cFDatei,"fa")	// Sammel-TDatei
	nF := SELECT()												// (Logbuch)
	LOCATE FOR cDatum <= DtoS(fa->TTDATUM)
	
	IF (RecNo()+2)/3 != Int((RecNo()+2)/3)
		msgbox("Die FBEST.DBF ist bei Datum "+cDatum+" defekt!")
		//RETURN .F.
	ENDIF
	
	DbUseArea(.T.,,cDatver+"TBEST.dbf")			// TDatei
	COPY STRUCTURE TO (cDatver+"TBEST_stapel.dbf")
	DbUseArea(,,cDatver+"TBEST_stapel.dbf","ta",.F.)			// TDatei
	nT := SELECT()
	DO WHILE !fa->(Eof())

		// in fa gibt es Mehrlinge! die auf nur einen ta kopiert werden!
		nauf := fa->auftrnr
	   aData1 := SatzGet( nF, fa->(RecNo()) )
	   fa->(DbSkip())
	   aData2 := SatzGet( nF, fa->(RecNo()) )
	   fa->(DbSkip())
	   aDataD := SatzGet( nF, fa->(RecNo()) )
	
// Wenn Tripel zu dieser Auftrnr schon vorhanden: in ta gibt es immer nur einen!
		ta->(Dblocate( {|| nAuf == ta->auftrnr } ))

// „ndern des vorhandenen Tripels, oder neuen Tripel anh„ngen:
      IF !ta->(Eof())
         aData1 := SatzGet( nT, fa->(RecNo()) )
         aDataD := SatzDiff( nT, @aData1, @aData2, "" )
         SKIP
         SatzPut( nT, ta->(RecNo()), aData2, "0" )
         SKIP
         SatzPut( nT, ta->(RecNo()), aDataD, "0" )
      ELSE
         APPEND BLANK
         SatzPut( nT, ta->(RecNo()), aData1, "0" )
         APPEND BLANK
         SatzPut( nT, ta->(RecNo()), aData2, "0" )
         APPEND BLANK
         SatzPut( nT, ta->(RecNo()), aDataD, "0" )
      ENDIF

	   fa->(DbSkip()) // geht auf das n„chste Tripel oder auf eof()
	ENDDO
	fa->(DbCloseArea())
	ta->(DbCloseArea())

	// VERS	//////////////////////////////////////////////////////////////////
	DbUseArea(.T.,,cDatver+"TTFL\FVERS.dbf","fa")	// Sammel-TDatei
	nF := SELECT()												// (Logbuch)
	LOCATE FOR cDatum <= DtoS(fa->TTDATUM)
	
	IF (RecNo()+2)/3 != Int((RecNo()+2)/3)
		msgbox("Die FVERS.DBF ist bei Datum "+cDatum+" defekt!")
		//RETURN .F.
	ENDIF
	
	DbUseArea(.T.,,cDatver+"TVERS.dbf")			// TDatei
	COPY STRUCTURE TO (cDatver+"TVERS_stapel.dbf")
	DbUseArea(,,cDatver+"TVERS_stapel.dbf","ta",.F.)			// TDatei
	nT := SELECT()
	DO WHILE !fa->(Eof())

		// in fa gibt es Mehrlinge! die auf nur einen ta kopiert werden!
		cVerskz := fa->verskz
	   aData1 := SatzGet( nF, fa->(RecNo()) )
	   fa->(DbSkip())
	   aData2 := SatzGet( nF, fa->(RecNo()) )
	   fa->(DbSkip())
	   aDataD := SatzGet( nF, fa->(RecNo()) )
	
// Wenn Tripel zu dieser Auftrnr schon vorhanden: in ta gibt es immer nur einen!
		ta->(Dblocate( {|| Trim(cVerskz) == Trim(ta->verskz) } ))
// „ndern des vorhandenen Tripels, oder neuen Tripel anh„ngen:
      IF !ta->(Eof())
         aData1 := SatzGet( nT, fa->(RecNo()) )
         aDataD := SatzDiff( nT, @aData1, @aData2, "" )
         SKIP
         SatzPut( nT, ta->(RecNo()), aData2, "0" )
         SKIP
         SatzPut( nT, ta->(RecNo()), aDataD, "0" )
      ELSE
         APPEND BLANK
         SatzPut( nT, ta->(RecNo()), aData1, "0" )
         APPEND BLANK
         SatzPut( nT, ta->(RecNo()), aData2, "0" )
         APPEND BLANK
         SatzPut( nT, ta->(RecNo()), aDataD, "0" )
      ENDIF

	   fa->(DbSkip()) // geht auf das n„chste Tripel oder auf eof()
	ENDDO
	fa->(DbCloseArea())
	ta->(DbCloseArea())

	// VV	///////////////////////////////////////////////////////////////////////////////
	cFDatei := cStickDir+"TTFL\F" + SubStr(Str(1->auftrnr,6,0),1,2) + "VV.DBF"			//+05.11.2019 14:12
	DbUseArea(.T.,,cFDatei,"fa")	// Sammel-TDatei
	nF := SELECT()												// (Logbuch)
	LOCATE FOR cDatum <= DtoS(fa->TTDATUM)
	
	IF (RecNo()+2)/3 != Int((RecNo()+2)/3)
		msgbox("Die FVV.DBF ist bei Datum "+cDatum+" defekt!")
		//RETURN .F.
	ENDIF
	
	DbUseArea(.T.,,cDatver+"TVV.dbf")			// TDatei
	COPY STRUCTURE TO (cDatver+"TVV_stapel.dbf")
	DbUseArea(,,cDatver+"TVV_stapel.dbf","ta",.F.)			// TDatei
	nT := SELECT()
	DO WHILE !fa->(Eof())

		// in fa gibt es Mehrlinge! die auf nur einen ta kopiert werden!
		nauf := fa->auftrnr
		nZeile := Val(fa->bb)
	   aData1 := SatzGet( nF, fa->(RecNo()) )
	   fa->(DbSkip())
	   aData2 := SatzGet( nF, fa->(RecNo()) )
	   fa->(DbSkip())
	   aDataD := SatzGet( nF, fa->(RecNo()) )
	
// Wenn Tripel zu dieser Auftrnr schon vorhanden: in ta gibt es immer nur einen!
		ta->(Dblocate( {|| nAuf == ta->auftrnr .AND. nZeile == Val(ta->bb) } ))

// „ndern des vorhandenen Tripels, oder neuen Tripel anh„ngen:
      IF !ta->(Eof())
         aData1 := SatzGet( nT, fa->(RecNo()) )
         aDataD := SatzDiff( nT, @aData1, @aData2, "" )
         SKIP
         SatzPut( nT, ta->(RecNo()), aData2, "0" )
         SKIP
         SatzPut( nT, ta->(RecNo()), aDataD, "0" )
      ELSE
         APPEND BLANK
         SatzPut( nT, ta->(RecNo()), aData1, "0" )
         APPEND BLANK
         SatzPut( nT, ta->(RecNo()), aData2, "0" )
         APPEND BLANK
         SatzPut( nT, ta->(RecNo()), aDataD, "0" )
      ENDIF

	   fa->(DbSkip()) // geht auf das n„chste Tripel oder auf eof()
	ENDDO
	fa->(DbCloseArea())
	ta->(DbCloseArea())



	SELECT &nOldArea

RETURN .T.

