Avatar billede mohnsen Praktikant
08. juni 2010 - 09:33 Der er 20 kommentarer og
1 løsning

Lægge linier sammen

Hej Eksperter

Så er jeg stødt på et problem som jeg må indrømme er for svært for mig.

Jeg har nogle data fra C5 Varesalgsrabat kartoteket, som jeg gerne vil have konverteret til at se lidt anderledes ud:

KILDEDATA:

Varenummer, rabatsats i procent, ved antal

f.eks.:
1011, 10, 20

Ved de varer hvor der kun er 1 linie, er der ikke noget problem, men nogle af varerne står 2 eller flere gange, fordi der kan opnås yderligere rabat ved køb af flere.

f.eks:
1011, 10, 20
1011, 5 , 30
(man får 10% rabat ved køb af 20 stk, og yderligere 5% altså 15% ved køb af 30 stk.)


Disse kildedata skulle gerne ende med at se således ud:

1011, 10, 20
1011, 15, 30

Og da ikke alle varenumre har lige mange linier kunne et udsnit af den færdige liste se nogenlunde således ud:

1011, 10, 20
1011, 15, 30
1012, 30, 10
1020, 40, 90

Den ligger sikkert lige til højrebenet, men jeg kan sgu ikke gennemskue den.
Avatar billede supertekst Ekspert
08. juni 2010 - 09:47 #1
hvor ligger de pågældende data - i C5 eller Access?
Avatar billede mohnsen Praktikant
08. juni 2010 - 09:59 #2
Kilden til de pågældende data er C5,

Men jeg arbejder på dem i access via en ODBC forbindelse.
Avatar billede supertekst Ekspert
08. juni 2010 - 11:54 #3
Ok - d.v.s. så er det i regi af Access. En stump VBA-kode der testerbrud på varenr - ved ens varenr akk. antal fra første forekomst til næste, hvis varenr er ens.
Avatar billede mohnsen Praktikant
08. juni 2010 - 12:20 #4
Jeg har kigget lidt rundt efter en løsning, og mener at DSUM måske kan bruges, de løsninger med DSUM jeg har fundet indtil nu, er dog baseret på hele databasen, eller et udsnit af den, og genstarter ikke den løbende sum for hver ændring i varenummeret.

Så det jeg leder efter er "muligvis" DSUM der er grupperet/genstarter hver gang der er en ændring i varenummeret.

Det skal helst foregå i en forespørgsel.
Avatar billede supertekst Ekspert
08. juni 2010 - 14:42 #5
Har skrevet en VBA-koden, hvis du alligevel er interesseret.

FØR:
Id    varenr    rabat%    rabatAntal
1    1011    10    20
2    1011    5    30
3    1012    2    10
4    1014    5    5
5    1015    10    5
6    1015    8    10
7    1019    5    25


EFTER:
Id    varenr    rabat%    rabatAntal
1    1011    10    20
2    1011    15    30
3    1012    2    10
4    1014    5    5
5    1015    10    5
6    1015    18    10
7    1019    5    25

VBA-MODUL:
Option Compare Database
Public Sub addRabatLinjer()
Dim vnr As Integer, rabPct As Byte
Dim rec As Recordset, r As Long
    Set rec = CurrentDb.OpenRecordset("rabatter")
    With rec
        For r = 1 To .RecordCount
            If r = 1 Then
                vnr = .Fields(1)
                rabPct = .Fields(2)
            Else
                If rec.Fields(1) = vnr Then
                    .Edit
                    .Fields(2) = .Fields(2) + rabPct
                    .Update
                Else
                    vnr = .Fields(1)
                    rabPct = .Fields(2)
                End If
            End If
        .MoveNext
        Next r
    End With
End Sub
Avatar billede supertekst Ekspert
08. juni 2010 - 14:45 #6
FØR:
Id    varenr    rabat%    rabatAntal
1    1011    10    20
2    1011    5    30
3    1012    2    10
4    1014    5    5
5    1015    10    5
6    1015    8    10
7    1019    5    25

EFTER:
rabatter
Id    varenr    rabat%    rabatAntal
1    1011    10    20
2    1011    15    30
3    1012    2    10
4    1014    5    5
5    1015    10    5
6    1015    18    10
7    1019    5    25

VBA-MODUL:
Option Compare Database
Public Sub addRabatLinjer()
Dim vnr As Integer, rabPct As Byte
Dim rec As Recordset, r As Long
    Set rec = CurrentDb.OpenRecordset("rabatter")
    With rec
        For r = 1 To .RecordCount
            If r = 1 Then
                vnr = .Fields(1)
                rabPct = .Fields(2)
            Else
                If rec.Fields(1) = vnr Then
                    .Edit
                    .Fields(2) = .Fields(2) + rabPct
                    .Update
                Else
                    vnr = .Fields(1)
                    rabPct = .Fields(2)
                End If
            End If
        .MoveNext
        Next r
    End With
End Sub
Avatar billede supertekst Ekspert
08. juni 2010 - 14:46 #7
2. udgave identisk - sendt v/fejl
Avatar billede mohnsen Praktikant
08. juni 2010 - 15:00 #8
Hej Supertekst

Det lyder godt - men kan du forklare mig, sådan helt lavpraktisk, hvad skal jeg gøre med den kode du har sendt?
Avatar billede supertekst Ekspert
08. juni 2010 - 15:11 #9
hvilke udgave af Access anvender du?
Avatar billede mohnsen Praktikant
08. juni 2010 - 15:13 #10
2007
Avatar billede supertekst Ekspert
08. juni 2010 - 15:36 #11
Ok - do. her.

Koden indsættes i et modul

Forudsætninger:
Posterne sorteres iflg. varenr
Bør testes i kopi

