december 6, 2018

Julekalender afsnit 6

Tilbage til blog

Brug SQL-statements i avancerede filtre

Vi går en kort stund fra video tips til et godt trick omkring SQL-statements i avancerede filtre

  1. Indledning

De fleste bruger af og til avanceret filtrering (Genvej D365: CTRL+SHIFT+F3, Genvej AX 2012: CTRL+F3), hvor man bl.a. kan joine andre tabeller ind og filtrere i en form baseret på disse tabeljoins.
Det der måske ikke så ofte bruges er muligheden for at sætte ekstra krydderi på vores filtre og anvende SQL-statements, hvor vi kan filtrere på baggrund af flere felter, og dermed fx filtrere de poster hvor Felt A er større end Felt B, eller hvor Felt A er forskellig fra Felt B.
Jeg bruger det også når der er behov for at finde de poster hvor enten betingelse A ELLER betingelse B er opfyldt, og altså ikke nødvendigvis dem begge.
Eksempler fra den virkelige verden er:
– Salgsordrer, hvor der er givet rabat, dvs. enten en rabat-procent, eller et rabatbeløb
– Kreditorfakturaer, hvor leverandørkonto er forskellig fra kreditorkonto
– Indkøbsordrer, hvor bekræftet leveringsdato er senere end den ønskede leveringsdato
– Projekter hvor medarbejder XX enten er Projektleder eller Projektsælger
Når først man kender den grundlæggende syntaks er det et rigtig effektivt redskab at have i sin værktøjskasse.
Som altid med filtrerede lister, så kan man tilføje dem til sit workspace (Rollecenter i AX2012), så man har let adgang til dem.

2. Grundlæggende om brug af SQL

Når man vil filtrere ud fra et (eller flere) felter, så skriver man tabelnavn.feltnavn, dvs. hvis jeg ønsker at filtrere listen med sales order lines, ud fra feltet discount percent, skriver jeg (SalesLine.LinePercent)Fx ville jeg måske filtrere salgsordrelinjer hvor discount percent er større end 0, så bliver syntaksen: (SalesLine.LinePercent>0) Som vist på billedet herunder:

NB: Det er ligegyldigt hvilket felt man skriver sit statement i, som det ses herunder filtrerer jeg ud fra felterne discount amount og discount percent, men jeg har skrevet mit statement i en filterlinje med feltet ”Delivery Remainder” der intet har med mit statement at gøre).

Lad os sige at jeg nu ønsker at finde alle de salgsordrelinjer hvor jeg har givet rabat, enten i form af rabat-% eller et rabat-beløb. Det vil sige jeg nu skal filtrere de salgsordrelinjer ud hvor enten Discount procent, eller Discount er større end 0. Jeg skal altså bruge SQL-kommandoen for ”Eller” som er ”||”  (se oversigt over syntaks længere nede)

Jeg skriver mit statement igen, som vist herunder: ((SalesLine.LineDisc>0)||(SalesLine.LinePercent>0))

Et tredje eksempel er hvis jeg ønsker at filtrere indkøbsordrer hvor kreditorkonto er forskellig fra fakturakonto (det kunne også være kreditorfakturaer man ønskede filtreret på samme måde).

Her bruger jeg syntaksen for Forskellig, dvs.  ”!=” og det fulde statement bliver til:

(Purchtable.orderaccount != PurchTable.InvoiceAccount)

3. Oversigt over syntaks og eksempler på anvendelse

Man kan anvende de almindelige tegn for større end, mindre end, eller lave en = værdi, se eksempler herunder

Ønsket filtrering: Syntaks:
Felt A er lig med en værdi, fx salgsordrelinjer, hvor rabatprocenten = 50 (SalesLine.LinePercent=50)
Felt A er større/mindre end en værdi

Fx salgsordrelinjer, hvor rabatbeløbet er større end 0

(SaleLine.LineDisc>0)
Felt A er større/mindre end Felt B

Fx salgsordrelinjer, hvor rabatbeløbet er større end rabatprocenten

(SalesLine.LineDisc>SalesLine.LinePercent)
Felt A er større end værdi ELLER Felt B er større end en værdi

Fx Salgsordrelinjer, hvor enten rabatbeløbet er større end 0, eller rabatprocenten er større end 0

 

((SalesLine.LineDisc>0)||(SalesLine.LinePercent>0))

 

 

NB: hvis man ønsker et ”OG” statement skiftes ”||” ud med ”&&”

Felt A er forskellig fra Felt B

 

Fx Indkøbsordrer, hvor Vendor Account er forskellig fra Invoice Account

 

Man anvender her ”!=”  som ”forskellig fra”

 

(VendTable.AccountNum !=VendTable.InvoiceAccount)