Hej alle. Jeg står lige overfor en udfordring. Jeg skal hente noget data ud fra en pris/rabat tabel. i tabellen kan kolonnen kontokode antage værdierne 0,1,2. For alle records med værdien 0, skal kolonnen kontorelation være = et debitornummer fra en debitor tabel og kolonnen ecustomer i debitor tabellen skal have værdien 1. Så Kontokode skal altså enten være o,1,2 OG hvis den er 0, skal de førnævnte ting opfyldes. Derudover er der en varekode i pris/rabat tabellen som ligeledes kan antage værdierne 0,1,2. Her skal det også være sådan så at værdien skal enten være 0,1,2 OG hvis den er 0, så skal varerelation være = et varenummer der findes i tabellen estocktable Derudover skal dataset kolonnen i prisrabat være = 'dat' og todate kolonnen i pris/rabat tabellen skal være større eller = 01-01-2007 eller have værdien 01-01-1900
mit bud har været select [kolonner] from prisrabat, estocktable, debkart where((prisrabat.kontokode=0 AND ltrim(prisrabat.kontorelation)=ltrim(debkart.kontonummer) AND debkart.ecustomer=1) OR prisrabat.kontokode=1 OR prisrabat.kontokode=2)AND ((prisrabat.varekode = 0 AND ltrim(prisrabat.varerelation)=ltrim(estocktable.itemnumber)) OR varekode=1 OR varekode=2) AND (tildato>='01-01-2007' OR tildato='01-01-1900') AND dataset='dat'
Jeg er ikke helt sikker på at jeg forstår 100% hvilke kriterier der helt præcis skal opfyldes (og derfor har jeg ikke forsøgt mig med konkret sql endnu), men som jeg læser det forsøger du følgende:
Hent noget fra nogle joinede tabeller hvor:
[en af følgende skal være opfyldt] (kontokode = 1 eller 2) ELLER (kontokode = 0 OG ecustormer = 1)
[OG en af følgende skal også være opfyldt] (varekode = 1 eller 2) ELLER (varekode = 0 OG 'varenummer findes')
[OG ALT følgende skal være opfyld] (prisrabat = 'dat') OG (todate > noget OG todate < nogetandet)
Svarer dette til hvad du ønker? Et lille tillæg: Kan varerelation overhovedet være et nummer som ikke findes i estocktable? Hvis ja, ville det så ikke være bedre at checke at det ikke kunne være det? For du bør ikke have relations felter som ikke har en relation...
det er meget tæt på at være rigtigt forstået. Jeg vil lige gøre opmærksom på at ecustomer er et felt der er i debitor tabellen, og at det felt skal være sat til 1, for den debitor hvis debitor nummer står i feltet kontorelation. Kontorelation er KUN udfyldt med et kundenummer for de records hvor kontokode=0, hvis kontorelation er 1 så står der en rabatgruppe i kontorelation og hvis det er 2, så er kontorelation blankt, da det så er en pris/rabat opsætning der gælder for alle kunder.
mht til varerelationen så kan der sagtens stå et varenummer der ikke findes i estocktable, da estocktable er en tabel der indeholder de vare der er en del af et varekatalog på en webshop. estocktable er således en delmængde af det samlede varesortiment
select [kolonner] from prisrabat p where kontokode = 0 and (select ecustomer from debkart d where p.kontokode = d.kontokode) = 1
Mht varenummer, ville det så ikke være bedre at have en status i prisrabat der kunne være hhv 0 eller1 alt efter om varen skal med i webshoppen eller ej?
den returnerede desværre ingenting. Der opstod ingen fejl, men den returnerede desværre ikke nogle records. Jeg har oprettet en enkelt record der skulle leve op til de krav. Jeg omskrev den desuden lidt til: select * from prisrabat p where kontokode = 0 and (select ecustomer from debkart d where p.kontorelation = d.kontonummer) = 1 da kontode kun er et tal mellem 0 og 3, mens kontorelation er det felt i pris/rabat tabellen der indeholder debitornummeret(men kun hvis kontokode er 0 i samme pris/rabat record)
mht. tabel designet, så er det XAL jeg henter data udfra og datastrukturen ligger fast der. Ved godt man godt kunne ændre det, men det ville kræve man oprettede felterne i pris/rabat tabellen, lavede en kørsel der udfyldte felterne(for det jeg laver er noget der implementeres sammen med kørende systemer), og derudover skulle der også ændres i noget trigger kode.
Og du Har en row i prisrabat hvor kontokode = 0 og det nummer der står i kontorelation også findes i feltet kontonummer i tabellen debkart, hvor der i samme row også står 1 i ecustomer
ja, jeg tror du har fat i den lange ende. HVIS kontokode = 0 i prisrabat tabellen, så betyder det at rabatten gælder for en specifik debitor, og feltet kontorelation i prisrabat tabellen vil derfor være udfyldt med et debitornummer som skal være at finde i tabellen debkart, og jeg er kun interesseret i at få fat i recorden hvis ecustomer = 1 i debkart for det kontonummer
- lige en forklaring for en sikkerheds skyld, men det virker som om du er fint med på hvad det drejer sig om.
kontokode er integer og kontorelation er varchar10. kontokode kan antage 3 værdier, nemlig 0,1,2 og kontorelation indeholder enten et debitornummer, en debitor rabatgruppe eller blankt, alt efter hvad feltet kontokode indeholder.
Nu har jeg ikke lige en ms sql ved hånden, så jeg kan ikke lige teste dette. Men jeg gætter på at grunden til at de forskellige sql sætninger ikke returnere rækker, skyldes at felttyperne ikke er ens. Altså mssql opfatter ikke integer 3 som det samme som varchar 3. Derfor findes ingen felter hvor kontorelation = kontokode , og derfor får du ingen data ud. Så første opgave er at ændre felttyper for de kolonner hvor du vil sammenligne om der står samme kunde/vare-nummer.
Når dette er gjort, test så at min sql fra 10.34 idag returnere data - og med ecustomer = 1. Hvis ja test så efterfølgende sql fra 19/01-2007 13:52:17
jeg tror du blander tingene lidt sammen....der er ingen steder hvor kontokode skal være = kontorelation. Kontorelation antager en værdi AFHÆNGIG af hvad kontokode viser, men skal på intet tidspunkt sammenlignes med denne. kontorelation skal derimod sammenlignes med debitornummeret fra debkart i de tilfælde hvor kontokode = 0. Og derudover skal ecustomer i debkart også være 1.
Det virker lidt som om du får returneret alle rows fra prisrabat hvor kontokode = 0, men at alle debkart felter står til null fordi der ikke findes nogle entries som hvor kontorelation = debitornummer.
Er du sikker på at der er et eller flere tilfælde hvor samme debitornummer står i begge tabeller OG kontokode ved en eller flere af disse = 0?
jeg er 100% sikker på jeg har oprettet en debitor hvor ecustomer = 1 OG at jeg har oprettet en rabat record for denne debitor i prisrabat, hvor kontokode = 0
det er ldit mystisk, har også selv prøvet med:
SELECT * FROM prisrabat WHERE kontokode=0 AND kontorelation IN(SELECT kontonummer FROM debkart WHERE ecustomer=1)
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.