#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"

// REDUZIERTE VERSION fr Rudox etc.   18.11.2006 13:24

//PROCEDURE Rech3Eingabe( cAuf, oDlg1, nFontR, cDruck )
//   LOCAL nEvent, mp1, mp2, oXbp, oBrowse:=oDlg1:cargo // nur damit oBrowse den richtigen Typ hat
//   LOCAL oDlg, cTitel, oPbDruck
//   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 := Trim(" "), cNt := "R", cBez := Trim(" "), cAufS := Space(6), nB1, nB2
//   LOCAL lFlucht := .F., nFlucht, cTab := "RET"
//   PRIVATE oCB, oFocusF := oBrowse
//// weil in Makros verwandt:
//   PRIVATE nAnz := 1, nt := 0, nRechnr := 0, nGS := 0
//   PRIVATE nZeile := 0, a3 := {}
//   PRIVATE nSum := 0
//   PRIVATE oSle, oSle0, oSle1, oSle2, oSle3, oSleR
//   PRIVATE nSumme := nSumme0 := nSumme1 := nSumme2 := nSumme3 := 0 , nH := 0
//   PRIVATE nSumme0a := nSumme0b := nSumme3a := nSumme3b := 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 := 45 , nBezWb2 := 30
//   IF nBezZeil = 1 .AND. ( nFontR = FONT_DEFFIXED_MEDIUM .OR. nFontR = FONT_DEFFIXED_LARGE )
//      nBezWb1 := 45
//   ENDIF
//
//   IF IsFieldVar("gkz")
//      IIf( !Empty(1->gkz), 5->(DbSeek( 1->gkz, .T. )),)
//      IF !Upper(AppName())$"VOGELX.EXE"
//         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
//   ENDIF
////////   IF !Empty(1->schladr)         // nur bei Raguse!!!
////////      5->(DbSeek( 1->schladr, .T. ))
////////      v_p_s := "vk_preis"+IIf(5->preisgr$"1234567", 5->preisgr, "1" )
////////   ELSE
////////      v_p_s := "vk_preis1"
////////   ENDIF
//
//   cAuf3temp := "r_"+LTrim(StrX(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 3
//   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( StrX(100,6,0), "Muster ausw„hlen:", oDlg1, Int(333*nV), Int(500*nV) ) )
//         cAufS := IIf( Empty(cAufS), cAuf, PadL( cAufS, 6 ) )
//      ELSE
//         cAufS := cAuf
//      ENDIF
//      SELECT 3
//   ELSE
//      cAufS := cAuf
//   ENDIF
//
////   SELECT 3
//   COPY STRU TO (cDatver+cAuf3temp)
//   aData1 := Array(FCount())
//   aData2 := Array(FCount())
//   aDataD := Array(FCount())
//
//   IF !"U"$cDruck
//      SELECT 13
//      USE (cAuf3temp) EXCLUSIVE
//      SELECT 3
//     FOR nt := 0 TO IIf(Upper(AppName())="MUELLX.EXE",4,3)
//      FIND &cAufS
//      DO WHILE 3->auftrnr=val(cAufS) .and. .not. eof()
//         IF Val( rn ) = nt
//            For n := 1 to FCount()
//               aData2[n] := FieldGet( n )
//            NEXT
//            AAdd( a3, Recno() )
////   //  Artikel-Daten korrigieren:       // 17.3.03: siehe beim Programmausstieg
////            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
//            APPEND BLANK
//            For n := 1 to FCount()
//               FieldPut( n, aData2[n] )
//            NEXT
//            IF Upper(AppName())$"BERGX.EXESANDERX.EXE"     // damit der Preis auf die 2. Zeile kommt
//               nB1 := 13->&b_g
//               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 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
//            IF Upper(AppName())$"BERGX.EXESANDERX.EXE"
//               REPLACE 13->&b_g WITH nB1
//               REPLACE 13->&b_gh WITH nB2
//            ENDIF
//            SELECT 3
//         ENDIF
//         skip
//      ENDDO
//     NEXT
//      IF cAufS = cAuf
//         ASort( a3 )
//      ELSE        // wenn erzeugt aus einer Musterrechnung:
//         a3 := {}
//         DbSeek( cAuf+" ",.T. )
//         DO WHILE 3->auftrnr = Val(cAuf) .AND. 3->rn = " " .AND. .NOT. 3->(Eof())
//            DbDelete()
//            DbSkip()
//         ENDDO
//      ENDIF
//   ELSE
//      SELECT 13
//      USE (cAuf3temp) EXCLUSIVE
//      APPEND BLANK
//      aData1 := Array(FCount())
//      For n := 1 to FCount()
//         aData1[n] := FieldGet( n )
//      NEXT
//      RECALL ALL
//      GO TOP
//      DO WHILE !Eof()
//         For n := 1 to FCount()
//            FieldPut( n, aData1[n] )
//         NEXT
//         SKIP
//      ENDDO
//      DELETE ALL
//      PACK
//   ENDIF
//   SELECT 8
//   USE serie index xserie
//   SELECT 13
//   GO BOTT
//   DO WHILE Recno() < 50
//      APPEND BLANK
//      REPLACE 13->zeile WITH Str(Recno(),2,0)
//   ENDDO
//   SUM 13->(&b_g) TO nSumme0 FOR Val( 13->rn ) = 0
//   SUM 13->(&b_g) TO nSumme1 FOR Val( 13->kennz ) = 1 .AND. Val(13->rn) < 4
//   SUM 13->(&b_g) TO nSumme2 FOR Val( 13->kennz ) = 2 .AND. Val(13->rn) < 4
//   SUM 13->(&b_g) TO nSumme3 FOR Val( 13->rn ) > 0 .AND. Val(13->rn) < 4
////////   SUM 13->(&b_g)*(1+zschl_voll/100) TO nSumme0a FOR Val( 13->rn ) = 0 .AND. Val( 13->kennz ) = 1
////////   SUM 13->(&b_g) TO nSumme0b FOR Val( 13->rn ) = 0 .AND. Val( 13->kennz ) = 2
////////   nSumme0 := nSumme0a + nSumme0b
////////   SUM 13->(&b_g)*(1+zschl_voll/100) TO nSumme1 FOR Val( 13->kennz ) = 1
////////   SUM 13->(&b_g) TO nSumme2 FOR Val( 13->kennz ) = 2
////////   SUM 13->(&b_g)*(1+zschl_voll/100) TO nSumme3a FOR Val( 13->rn ) > 0 .AND. Val( 13->kennz ) = 1
////////   SUM 13->(&b_g) TO nSumme3b FOR Val( 13->rn ) > 0 .AND. Val( 13->kennz ) = 2
////////   nSumme3 := nSumme3a + nSumme3b
////   SUM 13->(&b_g) TO nSumme0 FOR Val( 13->rn ) = 0
////   SUM 13->(&b_g) TO nSumme1 FOR Val( 13->rn ) = 1
////   SUM 13->(&b_g) TO nSumme2 FOR Val( 13->rn ) = 2
////   SUM 13->(&b_g) TO nSumme3 FOR Val( 13->rn ) = 3
//   nSumme := nSumme0 + nSumme3
//   GO TOP
//
//IF "U"$cDruck
//   cTitel := IIf( !"U"$cDruck, "Rechnung zu Auftrag "+cAuf+" / Verstorbener: "+ ;
//                        Trim(1->name)+", "+Trim(1->vorname)+" / Auftraggeber: "+;
//                        Trim(1->ansp_name)+", "+Trim(1->ansp_vname), ;
//                        "š B U N G S - Rechnung (Abspeichern nicht m”glich!)" )
//ELSE
//   cTitel := IIf( Upper(cDruck) = "BL_R", "Rechnung zu Auftrag "+cAuf+" / Verstorbener: "+ ;
//                        Trim(1->name)+", "+Trim(1->vorname)+" / Auftraggeber: "+ ;
//                        Trim(1->ansp_name)+", "+Trim(1->ansp_vname), ;
//                        "Angebot zu Vorvertrag "+cAuf+" / Kunde: "+ ;
//                        Trim(1->name)+", "+Trim(1->vorname) )
//ENDIF
//   // Standard Dialog erzeugen
//   oDlg := GuiStdDialog( cTitel, oDlg1, nV, nFontR, @oBrowse )    // @: weil sp„ter oBrowse gesetzt
//   IF Upper(cDruck) = "BL_V"
//      oDlg:drawingArea:setColorBG( GRA_CLR_GREEN )
//   ELSE
//      oDlg:drawingArea:setColorBG( GRA_CLR_YELLOW )
//   ENDIF
//
//
//   // Browser im Fenster erzeugen
//   oBrowse := GuiBrowseDb( oDlg:drawingArea,,, nV )
//   oBrowse:softTrack := .F.
//
//   // Spalten an Browser anfuegen
//   AddColumns( oBrowse )
//
//   // 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()
//
//   oXbp := XbpStatic():new( oDlg:drawingArea, ,  {int(20*nV),int(440*nV)}, {int(70*nV),int(25*nV)})
//   oXbp:caption := "Summe-0:"
//   oXbp:clipSiblings := .T.
//   oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
//   oXbp:create()
//   oSle0 := XbpSLE():new( oDlg:drawingArea, ,  {int(90*nV),int(440*nV)}, {int(65*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
//   oSle0:bufferLength := 8
//   oSle0:editable := .F.
//   oSle0:setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
//   oSle0:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
//   oSle0:group := XBP_WITHIN_GROUP
//   oSle0:dataLink := {|x| IIf( PCOUNT()==0, Transform( nSumme0, '99999.99' ), nSumme0 := Val(x)  ) }
//   oSle0:create():setData()
//
//   oXbp := XbpStatic():new( oDlg:drawingArea, ,  {int(150*nV),int(440*nV)}, {int(70*nV),int(25*nV)})
//   oXbp:caption := "Summe-E:"
//   oXbp:clipSiblings := .T.
//   oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
//   oXbp:create()
//   oSle1 := XbpSLE():new( oDlg:drawingArea, ,  {int(220*nV),int(440*nV)}, {int(65*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
//   oSle1:bufferLength := 8
//   oSle1:editable := .F.
//   oSle1:setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
//   oSle1:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
//   oSle1:group := XBP_WITHIN_GROUP
//   oSle1:dataLink := {|x| IIf( PCOUNT()==0, Transform( nSumme1, '99999.99' ), nSumme1 := Val(x)  ) }
//   oSle1:create():setData()
//
//   oXbp := XbpStatic():new( oDlg:drawingArea, ,  {int(280*nV),int(440*nV)}, {int(70*nV),int(25*nV)})
//   oXbp:caption := "Summe-F:"
//   oXbp:clipSiblings := .T.
//   oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
//   oXbp:create()
//   oSle2 := XbpSLE():new( oDlg:drawingArea, ,  {int(350*nV),int(440*nV)}, {int(65*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
//   oSle2:bufferLength := 8
//   oSle2:editable := .F.
//   oSle2:setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
//   oSle2:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
//   oSle2:group := XBP_WITHIN_GROUP
//   oSle2:dataLink := {|x| IIf( PCOUNT()==0, Transform( nSumme2, '99999.99' ), nSumme2 := Val(x)  ) }
//   oSle2:create():setData()
//
//   oXbp := XbpStatic():new( oDlg:drawingArea, ,  {int(410*nV),int(440*nV)}, {int(70*nV),int(25*nV)})
//   oXbp:caption := "Summe-N:"
//   oXbp:clipSiblings := .T.
//   oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
//   oXbp:create()
//   oSle3 := XbpSLE():new( oDlg:drawingArea, ,  {int(480*nV),int(440*nV)}, {int(65*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
//   oSle3:bufferLength := 8
//   oSle3:editable := .F.
//   oSle3:setInputFocus  := {|mp1,mp2,obj| HiliteSle( obj ) }
//   oSle3:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) }
//   oSle3:group := XBP_WITHIN_GROUP
//   oSle3:dataLink := {|x| IIf( PCOUNT()==0, Transform( nSumme3, '99999.99' ), nSumme3 := Val(x)  ) }
//   oSle3:create():setData()
//
//   oXbp := XbpStatic():new( oDlg:drawingArea, ,  {int(550*nV),int(440*nV)}, {int(70*nV),int(25*nV)})
//   oXbp:caption := "Gesamt:"
//   oXbp:clipSiblings := .T.
//   oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT
//   oXbp:create()
//   oSle := XbpSLE():new( oDlg:drawingArea, ,  {int(620*nV),int(440*nV)}, {int(65*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
//   oSle:bufferLength := 8
//   oSle:editable := .F.
//   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()
//
//   oPbDruck := XbpPushButton():new( oDlg:drawingArea, , {int(700*nV),int(440*nV)}, {int(50*nV),int(25*nV)} )
//   oPbDruck:caption := "~Druck"
////   oPbDruck:group := XBP_WITHIN_GROUP
//   oPbDruck:clipSiblings := .F.
//   oPbDruck:create()
//   oPbDruck:activate := {|| nGS := BlattDRG( cDruck,, oDlg:drawingArea,,, "P", "O", @nAnz, @nt ), ;
//                         SetAppFocus( oBrowse ) }
//  // Browser anzeigen und Focus geben
//   oDlg:setModalState( XBP_DISP_APPMODAL )
//   oDlg:show()
//   oBrowse:show()
//   SetAppFocus( oBrowse )
//
//   DO WHILE nEvent <> xbeP_Close
//      nEvent := AppEvent( @mp1, @mp2, @oXbp )
//      IF nEvent == xbeP_Close .AND. lFlucht != .T.
//                  IF nSumme0>99999.99 .OR.nSumme1>99999.99 .OR.nSumme2>99999.99 .OR.nSumme3>99999.99 ;
//                        .OR.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
//      ENDIF
//      IF nEvent == xbeP_Keyboard
//         DO CASE
//            CASE ( mp1 == xbeK_CTRL_INS .OR. mp1 == xbeK_ALT_E ) .AND. oXbp = oBrowse
//               nSumme := nSumme0 := nSumme1 := nSumme2 := nSumme3 := 0
//               R3TSatzeinfg()
//               oBrowse:refreshAll()
//            CASE mp1 == xbeK_CTRL_DEL .AND. oXbp = oBrowse
//               nSumme := nSumme0 := nSumme1 := nSumme2 := nSumme3 := 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:isDerivedFrom( "XbpSle" )
//               nFlucht := ConfirmBox( oCB, "Žnderungen speichern?", ;
//                           "Programm RECHNUNG beenden.", ;
//                           XBPMB_YESNOCANCEL, ;
//                           XBPMB_QUESTION )
//               IF nFlucht == XBPMB_RET_YES
//                  IF nSumme0>99999.99 .OR.nSumme1>99999.99 .OR.nSumme2>99999.99 .OR.nSumme3>99999.99 ;
//                        .OR.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( oBrowse )
//               ENDIF
//            CASE mp1 == xbeK_ALT_D .OR. mp1 == xbeK_CTRL_D
//               nGS := BlattDRG( cDruck,, oDlg:drawingArea,,, "P", "O", @nAnz, @nt )
//////               Rechbetr( nt, nGS, oDlg )
//               SetAppFocus( oPbDruck )
//            CASE mp1 == xbeK_ALT_G
//               nGS := BlattDRG( cDruck,, oDlg:drawingArea,,, "P", "O", @nAnz, @nt )
//////               Rechbetr( nt, nGS, oDlg )
//               SetAppFocus( oPbDruck )
//            CASE mp1 == xbeK_F1
//               ModalDialog( (cDatver+"f1_r3.dbf"), "Bedienungshinweise", oDlg:drawingArea, 680*nV, 460*nV )
//            CASE mp1 == xbeK_F10
//               IF nSumme0>99999.99 .OR.nSumme1>99999.99 .OR.nSumme2>99999.99 .OR.nSumme3>99999.99 ;
//                     .OR.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_F4 .AND. oBrowse:colPos = 1  .AND. IsMemberVar( oXbp, "value" )
//                  DbSuspendNotifications()
//               cArt := PadR( oXbp:value, 6 )
//               6->(DbSeek( cArt, .F. ))
//               IF .NOT. 6->(Eof())
//                  RZeileSpeichern( cAuf, 13 )
//               ELSE
//                  SET SOFTSEEK ON
//                  RechBSuch( cAuf, cArt, oDlg:drawingArea, nFontR, GRA_CLR_RED, 13 )
//                  SET SOFTSEEK OFF
//                  oXbp:setData( 13->zugr_z_st )
//               ENDIF
//               oBrowse:refreshAll()
//               DbResumeNotifications()
//            CASE (mp1 == xbeK_RETURN .OR. mp1 == xbeK_TAB .OR. mp1 == xbeK_SH_TAB) ;
//                           .AND. oBrowse:colPos = 1  .AND. IsMemberVar( oXbp, "value" )
//               cArt := PadR( oXbp:value, 6 )
//               IF !Empty(cArt) .AND. cArt != 13->zugr_z_st .AND. Val(cArt)>3
//                  DbSuspendNotifications()
//                  6->(DbSeek( cArt, .F. ))
//                  IF .NOT. 6->(Eof())
//                     RZeileSpeichern( cAuf, 13 )
//                  ELSE
//                     SET SOFTSEEK ON
//                     RechBSuch( cAuf, cArt, oDlg:drawingArea, nFontR, GRA_CLR_RED, 13 )
//                     SET SOFTSEEK OFF
//                     oXbp:setData( 13->zugr_z_st )
//                  ENDIF
//                  oBrowse:refreshAll()
//                  DbResumeNotifications()
//               ENDIF
//            CASE mp1 == xbeK_F4 .AND. oBrowse:colPos = 2  .AND. IsMemberVar( oXbp, "value" )
//                  cBez := Trim( oXbp:value )
//                  SET SOFTSEEK ON
//                  RechBSuch( cAuf, cArt, oDlg:drawingArea, nFontR, GRA_CLR_DARKCYAN, 13, cBez )
//                  SET SOFTSEEK OFF
//                  oXbp:setData( 13->&bezeichZ1 )
//                  oBrowse:refreshAll()
//            CASE (mp1 == xbeK_RETURN .OR. mp1 == xbeK_TAB .OR. mp1 == xbeK_SH_TAB) ;
//                           .AND. oBrowse:colPos = 2 .AND. IsMemberVar( oXbp, "value" )
//               IF 13->&bezeichZ1 != oXbp:value .or. Empty(13->kennz)
//                  REPLACE 13->&bezeichZ1 WITH oXbp:value
//                  DbSuspendNotifications()
//                  R3TSummenVor( 13 )     // wieso eigentlich??
//                  ckennz := 13->kennz
//                  cNt := 13->rn
//                  IF Val(13->zugr_z_st) == 0
//                     DbSkip(-1)
//                     cKennz := 13->kennz
//                     cNt := 13->rn
//                     DbSkip()
//                  ELSEIF Val(13->zugr_z_st) < 4
//                     ckennz := Str(Val(13->zugr_z_st),1,0)
//                     IF Upper((cNt := oSleR:getData())) == "R"
//                        cNt := " "
//                     ELSEIF Val((cNt := oSleR:getData())) > 0
//                     ENDIF
//                  ENDIF
//                  REPLACE 13->auftrnr WITH Val(cAuf)
//                  REPLACE 13->kennz WITH cKennz
//                  REPLACE 13->rn WITH cNt
//                  oBrowse:refreshAll()
//                  R3TSummenNach( 13 )     // wieso eigentlich??
//                  DbResumeNotifications()
//               ENDIF
//            CASE (mp1 == xbeK_F4 .OR. mp1 == xbeK_RETURN .OR. mp1 == xbeK_TAB .OR. mp1 == xbeK_SH_TAB) ;
//                   .AND. oBrowse:colPos = 3 .AND. IsMemberVar( oXbp, "value" )
//               IF 13->&b_g != oXbp:value .AND. !Empty(13->&bezeichZ1)
//                  R3TSummenVor( 13 )
//                  REPLACE 13->&b_g WITH oXbp:value
//                  R3TSummenNach( 13 )
//               ENDIF
////         CASE mp1 == xbeK_F5 .AND. IsMemberVar( oXbp, "value" ) ;
////                     .AND. oBrowse:colPos = 1 .AND. Upper(AppName())!="MUELLX.EXE"
//         CASE (mp1 == xbeK_F5 .AND. IsMemberVar( oXbp, "value" ) ;
//                     .AND. oBrowse:colPos = 1 .AND. !Upper(AppName())$"MUELLX.EXESINZIGX.EXE") .OR. ;
//              (mp1 == xbeK_CTRL_F5 .AND. IsMemberVar( oXbp, "value" ) ;
//                     .AND. oBrowse:colPos = 1 .AND. Upper(AppName())$"MUELLX.EXESINZIGX.EXE")
//            DbSuspendNotifications()
//            oXbp:setdata("")
//               SELECT 8
//               IF !Bof()
//                  skip -1
//               ENDIF
//               cArt := 8->art
//               SELECT 13
//               oFocusF := SetAppFocus()
//               cTab := RechBSuch( cAuf, cArt, oDlg:drawingArea, nFontR,, 13 )
//               oBrowse:refreshAll()
//            DbResumeNotifications()
//            IIf( cTab="TAB",, oBrowse:down() )
//            oBrowse:refreshAll()
//            oFocusF := oBrowse
//         CASE (mp1 == xbeK_F5 .AND. IsMemberVar( oXbp, "value" ) ;
//                     .AND. oBrowse:colPos = 1 .AND. Upper(AppName())$"MUELLX.EXESINZIGX.EXE") .OR. ;
//              (mp1 == xbeK_CTRL_F5 .AND. IsMemberVar( oXbp, "value" ) ;
//                     .AND. oBrowse:colPos = 1 .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
//               oBrowse:refreshAll()
//               oXbp:setData( 8->art )
//            DbResumeNotifications()
//            oFocusF := oBrowse
////         CASE mp1 == xbeK_F6 .AND. IsMemberVar( oXbp, "value" ) .AND. Upper(AppName())!="MUELLX.EXE"
//         CASE (mp1 == xbeK_F6 .AND. IsMemberVar( oXbp, "value" ) ;
//                     .AND. oBrowse:colPos = 1 .AND. !Upper(AppName())$"MUELLX.EXESINZIGX.EXE") .OR. ;
//              (mp1 == xbeK_CTRL_F6 .AND. IsMemberVar( oXbp, "value" ) ;
//                     .AND. oBrowse:colPos = 1 .AND. Upper(AppName())$"MUELLX.EXESINZIGX.EXE")
//            DbSuspendNotifications()
//            oXbp:setdata("")
//            SELECT 8
//            IF !Eof()
//               skip 1
//            ENDIF
//            cArt := 8->art
//            SELECT 13
//            cTab := RechBSuch( cAuf, cArt, oDlg:drawingArea, nFontR,, 13 )
//            oBrowse:refreshAll()
//            DbResumeNotifications()
//            IIf( cTab="TAB",, oBrowse:down() )
//            oBrowse:refreshAll()
//         CASE (mp1 == xbeK_F6 .AND. IsMemberVar( oXbp, "value" ) ;
//                     .AND. oBrowse:colPos = 1 .AND. Upper(AppName())$"MUELLX.EXESINZIGX.EXE") .OR. ;
//              (mp1 == xbeK_CTRL_F6 .AND. IsMemberVar( oXbp, "value" ) ;
//                     .AND. oBrowse:colPos = 1 .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
//            oBrowse:refreshAll()
//            oXbp:setData( 8->art )
//            DbResumeNotifications()
//         ENDCASE
//      ENDIF
//      oXbp:handleEvent( nEvent, mp1, mp2 )
//   ENDDO
//
//   oDlg:setModalState( XBP_DISP_MODELESS )
//   oDlg:destroy()
//   SetAppFocus( oFocus )
//
//   SELECT 13
//   IF lFlucht == .F. .AND. !"U"$cDruck              // ESC-Taste: lFlucht = .T.
//      GO TOP
//      REPLACE ALL 13->auftrnr WITH Val( cAuf ) FOR !Empty(13->bezeich)
//      DELETE ALL FOR 13->auftrnr <> Val( cAuf ) .AND. Empty(13->bezeich)
//      PACK
//      IF Upper(AppName())$"MENGX.EXE"
//         INDEX ON StrZero(auftrnr,6,0)+rn+kennz+zeile TO xtemp
//      ELSE
//         INDEX ON Str(auftrnr,6,0)+rn+kennz+zeile TO xtemp
//      ENDIF
//      IF Upper(AppName()) == "DISCHX.EXE"
//         SELECT 11
//         USE tauftr EXCLUSIVE
//      ENDIF
//      SELECT 3
//      FIND &cAuf
//      nZeile := 0
//     FOR nt := 0 TO IIf(Upper(AppName())="MUELLX.EXE",4,3)
//      SELECT 13
//      IF .NOT. Bof()
//         GO TOP
//      ENDIF
//      nGS := 0
//      DO WHILE .NOT. Eof()
//         IF Val( 13->rn ) <> nt
//            SKIP
//            LOOP
//         ENDIF
//         ++nZeile
//         For n := 1 to FCount()
//            aData2[n] := FieldGet( n )
//         NEXT
////         delete                            // oder nicht delete ?????
//         SELECT 3
//         IF nZeile <= Len( a3 )           // wenn Zeile NICHT neu, dann Artikel vor-korrigieren
//            c3 := Str( a3[nZeile] )
//            GO &c3
//            IF Upper(cDruck) != "BL_VR"   // Vorvertrag „ndert nicht die Artikelbest„nde
//               IF 3->auftrnr == Val(cAuf) .and. nt < 4  // 17.3.03: jetzt hier:
//            //  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
//                     IIf( IsFieldVar("umsatzeu"), 6->umsatzeu := 6->umsatzeu - 3->betrageu, )
//                     DbRUnlock( Recno() )
//                     SELECT 3
//            //
//               ENDIF
//            ENDIF
//            IIf( 3->auftrnr == Val( cAuf ), Satzsp( oDlg1 ), SatzAppend() )  // entweder lock ...
//         ELSE
//            APPEND BLANK                                                   // ... oder append
//         ENDIF
//         For n := 1 to FCount()
//            FieldPut( n, aData2[n] )
//         NEXT
//         REPLACE 3->zeile WITH Str( nZeile,2,0 )
//         DbRUnlock( Recno() )                                              // ... und unlock
//         nGS := nGS + 3->&b_g
//         IF Upper(AppName()) == "DISCHX.EXE"
//            n4 := 0
//            aDataD := SatzDiff( 13, @aData1, @aData2, "AUFTR" )
//            SELECT 11
//               APPEND BLANK
//               SatzPut( 11, RecNo(), aData1, "0" )
//               APPEND BLANK
//               SatzPut( 11, RecNo(), aData2, "0" )
//               APPEND BLANK
//               SatzPut( 11, RecNo(), aDataD, "0" )
//               SKIP                                   // damit eof entsteht
//         ENDIF
//         IF Upper(cDruck) != "BL_VR"   // Vorvertrag „ndert nicht die Artikelbest„nde
//            IF nt < 4
//      //  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
//               IIf( IsFieldVar("umsatzeu"), 6->umsatzeu := 6->umsatzeu + 3->betrageu, )
//               DbRUnlock( Recno() )
//      //
//            ENDIF
//         ENDIF
//         SELECT 13
//         SKIP
//      ENDDO
//      IF nt<4
//         Rechbetr( nt, nGS, oDlg )
//      ENDIF
//     NEXT
//      USE
//      SELECT 3
//      DO WHILE nZeile < Len( a3 ) .AND. .NOT. Eof()
//         c3 := Str( a3[++nZeile] )
//         GO &c3
//         IF 3->auftrnr == Val( cAuf )
//            IF Upper(cDruck) != "BL_VR"   // Vorvertrag „ndert nicht die Artikelbest„nde
//            //  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
//                     IIf( IsFieldVar("umsatzeu"), 6->umsatzeu := 6->umsatzeu - 3->betrageu, )
//                     DbRUnlock( Recno() )
//                     SELECT 3
//            //
//            ENDIF
//            SatzDelete()
//         ENDIF
//      ENDDO
//      IF Upper(AppName()) == "DISCHX.EXE"
//         SELECT 11
//         USE
//      ENDIF
//   ELSE
//      USE
////      3->(DbUnlock())       // wozu ??
//   ENDIF
//   SELECT 8
//   USE
//   FErase( cDatver+cAuf3temp+".dbf" )
//   Select &nOldArea
//RETURN
//
//
******************************************************************
* GUI Browser mit Navigations-Codebloecken erzeugen
******************************************************************
FUNCTION GuiBrowseDB( oParent, aPos, aSize, nV )
   LOCAL oBrowse

   IF Empty(aPos)
      oBrowse := XbpBrowse():new( oParent,, {5,int(5*nV)}, {int(760*nV),int(420*nV)},, .F. ):create()
   ELSE
      oBrowse := XbpBrowse():new( oParent,, aPos, ASize,, .F. ):create()
   ENDIF

   // Navigations Codebloecke fuer den Browser
   oBrowse:skipBlock     := {|n| DbSkipper(n) }
   oBrowse:goTopBlock    := {| | DbGoTop()    }
   oBrowse:goBottomBlock := {| | DbGoBottom() }
   oBrowse:phyPosBlock   := {| | Recno()      }

   // Codebloecke fuer den vertikalen Scrollbar.
   // Hinweis: DbPosition() liefert Werte zwischen 0 und 100.
   oBrowse:posBlock      := {| | DbPosition()    }
   oBrowse:goPosBlock    := {|n| DbGoPosition(n) }
   oBrowse:lastPosBlock  := {| | 100             }
   oBrowse:firstPosBlock := {| | 0               }

RETURN oBrowse


******************************************************************
* Standard Dialog unsichtbar erzeugen
******************************************************************
FUNCTION GuiStdDialog( cTitle, oDlg1, nV, nFontR, oBrowse )
   LOCAL oDlg
//   LOCAL aSize := {600,400}
//   LOCAL aPos  := CenterPos( aSize, AppDesktop():currentSize() )

//   DEFAULT cTitle TO "Standard Dialog Window"

   oDlg          := AKDialog():new( AppDeskTop(), oDlg1:cargo, {10,int(30*nV)}, {int(770*nV),int(500*nV)},, .F. )
   oDlg:icon     := 1
   oDlg:taskList := .T.
   oDlg:title    := cTitle
   oDlg:drawingArea:ClipChildren := .T.
//   oDlg:setInputFocus := {|| SetAppFocus( IIf( oFocusF:isDerivedFrom("XbpBrowse"), oBrowse, oFocusF ) ) }    // damit die Tabelle den Focus bekommt
   oDlg:create()
   oDlg:drawingArea:setFontCompoundName( nFontR )
   oDlg:drawingArea:cargo := oDlg
RETURN oDlg


FUNCTION CenterPos( aSize, aRefSize )
RETURN { Int( (aRefSize[1] - aSize[1]) / 2 ) ;
       , Int( (aRefSize[2] - aSize[2]) / 2 ) }