I koden:
har testet med en tabel m/nedestående struktur - men denne er ingen forudsætning - feltnr skal blot justeres
.
Id / VareNr / Rabatpct / RabatAntal
(0)    (1)      (2)        (3)    <-feltNr  fields(..)

Option Compare Database
Public Sub addRabatLinjer()
Dim vnr As Integer, rabPct As Byte
Dim rec As Recordset, r As Long
    Set rec = CurrentDb.OpenRecordset("rabatter") 'relevante tabel
    With rec
        For r = 1 To .RecordCount
            If r = 1 Then
                vnr = .Fields(1)
                rabPct = .Fields(2)
            Else
                If rec.Fields(1) = vnr Then
                    .Edit
                    .Fields(2) = .Fields(2) + rabPct
                    .Update
                Else
                    vnr = .Fields(1)
                    rabPct = .Fields(2)
                End If
            End If
        .MoveNext
        Next r
    End With
End Sub

Opret / Makro / Modul
Koden kopieres ind i et modul og kan direkte igangsættes herfra med Run / F5

Makroindstilling sættes så makroer kan udføres.
Avatar billede mohnsen Praktikant
08. juni 2010 - 16:09 #12
Hej Supertekst

Det er stadig ikke helt nemt for mig - Sorry!

Hvis jeg nu siger at mine felter hedder således:
varenr="ITEMRELATION"
Rabatpct="RATE_"
Rabatantal="QTY"

Kan du så ikke sætte dem ind for mig :)

Jeg har også prøvet at kopiere tekten ind i "module1", og når jeg prøver at køre den, stopper den ved

    Set rec = CurrentDb.OpenRecordset("rabatter")
Jeg har døbt med forespørgsel "rabatter"

Når jeg prøver at køre den fra knappen "afspil makro" i access, kan jeg ikke se den.

Jeg har godkendt alle makroer til at blive kørt i sikkerhedscenteret.

Min erfaring med makroer, er begrænset til at optage og afspille makroer i excel, så dette her er rimelig ukendt område for mig.

Jeg smider extra point oven i hatten når vi er færdige :)
Avatar billede supertekst Ekspert
08. juni 2010 - 17:25 #13
Prøv at sende db - eller et uddrag deraf - så kan jeg se opbygning af en post - datatyper m.v.

@-adr. under min profil.
Avatar billede supertekst Ekspert
08. juni 2010 - 18:41 #14
Jeg tester makroen direkte i modul-vinduet - trinvist via F8 - eller F5 for kør.

Rem version 2
Option Compare Database

Public Sub addRabatLinjer()

Const NR = "ITEMRELATION"
Const RAB = "RATE_"

Dim vNr As Integer, rabPct As Byte
Dim rec As Recordset, r As Long

    Set rec = CurrentDb.OpenRecordset("rabatter")
       
    With rec
        For r = 1 To .RecordCount
            If r = 1 Then
                vNr = .Fields(NR)
                rabPct = .Fields(RAB)
            Else
                If rec.Fields(NR) = vNr Then
                    .Edit
                    .Fields(RAB) = .Fields(RAB) + rabPct
                    .Update
                Else
                    vNr = .Fields(NR)
                    rabPct = .Fields(RAB)
                End If
            End If
        .MoveNext
        Next r
       
        .Close
    End With
End Sub
Avatar billede mohnsen Praktikant
09. juni 2010 - 07:56 #15
Hej Super

Jeg fik det til at virke sådan nogenlunde, da jeg selv testede på en demo tabel.

Der var dog de problem, at hvis man kommer til at trykke 2 eller flere gange, så stiger tallet hele tiden.

Derudover, så kører min rigtige database, med et ODBC link til kilden, som ikke kan/skal ændres, så rabatpct. bør fremgå som et beregnet felt i en query, og ikke skrive direkte i en tabel.
Avatar billede supertekst Ekspert
09. juni 2010 - 09:59 #16
Hej mohnsen

De 2 gange var jeg godt klar over.
Det kan forhindres ved enten at oprette en boolean-felt, der sættes første gang - eller en test i koden på om at der kun "opdateres" hvis rabat% i anden post er mindre end i den første.

I stedet for en tabel kan opdateringen også ske i en forespørgsel.
Avatar billede supertekst Ekspert
10. juni 2010 - 11:42 #17
Nogen beslutning?
Avatar billede mohnsen Praktikant
10. juni 2010 - 15:13 #18
Hej alle der læser med:

Efter megen frustration, og flere skallede pletter i hovedbunden, lykkedes det mig at finde en løsning via google

Den ser sådan her ud:
SELECT rabatter.ITEMRELATION AS PRICE_PROD_NUM, dbo_INVENPRICE.CURRENCY AS CURRENCY_CODE, -1 AS PRICE_B2B_ID, rabatter.QTY AS AMOUNT, Val(DSum("RATE_","rabatter","ITEMRELATION = '" & [ITEMRELATION] & "' and QTY <= " & [QTY])) AS RunningSum, dbo_INVENPRICE.PRICE, (1-([RunningSum]/100))*[PRICE] AS UNIT_PRICE
FROM dbo_INVENPRICE RIGHT JOIN rabatter ON dbo_INVENPRICE.ITEMNUMBER=rabatter.ITEMRELATION;

->Super, tak for din store indsats, du får fuld point, selvom jeg ikke brugte din løsning.
Avatar billede mohnsen Praktikant
10. juni 2010 - 15:14 #19
Så smid lige et svar :)
Avatar billede supertekst Ekspert
10. juni 2010 - 16:08 #20
Selv tak - en fornøjelse & et svar
Avatar billede supertekst Ekspert
14. juni 2010 - 13:45 #21
Fodringstid?
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