Avatar billede weaponx Nybegynder
11. juli 2005 - 12:09 Der er 23 kommentarer og
1 løsning

Tilgange/Afgange pr. uge

Hej Eksperter

Jeg har en tabel som f.eks. indeholder:

Kundenavn  Uge
Hans      16
kurt      16
Hans      17
Niels      17

Tabellen er indeholder kundebeholdning pr. uge. Jeg har brug for at finde tilgange og afgange. Det vil sige poster som ikke var der ugen før er tilgange. Poster som findes i forgående uge, men ikke findes i nuværende er afgange. Tilgange/Afgange skal både tælles, men også kunne vise hver kunde som er smuttet eller kommet til.

Jeg forstiller mig et loop, men ved ikke helt hvordan jeg skal gribe det an.
Avatar billede terry Ekspert
11. juli 2005 - 13:14 #1
I think you need at least one more field in your table (År)!
Weeks do NOT always start on the same date.
Avatar billede weaponx Nybegynder
11. juli 2005 - 13:26 #2
Jeg forsøgte at simplificere, tabellen indeholder også årstal. Du har ret i at det er et nyttigt felt i denne sammenhæng.
Avatar billede terry Ekspert
11. juli 2005 - 13:33 #3
Do you want an Access solution, or is it to be used in ASP?
Avatar billede weaponx Nybegynder
11. juli 2005 - 13:40 #4
Access please.
Avatar billede terry Ekspert
11. juli 2005 - 14:08 #5
Just to make sure what you want:

Is the result to show data for a specific period? (start yearweek to current week)

For each week you want the number of "tilgange" and the number of "Afgange" compared to previous week.
You also want to see "kunde navn" (tilgange + Afgange) for each week.

So a list something like

År/Uge - Kunde Navne - Tilgange/Afgange
----------------------------------------
2005/16  Hans          Tilgange
2005/16  Kurt          Tilgange
2005/17  Niels          Tilgange
2005/17  Kurt          Afgange

If I can give you this in a query then you should be able to find out hopwmany Tilgange/Afgange you have

If this is what you want then I will get back later with a solution (hopefully) as I am rather busy at the moment.
Avatar billede weaponx Nybegynder
11. juli 2005 - 14:15 #6
That is exactly what i need.

My table keeps the week/year in seperate colums. Other than that everything is as you described.

År - Uge - Kunde Navne - Tilgange/Afgange
----------------------------------------
2005 16  Hans          Tilgange
2005 16  Kurt          Tilgange
2005 17  Niels          Tilgange
2005 17  Kurt          Afgange
Avatar billede terry Ekspert
11. juli 2005 - 14:37 #7
Is the result to show data for a specific period? (start yearweek to current week)
Avatar billede weaponx Nybegynder
11. juli 2005 - 14:51 #8
The goal is to be able to make a history funktion so that i kan make 3 views that will show:

Beholdning
Tilgange
Afgange

x axis will be year/week and y axis will be number of costumers.

I will use theese views in excel to make pivot diagrams that will autoupdate.
Avatar billede terry Ekspert
11. juli 2005 - 15:03 #9
You may have data for MANY years, so it may be an idea to limit the result (period start/end)!


Beholdning????
Up to now this hasnt been mentioned so much! What do you mean by this and how is it to be shown?
Avatar billede weaponx Nybegynder
11. juli 2005 - 15:20 #10
Well beholdning is simple cause thats just everything in the table. Thats why i would prefer some kind of loop in vba.
So it starts with tilgange from week 1 to week 2 and week 2 to week 3 etc... upto 52. So it shows ex. the customers that are in week 2 but not in week 1.
And afgange from week 1 to week 2 and week 2 to week 3. So it shows ex. the customers in week 1 that are not in week 2.

Hope this makes sence.
Avatar billede weaponx Nybegynder
11. juli 2005 - 15:24 #11
I doubt that we will have more than 600 customers at any given week and i will limit the query to 2005 this year and next year i will limit to 2006. So it will max do a query on about 31.000 lines.
Avatar billede weaponx Nybegynder
11. juli 2005 - 19:45 #12
Jeg har løst problemet ved at lave to tabeller mere. En til afgange og en til tilgange. Dertil har jeg lavet en tilføjelses forespørgsel til både afgange og tilgange, så der er en som trykker på en knap hver uge.

For at sikre, at en uge ikke bliver inddateret flere gange har jeg lavet tre sletteforespørgsler en til hver af tabellerne kunder, tilgange og afgange.

Selve scriptet kan ses her:
*****************************************

Private Sub Kommandoknap12_Click()
Dim dbs As Database
Dim rst As Recordset
Dim strSQL As String
Dim stDocName1a As String
Dim stDocName2a As String
Dim stDocName3a As String
Dim stDocName1s As String
Dim stDocName2s As String
Dim stDocName3s As String

