**BRegieSV.prg - Regie-Zentrum fr Bestattungsverwaltung // stapelweise Zahlungseingänge zu einer Versicherung eingeben #include "Gra.ch" #include "Xbp.ch" #include "Appevent.ch" #include "Appedit.ch" #include "Appbrow.ch" #include "Font.ch" FUNCTION StapelVEingabe( oDlg1 ) LOCAL oDlg, nEvent, mp1, mp2, oPbSuch, oPbSuchN, oPbSuchK, oXbp2 LOCAL aSizeDesktop := AppDesktop():currentSize() LOCAL nBSb := aSizeDesktop[1] LOCAL nBSh := aSizeDesktop[2] // folgende Zahlen-Werte basieren auf 800x600: LOCAL nH := nBSb/800 // Korrekturfaktor fr tats„chliche Aufl”sung LOCAL nV := nBSh/600, nHV := nH/nV //+07.06.2011 17:28 LOCAL nOldArea := Select(), nRec1 := RecNo() // 11.10.2021 14:43 nRec1 LOCAL aEditcontrols LOCAL lFlucht := .F., nFlucht, nVer PRIVATE oCB PRIVATE oSle, oSle0, oSle1 PRIVATE cAuf := Str( 1->auftrnr,6,0 ), cAufVVbb, cKEY := Trim("") DbSuspendNotifications() //11.10.2021 14:45 cverstemp := "ver2"+LTrim(Str(Int(Seconds()/10))) SELECT 2 COPY STRU TO (cDatver+cverstemp) aData1 := Array(FCount()) aData2 := Array(FCount()) aDataD := Array(FCount()) GO TOP // COPY STRU TO C:\HDBE\vtemp ? time() + " Start: kopiere die letzten hundert Tage:" // COPY TO C:\HDBE\vtemp FOR erf_datum >= date() - 100 SET INDEX TO // vv:Index ausschalten GO LastRec() - 1500 COPY TO C:\HDBE\vtemp NEXT 1501 SET INDEX TO xvvauf // vv:Index einschalten ? time() + " ...kopiert. Setze die Namen ein:" SELECT 12 USE C:\HDBE\vtemp EXCLUSIVE DO WHILE !Eof() SELECT 1 DbSeek( Str(12->auftrnr,6,0 ) ) SELECT 12 REPLACE 12->name2 WITH Trim(1->name)+", "+Trim(1->vorname) SKIP ENDDO ? time() + " ...Namen eingesetzt. Indiziere:" INDEX ON Str(auftrnr,6,0)+bb TO C:\HDBE\vtemp0 INDEX ON Upper( verskz ) TO C:\HDBE\vtemp1 INDEX ON Upper( name2 ) TO C:\HDBE\vtemp2 SET INDEX TO C:\HDBE\vtemp0, C:\HDBE\vtemp1, C:\HDBE\vtemp2 ? time() + " ...indiziert und fertig!" SELECT 14 USE (cverstemp) EXCLUSIVE GO BOTT DO WHILE Recno() < 50 APPEND BLANK ENDDO GO TOP // cBFont := IIf( nBSb < 700, "8.Arial", "10.Arial" ) oDlg := AKDialog():new( AppDesktop(), oDlg1 ) oDlg:tasklist := .T. oDlg:title := "Eingabe von erhaltenen Versicherungs-Zahlungen ïauf Stapelï" oDlg:maxButton := .F. oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED oDlg:create(,, {10,30*nV}, {int(770*nH),int(500*nV)} ) // oDlg:drawingArea:setFontCompoundName( cBFont ) oDlg:drawingArea:setColorBG( GRA_CLR_CYAN ) oCB := oDlg:drawingArea oSle0 := XbpStatic():new( oDlg:drawingArea, , {int(10*nH),int(155*nV)}, {int(90*nH),int(25*nV)}) oSle0:caption := "~Verstorb.:" oSle0:clipSiblings := .T. oSle0:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT oSle0:create() oSle0 := XbpSLE():new( oDlg:drawingArea, , {int(110*nH),int(155*nV)}, {int(80*nH),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } ) oSle0:bufferLength := 6 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, Trim(cKEY), cKEY := x ) } oSle0:create():setData( cKEY ) oPbSuchN := XbpPushButton():new( oDlg:drawingArea, , {int(190*nH),int(155*nV)}, {int(40*nH),int(25*nV)} ) oPbSuchN:caption := "~Name" oPbSuchN:group := XBP_WITHIN_GROUP oPbSuchN:create() oPbSuchN:activate := {|| StapVersSuch( cKEY := Upper(Trim(oSle0:editBuffer())) , oDlg, 3 ), ; SetAppFocus( oSle0 ) } oSle1 := XbpStatic():new( oDlg:drawingArea, , {int(240*nH),int(155*nV)}, {int(90*nH),int(25*nV)}) oSle1:caption := "Vers-K~Z:" oSle1:clipSiblings := .T. oSle1:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT oSle1:create() oSle1 := XbpSLE():new( oDlg:drawingArea, , {int(340*nH),int(155*nV)}, {int(80*nH),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, Trim(cKEY), cKEY := x ) } oSle1:create():setData( cKEY ) oPbSuchK := XbpPushButton():new( oDlg:drawingArea, , {int(420*nH),int(155*nV)}, {int(40*nH),int(25*nV)} ) oPbSuchK:caption := "~Kennz" oPbSuchK:group := XBP_WITHIN_GROUP oPbSuchK:create() oPbSuchK:activate := {|| StapVersSuch( cKEY := Upper(Trim(oSle1:editBuffer())), oDlg, 2 ), ; SetAppFocus( oSle1 ) } oSle := XbpStatic():new( oDlg:drawingArea, , {int(470*nH),int(155*nV)}, {int(90*nH),int(25*nV)}) oSle:caption := "~Auftrags-Nr.:" oSle:clipSiblings := .T. oSle:options := XBPSTATIC_TEXT_VCENTER+XBPSTATIC_TEXT_RIGHT oSle:create() oSle := XbpSLE():new( oDlg:drawingArea, , {int(570*nH),int(155*nV)}, {int(80*nH),int(25*nV)}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } ) oSle:bufferLength := 6 oSle:setInputFocus := {|mp1,mp2,obj| HiliteSle( obj ) } oSle:killInputFocus := {|mp1,mp2,obj| DeHiliteSle( obj ) } oSle:group := XBP_WITHIN_GROUP oSle:dataLink := {|x| IIf( PCOUNT()==0, Trim(cKEY), cKEY := x ) } oSle:create():setData( cKEY ) oPbSuch := XbpPushButton():new( oDlg:drawingArea, , {int(650*nH),int(155*nV)}, {int(40*nH),int(25*nV)} ) oPbSuch:caption := "~Such" oPbSuch:group := XBP_WITHIN_GROUP oPbSuch:create() oPbSuch:activate := {|| StapVersSuch( cKEY := Padl(Trim(oSle:editBuffer()), 6), oDlg, 1 ), ; SetAppFocus( oSle ) } APPBROWSE ; PARENT oDlg:drawingArea ; POSITION TOP ; FONT &cBFont ; SIZE 60,100 PERCENT APPFIELD auftrnr CAPTION "Auftrag" WIDTH 5 APPFIELD verskz CAPTION "Vers-KZ" WIDTH 5 APPFIELD bb CAPTION "Zeile" WIDTH 2 APPFIELD abrname CAPTION "Versicherung" WIDTH 25 APPFIELD bez_am CAPTION "Datum" WIDTH 6 APPFIELD &b_b_g CAPTION "Betrag/"+w_g WIDTH 6 APPDISPLAY MODELESS APPEDIT INTO oEdit ; PARENT oDlg:drawingArea ; POSITION BOTTOM ; FONT &cBFont ; SEEK StapVersSuch( IIf( 14->Auftrnr > 0, Str( 14->Auftrnr,6,0 ), ; Padl(Trim(oSle:editBuffer()),6) ), oDlg, 1 ) ; TRIGGER "StapVEinfg" ON INSERT ; TRIGGER "StapVAend" ON UPDATE ; TRIGGER "StapVEntf" ON DELETE ; SIZE 30,100 PERCENT APPFIELD auftrnr INTO oEdit CAPTION "Auftrag" WIDTH 5 READONLY APPFIELD verskz INTO oEdit CAPTION "Vers-KZ" WIDTH 5 READONLY APPFIELD bb INTO oEdit CAPTION "Zeile" WIDTH 2 READONLY APPFIELD abrname INTO oEdit CAPTION "Versicherung" WIDTH 25 READONLY APPFIELD (IIf( DtoC( bez_am )=" ", trim(" "), DtoC( bez_am ))) INTO oEdit CAPTION "Datum" WIDTH 8 APPFIELD &b_b_g INTO oEdit CAPTION "Betrag/"+w_g WIDTH 8 APPDISPLAY oEdit MODELESS oDlg:setModalState( XBP_DISP_APPMODAL ) oDlg:show() oFocus := SetAppFocus( oSle ) DO WHILE nEvent <> xbeP_Close nEvent := AppEvent( @mp1, @mp2, @oXbp ) IF nEvent == xbeP_User nRec := Recno() 14->(DbGoBottom()) 14->(DbGoTop()) 14->(DbGoto(nRec)) ENDIF IF nEvent == xbeM_LbClick DO CASE CASE oXbp == oSle SetAppFocus( oSle ) CASE oXbp:isDerivedFrom( "XbpPushButton" ) .AND. ValType(oXbp:caption) == "N" IF oXbp:caption == 27 oEdit:SAVE() ENDIF ENDCASE ENDIF IF nEvent == xbeP_Keyboard DO CASE CASE mp1 == xbeK_RETURN PostAppEvent( xbeP_Activate,,, oXbp) CASE mp1 == xbeK_ALT_A SetAppFocus( oSle ) CASE mp1 == xbeK_ALT_V SetAppFocus( oSle0 ) CASE mp1 == xbeK_ALT_Z SetAppFocus( oSle1 ) CASE mp1 == xbeK_ALT_S PostAppEvent( xbeP_Activate,,, oPbSuch) CASE mp1 == xbeK_ALT_N PostAppEvent( xbeP_Activate,,, oPbSuchN) CASE mp1 == xbeK_ALT_K PostAppEvent( xbeP_Activate,,, oPbSuchK) CASE mp1 == xbeK_F10 IF oXbp:isDerivedFrom( "XbpSle" ) .and. oXbp != oSle .and. oXbp != oSle0 .and. oXbp != oSle1 oEdit:save() SetAppFocus( oDlg ) ENDIF PostAppEvent( xbeP_Close) CASE mp1 == xbeK_ESC nFlucht := ConfirmBox( oCB, "Eingaben speichern?", ; "Programm STAPEL-EINGABE beenden.", ; XBPMB_YESNOCANCEL, ; XBPMB_QUESTION ) IF nFlucht == XBPMB_RET_YES lEinfg := .F. lFlucht := .F. PostAppEvent( xbeP_Close) ELSEIF nFlucht == XBPMB_RET_NO lEinfg := .F. lFlucht := .T. PostAppEvent( xbeP_Close) ELSE ENDIF CASE mp1 == xbeK_F1 ModalDialog( (cDatver+"f1_SE.dbf"), "Bedienungshinweise", oDlg, 680*nH, 460*nV ) CASE mp1 == xbeK_F2 oEdit:goTop() CASE mp1 == xbeK_F3 oEdit:goPrevious() CASE mp1 == xbeK_F4 oEdit:goNext() CASE mp1 == xbeK_F5 oEdit:goBottom() CASE mp1 == xbeK_F6 oEdit:SEEK() CASE mp1 == xbeK_F7 .and. oXbp:isDerivedFrom( "XbpSle" ) oEdit:save() SetAppFocus( oEdit ) CASE mp1 == xbeK_F7 oEdit:edit() CASE mp1 == xbeK_F8 oEdit:insert() CASE mp1 == xbeK_F9 oEdit:DELETE() PostAppEvent( xbeP_User ) ENDCASE ENDIF oXbp:handleEvent( nEvent, mp1, mp2 ) ENDDO oDlg:setModalState( XBP_DISP_MODELESS ) oDlg:destroy() SetAppFocus( oFocus ) IF lFlucht == .F. // ESC-Taste: lFlucht = .T. IF ModalFen( "K E I N Benutzer darf jetzt ; " + ; "w„hrend der Eingliederung ; " + ; "Versicherungen bearbeiten! ; Weiter?", ; "A C H T U N G !", ; oDlg1 ) == "ESC" ENDIF SELECT 11 USE tvv EXCLUSIVE SELECT 14 DELETE FOR 14->auftrnr = 0 PACK IF .NOT. Bof() GO TOP ENDIF // hier folgt die Stapel-Žnderung fr die vv.dbf und die tvv.dbf : // die S„tze der StapTemp.dbf werden nach Zeile geordnet in vv.dbf eingefügt // die Bewegung wird als neue Bewegung an Tvv.dbf angeh„ngt DO WHILE .NOT. Eof() cAufVVbb := Str(14->auftrnr,6,0) + 14->bb SELECT 2 FIND &cAufVVbb //* aData1 := Satzget( 2, Recno() ) *// Satzsp( oCB ) REPLACE 2->bez_am WITH IIf( Empty( 14->bez_am ), date(), 14->bez_am ) REPLACE 2->&b_b_g WITH 2->&b_b_g + 14->&b_b_g REPLACE 2->&b_b_gh WITH 2->&b_b_gh + 14->&b_b_gh aData2 := Satzget( 2, RecNo() ) DbRUnlock( Recno() ) n4 := 0 aDataD := SatzDiff( 2, @aData1, @aData2, "2" ) SELECT 11 nAuf2 := 2->auftrnr // 30.11.02 Set FILTER TO auftrnr == nAuf2 GO TOP // Wenn Tripel zu dieser Auftrnr schon vorhanden: // lokalisieren eines freien, unberspielten Tripels von hinten(!) her: GO BOTTOM IF !Bof() SKIP -2 ENDIF DO WHILE Val(bb) != Val(2->bb) .AND. !Bof() SKIP -3 ENDDO cTTFlag := TTFlag IF auftrnr == 2->auftrnr .AND. SUBSTR( cTTFlag, VAL( cSystem ), 1 ) <> "1" ; .AND. !"2"$cTTFlag .AND. !Eof() .AND. !Bof() REPLACE TTFlag with cTTFlag // 28.10.02: //* aData1 := Satzget( 11, Recno() ) // erneutes Ausrechnen, wenn schon tvv-Satz existiert n4 := 4 aDataD := SatzDiff( 11, @aData1, @aData2, "2" ) *// // SKIP // Feldput( 11, RecNo(), aDataD ) // SKIP // Feldput( 11, RecNo(), aDataD ) SatzPut( 11, RecNo(), aData1, "0" ) SKIP SatzPut( 11, RecNo(), aData2, "0" ) SKIP SatzPut( 11, RecNo(), aDataD, "0" ) ELSE APPEND BLANK SatzPut( 11, RecNo(), aData1, "0" ) APPEND BLANK SatzPut( 11, RecNo(), aData2, "0" ) APPEND BLANK SatzPut( 11, RecNo(), aDataD, "0" ) ENDIF SELECT 2 SKIP SELECT 14 SKIP ENDDO USE SELECT 11 USE ELSE USE // schlieáen der TEMP-Datei ENDIF SELECT 12 USE FErase( cDatver+cVerstemp+".dbf" ) Select &nOldArea DbGoto(nRec1) //+11.10.2021 14:46 DbResumeNotifications() //+11.10.2021 14:46 RETURN .T. FUNCTION StapVersSuch( cKEY, oDlg1, nKEY ) LOCAL oDlg, nEvent, mp1, mp2 LOCAL aSizeDesktop := AppDesktop():currentSize() LOCAL nBSb := aSizeDesktop[1] LOCAL nBSh := aSizeDesktop[2] // folgende Zahlen-Werte basieren auf 800x600: LOCAL nH := nBSb/800 // Korrekturfaktor fr tats„chliche Aufl”sung LOCAL nV := nBSh/600, nHV := nH/nV //+07.06.2011 17:28 LOCAL nOldArea := Select() LOCAL lFlucht := .F. PRIVATE oCB SELECT 12 DbSetOrder( nKEY ) IF nKey == 1 DbSeek( cKEY ) ELSE DbSeek( cKEY, .T. ) ENDIF // cBFont := IIf( nBSb < 700, "7.Arial", "8.Arial" ) oDlg := AKDialog():new( AppDesktop(), oDlg1 ) oDlg:tasklist := .T. oDlg:title := "Versicherung ausw„hlen" oDlg:maxButton := .F. oDlg:border := XBPDLG_RAISEDBORDERTHIN_FIXED oDlg:create(,, {10,10*nV}, {int(740*nH),int(460*nV)} ) oCB := oDlg:drawingArea // oDlg:drawingArea:setFontCompoundName( "8.Arial" ) oDlg:drawingArea:setColorBG( GRA_CLR_DARKCYAN ) APPBROWSE ; PARENT oDlg:drawingArea ; POSITION TOP ; FONT &cBFont ; SIZE 95,100 PERCENT APPFIELD auftrnr CAPTION "Auftrag" WIDTH 5 APPFIELD name2 CAPTION "Verstorbener" WIDTH 10 APPFIELD verskz CAPTION "Vers-KZ" WIDTH 5 APPFIELD bb CAPTION "Zeile" WIDTH 2 APPFIELD abrname CAPTION "Versicherung" WIDTH 20 APPFIELD (IIf( DtoC( bez_am )=" ", trim(" "), DtoC( bez_am ))) CAPTION "Bez-Datum" WIDTH 8 APPFIELD &b_b_g CAPTION "Bez-Betrag/"+w_g WIDTH 8 APPDISPLAY MODELESS oDlg:setModalState( XBP_DISP_APPMODAL ) oDlg:show() DO WHILE nEvent <> xbeP_Close nEvent := AppEvent( @mp1, @mp2, @oXbp ) IF nEvent == xbeM_LbDblClick PostAppEvent( xbeP_Close) ENDIF IF nEvent == xbeP_Keyboard DO CASE CASE mp1 == xbeK_RETURN .or. mp1 == xbeK_F10 PostAppEvent( xbeP_Close) CASE mp1 == xbeK_ESC lFlucht := .T. PostAppEvent( xbeP_Close) ENDCASE ENDIF oXbp:handleEvent( nEvent, mp1, mp2 ) ENDDO oDlg:setModalState( XBP_DISP_MODELESS ) oDlg:destroy() SELECT 14 IF lFlucht = .F. // ESC-Taste: lFlucht = .T. REPLACE 14->auftrnr WITH 12->auftrnr REPLACE 14->verskz WITH 12->verskz REPLACE 14->bb WITH 12->bb REPLACE 14->abrname WITH 12->abrname DbCommit() ENDIF Select &nOldArea RETURN APPOP_PROCEED FUNCTION StapVEinfg(aRechPos) RETURN APPOP_PROCEED FUNCTION StapVAend(aRechPos) n1a := IIf( Empty(aRechPos[1]), Val(oSle:getData()), aRechPos[1] ) IF xdmeu="D" n6v := aRechPos[6] n6veu := n6v/xFaktor ELSE n6veu := aRechPos[6] n6v := n6veu*xFaktor ENDIF REPLACE 14->auftrnr WITH n1a REPLACE 14->bez_am WITH IIf( len(aRechPos[5])<7, ; CtoD(aRechPos[5]+str(year(date(),4,0))), CtoD(aRechPos[5]) ) REPLACE 14->bez_betrag WITH n6v REPLACE 14->bez_betreu WITH n6veu DbCommit() nRec := Recno() GO TOP GO nRec RETURN APPOP_PROCEED FUNCTION StapVEntf(aRechPos) IF AScan( aRechPos, {|x| ! Empty(x) } ) == 0 RETURN APPOP_PROCEED ENDIF IF ConfirmBox( oCB, "Soll der Datensatz gel”scht werden?", ; "Datensatz l”schen", ; XBPMB_YESNO, ; XBPMB_QUESTION ) == XBPMB_RET_NO RETURN APPOP_IGNORE ENDIF RETURN APPOP_PROCEED