Actie uitvoeren wanneer alle records zijn gevuld.

Status
Niet open voor verdere reacties.

jbusser

Gebruiker
Lid geworden
23 feb 2007
Berichten
147
Ik hoop dat ik het goed kan uitleggen:

Ik heb een tabel met medewerkers en een gerelateerde tabel met werkplekken.
De medewerkers moeten op de werkplekken van hun specialisme worden inegwerkt.
Iedere persoon moet dus op meerdere werkplekken worden ingewerkt.

Ik heb dus een formulier met persoonsgegevens
een subformulier met werkplekken
(let wel: de werkplekken verschillen in aantal en soort van persoon tot persoon)

Er is van tevoren vastgesteld op welke plekken de persoon moet worden ingewerkt.
Er zijn dus (bijvoorbeeld) 4 records in het subformulier.
Bij de werkplekken bestaat een veld "Hier_ingewerkt"
Als alle 4 die velden, behorende bij deze persoon, op "Ja" staan moet de het persoonsdossier automatisch een vinkje krijgen: "Volledig_ingewerkt"

Dat laatste lukt me wel maar hoe bepaal ik of alle vier de records, behorende bij die persoon, op "Waar staan"

Dus eigenlijk:
Als alle velden "Hier_ingewerkt" in tabel "Werkplek" van persoon_Jansen op "True" staan dan
Vullen van de gegevens in persoonsdossier (dit lukt wel)
einde als
 
er zijn verschillende mogelijkheden. Afhankelijk van je tabellenstructuur is één ervan een update query in de aard van:


Code:
update PersoonsDossier set VolledigIngewerkt = 1 where ID not in (select PersoonsID from Werkplekken where Hier_ingewerkt = 0)
 
Onzinnig om dit überhaupt te willen, je creëert een keten van niet-gerelateerde gegevens die onjuiste informatie (kunnen) bevatten. Of iemand volledig is ingewerkt wordt bepaald door het feit dat alle werkplekken zijn ingevinkt. Die info kun je met een simpele query uit het systeem halen. Een vinkje in een andere tabel doet daar niets aan af.

Om het probleem simpel te illustreren: een medewerker heeft nu 4 werkplekken. Als ze alle vier zijn verwerkt, zet je het bewuste vinkje. Nu komt er later een vijfde taak bij. Guess what: het vinkje blijft gewoon aanstaan. Iemand (of een extra procedure) moet dat (in mijn ogen dus volslagen onnodige) vinkje weer uitvinken tot de nieuwe taak is afgehandeld. Met een query hoef je niets te doen, omdat de nieuwe status gelijk geregeld is, omdat je nu immers niet alle taken meer hebt gedaan, maar slechts 4 van de 5.

Weggooien dus, en nooit meer aan denken :). Gebruik technieken die te allen tijde het juiste resultaat geven, en niet afhankelijk zijn van niet-verbonden velden.
 
Dat is waar, maar het idee is een goed idee qua snelheid, vereenvoudiging en duidelijkheid. Het is veel eenvoudiger in volgende schermen/rapporten om je te kunnen baseren op één veld in de hoofdtabel dan telkens terug alle subtabellen en berekeningen mee te sleuren, en deze tactiek wordt dus in bijna alle applicaties gebruikt. Je hebt het nadeel dat je inderdaad bij alle aanpassingen in de subtabellen het 'vinkje' in de hoofdtebel moet aanpassen, maar de voordelen naar snellere queries/rapporten zijn meestal hoger dan de nadelen bij het aanpassen van het hoofdformulier na aanpassingen van de subdata. Of het ware dat je meer updates uitvoert dan selects. Maar dat is zelden. Dus het basisidee van jBusser is solid en wordt algemeen toegepast.
 
Laatst bewerkt:
Goede ideeën hebben alles te maken met zuiverheid van de opgeslagen gegevens. Wederom (niet voor het eerst, en vast ook niet voor het laatst) haal je niet ter zake doende begrippen als 'snelheid' (al jaren geen probleem meer in Access), 'vereenvoudiging' (jouw oplossing maakt de zaak alleen maar gecompliceerder) en 'duidelijkheid' erbij, en TS heeft daar helemaal niets aan. In grote databases kom je inderdaad dataredundantie tegen t.b.v. snelheid (indexen etc) maar dan heb je het dus niet over Access databases. Misschien moet je je meer concentreren op het Databases forum en het SQL forum, dat daar dus wél voor bedoeld is. Daar kun je in ieder geval je ei veel beter kwijt.
 
Verduidelijking: ik heb het in message#4 wel over applicaties en applicatie-ontwerp/gemak en niet over databases, mijn excuses mocht dat niet duidelijk geweest zijn.
 
Nogmaals: waarom haal je er altijd zaken bij die niet ter zake doende zijn? Geef antwoord op de vragen van TS, en ga niet zelf van alles lopen bedenken. En TS zit dit alles vermoedelijk hoofdschuddend aan te kijken, want deze richting zal-ie vast niet op willen....
 
Was zeker niet mijn bedoeling een conflict uit te lokken. Ik ben zelf ook niet echt voorstander van deze manier van werken maar wordt min of meer van hogerhand opgelegd.
Het gaat er eigenlijk om dat e.e.a. "******proof" is wat hier zeker geen overbodige luxe is.
Voor nu heb ik het geheel omgekeerd en nu wordt het volledig ingewerkt vinkje aangeklikt en pas gezet indien alle werkplekken, behorende bij betreffende persoon, ook zijn aangevinkt.
 
Geen zorgen over conflicten. Dat is bijna standaard hier :D

Het is me niet helemaal duidelijk waar je nu precies voor gekozen hebt. Je hebt het in ieder geval over een vinkje dat (automatisch?) bijgewerkt wordt. Hopelijk wordt dat dan wel bij alle mutaties die van invloed kunnen zijn gedaan. Denk bijvoorbeeld ook aan de situatie waarbij je ten onrechte een werkplek als ingewerkt had aangemerkt. Als je dat terugdraait, zou ook Het Vinkje eventueel weer uit moeten.
Ik sta met andere woorden in Het Conflict aan de kant van AccessGuru. Het management kan je eenvoudig om de tuin leiden door op je formulier en rapporten wel een vinkje te laten zien. Dat sla je niet op (het is een niet-gebonden veld). De waarde bepaal je op basis van de onderliggende gegevens.

Nog een (ander) likje mosterd na de maaltijd. Ik vraag me ook af dit vinkjesgedoe wel aan personen gekoppeld moet zijn. Wat als iemand van functie verandert? Moet hij dan weer ingewerkt worden? Kortom: hoort het niet thuis bij een "plaatsing" (van een persoon op een functie)?
 
Ik ben zelf ook niet echt voorstander van deze manier van werken maar wordt min of meer van hogerhand opgelegd.
Mijn ervaring met 'hogerhand' is dat ze doorgaans geen flauw benul hebben van hoe de materie werkt. Daar hebben ze immers hun voetvolk voor :). Dat voetvolk moet dan natuurlijk wél kunnen aangeven waaróm iets wel of niet kan of moet. Foolproof in jullie geval is dus niet door met een nutteloos vinkje aan te geven of iets al dan niet gedaan is; foolproof is door het systeem aan te laten geven dat iets gedaan is. Ik schreef al dat die gegevens in de verschillende tabellen geen enkele relatie hebben met elkaar, en dus onafhankelijk van elkaar in de tabellen kunnen worden gewijzigd. Hoe 'foolish' wil je het hebben?

Zoals ik al aangaf: op het moment dat er op vijf werkplekken moet worden ingewerkt, en je geeft bij vier daarvan aan dat dit ook gebeurd is, dan kan het systeem geheel automatisch a) aangeven dat 4 van de 5 taken zijn volbracht (4 taken hebben bijvoorbeeld een gedaan vinkje, of, lijkt mij veeel nuttiger, een uitvoerdatum ingevuld) en de vijfde taak heeft dat niet. Daarnaast kun je die taak dus in een apart formulier bijvoorbeeld laten zien. Zelf zou ik op het hoofdformulier twee subformulieren (of keuzelijsten) zetten: één met de uit te voeren taken/werkplekken, en één met de volbrachte taken/werkplekken. Je ziet dan in één ogenblik welke taken/werkplekken nog open staan, en welke zijn 'afgevinkt'. Met die twee keuzelijsten, die ik zou gebruiken, kun je dus met een simpele klik bereiken dat de taak van de keuzelijst 'Uit te voeren' wordt overgezet naar de keuzelijst 'Uitgevoerd'. Veruit de beste oplossing, lijkt mij.