******************************************************************
* Wert in Feld schreiben wenn Datensatz gesperrt werden kann
******************************************************************
FUNCTION WriteField( cField, xValue )
   PRIVATE nA := SELECT()
   IF DbRLock(RecNo())
/////*****
      IF nA == 13 .OR. nA == 14
         R3TSummenVor( nA )
      ENDIF
*****/////
      &cField := xValue
////      IF cField = "(nA)->menge"
////         (nA)->ges_preis := xValue * (nA)->&b_g
////      ENDIF
////      IF cField = "(nA)->&b_g"
////         (nA)->ges_preis := xValue * (nA)->menge
////      ENDIF
/////*****
      IF nA == 13 .OR. nA == 14
         R3TSummenNach( nA )
      ENDIF
*****/////
      DbRUnlock(RecNo())
   ENDIF
RETURN xValue



******************************************************************
* Spalten fuer Browser definieren
******************************************************************
PROCEDURE AddColumns( oBrowse, H, S )
   LOCAL nA := SELECT()
   LOCAL aPP, oColumn, bBlock
   aPP := { { XBP_PP_COL_HA_CAPTION          , ""               }, ;
            { XBP_PP_COL_FA_CAPTION          , ""               }, ;
            { XBP_PP_COL_DA_FGCLR            , GRA_CLR_BLACK    }, ;
            { XBP_PP_COL_DA_BGCLR            , GRA_CLR_WHITE    }, ;
            { XBP_PP_COL_DA_HILITE_FGCLR     , GRA_CLR_WHITE    }, ;
            { XBP_PP_COL_DA_HILITE_BGCLR     , GRA_CLR_DARKGRAY }, ;
            { XBP_PP_COL_DA_HILITEFRAMELAYOUT, XBPFRAME_BOX + XBPFRAME_RECT + XBPFRAME_DOTTED }, ;
            { XBP_PP_COL_DA_CELLFRAMELAYOUT  , XBPFRAME_BOX + XBPFRAME_RAISED               }, ;
            { XBP_PP_COL_DA_ROWSEPARATOR     , XBPCOL_SEP_LINE            }, ;
            { XBP_PP_COL_DA_COLSEPARATOR     , XBPCOL_SEP_NONE            }, ;
            { XBP_PP_COL_DA_FRAMELAYOUT      , XBPFRAME_BOX               }, ;
            { XBP_PP_COL_DA_HILITE_BGCLR     , XBPSYSCLR_HILITEBACKGROUND }  }

//Stapel:
   IF !Empty(S)
      bBlock               := {|x| IIf(x==NIL, (nA)->auftrnr, (nA)->(WriteField( "(nA)->auftrnr", x )) ) }
      aPP[1,2]             := "AuftrNr"
      aPP[2,2]             := "AuftrNr"
      oColumn              := XbpGetColumn():new( oBrowse,,,, aPP )
      oColumn:dataLink     := bBlock
      oColumn:bufferLength := Len( Str(Eval( bBlock )) )
      oBrowse:addColumn( oColumn )
   ENDIF

   bBlock               := {|x| IIf(x==NIL, (nA)->ZUGR_Z_ST, (nA)->(WriteField( "(nA)->ZUGR_Z_ST", x )) ) }
   aPP[1,2]             := "Art-Nr."
   aPP[2,2]             := "<F4/5/6>"
   oColumn              := XbpGetColumn():new( oBrowse,,,, aPP )
   oColumn:dataLink     := bBlock
   oColumn:bufferLength := Len( Eval( bBlock ) )
   oBrowse:addColumn( oColumn )

   bBlock               := {|x| IIf(x==NIL, (nA)->BEZEICH, (nA)->(WriteField( "(nA)->BEZEICH", x )) ) }
   aPP[1,2]             := "Leistungs-Bezeichnung"
   aPP[2,2]             := "<F4> zur Suche nach Zeichenketten"
   oColumn              := XbpGetColumn():new( oBrowse,,,, aPP )
   oColumn:dataLink     := bBlock
   oColumn:bufferLength := Len( Eval( bBlock ) )
   oBrowse:addColumn( oColumn )

   bBlock               := {|x| IIf(x==NIL, (nA)->&b_g, (nA)->(WriteField( "(nA)->&b_g", x )) ) }
   aPP[1,2]             := "Betrag/"+w_g
   aPP[2,2]             := "Betrag/"+w_g
   oColumn              := XbpGetColumn():new( oBrowse,,,, aPP )
   oColumn:dataLink     := bBlock
   oColumn:bufferLength := Len( Str(Eval( bBlock )) )
   oBrowse:addColumn( oColumn )

//Stapel:
   IF !Empty(S)
      bBlock               := {|x| IIf(x==NIL, (nA)->kass_betr, (nA)->(WriteField( "(nA)->kass_betr", x )) ) }
      aPP[1,2]             := "Kasse/"+w_g
      aPP[2,2]             := "Kasse/"+w_g
      oColumn              := XbpGetColumn():new( oBrowse,,,, aPP )
      oColumn:dataLink     := bBlock
      oColumn:bufferLength := Len( Str(Eval( bBlock )) )
      oBrowse:addColumn( oColumn )

      bBlock               := {|x| IIf(x==NIL, (nA)->gebucht, (nA)->(WriteField( "(nA)->gebucht", x )) ) }
      aPP[1,2]             := "buc"
      aPP[2,2]             := "_,x"
      oColumn              := XbpGetColumn():new( oBrowse,,,, aPP )
      oColumn:dataLink     := bBlock
      oColumn:bufferLength := Len( Eval( bBlock ) )
      oBrowse:addColumn( oColumn )
   ENDIF

//Handel:
   IF !Empty(H)
      bBlock               := {|x| IIf(x==NIL, (nA)->menge, (nA)->(WriteField( "(nA)->menge", x )) ) }
      aPP[1,2]             := "Stck"
      aPP[2,2]             := "Stck"
      oColumn              := XbpGetColumn():new( oBrowse,,,, aPP )
      oColumn:dataLink     := bBlock
      oColumn:bufferLength := Len( Str(Eval( bBlock )) )
      oBrowse:addColumn( oColumn )
   
      bBlock               := {|x| IIf(x==NIL, (nA)->ges_preis, (nA)->(WriteField( "(nA)->ges_preis", x )) ) }
      aPP[1,2]             := "Gesamt/"+w_g
      aPP[2,2]             := "Gesamt/"+w_g
      oColumn              := XbpGetColumn():new( oBrowse,,,, aPP )
      oColumn:dataLink     := bBlock
      oColumn:bufferLength := Len( Str(Eval( bBlock )) )
      oColumn:editable     := .F.
      oColumn:TabStop      := .F.
      oBrowse:addColumn( oColumn )
   ENDIF

   bBlock               := {|x| IIf(x==NIL, (nA)->KENNZ, (nA)->(WriteField( "(nA)->KENNZ", x )) ) }
   aPP[1,2]             := "EL/FL"
   aPP[2,2]             := "1,2"
   oColumn              := XbpGetColumn():new( oBrowse,,,, aPP )
   oColumn:dataLink     := bBlock
   oColumn:bufferLength := Len( Eval( bBlock ) )
   oColumn:editable     := .F.
   oColumn:TabStop      := .F.
   oBrowse:addColumn( oColumn )

   bBlock               := {|x| IIf(x==NIL, (nA)->RN, (nA)->(WriteField( "(nA)->RN", x)) ) }
   aPP[1,2]             := "Rg/NRg"
   aPP[2,2]             := "_,1,2,3"
   oColumn              := XbpGetColumn():new( oBrowse,,,, aPP )
   oColumn:dataLink     := bBlock
   oColumn:bufferLength := Len( Eval( bBlock ) )
   oColumn:editable     := .F.
   oColumn:TabStop      := .F.
   oBrowse:addColumn( oColumn )

   bBlock               := {|x| IIf(x==NIL, (nA)->ZEILE, (nA)->(WriteField( "(nA)->ZEILE", x)) ) }
   aPP[1,2]             := "Zeile"
   aPP[2,2]             := "Zeile"
   oColumn              := XbpGetColumn():new( oBrowse,,,, aPP )
   oColumn:dataLink     := bBlock
   oColumn:bufferLength := Len( Eval( bBlock ) )
   oColumn:editable     := .T.
   oColumn:TabStop      := .F.
   oBrowse:addColumn( oColumn )

RETURN


FUNCTION RechBSuch( cAuf, cArt, oDlg1, nFontR, nColor, nA, cSuchfeld )
   LOCAL oDlg, nEvent, mp1, mp2
   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 lFlucht := .F., cTab := "RET"
   PRIVATE oCB
   (nA)->(DbSuspendNotifications())
   SELECT 6
   IF !Empty(cSuchfeld)
      6->(DbSetFilter( {|| Trim(cSuchFeld)$6->&bezZ1 } ))
      IIf( !(6)->(Bof()), 6->(DbGotop()), )
   ELSE
      FIND &cArt
   ENDIF

   oDlg := AKDialog():new( AppDesktop(), oDlg1:cargo )
   oDlg:tasklist := .T.
   oDlg:title := "Artikel/Leistung ausw„hlen"
   oDlg:maxButton := .F.
   oDlg:moveWithOwner := .F.
   oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED
   oDlg:create(,, {10,10}, {int(740*nV),int((1+nBrowH)*150*nV)} )

//   oDlg:drawingArea:setFontCompoundName( "8.Arial" )
   oDlg:drawingArea:setColorBG( GRA_CLR_DARKGREEN )
   oCB := oDlg:drawingArea

   APPBROWSE ;
        PARENT oDlg:drawingArea ;
        POSITION TOP ;
        FONT (nFontR) ;
        SIZE 100,100 PERCENT

   APPFIELD art_lei COLOR nCOLOR CAPTION "Art-Nr."
   APPFIELD &bezZ1 COLOR nCOLOR CAPTION "Leistung (Zeile1)" WIDTH nBezWb1
   IF nBezZeil == 2
      APPFIELD &bezZ2 COLOR nCOLOR CAPTION "Leistung (Zeile2)" WIDTH nBezWb2
   ENDIF
   APPFIELD &v_p_s COLOR nCOLOR CAPTION "Preis/"+w_g
   APPFIELD ausg COLOR nCOLOR CAPTION "K"

   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_TAB
            cTab := "TAB"
            PostAppEvent( xbeP_Close)
         CASE mp1 == xbeK_ESC
            lFlucht := .T.
            PostAppEvent( xbeP_Close)
         CASE mp1 == xbeK_F5 .OR. mp1 == xbeK_CTRL_F5
            SELECT 8
            if .not. Bof()
               skip -1
            endif
            cArt := 8->art
            SELECT 6
            FIND &cArt
         CASE mp1 == xbeK_F6 .OR. mp1 == xbeK_CTRL_F6
            SELECT 8
            if .not. Eof()
               skip 1
            endif
            cArt := 8->art
            SELECT 6
            FIND &cArt
      ENDCASE
      ENDIF
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO
   oDlg:setModalState( XBP_DISP_MODELESS )
   oDlg:destroy()
   6->(DbClearFilter())

   SELECT &nA
   IF lFlucht = .F.               // ESC-Taste: lFlucht = .T.
      REPLACE (nA)->auftrnr WITH Val( cAuf )
      REPLACE (nA)->zeile WITH Str( Recno(),2,0 )
      REPLACE (nA)->kennz WITH 6->ausg
      REPLACE (nA)->mwst_schl WITH 6->mwst_schl
      REPLACE (nA)->zugr_z_st WITH 6->art_lei
      (nA)->neu := IIf( 6->konto="1000", "ka", "  " )
      REPLACE (nA)->&bezeichZ1 WITH 6->&bezZ1
      IF nA == 13
         R3TSummenVor( nA )
      ENDIF
      IF !Upper(AppName())$"BERGX.EXESANDERX.EXE"
         REPLACE (nA)->&b_g WITH 6->&v_p_s                  //Handel
         IF Upper(AppName())="RAGUSEX.EXE"
            REPLACE (nA)->menge WITH 1
            REPLACE (nA)->ges_preis WITH 6->&v_p_s
         ENDIF
