11. juli 2005 - 12:09Der 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.
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.
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
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.
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.
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 ;)
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
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
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
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.
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
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.
>>>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).
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)
Synes godt om
Ny brugerNybegynder
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.