Avatar billede Motjida Novice
20. februar 2014 - 11:52 Der er 14 kommentarer og
1 løsning

Inputvalidering på flere fra/til kolonner

Hej,

Jeg har et sp¢rgsmål vedr inputvalidering over 7 fra/til kolonner. Er ikke helt sikker på hvordan det bedst håndteres.

Min tabel ser sådan her ud:

ID
Range1_From
Range1_To
Range2_From
Range2_To
Range3_From
Range3_To
Range4_From
Range4_To
Range5_From
Range5_To
Range6_From
Range6_To
Range7_From
Range7_To
GroupName

Og her er lidt test data hvor række 5, overlapper række 4:
1|000000|100000|000000|1000000|000000|1000000|000000|1000000|000000|1000000|000000|1000000|000000|1000000|Group1
2|200000|300000|200000|3000000|200000|3000000|200000|3000000|200000|3000000|200000|3000000|200000|3000000|Group1
3|100001|199999|100001|1999999|100001|1999999|100001|1999999|100001|1999999|100001|1999999|100001|1999999|Group2
4|150000|159999|000000|9999999|000000|9999999|000000|9999999|000000|9999999|000000|9999999|200000|9999999|Group3
5|150005|150005|000000|9999999|000000|9999999|000000|9999999|000000|9999999|000000|9999999|200000|9999999|Group4

Bemærk at række 4 ikke overlapper række 3 da der ikke er overlap i
Range7
Avatar billede terry Ekspert
20. februar 2014 - 18:26 #1
I think you need to give a better explanation
Avatar billede Motjida Novice
20. februar 2014 - 20:05 #2
Jeg har en form hvor man kan kan inputte 7 forskellige til/fra ranges, fra range 1 til range 7.

over de 7 ranges må der samlet set ikke være noget overlap mod eksisterende data i tabellen, men der kan godt være overlap i de enkelte ranges.

Dvs. når jeg vil tilføje en ny 7 range kombination skal formen slå hver enkelt range op mod tabellen, og hvis der til slut er et match over alle 7 ranges på en række, skal input afvises med den begrundelse at den kombination allerede helt eller delvist eksisterer i tabellen
Avatar billede Motjida Novice
20. februar 2014 - 20:08 #3
de enkelte ranges skal valideres hver for sig, dvs. range 1 skal ikke valideres mod range 2-7, men mod alle range 1 i tabellen osv. frem til range 7.

Håber det giver mere mening :)
Avatar billede terry Ekspert
21. februar 2014 - 09:53 #4
The only way I see this being done is as you say yourself, "slå hver enkelt range op mod tabellen".

You could do this in the fields Before Update event using Dcount
http://office.microsoft.com/en-001/access-help/dcount-function-HA001228817.aspx

The criteria argument is the same as the WHERE clause in SQL

you would need to compare the current fields value with each of the ranges in the table.
Avatar billede Motjida Novice
21. februar 2014 - 10:01 #5
Jeg er ikke sikker på DCOUNT virker her da jeg jo er n¢d til at slå hver enkelt værdi i min range op.

Dvs. hvis jeg har Range1_From som 1000 og Range1_To som 2000, så skal der laves et opslag mod alle rækker i tabellen for at se om de værdier er inkluderet i en eksisterende range.

Jeg er ikke sikker på hvordan dette g¢res mest effektivt.
Avatar billede terry Ekspert
21. februar 2014 - 10:16 #6
You should be able to use

OR in the WHERE clause which obviously would end up to be quite long.

Another idea could be to make an SQL which takes parameters. This would still be quite long but easier to make in query builder.

you could start by just working on the SQL query and once you get that working you will need to execute the query from code passing the parameter (fields value to evaluate) to the query which could return count.
Avatar billede Motjida Novice
21. februar 2014 - 14:56 #7
Jeg har brug for en mulighed for at slå hver enkelt værdi i en range  (fra formen) op mod hver enkelt værdi en range (fra tabellen)

dsv. hvis Range1 er 10000-20000 skal der laves 10001 opslag mod tabellen for range1, for at bestemme om nogen af de værdier allerede er indbefattet af en tidligere range1 (for eksempel hvis der fandtes en range1 fra 9995-10005)
Avatar billede terry Ekspert
21. februar 2014 - 15:19 #8
"Jeg har brug for en mulighed for at slå hver enkelt værdi i en range  (fra formen) op mod hver enkelt værdi en range (fra tabellen)"

Each time you enter a value in one of the 7 (From or To) ranges you need to check against what already exists in the table.

I don't see why you need to make 10001 "opslag"

If you have a range in dB 10000-20000

and you enter a value 10001 then your SQL will look something like this, you also need to include checks for other 6 ranges too
SELECT Count(*) from YourTable WHERE 10001 >= Range1_FRom AND 10001 < <= Range1_TO
Avatar billede terry Ekspert
21. februar 2014 - 15:21 #9
Then when you enter the RangeX_TO vgalue you would do the same
Avatar billede Motjida Novice
21. februar 2014 - 15:29 #10
Hvis jeg ¢nsker at oprette en ny række i tabellen (via formen) og jeg inputter 10000-20000 i Range1 From/To, så skal alle værdier indenfor den range tjekkes, for at se om de er indbefattet af en allerede eksisterende Range1 i tabellen.

jeg kan ikke bare tjekke 10000 og 20000, jeg er n¢d til at tjekke 10001, 10002, 10003 etc. da de er indeholdt i 10000-20000. Hvis der f.eks. allerede findes en range i tabellen 15000-20000 er den range jeg ¢nsker at inputte ugyldig da der ellers vil være overlap.
Avatar billede Motjida Novice
21. februar 2014 - 15:31 #11
Det er ikke et problem for mig at tjekke en enkelt værdi mod en Range, mit problem opstår når jeg skal finde alle værdier i en range og tjekke dem op mod alle værder i alle andre ranges der allerede er gemt i tabellen.
Avatar billede Motjida Novice
21. februar 2014 - 16:23 #12
Jeg har lavet f¢lgende query til at vise om der er overlap, ved ikke om det er den bedste metode... men den ser ud til at virke.

SELECT mst.Range1_From, mst.Range1_To, mst.Range2_From, mst.Range2_To, mst.Range3_From, mst.Range3_To, mst.Range4_From, mst.Range4_To, mst.Range5_From, mst.Range5_To, mst.Range6_From, mst.Range6_To, mst.Range7_From, mst.Range7_To
FROM Grouping_Master mst, Grouping_New new
WHERE (new.Range1_From Between mst.Range1_From And mst.Range1_To AND new.Range2_From Between mst.Range2_From And mst.Range2_To AND new.Range3_From Between mst.Range3_From And mst.Range3_To AND new.Range4_From Between mst.Range4_From And mst.Range4_To AND new.Range5_From Between mst.Range5_From And mst.Range5_To AND new.Range6_From Between mst.Range6_From And mst.Range6_To AND new.Range7_From Between mst.Range7_From And mst.Range7_To)
OR (new.Range1_To Between mst.Range1_From And mst.Range1_To AND new.Range2_To Between mst.Range2_From And mst.Range2_To AND new.Range3_To Between mst.Range3_From And mst.Range3_To AND new.Range4_To Between mst.Range4_From And mst.Range4_To AND new.Range5_To Between mst.Range5_From And mst.Range5_To AND new.Range6_To Between mst.Range6_From And mst.Range6_To AND new.Range7_To Between mst.Range7_From And mst.Range7_To);
Avatar billede terry Ekspert
22. februar 2014 - 13:16 #13
So you didn't have to check every value after all?
Avatar billede Motjida Novice
22. februar 2014 - 15:30 #14
jo, det er jo det min query gør :)
Avatar billede terry Ekspert
22. februar 2014 - 18:03 #15
"jeg kan ikke bare tjekke 10000 og 20000, jeg er n¢d til at tjekke 10001, 10002, 10003 etc. da de er "

dsv. hvis Range1 er 10000-20000 skal der laves 10001 opslag

Here you say EVERY single value!
And I answered that you didn't with


SELECT Count(*) from YourTable WHERE 10001 >= Range1_FRom AND 10001 < <= Range1_TO

which is VERY similar to what you have used (BETWEEN)

anyway, no problem, if you have something working now then great
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

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