Toon posts:

[Access] 3 problemen mbt SQL en VB

Pagina: 1
Acties:

Verwijderd

Topicstarter
OK, ik m'n vragen maar even opgespaard zodat ik ze netjes in een topic kan plaatsen. Eerst een situatieschets:

Voor m'n werk ben ik een personeelssysteem aan het bouwen. Dit alles gebeurt in Access (dit ivm koppig systeembeheer). De bedoeling is dat dit systeem nagenoeg alles bij gaat houden: NAWT gegevens, roosters, contracten, ziekte, beoordelingen etc.

Het leuke is dat ik ondertussen al een heel eind ben met de voltooiing van het systeem, maar dat er nog een aantal kleine probleempjes zijn die ik nog moet tackelen.

[Probleem 1]

Werknemers (vanaf nu noem ik ze Agents) hebben een Datum in dienst (DID), oftewel de dag dat het contract ingaat. Nu wordt er gewerkt met contractperiodes van 6 maanden. Wat ik wil is dat ik bij de DID automagisch 6 maanden op kan tellen.

N00b approach van mij was om er dan gewoon 182,5 dagen bij op te tellen, maar dat is juridisch gezien niet echt slim. Letter van het contract is namelijk dat het 6 maanden zijn. Van 28 februari tot 28 augustus, of van 30 augustus tot 28 februari bijvoorbeeld. Gewoon dagen erbij optellen is dus niet de oplossing.

Met de functie DateDiff kan je wel uitrekenen hoeveel maanden er zijn verstreken, maar als iemand mij kan vertellen of er een functie is waarmee je bij een datum 6 maanden op kan tellen dan zou ik zeer dankbaar zijn!
[/Probleem 1]

[Probleem 2]
Het bedrijf waar ik werk is een call-center. We hebben 66 werkplekken. Het inplannen van agents gebeurt dmv een formulier waar een kalenderbesturingselement op zit. Inplannen van agents werkt als een trein, het enige probleem waar ik tegenaan loop is dat ik het onmogelijk wil maken om meer dan 66 agents in te plannen op een dag/shift.

Daar had ik het volgende stukje SQL voor uitgedacht:
code:
1
2
3
4
SELECT COUNT(p.PlanningID)
FROM Planning p
WHERE p.Datum = [Datum uit kalenderbesturingselement] AND p.Shift = [Shiftinfo op formulier]
;

Deze query werkt goed. Hij hoest netjes het aantal ingeplande agents op dat ingepland is op dag x. Bij het omzetten naar VB gaat er echter iets mis. Netjes SQL in een strSQL gezet als volgt:
code:
1
2
3
4
SELECT p.PlanningID
FROM Planning p
WHERE p.Datum = [Datum uit kalenderbesturingselement] AND p.Shift = [Shiftinfo op formulier]
;

Daarna een nieuwe recordset rst aangemaakt. Daarna het volgende stukje code aangemaakt:
code:
1
2
3
4
5
6
AantalAgents = rst.RecordCount
If AantalAgents > 66 Then
MsgBox("Er zijn teveel agents ingepland")
Else
[query om agent toe te voegen]
End If

Vreemd genoeg gaat er hier iets mis. Als er op dag x geen agents ingepland zijn dan is rst.RecordCount 0. Is er wel een agent (eentje dus maar) ingepland, dan telt ie niet alleen alle agents die op dag x zijn ingepland, maar meteen alle agents die in de tabel planning staan (Alle planningID's dus). Uitermate vreemd, aangezien het bij de gewone query wel goed ging.

Ook hier weer: iemand een oplossing?
[/Probleem 2]

[Probleem 3]

Hmmm, tis nu al een flinke lap tekst geworden, en m'n geheugen laat me in de steek, dus die komt nog wel! :)
[/Probleem 3]

  • Sjab-X
  • Registratie: September 2001
  • Laatst online: 06-08 11:45
Oplossing 1: DateAdd :?

Oplossing 2:
SELECT COUNT(p.PlanningID)
FROM Planning p
WHERE p.Datum = [Datum uit kalenderbesturingselement] AND p.Shift = [Shiftinfo op formulier]
; :?

  • DaRace
  • Registratie: Juni 2001
  • Laatst online: 03-10-2023
probleem 1: gebruik de functie dateAdd()

Verwijderd

Topicstarter
Op donderdag 04 juli 2002 10:51 schreef Sjab-X het volgende:
Probleem 1: DateAdd :?
Aaargh... :o :o :o |:( ...

Ik voel me zo dom nu :) . Gewoon overheen gestaard met m'n domme hoofd.

/me gaat zichzelf even een pak voor z'n broek geven >:)

Verwijderd

Waarom gebruik je niet gewoon de query met count dan? Gewoon query draaien, resultaat uitlezen en kijken of het > 66 is. Is nog efficienter ook.
edit:

Gaat dus over probleem 2

Verwijderd

Topicstarter
Op donderdag 04 juli 2002 11:01 schreef MrX het volgende:
Waarom gebruik je niet gewoon de query met count dan? Gewoon query draaien, resultaat uitlezen en kijken of het > 66 is. Is nog efficienter ook.
edit:

Gaat dus over probleem 2
Uitlezen zeg je. Kun je daar ajb wat duidelijker in zijn? Ik was namelijk van mening dan mijn manier met rst.RecordCount de meest efficiente is.

Verwijderd

Zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Dim intNumOfReservations as Integer
'check if query returned records
If Not(objRS.BOF And objRS.EOF) Then
   intNumOfReservations = objRS("COUNT(p.PlanningID)")
End if
'test for too many reservations
If intNumOfReservations < 66 Then
   'start making new reservation
   ...
Else
   'too many reservations give error
   ...
End If

PS: Uit de losse pols ...

Verwijderd

Topicstarter
Op donderdag 04 juli 2002 11:11 schreef MrX het volgende:
Zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Dim intNumOfReservations as Integer
'check if query returned records
If Not(objRS.BOF And objRS.EOF) Then
   intNumOfReservations = objRS("COUNT(p.PlanningID)")
End if
'test for too many reservations
If intNumOfReservations < 66 Then
   'start making new reservation
   ...
Else
   'too many reservations give error
   ...
End If

PS: Uit de losse pols ...
Eeuh, heb je de query nu in de VB code ingebouwd of is het gewoon een querydef element (dwz dat de query in de Access werkruimte die je ziet staat)?

Ow wacht. Je hebt een recordset waar je daarna nogmaals de COUNT op loslaat ?!?!

Verwijderd

Op donderdag 04 juli 2002 11:21 schreef DaJaN het volgende:

[..]

Eeuh, heb je de query nu in de VB code ingebouwd of is het gewoon een querydef element (dwz dat de query in de Access werkruimte die je ziet staat)?

Ow wacht. Je hebt een recordset waar je daarna nogmaals de COUNT op loslaat ?!?!
Uhmz .... nee :P

Stappenplan dan maar?
1) doe deze query:
code:
1
2
3
SELECT COUNT(p.PlanningID) as NumOfReserveringen
FROM Planning p
WHERE p.Datum = [Datum uit kalenderbesturingselement] AND p.Shift = [Shiftinfo op formulier]

2) de resulterende recordset bevat 1 record, met 1 kolom, genaamd 'NumOfReserveringen' met het aantal reserveringen op de datum en shift die je als parameters in de query hebt meegegeven

3) haal die waarde uit de recordset, en controleer of die kleiner is dan 66. Zo ja, mag een nieuwe reservering worden gemaakt. Zo niet, dan is de shift al vol en moet je een foutmelding geven.

HTH :)

  • -Klimaks-
  • Registratie: Maart 2001
  • Laatst online: 10:10
Op donderdag 04 juli 2002 10:49 schreef DaJaN het volgende:
[Probleem 2]
code:
1
2
3
4
5
6
AantalAgents = rst.RecordCount
If AantalAgents > 66 Then
MsgBox("Er zijn teveel agents ingepland")
Else
[query om agent toe te voegen]
End If

[/Probleem 2]
Er is natuurlijk al een uitstekend antwoord gegeven, maar ik wil je er maar even op wijzen dat rst.RecordCount niet kan bepalen hoeveel records er zijn als je niet eerst rst.MoveLast hebt gedaan. Eerst een rst.MoveLast, rst.MoveFirst doen voor de recordcount

In those days spirits were brave, the stakes were high, men were REAL men, women were REAL women, and small furry creatures from Alpha Centauri were REAL small furry creatures from Alpha Centauri.
Zaphod in The Hitchhikers Guide To The Galaxy


Verwijderd

Topicstarter
Op donderdag 04 juli 2002 11:28 schreef MrX het volgende:

[..]

Uhmz .... nee :P

Stappenplan dan maar?
1) doe deze query:
code:
1
2
3
SELECT COUNT(p.PlanningID) as NumOfReserveringen
FROM Planning p
WHERE p.Datum = [Datum uit kalenderbesturingselement] AND p.Shift = [Shiftinfo op formulier]

2) de resulterende recordset bevat 1 record, met 1 kolom, genaamd 'NumOfReserveringen' met het aantal reserveringen op de datum en shift die je als parameters in de query hebt meegegeven

3) haal die waarde uit de recordset, en controleer of die kleiner is dan 66. Zo ja, mag een nieuwe reservering worden gemaakt. Zo niet, dan is de shift al vol en moet je een foutmelding geven.

HTH :)
Hehehe :)

Stap 3 is nog niet geheel duidelijk. Ik heb hier al meer mee zitten worstelen. Zet je de query als een String in de VB code?

Resumerend, (Oftewel wat mijn gare hoofd ervan maakt):

De query zet ik als strTelQuery in de VB-code. intAantalAgents is de integer waarin het aantal agents wordt opgeslagen. rstAantalAgents is de recordset.
code:
1
intAantalAgents = rstAantalAgents("numOfReservations")

Should do the trick... Toch?

(overigens, thanks m8!)
[ot]
HTM?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Op donderdag 04 juli 2002 10:54 schreef DaJaN het volgende:

[..]

Aaargh... :o :o :o |:( ...

Ik voel me zo dom nu :) . Gewoon overheen gestaard met m'n domme hoofd.

* Janoz gaat zichzelf even een pak voor z'n broek geven >:)
Let wel ff op... Ik kan me voorstellen dat 6 maanden optellen bij 30 augustus niet op 28 februari uitkomt, maar op 2 maart. Hetzelfde geldt voor een DID die op de 31 valt. Controleer hier wel ff op!

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Op donderdag 04 juli 2002 11:47 schreef Janoz het volgende:

[..]

Let wel ff op... Ik kan me voorstellen dat 6 maanden optellen bij 30 augustus niet op 28 februari uitkomt, maar op 2 maart. Hetzelfde geldt voor een DID die op de 31 valt. Controleer hier wel ff op!
Heb net effe de Access help doorgespit, en als het goed is wordt 30 augustus 28 februari!
De functie DateAdd geeft geen ongeldige datum als resultaat. In het volgende voorbeeld wordt er één maand toegevoegd aan 31 januari:

DateAdd("m", 1, "31 jan 95")

In dit geval geeft DateAdd 28 feb 95 als resultaat en niet 31 feb 95. Als date 31 jan 96 is, is het resultaat 29 feb 96 aangezien 1996 een schrikkeljaar is.
Perfect! :) Precies wat ik nodig had!!

En daarnaast, ik ben bezig om een mooi implementatieplan te schrijven, dus voordat we volledig op mijn systeem gaan vertrouwen is het eerst check... check... dubbelcheck! Zeker bij zoiets vitaals als contracten!
Pagina: 1