**BRegieR3.prg - Regie-Zentrum fr Bestattungsverwaltung // Rechnungen Eigenleistung I+II fr einen Auftrag #include "Gra.ch" #include "Xbp.ch" #include "Appevent.ch" #include "Appedit.ch" #include "Appbrow.ch" #include "Font.ch" FUNCTION Rech3Eingabe( cAuf, oDlg1 ) LOCAL oDlg, nEvent, mp1, mp2, oXbp LOCAL aSizeDesktop := AppDeskTop():currentSize() LOCAL nBSb := aSizeDesktop[1] LOCAL nBSh := aSizeDesktop[2] // folgende Zahlen-Werte basieren auf 800x600: LOCAL nV := nBSb/800 // Korrekturfaktor fr tats„chliche Aufl”sung LOCAL nOldArea := Select() LOCAL cArt := Trim( " " ) LOCAL lFlucht := .F., nFlucht PRIVATE oCB PRIVATE oEdit, oBrowse PRIVATE nZeile := 0, a3 := {}, lModi := .F. // lModi : Rechnung modifiziert? .T. == JA PRIVATE nSum := 0 PRIVATE nSumme := 0 , nSummeI := 0 , nSummeII := 0 cAuf3temp := "auf3"+LTrim(Str(Int(Seconds()/10))) SELECT 3 COPY STRU TO (cAuf3temp) aData1 := Array(FCount()) aData2 := Array(FCount()) aDataD := Array(FCount()) SELECT 13 USE (cAuf3temp) EXCLUSIVE SELECT 3 FOR i := 0 TO 2 FIND &cAuf DO WHILE 3->auftrnr=Val(cAuf) .and. .not. eof() IF Val( rn ) = i // Satzsp( oDlg ) // sperren fr die anderen??? Ja: seit 21.7.02 :: IF DbRLock( RecNo() ) ELSE IF ModalFen( "Rechnung wird schon bearbeitet! Nochmal?",, oDlg1 ) == "ESC" SELECT 13 USE FErase( cDatver+cAuf3temp+".dbf" ) Select &nOldArea RETURN .F. ELSE LOOP ENDIF ENDIF For n := 1 to FCount() aData2[n] := FieldGet( n ) NEXT AAdd( a3, RecNo() ) SELECT 13 APPEND BLANK FOR n := 1 to FCount() FieldPut( n, aData2[n] ) NEXT REPLACE 13->kennz WITH IIf( i=2, "2", "1") SELECT 3 ENDIF SKIP ENDDO NEXT ASort( a3 ) SELECT 8 USE serie index xserie SELECT 13 GO BOTT DO WHILE Recno() < 20 APPEND BLANK ENDDO SUM 13->(&b_g) TO nSummeI FOR Val( 13->kennz ) < 2 SUM 13->(&b_g) TO nSummeII FOR Val( 13->kennz ) = 2 nSumme := nSummeI + nSummeII GO TOP cArt := 13->zugr_z_st lEinfg := .T. DO WHILE lEinfg = .T. // cFont := IIf( nBSb < 650, "8.Arial", "10.Arial" ) oDlg := AKDialog():new( AppDesktop(), oDlg1,,, { { XBP_PP_FGCLR, GRA_CLR_YELLOW } } ) oDlg:tasklist := .T. oDlg:title := "Rechnung zu Auftrag "+cAuf+" / "+; Trim(1->name)+", "+Trim(1->vorname)+" / "+; Trim(1->ansp_name)+", "+Trim(1->ansp_vname) oDlg:maxButton := .F. oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED oDlg:create(,, {10,10}, {int(770*nV),int(500*nV)} ) // oDlg:drawingArea:setFontCompoundName( cFont ) oDlg:drawingArea:setColorBG( GRA_CLR_YELLOW ) oCB := oDlg:drawingArea oXbp := XbpStatic():new( oDlg:drawingArea, , {int(100*nV),int(155*nV)}, {int(90*nV),int(25*nV)}) oXbp:caption := "Summe I :" oXbp:clipSiblings := .T. oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT oXbp:create() oSle1 := XbpSle():new( oDlg:drawingArea, , {int(200*nV),int(155*nV)}, {int(80*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } ) oSle1:bufferLength := 6 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( nSummeI, '@N' ), nSummeI := Val(x) ) } oSle1:create():setData() oXbp := XbpStatic():new( oDlg:drawingArea, , {int(300*nV),int(155*nV)}, {int(90*nV),int(25*nV)}) oXbp:caption := "Summe II :" oXbp:clipSiblings := .T. oXbp:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT oXbp:create() oSle2 := XbpSLE():new( oDlg:drawingArea, , {int(400*nV),int(155*nV)}, {int(80*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } ) oSle2:bufferLength := 6 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( nSummeII, '@N' ), nSummeII := Val(x) ) } oSle2:create():setData() oXbp := XbpStatic():new( oDlg:drawingArea, , {int(500*nV),int(155*nV)}, {int(90*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(600*nV),int(155*nV)}, {int(80*nV),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } ) oSle:bufferLength := 6 oSle:setInputFocus := {|mp1,mp2,obj| HiliteSle( obj ) } oSle:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) } oSle:group := XBP_WITHIN_GROUP oSle:dataLink := {|x| IIf( PCOUNT()==0, Transform( nSumme, '@N' ), nSumme := Val(x) ) } oSle:create():setData() oPbDruck := XbpPushButton():new( oDlg:drawingArea, , {int(700*nV),int(155*nV)}, {int(50*nV),int(25*nV)} ) oPbDruck:caption := "~Druck" oPbDruck:group := XBP_WITHIN_GROUP oPbDruck:create() // oPbDruck:activate := {|| nGS := BlattDR_( "Bl_r",, oDlg,,, "P", "O", @nAnz, @nt ), ; // SetAppFocus( oPbDruck ) } oPbDruck:activate := {|| Rechdruni( cAuf, cDrucker, DtoC( date() ), "J", 2, .F., oDlg ), ; SetAppFocus( oPbDruck ) } APPBROWSE INTO oBrowse; PARENT oDlg:drawingArea ; POSITION TOP ; FONT &cFont ; SIZE 60,100 PERCENT APPFIELD zugr_z_st INTO oBrowse CAPTION "Art-Nr." WIDTH 5 APPFIELD bezeich INTO oBrowse CAPTION "Leistung" WIDTH 40 APPFIELD &b_g INTO oBrowse CAPTION "Betrag/"+w_g WIDTH 6 APPFIELD kennz INTO oBrowse CAPTION "K" APPFIELD zeile INTO oBrowse CAPTION "Z" APPEDIT INTO oEdit; PARENT oDlg:drawingArea ; POSITION BOTTOM ; FONT &cFont ; SEEK Rech3Such( cAuf, cArt, oDlg ) ; TRIGGER "Rech3Einfg" ON INSERT ; TRIGGER "Rech3Aend" ON UPDATE ; TRIGGER "Rech3Entf" ON DELETE ; SIZE 30,100 PERCENT APPFIELD zugr_z_st INTO oEdit CAPTION "Art-Nr." WIDTH 5 COMMENT "Artikelnr. eingeben ..." APPFIELD bezeich INTO oEdit CAPTION "Leistung" WIDTH 40 APPFIELD &b_g INTO oEdit CAPTION "Betrag/"+w_g WIDTH 6 APPFIELD kennz INTO oEdit CAPTION "K" APPFIELD zeile INTO oEdit CAPTION "Z" APPDISPLAY oBrowse MODELESS APPDISPLAY oEdit MODELESS oDlg:setModalState( XBP_DISP_APPMODAL ) oDlg:show() oFocus := SetAppFocus( oEdit ) lEinfg := .F. nEvent := xbeP_None DO WHILE nEvent <> xbeP_Close nEvent := AppEvent( @mp1, @mp2, @oXbp ) IF nEvent == xbeP_User nRec := Recno() 13->(DbGoBottom()) DO While !Bof() 13->(DbSkip(-1)) ENDDO 13->(DbGoto(nRec)) ENDIF IF nEvent == xbeM_LbClick DO CASE CASE oXbp:isDerivedFrom( "XbpPushButton" ) .AND. ValType(oXbp:caption) == "N" IF oXbp:caption == 27 oEdit:SAVE() ENDIF ENDCASE ENDIF IF nEvent == xbeP_Keyboard DO CASE CASE mp1 == xbeK_ESC nFlucht := ConfirmBox( oCB, "Žnderungen speichern?", ; "Programm RECHNUNG beenden.", ; XBPMB_YESNOCANCEL, ; XBPMB_QUESTION ) IF nFlucht == XBPMB_RET_YES lEinfg := .F. lFlucht := .F. PostAppEvent( xbeP_Close) ELSEIF nFlucht == XBPMB_RET_NO lEinfg := .F. lFlucht := .T. PostAppEvent( xbeP_Close) ELSE ENDIF CASE mp1 == xbeK_F10 IF oXbp:isDerivedFrom( "XbpSle" ) .and. oXbp != oSle1 .and. oXbp != oSle2 .and. oXbp != oSle oEdit:save() SetAppFocus( oDlg ) ENDIF lEinfg := .F. PostAppEvent( xbeP_Close) CASE mp1 == xbeK_ALT_E lEinfg := .T. PostAppEvent( xbeP_Close) CASE mp1 == xbeK_ALT_D PostAppEvent( xbeP_Activate,,, oPbDruck ) CASE mp1 == xbeK_ALT_G nGS := BlattDRG( "Bl_r",, oDlg,,, "P", "O", @nAnz, @nt ) CASE mp1 == xbeK_F1 ModalDialog( (cDatver+"f1_r3.dbf"), "Bedienungshinweise", oDlg, 680*nV, 460*nV ) CASE mp1 == xbeK_F5 SELECT 8 if .not. Bof() skip -1 endif cArt := 8->art SELECT 13 Rech3Such( cAuf, cArt, oDlg ) CASE mp1 == xbeK_F6 SELECT 8 if .not. Eof() skip 1 endif cArt := 8->art SELECT 13 Rech3Such( cAuf, cArt, oDlg ) ENDCASE ENDIF oXbp:handleEvent( nEvent, mp1, mp2 ) ENDDO oDlg:setModalState( XBP_DISP_MODELESS ) oDlg:destroy() SetAppFocus( oFocus ) SELECT 13 IF lEinfg = .T. SET DELETED OFF R3SatzEinfg( Recno() ) SET DELETED ON ENDIF ENDDO SELECT 13 IF lFlucht == .F. .AND. lModi == .T. // ESC-Taste: lFlucht = .T. GO TOP SELECT 3 FIND &cAuf SELECT 11 USE tauftr EXCLUSIVE LOCATE FOR auftrnr == Val( cAuf ) .AND. Val( rn ) < 3 // Wenn Tripel zu dieser Auftrnr schon vorhanden: // lokalisieren eines freien, unberspielten Tripels: DO WHILE auftrnr == Val( cAuf ) .AND. Val( rn ) < 3 .AND. .NOT. Eof() cTTFlag := TTFlag IF SUBSTR( cTTFlag, VAL( cSystem ), 1 ) <> "1" ; .AND..NOT. "2"$cTTFlag EXIT ENDIF SKIP 2 CONTINUE ENDDO SELECT 13 DELETE FOR 13->auftrnr <> Val( cAuf ) PACK INDEX ON Str(auftrnr,6,0)+kennz+zeile TO C:\HDBE\xtemp nZeile := 0 FOR nt := 0 TO 2 STEP 2 SELECT 13 IF .NOT. Bof() GO TOP ENDIF 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 ) c3 := Str( a3[nZeile] ) GO &c3 IIf( 3->auftrnr == Val( cAuf ), Satzsp( oCB ), SatzAppend() ) ELSE APPEND BLANK ENDIF //* aData1 := Satzget( 3, Recno() ) *// //s.o. Satzsp( oCB ) For n := 1 to FCount() FieldPut( n, aData2[n] ) NEXT REPLACE 3->zeile WITH Str( nZeile,2,0 ) DbRUnlock( Recno() ) n4 := 0 aDataD := SatzDiff( 13, @aData1, @aData2, "AUFTR" ) SELECT 11 IF auftrnr == Val( cAuf ) .AND. Val( rn ) < 3 .AND. .NOT. Eof() SatzPut( 11, RecNo(), aData1, "0" ) SKIP SatzPut( 11, RecNo(), aData2, "0" ) SKIP SatzPut( 11, RecNo(), aDataD, "0" ) CONTINUE // gehe gleich zum n„chsten Tripel ELSE 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 SELECT 13 SKIP ENDDO NEXT USE SELECT 3 DO WHILE nZeile < Len( a3 ) .AND. .NOT. Eof() c3 := Str( a3[++nZeile] ) GO &c3 IIf( 3->auftrnr == Val( cAuf ) .AND. Val( 3->rn ) < 3, SatzDelete(), ) ENDDO SELECT 11 DO WHILE .NOT. Eof() DELETE NEXT 3 IF .NOT. Eof() SKIP -1 ENDIF CONTINUE ENDDO USE ELSE USE // schlieáen der TEMP-Datei 3->(DbUnlock()) ENDIF FErase( cDatver+cAuf3temp+".dbf" ) Select &nOldArea RETURN .T. FUNCTION Rech3Such( cAuf, cArt, oDlg1 ) LOCAL oDlg, nEvent, mp1, mp2 LOCAL aSizeDesktop := AppDesktop():currentSize() LOCAL nBSb := aSizeDesktop[1] LOCAL nBSh := aSizeDesktop[2] // folgende Zahlen-Werte basieren auf 800x600: LOCAL nV := nBSb/800 // Korrekturfaktor fr tats„chliche Aufl”sung LOCAL nOldArea := Select() LOCAL lFlucht := .F. PRIVATE oCB SELECT 6 FIND &cArt // cFont := IIf( nBSb < 700, "7.Arial", "8.Arial" ) oDlg := AKDialog():new( AppDesktop(), oDlg1 ) oDlg:tasklist := .T. oDlg:title := "Artikel/Leistung ausw„hlen" oDlg:maxButton := .F. // oDlg:close := {|mp1,mp2,obj| obj:destroy() } oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED oDlg:create(,, {10,10}, {int(740*nV),int(460*nV)} ) // oDlg:drawingArea:setFontCompoundName( "8.Arial" ) oDlg:drawingArea:setColorBG( GRA_CLR_DARKGREEN ) oCB := oDlg:drawingArea APPBROWSE ; PARENT oDlg:drawingArea ; POSITION TOP ; FONT &cFont ; SIZE 100,100 PERCENT APPFIELD art_lei CAPTION "Art-Nr." APPFIELD bez CAPTION "Leistung" APPFIELD &v_p_s CAPTION "Preis/"+w_g APPFIELD kennz 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_ESC lFlucht := .T. PostAppEvent( xbeP_Close) CASE mp1 == xbeK_F5 SELECT 8 IF .not. Bof() skip -1 ENDIF cArt := 8->art SELECT 6 FIND &cArt CASE mp1 == xbeK_F6 SELECT 8 IF .not. Eof() SKIP 1 ENDIF cArt := 8->art SELECT 6 FIND &cArt ENDCASE ENDIF oXbp:handleEvent( nEvent, mp1, mp2 ) ENDDO SELECT 13 IF lFlucht = .F. // ESC-Taste: lFlucht = .T. IF Val( 13->zugr_z_st ) > 0 LOCATE FOR Val( 13->zugr_z_st ) == 0 IF Eof() APPEND BLANK ENDIF ENDIF REPLACE 13->auftrnr WITH Val( cAuf ) REPLACE 13->zeile WITH Str( Recno(),2,0 ) REPLACE 13->kennz WITH 6->ausg IF Val( 13->kennz ) < 2 REPLACE 13->rn WITH " " ELSE REPLACE 13->rn WITH "2" ENDIF REPLACE 13->mwst_schl WITH 6->mwst_schl REPLACE 13->zugr_z_st WITH 6->art_lei REPLACE 13->bezeich WITH 6->bez REPLACE 13->&b_g WITH 6->&v_p_s REPLACE 13->&b_gh WITH 6->&v_p_sh DbCommit() nSummeI := IIf( Val(13->kennz) < 2, (nSummeI+&b_g), nSummeI ) nSummeII := IIf( Val(13->kennz) = 2, (nSummeII+&b_g), nSummeII ) nSumme := nSummeI + nSummeII oSle1:setdata( Str( nSummeI,8,2 ) ) oSle2:setdata( Str( nSummeII,8,2 ) ) oSle:setdata( Str( nSumme,8,2 ) ) lModi := .T. // Rechnung wird durch Rech3Such modifiziert ENDIF oDlg:setModalState( XBP_DISP_MODELESS ) oDlg:destroy() Select &nOldArea RETURN APPOP_PROCEED FUNCTION Rech3Einfg(aRechPos) lModi := .T. // Rechnung wird durch Rech3Einfg modifiziert RETURN APPOP_PROCEED FUNCTION Rech3Aend(aRechPos) lModi := .T. // Rechnung wird durch Rech3Aend modifiziert cArt := aRechPos[1] c6b1 := aRechPos[2] IF xdmeu="D" n6v := aRechPos[3] n6veu := n6v/xFaktor ELSE n6veu := aRechPos[3] n6v := n6veu*xFaktor ENDIF n1a := 1->auftrnr // IF cArt <> 13->zugr_z_st SELECT 6 FIND &cArt IF Eof() c6b1 := "" n6v := n6veu := 0 ELSE c6b1 := IIf( Len(aRechPos[2])=0, 6->bez, c6b1 ) n6v := IIf( aRechPos[3] = 0, 6->vk_preis, n6v ) n6veu := IIf( aRechPos[3] =0, 6->vk_preiseu, n6veu ) ENDIF // ENDIF SELECT 13 IF Val(aRechPos[4])!=0 .OR. !Empty(6->ausg) REPLACE 13->auftrnr WITH n1a REPLACE 13->zeile WITH IIf( Val(aRechPos[5])>0, aRechPos[5], Str(Recno(),2,0) ) REPLACE 13->kennz WITH IIf( Val(aRechPos[4])=0, 6->ausg, aRechPos[4] ) IF Val( 13->kennz ) < 2 REPLACE 13->rn WITH " " ELSE REPLACE 13->rn WITH "2" ENDIF nSummeI := IIf( Val(13->kennz) < 2, (nSummeI-&b_g), nSummeI ) nSummeII := IIf( Val(13->kennz) = 2, (nSummeII-&b_g), nSummeII ) nSumme := nSummeI + nSummeII REPLACE 13->mwst_schl WITH 6->mwst_schl REPLACE 13->zugr_z_st WITH cArt REPLACE 13->bezeich WITH c6b1 REPLACE 13->betrag WITH n6v REPLACE 13->betrageu WITH n6veu DbCommit() nRec := Recno() nSummeI := IIf( Val(13->kennz) < 2, (nSummeI+&b_g), nSummeI ) nSummeII := IIf( Val(13->kennz) = 2, (nSummeII+&b_g), nSummeII ) nSumme := nSummeI + nSummeII oSle1:setdata( Str( nSummeI,8,2 ) ) oSle2:setdata( Str( nSummeII,8,2 ) ) oSle:setdata( Str( nSumme,8,2 ) ) GO nRec ENDIF RETURN APPOP_PROCEED FUNCTION Rech3Entf(aRechPos) lModi := .T. // Rechnung wird durch Rech3Entf modifiziert IF AScan( aRechPos, {|x| ! Empty(x) } ) == 0 RETURN APPOP_PROCEED ENDIF IF ConfirmBox( oCB, "Soll der Datensatz gel”scht werden?", ; "Datensatz l”schen", ; XBPMB_YESNO, ; XBPMB_QUESTION ) == XBPMB_RET_NO RETURN APPOP_IGNORE ENDIF IF Val( aRechPos[4] ) < 2 nSummeI := nSummeI - aRechPos[3] ELSE nSummeII := nSummeII - aRechPos[3] ENDIF nSumme := nSummeI + nSummeII oSle1:setdata( Str( nSummeI,8,2 ) ) oSle2:setdata( Str( nSummeII,8,2 ) ) oSle:setdata( Str( nSumme,8,2 ) ) PostAppEvent( xbeP_User) RETURN APPOP_PROCEED FUNCTION R3SatzEinfg( nRec ) LOCAL aBlattSE := {} , aBlattZSE[FCount()] lModi := .T. // Rechnung wird durch R3SatzEinfg modifiziert APPEND BLANK aBlattZSE := R3SatzLese() GO 1 DO WHILE .NOT. Eof() IF !Deleted() IF nRec = Recno() AAdd( aBlattSE, aBlattZSE ) ENDIF AAdd( aBlattSE, R3SatzLese() ) ENDIF SKIP ENDDO ZAP FOR i := 1 to Len( aBlattSE ) APPEND BLANK aBlattZSE := aBlattSE[i] For n := 1 to FCount() FieldPut( n, aBlattZSE[n] ) NEXT NEXT GO nRec RETURN .T. FUNCTION R3SatzLese() LOCAL aValue := Array( FCount() ) FOR n := 1 TO FCount() aValue[n] := FieldGet(n) NEXT RETURN aValue