Avatar billede sbi Nybegynder
02. december 2002 - 15:32 Der er 11 kommentarer

Validering af data

Jeg har brug for følgende validering7udvælgelse af data match.

Jeg har en record med et no + 4 parametre:
No group1 group2 group3 group4

Denne record skal sammenlignes med en tabel hvor der er defineret en række profiler med forskellige filtre. Eksempel:

Profil A; group1=600|800; group3=5..10
Profil B; group1=400; group4=2500
Profil C; group2=14540..15000; group2=25

Ideen er at når min record skal valideres mod disse profiler (Skal altid starte fra toppen, da profilerne er prioriterede).

Når den så rammer en profil der matcher skal denne vælges.
Formatet i filtrene er som beskrevet ovenstående: en "|" betyder "eller" og ".." betyder "Between".

Jeg er i tvivl om hvordan jeg skal gribe det an. Jeg regner med at bygge den i en Stored Procedure.

Håber I har noget input.

/SBI
Avatar billede jwi Nybegynder
03. december 2002 - 15:05 #1
Could you give an example of how the data looks in the table?
james.
Avatar billede sbi Nybegynder
03. december 2002 - 15:56 #2
The group1 to group4 in the recordset only contains datatype int.

/SBI
Avatar billede jwi Nybegynder
03. december 2002 - 16:47 #3
But does the table look like this:
group1
Avatar billede jwi Nybegynder
03. december 2002 - 16:50 #4
Sorry about that;)

Like this:-

profile    group1    group2      group3    group4
---------------------------------------------------
A          600|800                5..10
B          400                          2500
C                    14540..15000
C                    25
Avatar billede sbi Nybegynder
03. december 2002 - 18:20 #5
Exactly!

And the  Recordset to be validated agianst these profiles could be like:
NO  group1    group2    group3    group4
-----------------------------------------
123  600      13000    25        5600

/SBI
Avatar billede janus_007 Nybegynder
06. december 2002 - 12:29 #6
Enten skal du bruge en sp eller også må du lave et bedre tabeldesign!
At lave en select der tager højde for tallene i intervallet 5..10 er vist ikke noget der lige lader sig gøre!

Men det kan snildt løses... :O)
Avatar billede heko124 Nybegynder
08. januar 2003 - 18:29 #7
Værdierne under group1 til group4 i din profiltabel er de registrede i db som vharchar's eller int ?

henrik :-)
Avatar billede heko124 Nybegynder
08. januar 2003 - 18:31 #8
og vil en record fra dit recoredset altid kun matche én profil ?

henrik :-)
Avatar billede sbi Nybegynder
09. januar 2003 - 01:25 #9
Datatyperne i profiltabellen er varchars for at den kan indeholde "|" og ".."
En record kan sagtens matche flere profiler, men de vil blive gennemløbet fra toppen, dvs. at de mest 'restiktive' filtre ligger øverst (dem med flest krav)

Jeg har dog selv løst problemet.
(Se nedenstående)

Men hvis du eller andre har en bedre løsning kunne det være interessant at se.
Avatar billede sbi Nybegynder
09. januar 2003 - 01:26 #10
Set @FilterA=600 //Varens Group1 filter. (Ville matche A profilen)
   
    IF (@OR_Position>0)
    BEGIN
    WHILE (@OR_Position>0)
    BEGIN
        SET @GenProdPostingGroupFilterLength = LEN(@GenProdPostingGroupFilter)
        SET @GenProdPostingGroupFilter2 = Substring(@GenProdPostingGroupFilter, 1, @OR_Position-1)
        SET @GenProdPostingGroupFilter = Substring(@GenProdPostingGroupFilter, @OR_Position+1, @GenProdPostingGroupFilterLength)
        SET @GenProdPostingGroupFilterLength = LEN(@GenProdPostingGroupFilter)
        SET @OR_Position = CHARINDEX('|', @GenProdPostingGroupFilter)
        IF (CAST(@FilterA as VarChar(50)) = @GenProdPostingGroupFilter2)
        BEGIN
            SET @ProfileFilterA = True
        END
    END
        IF (CAST(@FilterA as VarChar(50)) = @GenProdPostingGroupFilter2)
        BEGIN
            SET @ProfileFilterA = True
        END
    END

    IF (@BETWEEN_Position>0)
    BEGIN

        IF (RTRIM(CAST(@FilterA AS Char(30))) >= REPLACE(@GenProdPostingGroupFilter, '..', ' AND '+RTRIM(CAST(@FilterA AS Char(30)))+' <= '))
        BEGIN
            SET @ProfileFilterA = True
        END
    END
Avatar billede sbi Nybegynder
09. januar 2003 - 01:29 #11
Ovenstående kode skal løbes igennem 4 gange (1 gang for hver filter) på hver profil.

Rent performance mæssigt gør det ikke noget. Ovenstående kode (som dog kun er et udklip af den samlede procedure der er 300 linier lang) bliver eksekveret på under 1 sek. selv om der ligger en del profiler.

/SBI
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
Computerworld tilbyder specialiserede kurser i database-management

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