Peter herhaalt mijn bezwaren met een ander voorbeeld, wat uiteraard óók een praktijkgeval kan zijn. Zijn laatste opmerking lijkt mij dan weer gebaseerd op ontbrekende kennis van jullie situatie. Zelf zou ik in ieder geval ook een aparte tabel gebruiken voor deze procedures, waarbij óók de functie een veld zou moeten zijn, inderdaad om dubbel inwerken op meerdere functies mogelijk te maken. Overigens vermoed ik dat de inwerkplekken aan een functie zijn gerelateerd, dus als je een werkplek hebt ingevuld, dan conflicteert dat niet gelijk met een andere inwerkplek. Sterker nog: als functie A inwerkplekken 2, 5, 6 en 8 heeft, en functie B inwerkplekken 1, 5, 6 en 9 dan heeft de betreffende collega die van functie A naar functie B gaat al twee plekken binnen. Toch?
 
Hoi,

in plaats van het volgende hoofdstuk van het commentaar-boek: hier een voorbeeld hoe de methode van jbusser op een eenvoudige manier kan werken.
 

Bijlagen

  • Taken.zip
    67,5 KB · Weergaven: 20
Maar desalniettemin: een goede opzet van je database bespaart je een hoop geneuzel en extra werk. Lijkt mij op de lange termijn een véééél betere insteek. En mocht dat voor jou niet duidelijk zijn geweest: míjn oplossing behoeft dus geen enkele aanpassing aan je systeem; kun je gewoon implementeren. Goed nadenken als je een database opzet heeft zo zijn voordelen :). Overigens werkt de oplossing van noella maar ten dele; voeg maar een nieuwe taak toe en kijk wat er met het vinkje gebeurt. Nogmaals: deze oplossing is niet waterdicht. En het leven is zoveel simpeler als je oplossingen bedenkt en gebruikt die dat wél zijn....

En de hele (nogal uitgebreide) constructie kan worden teruggebracht tot één gebeurtenis:

Code:
Option Compare Database
Option Explicit


Private Sub dtAfgewerkt_Click()
    Me.Dirty = False
    Forms("frmTaken").chkAfgewerkt = (DCount("dtID", "tblDeeltaken", "dtAfgewerkt = 0 and dtTaak = " & Me.txtTaak) = 0)
End Sub
Meer heb je niet nodig.
 
Ik dacht wel dat zowel een delete en insert gedekt zijn in mijn voorbeeld.
 
Nee. Daarnaast doe jij niets aan de totale onzinnigheid van deze constructie.
 
Nog eens uitgetest en de codes voor na insert en delete werken wel degelijk, de debug.print is er om te checken of het werkt, maar zie je niet bij de uitvoering in het formulier:
Code:
Private Sub Form_AfterDelConfirm(Status As Integer)
    If DCount("dtID", "tblDeeltaken", "dtAfgewerkt = 0 and dtTaak = " & Me.txtTaak) > 0 Then
        Forms("frmTaken").chkAfgewerkt = 0
        Debug.Print "nog werk aan de winkel " & DCount("dtID", "tblDeeltaken", "dtAfgewerkt = 0 and dtTaak = " & Me.txtTaak)
    Else
        Forms("frmTaken").chkAfgewerkt = -1

    End If
End Sub

Private Sub Form_AfterInsert()
    If DCount("dtID", "tblDeeltaken", "dtAfgewerkt = 0 and dtTaak = " & Me.txtTaak) > 0 Then
        Forms("frmTaken").chkAfgewerkt = 0
        Debug.Print "nog werk aan de winkel " & DCount("dtID", "tblDeeltaken", "dtAfgewerkt = 0 and dtTaak = " & Me.txtTaak)
    Else
        Forms("frmTaken").chkAfgewerkt = -1

    End If
End Sub
 
Dan geldt nog steeds dat jouw code vervangen kan worden door één regel.
 
Zoals in mijn handtekening staat: ik ben helemaal geen programmeur, ik ben DBA. :rolleyes:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan