Subfrm / Checklist

Status
Niet open voor verdere reacties.
De bedoeling is dat een medewerker de ISRA checklisten ontwerpt / samenstelt door het invullen van deze lijst.
Die lijst en formulier zie ik in je database
Weer een andere medewerker moet dus een formulier hebben (met achterliggende tabel) waar hij/zij de checklisten kan uitvoeren op datum en notities erbij kan maken.
Deze tabel en bijbehorend formulier zie ik niet. Heb je die nog niet? Of zit hij niet in de laatste versie?
 
De tabel om de checklisten van de ISRA uit te voeren en opmerkingen te maken is er nog niet. Met de reden dat ik niet goed weet hoe dit uit te werken.
 
Ik heb wat zitten 'klooien' in een db van een andere vraag die nu loopt, omdat ik de data daar wat beter van kon gebruiken. Voor het principe van de oplossing maakt dat verder niet zoveel uit, denk ik. In de plaatjes, en de SQL hieronder, wordt het hopelijk straks wel duidelijk.

Om te beginnen: ik heb een tabel met Klantgegevens uitgebreid met wat selectievakjes.
Afb. 1 - Tabel.png

Vervolgens (en dat kostte nog best wat tijd ;)) een query gemaakt die voor elke termijn de eerstvolgende datum berekent.
Afb. 2 - Verzamelquery.png

Deze query is de basis voor de UNION query, die alleen de gekozen selecties laat zien. Daarbij zie je per optie maar één datum, met daarachter in een veld het juiste type. In het veld [Controletype] staat dan dus niet meer "Elke keer anders", maar Dagelijks, Wekelijks etc.
In wezen is een Union query niets anders dan een aantal queries samengebracht in één query, met het woord UNION er tussen. Daarbij is het belangrijk dat alle queries die je op deze manier samenvoegt hetzelfde aantal velden bevatten, dat die velden in dezelfde volgorde staan, en dus ook van hetzelfde type zijn. Daarbij geldt dan ook nog: de naamgeving in de eerste query bepaalt de kolomnamen. van de overige queries worden dus alleen de gegevens toegevoegd, het maakt niet meer uit hoe de velden zijn benoemd. Zolang ze dus maar van hetzelfde type zijn.

In jouw voorbeeld is het makkelijk, want ik gebruik dus 5 keer dezelfde SQL. Enige verschil: per (sub)query wordt maar één Datumveld gebruikt, en dat is dus één van de berekende termijnen. In het veld [Controletype] geef je vervolgens aan wat voor soort datum je ziet. Elke subquery wordt apart gefilterd op het gebruikte type. Dus bij Dagelijks filter je op [Dagelijks] = Waar, bij Kwartaal op [Kwartaal] = Waar.

Het resultaat ziet er nu zo uit:
Afb. 3 - UNION query.png

En voor het mooie nog de uitwerking op het Klantenformulier, waar je voor elke klant dus de termijnen ziet voor die klant.
Afb. 4 - Formulier.png

En hier dan de SQL die is gebruikt om e.e.a. uit te rekenen.
PHP:
SELECT Klantnaam, Domeinnaam, Registratiedatum, Dagelijks, Week, Maand, Kwartaal, Jaar, 
DateAdd("d",IIf(Weekday(Date(),2)=5,3,1),Date()) AS Controledatum, "Dagelijks" AS Controletype
FROM Factuurbestand_2020
WHERE Dagelijks=True

UNION 
SELECT Klantnaam, Domeinnaam, Registratiedatum, Dagelijks, Week, Maand, Kwartaal, Jaar, 
DateAdd("ww",DateDiff("ww",[Registratiedatum],Date())+Abs(Weekday(Date(),2)>=Weekday([Registratiedatum],2)),[Registratiedatum]) AS ControledatumW, "Wekelijks" AS Controletype
FROM Factuurbestand_2020
WHERE Week=True

UNION 
SELECT Klantnaam, Domeinnaam, Registratiedatum, Dagelijks, Week, Maand, Kwartaal, Jaar, 
DateAdd("m",DateDiff("m",[Registratiedatum],Date())+Abs(Format([Registratiedatum],"dd")<=Format(Date(),"dd")),[Registratiedatum]) AS ControledatumM, "Maandelijks" AS Controletype
FROM Factuurbestand_2020
WHERE Maand=True

UNION 
SELECT Klantnaam, Domeinnaam, Registratiedatum, Dagelijks, Week, Maand, Kwartaal, Jaar, 
DateAdd("q",DateDiff("q",[Registratiedatum],Date())+Abs(DateAdd("q",DateDiff("q",[Registratiedatum],Date()),[Registratiedatum])<=Date()),[Registratiedatum]) AS ControledatumQ, "Kwartaal" AS Controletype
FROM Factuurbestand_2020
WHERE Kwartaal=True

UNION 
SELECT Klantnaam, Domeinnaam, Registratiedatum, Dagelijks, Week, Maand, Kwartaal, Jaar, 
DateAdd("yyyy",DateDiff("yyyy",[Registratiedatum],Date())+Abs(Format([Registratiedatum],"mmdd")<=Format(Date(),"mmdd")),[Registratiedatum]) AS ControledatumJ, "Jaarlijks" AS Controletype
FROM Factuurbestand_2020
WHERE Jaar=True

ORDER BY Klantnaam, Domeinnaam;

Zoals je ziet, is het niet zo'n heel ingewikkelde berekening :D. HEt is dus van belang dat je altijd uitgaat van een startdatum. Alleen een Dagelijkse activiteit is heel simpel te bereken, voor de rest moet je dus uitgaan van die startdatum.

Kijk maar eens of je het a) snapt, en b) er wat aan hebt!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan