[VBA/Access] Automatische planning

Pagina: 1
Acties:
  • 211 views sinds 30-01-2008
  • Reageer

  • Wackmack
  • Registratie: Oktober 2003
  • Laatst online: 10-02 15:06
Hallo,

Voor mijn stage moet ik een opdracht maken, een Backup administratie in access.

Ik zal even uitleggen wat het probleem is.

Ik heb een database gemaakt en alles loopt prima.

Nu heb ik een table met Servernaam, ip, BackupFrequentie, BackupMedium, BackupSoort, Tapenummer, PlanDatum

Nu wil ik als ik bij BackupFrequentie Dagelijks/Wekelijks/Maandelijks invoer er bij PlanDatum voor 1 jaar wordt ingevuld dus.

BackupFrequentie Wekelijks
PlanDatum 11-11-2004, 18-11-2004, 25-11-2004.

Nu heb ik al het 1 en ander in VBA gemaakt.
Alleen het toevoegen lukt nog niet echt. Ik krijg wel als ik Wekelijks invoeren dat ik de Module dan open maar dat is niet echt wat ik wil.

Hier onder is de Code:

--------------------------------------------------------------------------------------------------------

Option Compare Database
Option Explicit
Function SetDatum7DagenVooruit()
'
' SetDatum7DagenVooruit Macro
' Macro gemaakt op 03-11-04 door Tiels00
'
Dim SysteemJaar As Integer
Dim SysteemMaand As Integer
Dim SysteemDag As Integer
Dim Rest1 As Integer
Dim Rest2 As Integer
Dim SchrikkelJaar As Boolean

'Vraag met de functies Year, Month en Day de huidige
'systeemdatum (Now) op.
SysteemJaar = Year(Now)
SysteemMaand = Month(Now)
SysteemDag = Day(Now)
SchrikkelJaar = False

'We gaan eerst kijken of het een schrikkeljaar is. Dat is
'natuurlijk alleen van belang als het februari is, dus als
'Systeemmaand = 2. Een jaar is een schrikkeljaar in de volgende
'situatie: Als het deelbaar is door 4, maar niet door 100 tenzij
'het jaar deelbaar is door 400.
If SysteemMaand = 2 Then
'bepaal de rest bij deling van het systeemjaar door 4
Rest1 = SysteemJaar Mod 4
'Bekijk of de rest 0 is (volledig deelbaar door 4 dus)
If Rest1 = 0 Then
'Bepaal dan de rest bij deling door 100 en 400
Rest1 = SysteemJaar Mod 100
Rest2 = SysteemJaar Mod 400

'Als de rest bij deling door 100 nu niet 0 is, dan is het
'een schrikkeljaar. Is de rest bij deling door 100 wél 0,
'én de deling door 400 is ook 0, dan is ook een schrikkeljaar.
'anders niet.
If (Rest1 = 0 And Rest2 = 0) Or Not Rest1 = 0 Then
SchrikkelJaar = True
End If
End If
End If

'Start met het berekenen van de datum 7 dagen vooruit.
'Eerst tellen we 7 op bij de systeemdag:
SysteemDag = SysteemDag + 7

'Omdat de datum nu hoger kan worden dan het aantal dagen in de maand
'(immers, als je 7 optelt bij 31 december zou dat 38 december worden)
'Om dat te corrigeren gaan we van de systeemdag het maximaal aantal dagen
'aftrekken. Dat is per maand verschillend.
'Eerst gaan we kijken of SysteemDag nu groter is geworden dan het maximaal
'aantal dagen in de systeemmaand (houdt eventueel rekening met schrikkeljaar):
'De maanden 1,3,5,7,8,10 en 12 hebben 31 dagen,
'de maanden 4,6,9 en 11 hebben er 30 en maand 2 heeft er 28 of 29
'Maanden 2(februari) en 12(december) worden apart behandeld.
Select Case SysteemMaand
Case 1, 3, 5, 7, 8, 10
'is SysteemDag groter dan 31, trek er 31 van af en tel 1 op bij de
'SysteemMaand.
If SysteemDag > 31 Then
SysteemDag = SysteemDag - 31
SysteemMaand = SysteemMaand + 1
End If
Case 4, 6, 9, 11
'is SysteemDag groter dan 30, trek er 30 van af en tel 1 op bij de
'SysteemMaand.
If SysteemDag > 30 Then
SysteemDag = SysteemDag - 30
SysteemMaand = SysteemMaand + 1
End If
Case 2
'Er zijn twee situaties: schrikkeljaar en geen schrikkeljaar
'trek afhankelijk hiervan 28 of 29 af van SysteemDag (indien groter)
'en tel 1 op bij de maand
If SchrikkelJaar Then
If SysteemDag > 29 Then
SysteemDag = SysteemDag - 29
SysteemMaand = SysteemMaand + 1
End If
Else
If SysteemDag > 28 Then
SysteemDag = SysteemDag - 28
SysteemMaand = SysteemMaand + 1
End If
End If
Case 12
'als Systeemdag + 7 groter is dan 31, moet ook het
'systeemjaar met 1 worden opgehoogd:
If SysteemDag > 31 Then
SysteemDag = SysteemDag - 31
SysteemMaand = 1
SysteemJaar = SysteemJaar + 1
End If
End Select

'Je hebt nu de systeemdatum + 7 dagen vooruit. Deze kun je gebruiken
'in de applicatie.
'Ze moet echter wel worden teruggegeven (met de 'DateSerial functie):

If BackupFrequentie = Wekelijks Then SetDatum7DagenVooruit = DateSerial(SysteemJaar, SysteemMaand, SysteemDag)
End Function

Private Sub Class_Initialize()

End Sub


--------------------------------------------------------------------------------------------------------

If BackupFrequentie = Wekelijks Then SetDatum7DagenVooruit = DateSerial(SysteemJaar, SysteemMaand, SysteemDag)

If BackupFrequentie = Wekelijks Then PlanDatum to/add
SetDatum7DagenVooruit

Zo dacht ik het te kunnen toevoegen maar add/to bestaat volgens mij niet.
Ik heb alleen nog de code nodig om toe te voegen, weet iemand dat misschien.
Ik beschik ook over 3 boeken maar ik heb het niet zo snel kunnen vinden.

2. Ik heb in mijn 2e tabel een slectie vakje gemaakt, deze kan ik nu mooi filteren met Waar/Onwaar maar dit kan ik niet tellen met Count. Count kan alleen maar met getallen. Is er een mogelijk om toch deze rij te kunnen tellen?

3. Ik werk met parameters als datums, dus selecteren op datums, dat werkt super.
Echter wil ik nu met 2 parameters werken dus 1-10-2004 10-10-2004 alle datums hiertussen wil ik dan zien. Dit kan ik heel mooi instellen met Between/And maar ik wil het in een parameter hebben. Dit heb ik al gedaan maar alleen de eerste parameter schijnt dan te werken.

[ Voor 8% gewijzigd door Wackmack op 04-11-2004 15:39 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

code:
1
If BackupFrequentie = Wekelijks Then PlanDatum = PlanDatum + SetDatum7DagenVooruit

:?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Wackmack
  • Registratie: Oktober 2003
  • Laatst online: 10-02 15:06
NMe84 schreef op 04 november 2004 @ 15:27:
code:
1
If BackupFrequentie = Wekelijks Then PlanDatum = PlanDatum + SetDatum7DagenVooruit

:?
Zou het zo makkelijk zijn? ff kijken:)

  • PaulZ
  • Registratie: Augustus 2004
  • Laatst online: 21-05-2024
Kan je ook niet de functie DateAdd gebruiken om dagen bij een datum op te tellen?
Is volgens mij makkelijker....

Vlinders moet je volgen, niet vangen...


  • Wackmack
  • Registratie: Oktober 2003
  • Laatst online: 10-02 15:06
Dus het wordt:
If BackupFrequentie = Wekelijks Then
DateAdd PlanDatum = PlanDatum + SetDatum7DagenVooruit
Zo??

Ik heb het ingevoerd bij After Update maar hij opent dan gewoon mijn procedure, ik wil dat mijn datum wordt opgevoerd, zit ik misschien in het verkeerde scherm?

Weet iemand misschien nog een antwoord op mijn andere vragen?

2. Ik heb in mijn 2e tabel een slectie vakje gemaakt, deze kan ik nu mooi filteren met Waar/Onwaar maar dit kan ik niet tellen met Count. Count kan alleen maar met getallen. Is er een mogelijk om toch deze rij te kunnen tellen?

3. Ik werk met parameters als datums, dus selecteren op datums, dat werkt super.
Echter wil ik nu met 2 parameters werken dus 1-10-2004 10-10-2004 alle datums hiertussen wil ik dan zien. Dit kan ik heel mooi instellen met Between/And maar ik wil het in een parameter hebben. Dit heb ik al gedaan maar alleen de eerste parameter schijnt dan te werken.

Alvast bedankt voor het reageren!

  • Wackmack
  • Registratie: Oktober 2003
  • Laatst online: 10-02 15:06
Heeft er niemand een Idee? Ik ben ook al zelf op onderzoek uitgegaan, heb al 3 super dikke boeken gehaald van VB

  • nenne
  • Registratie: Juni 2004
  • Laatst online: 06-06-2024
Een paar tips die je op weg kunnen helpen:

- Allereerst zou ik je voorstellen de functie DateAdd te gebruiken (zoals al eerder geopperd is), dit scheelt je enorm veel programmeerwerk aangezien je nu niet meer hoeft te bepalen hoeveel dagen elke maand heeft.
- Afhankelijk van de updatefrequentie, kun je de toe te wijzen plandata in een lus zetten: als de updatefrequentie dagelijks is, dan wordt je lus:

For x = 0 to x = 365
plandatum = plandatum + x (uiteraard met de functie DateAdd)
Next x

Als de updatefrequentie wekelijks is, dan wordt je lus:

For x = 0 to x = 52
plandatum = plandatum + 7 (uiteraard met de functie DateAdd)
Next x


Als de updatefrequentie maandelijks is, dan wordt je lus:

For x = 0 to x = 12
plandatum = plandatum + 1 maand (waarbij je uit zou moeten vogelen hoe je een maand bij een datum optelt, aangezien de lengte van een maand 28, 29, 30 of 31 dagen heeft, maar vaststaat dat je elke maand op dezelfde datum back-upt)
Next x

- Zoals ook eerder geopperd is, dient je formule van de volgende vorm te zijn:

If BackupFrequentie = Wekelijks Then PlanDatum = PlanDatum + SetDatum7DagenVooruit

Let erop dat je NIET de PROCEDURE SetDatum7DagenVooruit aanroept, maar een FUNCTIE. Een functie geeft namelijk een waarde terug (bijvoorbeeld een integer), waarna je deze kunt gebruiken voor de optelling van je datum. Zoek maar op in je boeken hoe een functie werkt.


Wat betreft het tellen van de Waar/Onwaar-kolom zou je het volgende kunnen doen met een lusje (wederom pseudo-code):

For x = 0 to x = aantal records

If record = Waar then
aantalWaar = aantalWaar + 1
End If

Next x

Voor de laatste vraag heb ik geen antwoord. Suc6 ermee en laat maar weten of het gelukt is 8)

  • N0stradamus
  • Registratie: April 2002
  • Laatst online: 19-07-2024
Versteegrob schreef op 05 november 2004 @ 11:17:
.
<snip>
Weet iemand misschien nog een antwoord op mijn andere vragen?

2. Ik heb in mijn 2e tabel een slectie vakje gemaakt, deze kan ik nu mooi filteren met Waar/Onwaar maar dit kan ik niet tellen met Count. Count kan alleen maar met getallen. Is er een mogelijk om toch deze rij te kunnen tellen?

<snip>
Met de volgende querie kun je je selectievakjes (bitvelden) in een tabel tellen:

code:
1
SELECT Count(*) AS VerzinIets FROM (SELECT Veldje FROM TabelNaam WHERE Veldje=True). AS Sjeetje

Als ik het echt allemaal van te voren wist...


  • Wackmack
  • Registratie: Oktober 2003
  • Laatst online: 10-02 15:06
Moet het dan dit worden:

SELECT Count(*) AS Datumbehaald
FROM test_na AS Sjeetje
;

Of

SELECT Datumbehaald
FROM test_na
WHERE Veld=True
;

Het AS Sjeetje volg ik even niet, ik las nu ook van een site dat AS gewoon je Veldnaam kan veranderen in een andere naam. En ik las ook dat je Count alleen kan gebruiken bij Integer. Nu lijkt het mij logisch dat je doordat je =True gebruikt wel het Selectie vakje kan optellen, en dus filteren met Onwaar/Waar

[ Voor 68% gewijzigd door Wackmack op 10-11-2004 13:25 ]

Pagina: 1