Set dbs = CurrentDb

strSQL = "SELECT * FROM tbl_main WHERE (((tbl_main.Uge)=weeknow()) AND ((tbl_main.Aar)=Year(Now())));"
Set rst = dbs.OpenRecordset(strSQL)

If rst.EOF Then
    MsgBox "Vent venligst, Opdateringen begynder", vbOKOnly 'kode der bruges når der ikke findes nogen poster fra denne uge
   
    DoCmd.SetWarnings False  ' slår advarsels popup vinduer FRA
   
    stDocName1a = "vw_add_kunder" ' tilføjer kunder til tbl_main fra aftaledatabasen
    DoCmd.OpenQuery stDocName1a, acNormal, acEdit
   
    stDocName2a = "vw_add_afgange" ' tilføjer kunder til tbl_afgange fra aftaledatabasen
    DoCmd.OpenQuery stDocName2a, acNormal, acEdit
   
    stDocName3a = "vw_add_tilgange" ' tilføjer kunder til tbl_tilgange fra aftaledatabasen
    DoCmd.OpenQuery stDocName3a, acNormal, acEdit

    DoCmd.SetWarnings True  ' slår advarsels popup vinduer TIL

    MsgBox "Opdateringen er færdig", vbOKOnly
Else
    fortsaette = MsgBox("En person har allerede opdateret listen i denne uge. Ønsker ud at slette denne uges data og opdatere dem igen med nye data?", vbYesNo)  'kode der bruges når der findes nogen poster fra denne uge
    If fortsaette = vbNo Then
    MsgBox "Du har annulleret opdateringen", vbOKOnly
    Set rst = Nothing
    dbs.Close
    Exit Sub
Else

    MsgBox "Vent venligst, Opdateringen begynder", vbOKOnly 'kode der bruges når bruger accepterer sletning af denne uges for så at opdatere dem igen med nye
   
    DoCmd.SetWarnings False  ' slår advarsels popup vinduer FRA
   
    'lad os slette de gamle data fra denne uge
    stDocName1s = "vw_del_kunder" ' sletter kunder fra tbl_kunder hvor ugen er nu
    DoCmd.OpenQuery stDocName1s, acNormal, acEdit
   
    stDocName2s = "vw_del_afgange" ' sletter kunder fra tbl_afgange hvor ugen er nu -1
    DoCmd.OpenQuery stDocName2s, acNormal, acEdit
   
    stDocName3s = "vw_del_tilgange" ' sletter kunder fra tbl_tilgange hvor ugen er nu
    DoCmd.OpenQuery stDocName3s, acNormal, acEdit
   
       
    'lad os inddatere data fra denne uge
    stDocName1a = "vw_add_kunder" ' tilføjer kunder til tbl_main fra aftaledatabasen
    DoCmd.OpenQuery stDocName1a, acNormal, acEdit
   
    stDocName2a = "vw_add_afgange" ' tilføjer kunder til tbl_afgange fra aftaledatabasen
    DoCmd.OpenQuery stDocName2a, acNormal, acEdit
   
    stDocName3a = "vw_add_tilgange" ' tilføjer kunder til tbl_tilgange fra aftaledatabasen
    DoCmd.OpenQuery stDocName3a, acNormal, acEdit

    DoCmd.SetWarnings True  ' slår advarsels popup vinduer TIL

    MsgBox "Opdateringen er færdig", vbOKOnly
   
    End If
End If

Set rst = Nothing
dbs.Close

End Sub


*****************************

Jeg bruger også en week now funktion, da den ikke som Year(Now()) er en indbygget funktion i MS Access.

**************************

Function weeknow()
Dim whatdate As Date
whatdate = Now()
weeknow = DateDiff("ww", DateSerial(Year(Now()), 1, 5), whatdate)
End Function

***********************

Håber det hjælper nogen. Hvis der er andre og bedre forslag til at løse dette problem vil jeg meget gerne stadig give point for at høre dem ;)
Avatar billede fdata Forsker
12. juli 2005 - 21:48 #13
Vær lige obs på at din weeknow vist ikke er helt ok.
Avatar billede weaponx Nybegynder
13. juli 2005 - 16:12 #14
ved ikke om jeg fik rettet den med weeknow helt efter bogen, men den virker med:
Function weeknow()
Dim whatdate As Date
whatdate = Now()
weeknow = DateDiff("ww", DateSerial(Year(Now()), 1, 1), whatdate)
End Function
Avatar billede fdata Forsker
13. juli 2005 - 23:17 #15
Prøv at sætte din PC's dato frem til 01-01-06 og test så Weeknow  ;o))
(der er altid ballade omkring nytår)

Prøv evt.:

' NB:
' 29.12.03 beregnes af Access til uge 53 (bør være 1)
' 31.12.07 beregnes af Access til uge 53 (bør være 1)
Function UgeNr(Dato As Variant) As Integer
  If IsNull(Dato) Then
    UgeNr = 0
  Else
    If (Dato = #12/29/2003#) Or (Dato = #12/31/2007#) Then    ' Access crap
      UgeNr = 1
    Else
      UgeNr = DatePart("ww", Dato, vbMonday, vbFirstFourDays)
    End If
  End If
End Function
Avatar billede weaponx Nybegynder
14. juli 2005 - 12:48 #16
Den uge funktion ser noget mere forståelig ud end den jeg havde fundet. Smid et svar så lukker vi spørgsmålet
Avatar billede terry Ekspert
17. juli 2005 - 10:34 #17
Not quite sure where I picked this up from

Function WeekNumber(InDate As Date) As Integer
  Dim DayNo As Integer
  Dim StartDays As Integer
  Dim StopDays As Integer
  Dim StartDay As Integer
  Dim StopDay As Integer
  Dim VNumber As Integer
  Dim ThurFlag As Boolean

  DayNo = Days(InDate)
  StartDay = WeekDay(DateSerial(Year(InDate), 1, 1)) - 1
  StopDay = WeekDay(DateSerial(Year(InDate), 12, 31)) - 1
  ' Number of days belonging to first calendar week
  StartDays = 7 - (StartDay - 1)
  ' Number of days belonging to last calendar week
  StopDays = 7 - (StopDay - 1)
  ' Test to see if the year will have 53 weeks or not
  If StartDay = 4 Or StopDay = 4 Then ThurFlag = True Else ThurFlag = False
  VNumber = (DayNo - StartDays - 4) / 7
  ' If first week has 4 or more days, it will be calendar week 1
  ' If first week has less than 4 days, it will belong to last year's
  ' last calendar week
  If StartDays >= 4 Then
    WeekNumber = Fix(VNumber) + 2
  Else
    WeekNumber = Fix(VNumber) + 1
  End If
  ' Handle years whose last days will belong to coming year's first
  ' calendar week
  If WeekNumber > 52 And ThurFlag = False Then WeekNumber = 1
  ' Handle years whose first days will belong to the last year's
  ' last calendar week
  If WeekNumber = 0 Then
    WeekNumber = WeekNumber(DateSerial(Year(InDate) - 1, 12, 31))
  End If
End Function
Avatar billede fdata Forsker
17. juli 2005 - 20:07 #18
Et svar  ;o)
Avatar billede terry Ekspert
18. juli 2005 - 08:18 #19
I may be wrong but just looking at this line
If (Dato = #12/29/2003#) Or (Dato = #12/31/2007#) Then    ' Access crap

tells me that it doesnt work for all dates, but then I dont even know if my example does :o)
Avatar billede terry Ekspert
18. juli 2005 - 08:21 #20
Ugenummerering
Den anvendte nummerering af ugerne i kalendariet er i overensstemmelse med den af Dansk Standardiseringsråd DS/EN 28601 vedtagne standard. Efter denne standard omfatter et ugenummer altid et tidsrum på 7 dage, og mandag er den første dag i ugen. Den første uge, som indeholder mindst 4 dage af det nye år , er uge 1 og vil altid være den uge, hvor første torsdag i januar forekommer.
Avatar billede terry Ekspert
18. juli 2005 - 08:51 #21
Function WeekNum(dtDate As Date) As Long
    Dim lRetVal As Long
    lRetVal = DateSerial(Year(dtDate + (8 - Weekday(dtDate)) Mod 7 - 3), 1, 1)
    WeekNum = ((dtDate - lRetVal - 3 + (Weekday(lRetVal) + 1) Mod 7)) \ 7 + 1
End Function
Avatar billede weaponx Nybegynder
18. juli 2005 - 17:40 #22
Tror jeg skal lege lidt mere med de uge funktioner. Hvorfor er chefer altid så vilde med uger? alle normale mennesker er for længst gået over til datoer, datointervaller, mdr. og år.
Avatar billede fdata Forsker
19. juli 2005 - 13:18 #23
>>>terry
One might expect that the DatePart("ww" ...) expression would work for all dates. As we have discussed more than once here on e this is not the case.
As a result of this bug you have to correct the weeknumber for a few dates. The solution offered here is the simple quick-and-dirty solution.
Microsoft are aware of the problem: http://support.microsoft.com/default.aspx?scid=kb;en-us;200299 
(this page includes another workaround).
Avatar billede terry Ekspert
19. juli 2005 - 20:40 #24
thanks fdata, thats where I got the solution I gave 17/07-2005 10:34:59

but forgot to paste

Function Days(DayNo As Date) As Integer
  Days = DayNo - DateSerial(Year(DayNo), 1, 0)
End Function

:o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester