08. juni 2010 - 09:33Der 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:
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.
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.
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
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
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
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
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.
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.
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.
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.