**BRegieARo.prg   -  Regie-Zentrum fr Bestattungsverwaltung
//                      Verwaltung der Artikel+Leistungen
#pragma Library( "XppUI2.LIB" )

#include "Gra.ch"
#include "Xbp.ch"
#include "Appevent.ch"
#include "Appedit.ch"
#include "Appbrow.ch"
#include "Font.ch"
#include "Dmlb.ch"
#include "Common.ch"


//xbeP_User = 134217728
   #define  xbeU_RefreshHist  xbeP_User + 1 
   #define  xbeU_RefreshSuch xbeP_User + 2 
   #define  xbeU_RefreshAnlief xbeP_User + 3
   #define  xbeU_RefreshScan xbeP_User + 4
   #define  xbeU_ShowHistDaten xbeP_User + 5
   #define  xbeU_ShowScan xbeP_User + 6
   #define  xbeU_RefreshPLZ xbeP_User + 7

   #define  xbeU_CalcReturn xbeP_User + 11
   #define  xbeU_RefreshCalc xbeP_User + 12

   #define  xbeU_RefreshApp xbeP_User + 31
   #define  xbeU_ShowAnlief xbeP_User + 32
   #define  xbeU_RefreshRechng xbeP_User + 33

/* siehe:   #define xbeP_User                      134217728 */

//------------------------------------------
/* 24.06.2008 17:47 neue Thread-Klasse  fr die AnkaufsAbrechnung: */
      CLASS MaterialThrd FROM Thread
         EXPORTED:
         VAR producerID
         VAR terminated
         
         INLINE METHOD init()
           ::thread:init()
           ::producerID := ThreadID()
           ::terminated := .F.
         RETURN
         
         INLINE METHOD terminate()
         RETURN ::terminated := .T.
         
         EXPORTED:
         INLINE METHOD execute(a,b,c,d,e,f,g,h)
            MaterialVerw(a,b,c,d,e,f,g,h)
         RETURN self
         
         INLINE METHOD atStart()
         RETURN self
         
         INLINE METHOD atEnd()
            DbCloseAll()
         RETURN .T.
      ENDCLASS
//------------------------------------------



FUNCTION MaterialVerw( oDlg1, aPos, ASize, cS_mat, nAnf, nEnd, cS, nIndex )  //+28.09.2009 21:00 cS
   LOCAL oDlg, nEvent, mp1, mp2, oXbp, oBrowse
   LOCAL oCtrl, oFocus := SetAppFocus(), aEditControls := {}
   LOCAL nOldArea := Select(), nB:=nBz
   PRIVATE cA := " " //10.12.2006 10:56 
   PRIVATE oCB, oALDA, oEdit, cArtLei := Trim(" "), cArtBez := Trim(" "), lFlucht := .F., lEinfg := .F.
   PRIVATE nFontR := IIf( nV<=1, FONT_DEFFIXED_MEDIUM, FONT_DEFFIXED_LARGE )  // wirkt eh nicht...
   PRIVATE nAnz := 1, nt := 0, cPE := "kg" //, nRechnr := 0, nGS := 0
   PRIVATE nZeile := 0  //, a3 := {} //, nZL := 3->(FieldInfo(3,FLD_LEN))   // 22.08.2005 L„nge des Feldes 'zeile'
   PRIVATE cZeimax := "95"      //+14.06.2009 11:42 sonst gibts ne Fehlermeldung...
   DEFAULT aPos TO {10,30*nV}
   DEFAULT ASize TO {770*nH,500*nV}
   DEFAULT cS_mat TO "s_mat"        //+28.09.2009 20:56
   DEFAULT nAnf TO -100
   DEFAULT nEnd TO 799
   IF cS = NIL //+28.09.2009 22:27
   /*07.04.2008 21:19 nH, nV ver„ndert wegen Resize */
      IF Abs(aPos[1]-oDlg1:currentpos()[1])<100 // wenn NICHT aufgerufen aus Rechnung  
         aPos := {oDlg1:cargo:currentpos()[1]+4,oDlg1:cargo:currentpos()[2]} //14.04.2008 14:28 unten wie Hauptmaske
         ASize := {oDlg1:cargo:currentsize()[1],oDlg1:cargo:currentsize()[2]}  //14.04.2008 14:22 H”he wie Hauptmaske
      ELSE
   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
         aPos := {oDlg1:currentPos()[1],oDlg1:currentPos()[2]+30} //+ ganz links unten in der Parent-Tab:
         ASize := {oDlg1:currentsize()[1],oDlg1:currentsize()[2] - ;
                     IIf( oDlg1:isderivedfrom("XbpTabPage"), oDlg1:tabheight, 28 ) }  //08.07.2008 18:19
   //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      ENDIF
   /**/
   ENDIF 

   IF Empty(cStickVer)
      AlertBox( , "Sie haben keine Berechtigung zur Abrechnung!;"        + ;
                       ";;Rufen Sie einen Berechtigten!", ;
                       { "abbrechen" }  , ;
                       XBPSTATIC_SYSICON_ICONWARNING    , ;
                       "Achtung" )
      ThreadObject():QUIT()
   ENDIF
   IF nAnf >= 900 .AND. 6->(IsFieldVar("bez3"))
      nBz:=23*nV
   ENDIF

   IF Empty(cS)         //+28.09.2009 21:42
      datei("10")
      
   SELECT 7
      DbUseArea( , "FOXCDX", cStickVer + "RMPREISE", "rmp" )
      OrdListAdd( cStickVer + "RMPREISE" )
      OrdSetFocus( "md" )       //+23.09.2009 11:57
   SELECT 6
      DbUseArea( , "FOXCDX", cStickVer + "ROHMAT", "mat" )
      OrdListAdd( cStickVer + "ROHMAT" )
      OrdSetFocus( "mr" )           //+23.09.2009 11:57
   ENDIF


  DO WHILE cA == " "    //10.12.2006 09:54
     Sleep(10)          //+31.07.2009 17:15
   cA := "A"            //10.12.2006 09:54
   cTitel := "Eingabe/Žnderung von Artikeln/Leistungen  (<ESC>=Abbruch)"

   oDlg := AKDialog():new( AppDesktop(), oDlg1:cargo )
//++++++++++ 07.06.2009 11:43 wie bei bestP9:
   oDlg:taskList := .T.
   oDlg:movewithOwner := .T.  //+01.06.2009 21:22
   oDlg:title := cTitel + "     *"  //+ wird nur fr Debug-Abfragen gebraucht
   oDlg:titlebar := .F.
   oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED
   oDlg:create(,, aPos, ASize )
   SetAppFocus(oDlg)       // Fenster muá den Focus haben, damit Parts ihn dann kriegen k”nnen!
   oDlg:lockUpdate(.T.)    // damit der Bildaufbau unsichtbar bleibt

   oDlg:drawingArea:setColorBG( XBPSYSCLR_TRANSPARENT )
   oCB := oDlg:drawingArea
   oALDA := oDlg:drawingArea
   oALDA:cargo := oDlg
   aThrdFenster[7] := oDlg       //+05.08.2009 09:43

// jetzt folgt die Erzeugung der Eingabefelder
   oEdit := ArtikelFF():new( oALDA,oDlg, {330*nH,0}, {440*nH,475*nV},,, nBz, cS_mat, nAnf, nEnd, 6 )
   oEdit:CREATE( oALDA,oDlg, {330*nH,0}, {440*nH,475*nV},,, nBz, cS_mat, nAnf, nEnd, 6 )
   oEdit:XbpObjekt(,"MAT_KURZ"):postblock := {|o| oDlg:isIndexUnique( 1, PadR(Trim(o:editBuffer()),10) ) }
   oEdit:XbpObjekt(,"MAT_KURZ"):validate := oEdit:SingleZeile[1]:postblock
   
   AEval( oEdit:editControls, {|x| oDlg:addEditControl( x ) } )
// bis hierhin geht die Erzeugung der Eingabefelder

   oDlg:setModalState( XBP_DISP_APPMODAL )

   oCtrl := XbpGetController():new( oDlg )
   oCtrl:create()
   oCtrl:READ( oEdit:XbpNummer( oEdit:SingleZeile, "material" )+1 , .F. )
   IF Empty(cS)         //+28.09.2009 21:42
      SET ORDER TO 1
   ENDIF
   DbSkip(0)
   * Shortcuts initialisieren
   oDlg:InitShortCuts( oDlg )
   oDlg:lockUpdate(.F.)
   oDlg:invalidateRect()

   nEvent := xbeP_None
   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      IF nEvent == xbeP_Close .AND. lFlucht == .F.
         lEinfg := .T.
      ENDIF
       //+26.09.2009 11:08 macht das RSuchfenster zwangsweise modal:
      IF !IstTeilVonOwner(oDlg1:cargo,oXbp)
         nEvent := xbeP_None
         LOOP
      ENDIF
// 26.02.2006  zum Laden neuer Bilder in die Artikel-Datei - Klick auf Area links unten:
      IF nEvent == xbeM_LbDblClick //.AND. IsMemberVar(oXbp,"cargo") //.AND. ValType(oXbp:cargo) == "O"
         IF oXbp:IsDerivedFrom("XbpCellGroup")
            nIndex := 0
            cSuch := cS
            IF ValType(oXbp:getcell(1)) == "C" .AND. oXbp:getcell(1) = "Rei"
               nIndex := 1
               cSuch := 6->mat_reihe + 6->mat_art
            ELSEIF ValType(oXbp:getcell(1)) == "C" .AND. oXbp:getcell(1) = "Kurz"
               nIndex := 2
               cSuch := 6->mat_kurz
            ELSEIF ValType(oXbp:getcell(1)) == "C" .AND. oXbp:getcell(1) = "Material"
               nIndex := 3
               cSuch := 6->material
            ELSEIF !Empty(cS)       //+28.09.2009 21:09
               oEdit:aData0 := Array(FCount())
               oEdit:Satzlesen(0,DbStruct())
               IF ValType(oXbp:getCell(1))="N"
                  AAdd(oEdit:aData0, 6->&(oXbp:setparent():cargo))
               ELSE
                  AAdd(oEdit:aData0,0)  //+24.09.2009 10:15
               ENDIF
               oDlg:setModalState( XBP_DISP_MODELESS )
               DbDeRegisterClient(oEdit)
               o := oEdit:aData0
               oEdit:destroy()
               oDlg:destroy()
               SELECT &nOldArea
               SetAppFocus( oFocus )
               RETURN o
            ENDIF
            IF nIndex > 0
               DbSuspendNotifications()
               OrdSetFocus(nIndex)
               DbSeek(Trim(cSuch),.F.)
               nRecH := RecNo()        
               IIf(Len(oEdit:BrowseFeld)>0,oEdit:BrowseFeld[1]:refreshAll(),)
               DbGoto(nRecH)
               DbResumeNotifications()
            ENDIF
         ENDIF
      ENDIF
      IF nEvent == xbeP_Keyboard
         IF mp1 >= xbeK_F1 .AND. mp1 <= xbeK_F12      //01.07.2007 12:01 fr ::AdrSuch
//   wenn eine Funktionstaste gedrckt wird, dann wird PUBLIC cFktT mit deren Nr. belegt:
            cFktT := 1 + mp1 - xbeK_F1
            IF oXbp:cargo$"cArtBez"
               mp1 := xbeK_TAB
            ENDIF
         ELSE
            cFktT := 0
         ENDIF
         DO CASE
            CASE mp1 == xbeK_ESC
               lEinfg := .F.
               lFlucht := .T.
               PostAppEvent( xbeP_Close,,, oCB:cargo )
            CASE mp1 == xbeK_CTRL_F7         //04.09.2007 10:37
               oEdit:SingleZeile[1]:enable()
            CASE mp1 == xbeK_CTRL_F8         //04.09.2007 10:37
               oEdit:SingleZeile[1]:disable()
            CASE mp1 == xbeK_CTRL_DEL
               oFoc := SetAppFocus()
               n := AlertBox( , "M”chten Sie den markierten Datensatz "+6->material+";"        + ;
                             ";unwiderruflich l”schen?", ;
                             { "JA l”schen", "abbrechen" }  , ;
                             XBPSTATIC_SYSICON_ICONQUESTION    , ;
                             "Achtung" )
               IF n = 1
                  Satzsp( oCB )
                  6->(DbDelete())
                  IF !6->(Bof())
                     6->(DbSkip(-1))              // 21.6.2005 zum Test
                  ENDIF
                  nRec := RecNo()
                  oEdit:BrowseFeld[1]:refreshAll()
               ENDIF
               SetAppFocus(oFoc)
            CASE mp1 == xbeK_CTRL_F2      //+27.06.2009 18:44 ScreenDump
               Win_Clip_File(AppDeskTop(),cDatver+"CLIPS\S_"+Left(Time(),2)+SubStr(Time(),4,2)+Right(Time(),2) )
               LOOP
            CASE mp1 == xbeK_F1
               ModalDialog( (cDatver+"f1_AL.rtf"), "Bedienungshinweise", oALDA, 680*nH, 460*nV )
            CASE mp1 == xbeK_F4  //10.05.2006 18:03
               IF IsFieldVar( oXbp:cargo )
                  6->(Satzsp(oCB))
                  IF ValType( 6->&(oXbp:cargo) )="D"
                     oXbp:setData( 6->&(oXbp:cargo) := DATE() )
                     PostAppEvent( xbeP_Keyboard, xbeK_TAB, , oXbp )
                     ELSEIF Upper(oXbp:cargo) = "EKPEU"
                     oXbp:setData( 6->&(oXbp:cargo) := 6->&e_p_s )
                     PostAppEvent( xbeP_Keyboard, xbeK_TAB, , oXbp )
                  ENDIF
                  6->(DbRUnlock())
               ENDIF
            CASE mp1 == xbeK_F10
               IF Alias(13)!=NIL .AND. (Val(6->mat_kurz)<3 .OR. Empty(6->material))
                  ModalFen( "Sie mssen eine Artikelnr.  ; " + ;
                           "UND eine Artikelbezeichnung ; " + ;
                           "eingeben! (Oder abbrechen) ; " + ;
                           "Erg„nzen Sie die Daten! ; Weiter?", ;
                           "A C H T U N G !", ;
                           oDlg:drawingArea )
                  lEinfg := .F.
                  LOOP
               ELSEIF Alias(13) != NIL
                  lEinfg := .T.     // ge„nderter Artikel soll in Rechnung eingefgt werden
               ENDIF
         ENDCASE
      ENDIF
//+ Calculator wurde beendet:
      IF nEvent == xbeU_CalcReturn     //+ xbeP_User + 11
         //+ bisher noch keine Aktion an dieser Stelle !
         oFocsle:setData( mp1 )
         SetAppFocus(oFocSle)
      ELSE
         oXbp:handleEvent( nEvent, mp1, mp2 )
      ENDIF
   ENDDO

   oDlg:setModalState( XBP_DISP_MODELESS )
   DbDeRegisterClient(oEdit)
   oEdit:destroy()
   oDlg:destroy()
      DO WHILE nEvent <> xbe_None      //+02.06.2011 17:40
         nEvent := AppEvent( @mp1, @mp2, @oXbp, 10 )     //leert die Event-Loop !! wichtig!!
      ENDDO 
   SetAppFocus( oFocus )
  ENDDO
   nBz := nB
   Select &nOldArea
   IIf(lLogBook,oBest:TLog:write():writeLogFile(),)    //16.09.2007 22:33

   IF cS != NIL      //+28.09.2009 22:14
      RETURN Array(FCount())
   ENDIF
   DbCloseAll()
   IF ValType(aThrdFenster[2]) == "O"  //+23.03.2010 08:55
      oApp:TabMax(oApp:XbpObjekt(oApp:TabSeite,"AnliefPrg"),{+1,-1,-2,-3,-4,-5,0})  //+03.08.2009 15:36
      aThrdFenster[2]:show()
   ELSE  //+23.03.2010 08:55 wenn aus AppFenster aufgerufen wurde:
      oApp:TabMax(oApp:XbpObjekt(oApp:TabSeite,"EinlogPrg"),{-1,-2,-3,-4,-5,-6,0})  //+03.08.2009 15:36
      aThrdFenster[1]:show()
   ENDIF
   aThrdFenster[7] := NIL
   oApp:oMaterialThrd := NIL
   ThreadObject():QUIT()
RETURN lEinfg

CLASS ArtikelFF FROM DialogFF
   EXPORTED:
   VAR VArea
   VAR EditArtikel
   VAR Sperre
   VAR cBN                       //brutto/netto-Kalkulation ek*nFakt=vk_brutto/netto   18.12.2006 09:00
   VAR nRund                     // Rundung-Nachkommastellen
   VAR nProz                     // Kalkulationsaufschlag
   VAR cMat_Kurz                 //+ Suchvariable  15.07.2009 12:50
   VAR cMaterial                 //+ Suchvariable
   VAR dStand                    //+ Setzvariable
   METHOD INIT
   METHOD CREATE
   METHOD notify
   METHOD NEU                    // šberladen der DialogFF-Methode
   METHOD NEUerStand             //+ aktuellen Stand in RMPreise.dbf sichern
                                 //+ und date() in aktuelle ekpr_datum schreiben
   METHOD ABDrucken              //+ zum Preislistendruck
   METHOD MaterialTabelle        //+ erzeugt die Tabelle fr die Preisliste
   METHOD ArtikelSuch
   METHOD JahresUmsatz
   METHOD ArtAusRech
   METHOD Wareneingang
   METHOD Kalkulation
   METHOD Zugang                 //29.03.2008 14:17 Zug„nge fr diesen Artikel sehen
ENDCLASS

METHOD ArtikelFF:INIT( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
   ::DialogFF:INIT( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
   ::Fancy := cLeistBM
   ::VArea := nA
   ::BEArea := {}
   AAdd( ::BEArea, oParent )
   ::BENr := Len( ::BEArea )
   ::EditArtikel := ""
   ::Sperre := IIf(cAdrBM=" ",.T.,.F.)
   ::cBN := "B"      //18.12.2006 09:02
   ::nRund := 2      //
   ::nProz := 0      //
   ::cMat_Kurz := Space(10)
   ::cMaterial := Space(10)
   ::dStand := DATE()
   ::aG := {{CtoD(""),"",0,0},{CtoD(""),"",0,0},{CtoD(""),"",0,0},{CtoD(""),"",0,0},{CtoD(""),"",0,0}}
RETURN self

METHOD ArtikelFF:CREATE( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
   ::DialogFF:CREATE( oParent, oOwner, aPos, ASize, aPP, lVisible, nBz, cFF, nAnf, nEnd, nA )
//   (nA)->(DbRegisterClient(self))     // reicht es, wenn das Fenster als Ganzes registriert ist??
RETURN self

METHOD ArtikelFF:notify( nEvent, mp1, mp2 )
   LOCAL nRec, oFocus,i
      IF nEvent == xbeDBO_Notify             // Notify-Ereignis
         IF mp1 == DBO_MOVE_DONE             // Skip ist beendet
            ::aG := {{CtoD(""),"",0,0},{CtoD(""),"",0,0},{CtoD(""),"",0,0},{CtoD(""),"",0,0},{CtoD(""),"",0,0}}
            IF rmp->(DbSeek((::VArea)->mat_kurz,.F.,"mk"))
               SELECT("rmp")
               DbSuspendNotifications()
               DO WHILE rmp->mat_kurz == (::VArea)->mat_kurz
                  DbSkip()
               ENDDO
               DbSkip(-1)     //+zurck zum richtigen Material
               FOR i := 1 TO 5
                  oEdit:XbpObjektSet(,"aG["+Str(i,1)+",1]",::aG[i,1] := rmp->ekpr_datum )
                  oEdit:XbpObjektSet(,"aG["+Str(i,1)+",2]",::aG[i,2] := rmp->ekpr_einh)
                  oEdit:XbpObjektSet(,"aG["+Str(i,1)+",3]",::aG[i,3] := rmp->bispreis)
                  oEdit:XbpObjektSet(,"aG["+Str(i,1)+",4]",::aG[i,4] := rmp->vonpreis)
                  oEdit:XbpObjektGet(,"aG["+Str(i,1)+",1]")
                  oEdit:XbpObjektGet(,"aG["+Str(i,1)+",2]")
                  oEdit:XbpObjektGet(,"aG["+Str(i,1)+",3]")
                  oEdit:XbpObjektGet(,"aG["+Str(i,1)+",4]")
                  DbSkip(-1)
                  IF Bof() .OR. rmp->mat_kurz != (::VArea)->mat_kurz ; EXIT ; ENDIF
               NEXT
               DO WHILE i <= 5
                  oEdit:XbpObjektSet(,"aG["+Str(i,1)+",1]",::aG[i,1])
                  oEdit:XbpObjektSet(,"aG["+Str(i,1)+",2]",::aG[i,2])
                  oEdit:XbpObjektSet(,"aG["+Str(i,1)+",3]",::aG[i,3])
                  oEdit:XbpObjektSet(,"aG["+Str(i,1)+",4]",::aG[i,4])
                  oEdit:XbpObjektGet(,"aG["+Str(i,1)+",1]")
                  oEdit:XbpObjektGet(,"aG["+Str(i,1)+",2]")
                  oEdit:XbpObjektGet(,"aG["+Str(i,1)+",3]")
                  oEdit:XbpObjektGet(,"aG["+Str(i,1)+",4]")
                  ++i
               ENDDO
               DbResumeNotifications()
               SELECT (::VArea)
            ENDIF
            IF !SetAppFocus():isDerivedFrom( "XbpBrowse" ) .AND. Len(::BrowseFeld) > 0
               (::VArea)->(DbSuspendNotifications())
               nRec := (::VArea)->(RecNo())
               FOR i := 1 TO Len(::BrowseFeld)
                  ::BrowseFeld[i]:refreshAll()
               NEXT
               (::VArea)->(DbGoto( nRec ))
               (::VArea)->(DbResumeNotifications())
            ENDIF
         ENDIF
      ENDIF
RETURN self

METHOD ArtikelFF:NEU(oDlg1,nA)
   ::EditArtikel := "      "
   (nA)->(DbAppend())
   (nA)->(DbGotop())
   (nA)->(DbSkip(0))
   oEdit:SingleZeile[1]:enable()    //13.08.2007 18:41
RETURN self

//+16.07.2009 11:38 aktuelle Preise in die RMPreise.dbf kopieren
//+   und heutiges Datum in die ekpr_datum-Felder der ROHMAT.dbf schreiben
METHOD ArtikelFF:NEUerStand()
   LOCAL nRec := RecNo()
   LOCAL n := AlertBox( , "Neuen Preis-Stand erzeugen mit Datum "+DtoC(oEdit:dStand)+";"        + ;
                 ";und dabei den aktuellen Stand sichern:", ;
                 { "Preis-Stand erzeugen", "abbrechen" }  , ;
                 XBPSTATIC_SYSICON_ICONQUESTION    , ;
                 "Achtung" )
   IF n = 1
      DbSuspendNotifications()
      DbGotop()
      DO WHILE !Eof()
         IF mat_kurz != " "
            rmp->(DbAppend())
            rmp->mat_kurz := (::VArea)->mat_kurz
            rmp->ekpr_datum := (::VArea)->ekpr_datum
            rmp->vonpreis := (::VArea)->vonpreis
            rmp->bispreis := (::VArea)->bispreis
            rmp->ekpr_einh := (::VArea)->ekpr_einh
            Satzsp(oCB)
            (::VArea)->ekpr_datum := ::dStand
            DbRUnlock()
         ENDIF
         DbSkip()
      ENDDO
      DbGoto(nRec)
      DbResumeNotifications()
      DbSkip(0)
   ENDIF
RETURN self

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+16.07.2009 18:51 fr Preislisten:
METHOD ArtikelFF:ABDrucken( oDlg1, cArt, nAnz, nOrient, cBlDatei )      //, cPE )
   DEFAULT cArt TO "AB", nAnz TO 1, nOrient TO 1, ;
            cBlDatei TO "bl_mat"                      //, cPE TO "kg"
   //vv fllt ::aB
   ::MaterialTabelle()
   //^^
   BlattDRG( cBlDatei,, oDlg1,,,cArt,"A",@nAnz,,nOrient)     //* @nt war nach @nAnz
RETURN self

//+16.07.2009 16:24 erstellt ein Array mit t/kg-Material fr die Preisliste
METHOD ArtikelFF:MaterialTabelle()
   LOCAL nRec := RecNo(), aZeile
   ::aB := {}
   DbSuspendNotifications()
   DbSetFilter( {|| ekpr_einh = cPE } )
   DbGotop()
   //vv fr die šberschrift:
   aZeile := Array(8)
   AFill(aZeile,"")
   aZeile[1] := "MKurz"
   aZeile[2] := "Material"
   IF rmp->(DbSeekLast(Upper(Trim(mat->mat_kurz))))
      FOR i := 7 TO 3 STEP -1
         aZeile[i] := DtoC(rmp->ekpr_datum)
         rmp->(DbSkip(-1))
         IF rmp->mat_kurz != mat->mat_kurz ; EXIT ; ENDIF
      NEXT
   ENDIF
   aZeile[8] := DtoC(mat->ekpr_datum)
   AAdd(::aB,AClone(aZeile))
   //^^
   //vv fr die PreisZeilen:
   DO WHILE !Eof()
      aZeile := Array(8)
      AFill(aZeile,"")
      aZeile[1] := Trim(mat->mat_kurz)
      aZeile[2] := Trim(mat->material)

      IF rmp->(DbSeekLast(Upper(Trim(mat->mat_kurz))))
         FOR i := 7 TO 3 STEP -1
            IF cPE = "kg"
               aZeile[i] := LTrim(Str(rmp->vonpreis))+"-"+LTrim(Str(rmp->bispreis))
            ELSE
               aZeile[i] := LTrim(Str(rmp->vonpreis,6,0))+"-"+LTrim(Str(rmp->bispreis,6,0))
            ENDIF
            rmp->(DbSkip(-1))
            IF rmp->mat_kurz != mat->mat_kurz ; EXIT ; ENDIF
         NEXT
      ENDIF
      IF cPE = "kg"
         aZeile[8] := LTrim(Str(mat->vonpreis))+"-"+LTrim(Str(mat->bispreis))
      ELSE
         aZeile[8] := LTrim(Str(mat->vonpreis,6,0))+"-"+LTrim(Str(mat->bispreis,6,0))
      ENDIF
      AAdd(::aB,AClone(aZeile))
      DbSkip()
   ENDDO
   //^^
   DbClearFilter()
   DbGoto(nRec)
   DbResumeNotifications()
RETURN self

//+15.07.2009 13:23  neues Suchen mit neuem refreshall() (nRecH!)
METHOD ArtikelFF:ArtikelSuch(nIndex)
   LOCAL cSuch := ::XbpObjekt(,IIf(nIndex=2,"cmat_kurz","cmaterial")):getData()
   LOCAL nRecH, nOrd
   DbSuspendNotifications()
   nOrd := OrdSetFocus(nIndex)
   DbSeek(Trim(cSuch),.T.)
   OrdSetFocus(nOrd)
   nRecH := RecNo()        
   IIf(Len(::BrowseFeld)>0,::BrowseFeld[1]:refreshAll(),)
   DbGoto(nRecH)
   DbResumeNotifications()
RETURN self


//+03.01.2010 17:57 erst JahresMenge und Umsatz auf 0 setzen
//+   dann die abrech.dbf durchgehen und alle Mengen+Gesamtpreise aus
//+   dem Jahr von der abrechT in die rohmat-Felder addieren
METHOD ArtikelFF:JahresUmsatz(cJahr)
   LOCAL nOldArea := SELECT(), nOldInd, nRec := 6->(RecNo()), i
   DEFAULT cJahr TO SubStr(DtoS(DATE()),1,4)
   
   SELECT 6    // fr alle F„lle...
   DbSuspendNotifications()
   nOldInd := OrdSetFocus("mk") 
   DbGotop()
   DO WHILE !Eof()
      Satzsp(oCB)
      REPLACE jahrmengek WITH 0
      REPLACE umsatz_ek WITH 0
      DbRUnlock()
      DbSkip()
   ENDDO
   DbGotop()
      
      Datei("0011")  //+ ”ffnet die abrech.dbf + abrechT.dbf
      SELECT 3
      INDEX on DtoS(abrdatum) TO temp
      DbSetScope( SCOPE_TOP, cJahr+"00" )
      DbSetScope( SCOPE_BOTTOM, cJahr+"zz" )
      DbGotop()
      DO WHILE !Eof()
         SELECT 4
         DbSeek(3->abrechnr)
         DO WHILE 3->abrechnr == 4->abrechnr .AND. !3->(Eof()) .AND. !4->(Eof())
            IF Len(Trim(4->mat_kurz)) > 0
               6->(DbSeek(Upper(4->mat_kurz),.T.))     //+ SoftSeek!
               IF !6->(Eof()) .AND. 6->mat_kurz[1] = 4->mat_kurz[1]
                  6->(Satzsp(oCB))
                  6->jahrmengek += 4->menge_kg
                  6->umsatz_ek += 4->ges_prnet
                  6->(DbRUnlock())
               ELSE
                  MsgBox( 4->mat_kurz + " nicht gefunden" )
               ENDIF
            ELSEIF Len(Trim(4->material)) > 0
               6->(OrdSetFocus("ma"))
               6->(DbSeek(Upper(SubStr(LTrim(4->material),1,2)),.T.))     //+ SoftSeek!
               IF !6->(Eof()) .AND. 6->material[1] = LTrim(4->material)[1]
                  6->(Satzsp(oCB))
                  6->jahrmengek += 4->menge_kg
                  6->umsatz_ek += 4->ges_prnet
                  6->(DbRUnlock())
               ELSE
                  MsgBox( 4->material + " nicht gefunden" )
               ENDIF
               6->(OrdSetFocus("mk"))
            ENDIF
            4->(DbSkip())
         ENDDO
         SELECT 3
         3->(DbSkip())
      ENDDO
      DbCloseArea()
      3->(DbCloseArea())
   SELECT 6
   DbGotop()
   DO WHILE !Eof()
      IF 6->jahrmengek <> 0
         Satzsp(oCB)
         6->mittpreis := Round(umsatz_ek/jahrmengek,2)
         DbRUnlock()
      ENDIF
      DbSkip()
   ENDDO
   OrdSetFocus(nOldInd)
   DbResumeNotifications()
   6->(DbGoto(nRec))
//   SELECT (nOldArea)
RETURN self

// legt an/„ndert Artikel in der Artikel-Datei aus der Rechnung heraus mit <F7>
METHOD ArtikelFF:ArtAusRech(nZeile)
   13->(DbSuspendNotifications())
   IF nZeile >= 1
      IF 6->(Eof())        // 12.02.2006  kommt wahrscheinlich ehï nicht vor (wahrscheinlich!)
         6->(DbAppend())
      ELSE
         6->(Satzsp(oCB))
      ENDIF
      IIf(Empty(6->art_lei), 6->art_lei := 13->zugr_z_st, )
      6->bez := 13->bezeich
      6->ausg := 13->kennz
      6->mwst_schl := 13->mwst_schl
      6->&v_p_s := 13->&b_g
      6->&v_n_o := 13->&b_n
      6->(DbRUnlock())
   ENDIF
   IF nZeile >= 2
      13->(DbSkip())
      IF Val(13->zugr_z_st) < 3
         6->(Satzsp(oCB))
         6->bez2 := 13->bezeich
         IF cPreisZ == "2" // PUBLIC, die angibt, dass der Preis in der letzten Artikelzeile steht
            6->mwst_schl := 13->mwst_schl
            6->&v_p_s := 13->&b_g
            6->&v_n_o := 13->&b_n
         ENDIF
         6->(DbRUnlock())
      ENDIF 
   ENDIF
   IF nZeile == 3 .AND. Val(13->zugr_z_st) < 3  // wenn also die zweite Zeile keine "erste Zeile" ist
      13->(DbSkip())
      IF Val(13->zugr_z_st) < 3
         6->(Satzsp(oCB))
         6->bez3 := 13->bezeich
         IF cPreisZ == "2"
            6->mwst_schl := 13->mwst_schl
            6->&v_p_s := 13->&b_g
            6->&v_n_o := 13->&b_n
         ENDIF
         6->(DbRUnlock())
      ENDIF 
   ENDIF 
   13->(DbSkip(-nZeile+1))
   13->(DbResumeNotifications())
RETURN self

// kumuliert die Wareneing„nge in lzu.dbf //10.05.2006 18:18
METHOD ArtikelFF:Wareneingang()
   LOCAL nOldArea := SELECT(), nEK
   SELECT 7
   IF Alias() != "LZU"
      USE lzu INDEX xlzu
   ENDIF
   APPEND BLANK
   7->art_lei := 6->art_lei
   7->datum := 6->leing
   7->anz := 6->ein_menge
   7->ekpeu := 6->ekpeu
   IF 7->(IsFieldVar("bez"))
      7->bez := 6->bez
   ENDIF
   7->(DbCommit())   //16.12.2006 12:55
   SELECT (nOldArea)
   IF 6->ek_preiseu != 6->ekpeu
      nEK := AlertBox( , "<JA> = modifiziert EK-Preis;"        + ;
                 ";", ;
                 { "JA" , "_NEIN" }  , ;
                 XBPSTATIC_SYSICON_ICONWARNING    , ;
                 "Einkaufspreis „ndern?" ) = 1  //+13.11.2009 18:59
   ENDIF
   6->(Satzsp(oALDA))
   6->bestand += 6->ein_menge
   IF nEK ==  1   //+13.11.2009 18:59XBPMB_RET_YES
      6->ek_preiseu := 6->ekpeu
   ENDIF
   6->(DbRUnlock())
RETURN self

// 16.03.2008 22:36 lP2 == .T. heiát, es wird VKPreis2 aus VKPreis1 berechnet
METHOD ArtikelFF:Kalkulation(nQ,cBN,nRund,nPrFakt,cAlt,lP2)  //17.12.2006 16:50 cBN: "B"/"N" VKbrutto/netto aus EK
   LOCAL nKFakt, nEK, nVKn, nVKb, nRec := RecNo(), cKennz
   DEFAULT cBN TO "B", nQ TO 1, nRund TO 2, nPrFakt TO 1, lP2 TO .F.
// nQ ist die Quelle der Kalkulaton, der Parameter, der gerade ver„ndert wurde
// nQ = 1: kalk_fakt, 2: EK, 3: VKnetto, 4: VKbrutto
   IF ValType(cAlt)=="C" .AND. cAlt!="!"
      RETURN self
   ENDIF
   DO CASE
   CASE nPrFakt != 1 .OR. nQ == 0 // d.h. +/- gedrckt   //28.12.2006 20:48
      IF lP2 == .F.
         IF IsFieldVar("alt") .AND. 6->alt == "!"  // diese Artikelgruppe komplett mit gleichem Faktor kalkulieren
            cKennz := 6->kennz      // Artikelgruppe
            DbSuspendNotifications()
            Satzsp(oALDA)
            6->alt := " "     // '!' wieder zurcksetzen
            DbGotop()
            DO WHILE !Eof()
               IF 6->kennz = cKennz
                  Satzsp(oALDA)
                  IIf(IsFieldVar("ek_pr_einh").AND.6->ek_pr_einh==0, 6->ek_pr_einh := 1,) //02.01.2008 14:25
                  IF cBN = "B"
                     6->vk_preiseu := Round(6->vk_preiseu * nPrFakt,nRund)
                     6->vk_nettoeu := Round(6->vk_preiseu/(1+IIf(&cms="3",val(zv)/100,IIf(&cms="2",val(zh)/100,0))),2)
                     6->kalk_fakt := IIf(6->ek_preiseu!=0,Round(6->vk_preiseu / (6->ek_preiseu/ ;
                                       IIf(6->(IsFieldVar("ek_pr_einh")),6->ek_pr_einh,1)),2),0) //02.01.2008 13:44
                  ELSEIF cBN = "N"
                     6->vk_nettoeu := Round(6->vk_nettoeu * nPrFakt,nRund)
                     6->vk_preiseu := Round(6->vk_nettoeu * (1+IIf(&cms="3",val(zv)/100,IIf(&cms="2",val(zh)/100,0))),2)
                     6->kalk_fakt := IIf(6->ek_preiseu!=0,Round(6->vk_nettoeu / (6->ek_preiseu/ ;
                                       IIf(6->(IsFieldVar("ek_pr_einh")),6->ek_pr_einh,1)),2),0) //02.01.2008 13:44
                  ENDIF
                  DbRUnlock()
               ENDIF
               DbSkip()
            ENDDO
            DbGoto(nRec)
            DbResumeNotifications()
         ELSE
            Satzsp(oALDA)
            IIf(IsFieldVar("ek_pr_einh").AND.6->ek_pr_einh==0, 6->ek_pr_einh := 1,) //02.01.2008 14:25
            IF cBN = "B"
               6->vk_preiseu := Round(6->vk_preiseu * nPrFakt,nRund)
               6->vk_nettoeu := Round(6->vk_preiseu/(1+IIf(&cms="3",val(zv)/100,IIf(&cms="2",val(zh)/100,0))),2)
               6->kalk_fakt := IIf(6->ek_preiseu!=0,Round(6->vk_preiseu / (6->ek_preiseu/ ;
                                 IIf(6->(IsFieldVar("ek_pr_einh")),6->ek_pr_einh,1)),2),0) //02.01.2008 13:44
            ELSEIF cBN = "N"
               6->vk_nettoeu := Round(6->vk_nettoeu * nPrFakt,nRund)
               6->vk_preiseu := Round(6->vk_nettoeu * (1+IIf(&cms="3",val(zv)/100,IIf(&cms="2",val(zh)/100,0))),2)
               6->kalk_fakt := IIf(6->ek_preiseu!=0,Round(6->vk_nettoeu / (6->ek_preiseu/ ;
                                       IIf(6->(IsFieldVar("ek_pr_einh")),6->ek_pr_einh,1)),2),0) //02.01.2008 13:44
            ENDIF
            DbRUnlock()
         ENDIF
      ELSEIF lP2 == .T. // VK2 soll aus VK berechnet werden
         IF IsFieldVar("alt") .AND. 6->alt == "!"  // diese Artikelgruppe komplett mit gleichem Faktor kalkulieren
            cKennz := 6->kennz      // Artikelgruppe
            DbSuspendNotifications()
            Satzsp(oALDA)
            6->alt := " "     // '!' wieder zurcksetzen
            DbGotop()
            DO WHILE !Eof()
               IF 6->kennz = cKennz
                  Satzsp(oALDA)
                  IF cBN = "B"
                     6->vk_pr2eu := Round(6->vk_preiseu * nPrFakt,nRund)
                     6->vk_ne2eu := Round(6->vk_pr2eu/(1+IIf(&cms="3",val(zv)/100,IIf(&cms="2",val(zh)/100,0))),2)
                  ELSEIF cBN = "N"
                     6->vk_ne2eu := Round(6->vk_nettoeu * nPrFakt,nRund)
                     6->vk_pr2eu := Round(6->vk_ne2eu * (1+IIf(&cms="3",val(zv)/100,IIf(&cms="2",val(zh)/100,0))),2)
                  ENDIF
                  DbRUnlock()
               ENDIF
               DbSkip()
            ENDDO
            DbGoto(nRec)
            DbResumeNotifications()
         ELSE
            Satzsp(oALDA)
            IF cBN = "B"
               6->vk_pr2eu := Round(6->vk_preiseu * nPrFakt,nRund)
               6->vk_ne2eu := Round(6->vk_pr2eu/(1+IIf(&cms="3",val(zv)/100,IIf(&cms="2",val(zh)/100,0))),2)
            ELSEIF cBN = "N"
               6->vk_ne2eu := Round(6->vk_nettoeu * nPrFakt,nRund)
               6->vk_pr2eu := Round(6->vk_ne2eu * (1+IIf(&cms="3",val(zv)/100,IIf(&cms="2",val(zh)/100,0))),2)
            ENDIF
            DbRUnlock()
         ENDIF
      ENDIF
   CASE nQ = 1       // d.h. Kalkulationsfaktor eingegeben
      nKFakt := ::XbpObjekt(oEdit:singlezeile,"kalk_fakt"):getData()
      nKFakt := IIf( nKFakt>=1, nKFakt, 1/(1-x))
      IF IsFieldVar("alt") .AND. 6->alt == "!"           // diese Artikelgruppe komplett mit gleichem Faktor kalkulieren
         cKennz := 6->kennz      // Artikelgruppe
         DbSuspendNotifications()
         Satzsp(oALDA)
         6->alt := " "
         DbGotop()
         DO WHILE !Eof()
            IF 6->kennz = cKennz
               Satzsp(oALDA)
               IIf(IsFieldVar("ek_pr_einh").AND.6->ek_pr_einh==0, 6->ek_pr_einh := 1,) //02.01.2008 14:25
               IF cBN = "B"
                  6->kalk_fakt := nKFakt
                  6->vk_preiseu := Round(nKFakt * (6->ek_preiseu/ ;
                                    IIf(6->(IsFieldVar("ek_pr_einh")),6->ek_pr_einh,1)),nRund) //02.01.2008 13:44
                  6->vk_nettoeu := Round(6->vk_preiseu/(1+IIf(&cms="3",val(zv)/100,IIf(&cms="2",val(zh)/100,0))),2)
               ELSEIF cBN = "N"
                  6->kalk_fakt := nKFakt
                  6->vk_nettoeu := Round(nKFakt * (6->ek_preiseu/ ;
                                    IIf(6->(IsFieldVar("ek_pr_einh")),6->ek_pr_einh,1)),nRund) //02.01.2008 13:44
                  6->vk_preiseu := Round(6->vk_nettoeu * (1+IIf(&cms="3",val(zv)/100,IIf(&cms="2",val(zh)/100,0))),2)
               ENDIF
               DbRUnlock()
            ENDIF
            DbSkip()
         ENDDO
         DbGoto(nRec)
         DbResumeNotifications()
      ELSE
         Satzsp(oALDA)
         IIf(IsFieldVar("ek_pr_einh").AND.6->ek_pr_einh==0, 6->ek_pr_einh := 1,) //02.01.2008 14:25
         IF cBN = "B"
            6->vk_preiseu := Round(nKFakt * (6->ek_preiseu/ ;
                              IIf(6->(IsFieldVar("ek_pr_einh")),6->ek_pr_einh,1)),nRund) //02.01.2008 13:44
            6->vk_nettoeu := Round(6->vk_preiseu/(1+IIf(&cms="3",val(zv)/100,IIf(&cms="2",val(zh)/100,0))),2)
         ELSEIF cBN = "N"
            6->vk_nettoeu := Round(nKFakt * (6->ek_preiseu/ ;
                              IIf(6->(IsFieldVar("ek_pr_einh")),6->ek_pr_einh,1)),nRund) //02.01.2008 13:44
            6->vk_preiseu := Round(6->vk_nettoeu * (1+IIf(&cms="3",val(zv)/100,IIf(&cms="2",val(zh)/100,0))),2)
         ENDIF
         DbRUnlock()
      ENDIF
   CASE nQ = 2    // ek_preis eingegeben
      nEK := ::XbpObjekt(oEdit:singlezeile,"ek_preiseu"):getData()
      Satzsp(oALDA)
      IIf(IsFieldVar("ek_pr_einh").AND.6->ek_pr_einh==0, 6->ek_pr_einh := 1,) //02.01.2008 14:25
      IF cBN = "B"
         6->vk_preiseu := Round(6->kalk_fakt * (6->ek_preiseu/ ;
                           IIf(6->(IsFieldVar("ek_pr_einh")),6->ek_pr_einh,1)),nRund) //02.01.2008 13:44
         6->vk_nettoeu := Round(6->vk_preiseu/(1+IIf(&cms="3",val(zv)/100,IIf(&cms="2",val(zh)/100,0))),2)
      ELSEIF cBN = "N"
         6->vk_nettoeu := Round(6->kalk_fakt * (6->ek_preiseu/ ;
                           IIf(6->(IsFieldVar("ek_pr_einh")),6->ek_pr_einh,1)),nRund) //02.01.2008 13:44
         6->vk_preiseu := Round(6->vk_nettoeu * (1+IIf(&cms="3",val(zv)/100,IIf(&cms="2",val(zh)/100,0))),2)
      ENDIF
      DbRUnlock()
   CASE nQ = 3 // vk_nettoeu eingegeben
      nVKn := ::XbpObjekt(oEdit:singlezeile,"vk_nettoeu"):getData()
      Satzsp(oALDA)
      IIf(IsFieldVar("ek_pr_einh").AND.6->ek_pr_einh==0, 6->ek_pr_einh := 1,) //02.01.2008 14:25
      IF cBN = "B"
         6->vk_preiseu := Round(6->vk_nettoeu * (1+IIf(&cms="3",val(zv)/100,IIf(&cms="2",val(zh)/100,0))),2)
         6->kalk_fakt := IIf(6->ek_preiseu!=0,Round(6->vk_preiseu / (6->ek_preiseu/ ;
                           IIf(6->(IsFieldVar("ek_pr_einh")),6->ek_pr_einh,1)),2),0) //02.01.2008 13:44
      ELSEIF cBN = "N"
         6->kalk_fakt := IIf(6->ek_preiseu!=0,Round(6->vk_nettoeu / (6->ek_preiseu/ ;
                           IIf(6->(IsFieldVar("ek_pr_einh")),6->ek_pr_einh,1)),2),0) //02.01.2008 13:44
         6->vk_preiseu := Round(6->vk_nettoeu * (1+IIf(&cms="3",val(zv)/100,IIf(&cms="2",val(zh)/100,0))),2)
      ENDIF
      DbRUnlock()
   CASE nQ = 4 // vk_preiseu eingegeben
      nVKb := ::XbpObjekt(oEdit:singlezeile,"vk_preiseu"):getData()
      Satzsp(oALDA)
      IIf(IsFieldVar("ek_pr_einh").AND.6->ek_pr_einh==0, 6->ek_pr_einh := 1,) //02.01.2008 14:25
      IF cBN = "B"
         6->kalk_fakt := IIf(6->ek_preiseu!=0,Round(6->vk_preiseu / (6->ek_preiseu/ ;
                           IIf(6->(IsFieldVar("ek_pr_einh")),6->ek_pr_einh,1)),2),0) //02.01.2008 13:44
         6->vk_nettoeu := Round(6->vk_preiseu/(1+IIf(&cms="3",val(zv)/100,IIf(&cms="2",val(zh)/100,0))),2)
      ELSEIF cBN = "N"
         6->vk_nettoeu := Round(6->vk_preiseu / (1+IIf(&cms="3",val(zv)/100,IIf(&cms="2",val(zh)/100,0))),2)
         6->kalk_fakt := IIf(6->ek_preiseu!=0,Round(6->vk_nettoeu / (6->ek_preiseu/ ;
                           IIf(6->(IsFieldVar("ek_pr_einh")),6->ek_pr_einh,1)),2),0) //02.01.2008 13:44
      ENDIF
      DbRUnlock()
   ENDCASE
   ::XbpObjekt(oEdit:singlezeile,"kalk_fakt"):setData()
   ::XbpObjekt(oEdit:singlezeile,"ek_preiseu"):setData()
   ::XbpObjekt(oEdit:singlezeile,"vk_nettoeu"):setData()
   ::XbpObjekt(oEdit:singlezeile,"vk_preiseu"):setData()
RETURN self

//29.03.2008 14:24 zeigt in einem Fenster die Zug„nge zu dem aktuellen Artikel
METHOD ArtikelFF:Zugang()
   LOCAL nOldArea := SELECT()
   LOCAL cTitel

   SELECT 7
   IF Alias() != "LZU"
      USE lzu INDEX xlzu      // normalerweise ohnehin in Datei.prg ge”ffnet!
   ENDIF

   IF !Upper(AppName())$"MUELLX.EXE"
      7->(DbSetFilter( {|| 7->art_lei == 6->art_lei } ))    //12.04.2008 16:28 weil Scope Fehler erzeugte
      IIf( !(7)->(Bof()), 7->(DbGotop()), )    //29.03.2008 14:06
      cTitel := "Zug„nge des aktuellen Artikels:"
   ELSE
      cTitel := "Artikel-Zug„nge: (Zeilen l”schen mit Strg-Entf)"
   ENDIF

   oBest:Such(  oCB  , "s_mat", 980, 989, 7, 7->(RecNo()), ;
                                                {10,30*nV}, {330*nH,265*nV}, {}, cTitel  )
   7->(DbClearFilter())
   SELECT (nOldArea)
RETURN .T.