//         REPLACE (nA)->&b_gh WITH 6->&v_p_sh
         IIf( IsFieldVar("&b_gh"), (nA)->&b_gh := 6->&v_p_sh, )
      ENDIF
      IF Upper((cNt := oSleR:getData())) == "R" // Nolte/Lange-Spezial: keine Nachrechnungs-Automatik
         REPLACE (nA)->rn WITH " "
      ELSEIF Val((cNt := oSleR:getData())) > 0
         REPLACE (nA)->rn WITH cNt
      ENDIF
      IF nA == 13
         R3TSummenNach( nA )
      ENDIF
      IF nBezZeil == 2
         IF !Empty(6->&bezZ2)
            ckennz := (nA)->kennz
            cNt := (nA)->rn
            (nA)->(DbSkip())
            IIf( (nA)->(Eof()), (nA)->(DbAppend()), IIf(!Empty((nA)->&bezeichZ1),R3TSatzeinfg(),))
            REPLACE (nA)->&bezeichZ1 WITH 6->&bezZ2
            REPLACE (nA)->auftrnr WITH Val( cAuf )
            REPLACE (nA)->kennz WITH ckennz
            REPLACE (nA)->rn WITH cNt
            REPLACE (nA)->zeile WITH Str( Recno(),2,0 )
            IF Upper(AppName())$"BERGX.EXESANDERX.EXE"
               REPLACE (nA)->&b_g WITH 6->&v_p_s
               REPLACE (nA)->&b_gh WITH 6->&v_p_sh
            ENDIF
            (nA)->(DbSkip(-1))
         ELSE
            IF Upper(AppName())$"BERGX.EXESANDERX.EXE"
               REPLACE (nA)->&b_g WITH 6->&v_p_s
               REPLACE (nA)->&b_gh WITH 6->&v_p_sh
            ENDIF
         ENDIF
      ENDIF
   ENDIF
   Select &nOldArea
   (nA)->(DbResumeNotifications())
   (nA)->(DbSkip(0))
RETURN cTab

PROCEDURE RZeileSpeichern( cAuf )
   LOCAL nA := SELECT()
                  DbSuspendNotifications()
      REPLACE (nA)->auftrnr WITH Val( cAuf )
      REPLACE (nA)->zeile WITH Str( Recno(),2,0 )
      REPLACE (nA)->kennz WITH 6->ausg
      REPLACE (nA)->mwst_schl WITH 6->mwst_schl
      REPLACE (nA)->zugr_z_st WITH 6->art_lei
      (nA)->neu := IIf( 6->konto="1000", "ka", "  " )
      REPLACE (nA)->&bezeichZ1 WITH 6->&bezZ1
      IF nA == 13
         R3TSummenVor( nA )
      ENDIF
      IF !Upper(AppName())$"BERGX.EXESANDERX.EXE"
         REPLACE (nA)->&b_g WITH 6->&v_p_s                  // Handel:
         IF Upper(AppName())="RAGUSEX.EXE"
            REPLACE (nA)->menge WITH 1
            REPLACE (nA)->ges_preis WITH 6->&v_p_s
         ENDIF
//         REPLACE (nA)->&b_gh WITH 6->&v_p_sh
         IIf( IsFieldVar("&b_gh"), (nA)->&b_gh := 6->&v_p_sh, )
      ENDIF
      IF Upper((cNt := oSleR:getData())) == "R" // Nolte/Lange-Spezial: keine Nachrechnungs-Automatik
         REPLACE (nA)->rn WITH " "
      ELSEIF Val((cNt := oSleR:getData())) > 0
         REPLACE (nA)->rn WITH cNt
      ENDIF
   //   DbCommit()
   //   nRec := Recno()
      IF nA == 13
         R3TSummenNach( nA )
      ENDIF
         IF nBezZeil == 2
            IF !Empty(6->&bezZ2)
               ckennz := (nA)->kennz
               cNt := (nA)->rn
               (nA)->(DbSkip())
               IIf( (nA)->(Eof()), (nA)->(DbAppend()), IIf(!Empty((nA)->&bezeichZ1),R3TSatzeinfg(),))
               REPLACE (nA)->&bezeichZ1 WITH 6->&bezZ2
               REPLACE (nA)->auftrnr WITH Val( cAuf )
               REPLACE (nA)->kennz WITH ckennz
               REPLACE (nA)->rn WITH cNt
               REPLACE (nA)->zeile WITH Str( Recno(),2,0 )
               IF Upper(AppName())$"BERGX.EXESANDERX.EXE"
                  REPLACE (nA)->&b_g WITH 6->&v_p_s
//                  REPLACE (nA)->&b_gh WITH 6->&v_p_sh
                  IIf( IsFieldVar("&b_gh"), (nA)->&b_gh := 6->&v_p_sh, )
               ENDIF
               (nA)->(DbSkip(-1))
            ELSE
               IF Upper(AppName())$"BERGX.EXESANDERX.EXE"
                  REPLACE (nA)->&b_g WITH 6->&v_p_s
//                  REPLACE (nA)->&b_gh WITH 6->&v_p_sh
                  IIf( IsFieldVar("&b_gh"), (nA)->&b_gh := 6->&v_p_sh, )
               ENDIF
            ENDIF
         ENDIF
         DbResumeNotifications()
RETURN

FUNCTION Rechbetr( nt, nGS, oDlg1 )
   LOCAL nOldArea := Select()
   IF nGS == NIL
      RETURN .T.
   ENDIF
   SELECT 1
   IF Round(&r_b_0,2) <> Round(nGS,2) .AND. nt = 0
      satzsp( oDlg1 )
      IF xdmeu="D"
         repl &r_b_0 with nGS
//         repl &r_b_0h with nGS/xFaktor
         IIf( IsFieldVar("&r_b_0h"), 1->&r_b_0h := nGS/xFaktor, )
      ELSE
         repl &r_b_0 with nGS
//         repl &r_b_0h with nGS*xFaktor
         IIf( IsFieldVar("&r_b_0h"), 1->&r_b_0h := nGS*xFaktor, )
      ENDIF
      DbRUnlock( Recno() )
   ENDIF
   IF Round(&r_b_1,2) <> Round(nGS,2) .AND. nt = 1
      satzsp( oDlg1 )
      IF xdmeu="D"
         repl &r_b_1 with nGS
//         repl &r_b_1h with nGS/xFaktor
         IIf( IsFieldVar("&r_b_1h"), 1->&r_b_1h := nGS/xFaktor, )
      ELSE
         repl &r_b_1 with nGS
//         repl &r_b_1h with nGS*xFaktor
         IIf( IsFieldVar("&r_b_1h"), 1->&r_b_1h := nGS*xFaktor, )
      ENDIF
      DbRUnlock( Recno() )
   ENDIF
   IF Round(&r_b_2,2) <> Round(nGS,2) .AND. nt = 2
      satzsp( oDlg1 )
      IF xdmeu="D"
         repl &r_b_2 with nGS
//         repl &r_b_2h with nGS/xFaktor
         IIf( IsFieldVar("&r_b_2h"), 1->&r_b_2h := nGS/xFaktor, )
      ELSE
         repl &r_b_2 with nGS
//         repl &r_b_2h with nGS*xFaktor
         IIf( IsFieldVar("&r_b_2h"), 1->&r_b_2h := nGS*xFaktor, )
      ENDIF
      DbRUnlock( Recno() )
   ENDIF
   IF Round(&r_b_3,2) <> Round(nGS,2) .AND. nt = 3
      satzsp( oDlg1 )
      IF xdmeu="D"
         repl &r_b_3 with nGS
//         repl &r_b_3h with nGS/xFaktor
         IIf( IsFieldVar("&r_b_3h"), 1->&r_b_3h := nGS/xFaktor, )
      ELSE
         repl &r_b_3 with nGS
//         repl &r_b_3h with nGS*xFaktor
         IIf( IsFieldVar("&r_b_3h"), 1->&r_b_3h := nGS*xFaktor, )
      ENDIF
      DbRUnlock( Recno() )
   ENDIF
   satzsp(oDlg1)
   1->&r_s := 1->&r_b_0 + 1->&r_b_1 + 1->&r_b_2 + 1->&r_b_3
//   1->&r_sh := 1->&r_b_0h + 1->&r_b_1h + 1->&r_b_2h + 1->&r_b_3h
   IIf( IsFieldVar("&r_sh"), 1->&r_sh := 1->&r_b_0h + 1->&r_b_1h + 1->&r_b_2h + 1->&r_b_3h, )
   1->&t_l := 1->&r_s - 1->&v_m
//   1->&t_lh := 1->&r_sh - 1->&v_mh
   IIf( IsFieldVar("&t_lh"), 1->&t_lh := 1->&r_sh - 1->&v_mh, )
   DbRUnlock(RecNo())
   Select &nOldArea
RETURN .T.

FUNCTION R3TSatzEinfg( lDel )
   LOCAL nA := SELECT()
   LOCAL aBlattSE := {} , aBlattZSE[FCount()]
   LOCAL nRec := RecNo()
//   nSumme := nSumme0 := nSumme1 := nSumme2 := nSumme3 := 0
   lDel := IIf( lDel<>NIL, lDel, .F. )
   APPEND BLANK
   aBlattZSE := R3TSatzLese()                    // 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, R3TSatzLese() )
         ELSEIF nRec = Recno() .AND. lDel       // l„át den aktuellen Satz aus
         ELSE
            AAdd( aBlattSE, R3TSatzLese() )
         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 (nA)->(IsFieldVar("zeile"))
         REPLACE (nA)->zeile WITH Str( Recno(), 2, 0 )
      ENDIF
      R3TSummenNach( nA, 0 )
   NEXT
   IF nA = 13
      oSle0:setdata( Str( nSumme0,8,2 ) )
      oSle1:setdata( Str( nSumme1,8,2 ) )
      oSle2:setdata( Str( nSumme2,8,2 ) )
      oSle3:setdata( Str( nSumme3,8,2 ) )
      nSumme := nSumme0 + nSumme3
      oSle:setdata( Str( nSumme,8,2 ) )
   ELSEIF nA = 14
      oSle:setdata( Str( nSumme,8,2 ) )
   ELSEIF nA = 19
//////      oSle:setdata( Str( nSumme,8,2 ) )
   ENDIF
   GO nRec
RETURN .T.

FUNCTION R3TSatzLese()
   LOCAL aValue := Array( FCount() )
   FOR n := 1 TO FCount()
      aValue[n] := FieldGet(n)
   NEXT
RETURN aValue

PROCEDURE R3TSummenVor( nA )
      LOCAL nM := IIf( !(nA)->(IsFieldVar("menge")), 1, (nA)->menge )
      IF nA = 13
         IF (nA)->rn = " " .or. (nA)->rn = "0"
            nSumme0 := nSumme0 - (nA)->&b_g * nM         //Handel
         ENDIF
         IF (nA)->kennz = "1" .AND. Val((nA)->rn) < 4
            nSumme1 := nSumme1 - (nA)->&b_g * nM
         ENDIF
         IF (nA)->kennz = "2" .AND. Val((nA)->rn) < 4
            nSumme2 := nSumme2 - (nA)->&b_g * nM
         ENDIF
         IF Val((nA)->rn) > 0 .AND. Val((nA)->rn) < 4
            nSumme3 := nSumme3 - (nA)->&b_g * nM
         ENDIF
      ELSEIF nA = 14
         nSumme -= IIf(Empty((nA)->gebucht), (nA)->kass_betr * nM, 0 )
      ELSEIF nA = 19
         nSumme0 -= (nA)->&e_n
         nSumme1 -= (nA)->&a_g
         nSumme2 = nSumme0 - nSumme1
         nSumme = nSumme2 + nSumme3
      ENDIF
RETURN

PROCEDURE R3TSummenNach( nA, s )
      LOCAL nM := IIf( !(nA)->(IsFieldVar("menge")), 1, (nA)->menge )
      IF nA = 13
         IF (nA)->rn = " " .or. (nA)->rn = "0"
            nSumme0 := nSumme0 + (nA)->&b_g * nM
            oSle0:setdata( Str( nSumme0,8,2 ) )
         ENDIF
         IF (nA)->kennz = "1" .AND. Val((nA)->rn) < 4
            nSumme1 := nSumme1 + (nA)->&b_g * nM
            oSle1:setdata( Str( nSumme1,8,2 ) )
         ENDIF
         IF (nA)->kennz = "2" .AND. Val((nA)->rn) < 4
            nSumme2 := nSumme2 + (nA)->&b_g * nM
            oSle2:setdata( Str( nSumme2,8,2 ) )
         ENDIF
         IF Val((nA)->rn) > 0 .AND. Val((nA)->rn) < 4
            nSumme3 := nSumme3 + (nA)->&b_g * nM
            oSle3:setdata( Str( nSumme3,8,2 ) )
         ENDIF
         IF s == 0
            RETURN
         ENDIF
         nSumme := nSumme0 + nSumme3
      ELSEIF nA = 14
         nSumme += IIf(Empty((nA)->gebucht), (nA)->kass_betr * nM, 0 )
      ELSEIF nA = 19
         nSumme0 += (nA)->&e_n
         oSle0:setdata( Str( nSumme0,8,2 ) )
         nSumme1 += (nA)->&a_g
         oSle1:setdata( Str( nSumme1,8,2 ) )
         nSumme2 = nSumme0 - nSumme1
         oSle2:setdata( Str( nSumme2,8,2 ) )
         nSumme := nSumme2 + nSumme3
      ENDIF
      oSle:setdata( Str( nSumme,8,2 ) )
RETURN

//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
//         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

FUNCTION RDatum(cTtmm)     // 2.5.04 : in bl_r statt date()
   LOCAL dDatum := DATE()
   IF Empty(cTtmm)
      dDatum := IIf(!Empty(1->beerd_dat),1->beerd_dat,DATE())
   ELSE
      dDatum := CtoD( SubStr(13->ttmm,1,2)+"."+SubStr(13->ttmm,3,2)+"."+ ;
                  IIf( !Empty(1->beerd_dat),Str(Year(1->beerd_dat)), ;
                  IIf(Month(DATE()) >= Val(SubStr(13->ttmm,3,2)), Str(Year(DATE()),4), ;
                  Str(Year(DATE())-1,4) )) )
//                  IIf( Month(DATE()) >= Val(SubStr(13->ttmm,3,2)), Str(Year(DATE()),4), ;
//                  Str(Year(DATE())-1,4) ) )
   ENDIF
RETURN dDatum