Avatar billede dane022 Seniormester
16. februar 2010 - 21:27 Der er 18 kommentarer og
1 løsning

dynamisk søgefunktion med dobbelt kriterie

Nedenstående kode udsøger alle medarbejdere der er ansat pr. den dato der skrives i [oplysninger pr.].
Koden virker fint på de medarbejdere der er fratrådt, men ikke på dem der ikke er fratrådt. Koden skal derfor udsøge de medarbejdere hvor ansættelsesdatoen er mindre eller lig med [oplysninger pr] OG fratrædelsesdato er blank ELLER fratrædelsesdato er større end [oplysninger pr]
Hvordan kringles den ?

If Me![oplysninger pr] <> "" Then
SQLStr = SQLStr & "[ansættelsesdato] <= #" & Format(Me![oplysninger pr], "yyyy-mm-dd") & "# and "
End If
If Me![oplysninger pr] <> "" Then
SQLStr = SQLStr & "[fratrædelsesdato] >= #" & Format(Me![oplysninger pr], "yyyy-mm-dd") & "# and "
End If
Avatar billede kabbak Professor
16. februar 2010 - 21:59 #1
det kan man ikke se på
SQLStr = SQLStr & "[ansættelsesdato] <= #" & Format(Me![oplysninger pr], "yyyy-mm-dd") & "# and "

mangler der ikke noget ??
Avatar billede fdata Forsker
16. februar 2010 - 22:01 #2
Mener du sådan her:

If Me![oplysninger pr] <> "" Then
  SQLStr = SQLStr & "(([ansættelsesdato] <= #" & Format(Me![oplysninger pr], "yyyy-mm-dd") & "# AND [fratrædelsesdato] Is Null)"
  SQLStr = SQLStr & " OR "
  SQLStr = SQLStr & "([fratrædelsesdato] >= #" & Format(Me![oplysninger pr], "yyyy-mm-dd") & "#)) and "
End If

Bemærk alle de nye paranteser ;o)
Avatar billede dane022 Seniormester
16. februar 2010 - 22:03 #3
For mig ser den ud til at virke. Den er brugt på eksperten flere steder, men ikke i den udgave jeg søger. Hvad mener du mangler?
16. februar 2010 - 22:05 #4
Det er svaert at sige naar vi ikke ser hele sql expression, men jeg tror det er forkert at lave to if-grupper.

Proev med dette:

If Me![oplysninger pr] <> "" Then
SQLStr = SQLStr & "[ansættelsesdato] <= #" & Format(Me![oplysninger pr], "yyyy-mm-dd") & "# and "
SQLStr = SQLStr & "[fratrædelsesdato] >= #" & Format(Me![oplysninger pr], "yyyy-mm-dd") & "# and "
End If
16. februar 2010 - 22:06 #5
#2 og #3 blev aabenbart sendt mens jeg var i gang med at skrive mit indlaeg.
Avatar billede dane022 Seniormester
16. februar 2010 - 22:09 #6
Den virker som den første (er afprøvet). Hele koden:
Private Sub Kommandoknap4_Click()
Dim SQLStr As String
   
    If Me![oplysninger pr] <> "" Then
        SQLStr = SQLStr & "[medarbejdernummer] like '*" & Me!Medarbejdernummer & "*' And "
        SQLStr = SQLStr & "[ansættelsesdato] <= #" & Format(Me![oplysninger pr], "yyyy-mm-dd") & "# and "
        SQLStr = SQLStr & "[fratrædelsesdato] >= #" & Format(Me![oplysninger pr], "yyyy-mm-dd") & "# and "
    End If
     
    If Len(SQLStr) = 0 Then
        DoCmd.OpenForm "ansættelser"
        DoCmd.Close acForm, "ansættelser søgning"
    Else
        SQLStr = Left(SQLStr, Len(SQLStr) - 5)
        DoCmd.OpenForm "ansættelser", , , SQLStr
        DoCmd.Close acForm, "ansættelser søgning"
    End If
End Sub
Avatar billede dane022 Seniormester
16. februar 2010 - 22:10 #7
Jeg søger udover datoen også på medarbejdernummer
16. februar 2010 - 22:17 #8
Jamen saa tillader jeg mig at oprette et svar for med undtagelse af tilfoejelsen for medarbejdernummer saa var det den loesning jeg presenterede i #4.
Avatar billede dane022 Seniormester
16. februar 2010 - 22:21 #9
den søger ikke på blank fratrædelsesdato
Avatar billede fdata Forsker
16. februar 2010 - 22:23 #10
>> Christian. Blander mig lige. Du mangler en lille (ikke ubetydelig) krølle.

Bemærk spm: ...hvor ansættelsesdatoen er mindre eller lig med [oplysninger pr] OG fratrædelsesdato er blank ELLER fratrædelsesdato er større end [oplysninger pr]

Din løsning medtager kun poster, hvor ansættelses- og fratrædelsesdatoerne begge er udfyldt.

Se i mit svar #2. Her er udtrykket:
  ansættelsesdatoen er mindre eller lig med [oplysninger pr] OG fratrædelsesdato er blank
    ELLER
  fratrædelsesdato er større end [oplysninger pr]
Avatar billede dane022 Seniormester
16. februar 2010 - 22:36 #11
Sorry, havde ikke set dit svar. Vi er tæt på.
Men af en eller anden grund tager din kode også data med hvor [oplysninger pr] ligger før ansættelsesdatoen.
Det gør koden i #6 ikke.

Til oplysning skal det nævnes at jeg har smidt SQLStr = SQLStr & "[medarbejdernummer] like '*" & Me!Medarbejdernummer & "*' And "
ind på hver sin side af OR
16. februar 2010 - 22:54 #12
fdata, de indlaeg vi sendte med 4 minutters mellemrum (du foerst mens jeg skrev mit) har det til faelles at de fjerner det dobbelte IF  END IF hvilket synes at vaere hovedproblemet i koden i det oprindelige spoergsmaal.

dane022 (og fdata), det jeg konstaterede er at den kode du i #6 siger virker og som du synes at vaere tilfreds med svarer til mit indlaeg.

fdata synes saa at sige at du ikke burde vaere tilfreds med koden i #t6 (og med min kode) fordi de ikke tester for blanke dater, og i #9 siger du saa det samme.

Lad mig lave to kommentarer:  (1) Jeg er selv i gang med at laere Access (startede for cirka to maaneder siden) og det er tilfredsstillende og jeg giver mig selv interne points for at jeg kunnet se hovedproblemet og foreslaa en loesning der virker.

(2)  Det er ved at vaere sengetid i Belgien hvor jeg bor.  Nu hvor du har en loesning paa det problem du stillede synes jeg at du boer lukke spoergsmaalet og uddele points som du skoenner.  Jeg kikker paa traaden i morgen tidlig.
16. februar 2010 - 22:56 #13
Og saa igen, #11 blev sendt mens jeg skrev min #12.  Jeg stopper.  Held og lykke med at fastlaegge hvilken kode du vil bruge.
Avatar billede Slettet bruger
17. februar 2010 - 09:49 #14
Her er et eksempel for at vise princippet, der kan give dig din løsning:

qFraTraadt:
SELECT tblAnsatte.Navn, tblAnsatte.Fratraadt
FROM tblAnsatte
WHERE (((tblAnsatte.Fratraadt)<=[DinDato:]));

...og endelig forespørgsel:

SELECT tblAnsatte.Navn, tblAnsatte.Ansat, tblAnsatte.Fratraadt
FROM tblAnsatte LEFT JOIN qFraTraadt ON tblAnsatte.Navn = qFraTraadt.Navn
WHERE (((tblAnsatte.Ansat)<=[DinDato:]) AND ((qFraTraadt.Navn) Is Null));

!~)
Avatar billede fdata Forsker
17. februar 2010 - 19:50 #15
Øøøh. Nu er jeg forvirret. Du skriver: Men af en eller anden grund tager din kode også data med hvor [oplysninger pr] ligger før ansættelsesdatoen.

Ja, i de tilfælde, hvor en medarbejder er fratrådt, ses der ikke på ansættelsesdatoen; men det er jo sådan, du har specificeret dit spørgsmål!

Hvis du mener noget andet, må du lige forklare helt præcist, hvad det er du så ønsker.
Avatar billede fdata Forsker
17. februar 2010 - 19:54 #16
Tjah, jeg kan jo forresten prøve at gætte. Hvad med:

If Me![oplysninger pr] <> "" Then
  SQLStr = SQLStr & "[ansættelsesdato] <= #" & Format(Me![oplysninger pr], "yyyy-mm-dd") & "#"
  SQLStr = SQLStr & " AND ""
  SQLStr = SQLStr & " (([fratrædelsesdato] Is Null) OR ([fratrædelsesdato] >= #" & Format(Me![oplysninger pr], "yyyy-mm-dd") & "#)"
End If

Det vil give dig alle medarbejdere der er ansat pr. den dato der skrives i [oplysninger pr.]., som du skriver i dit spm.
Avatar billede dane022 Seniormester
17. februar 2010 - 21:13 #17
Jeg er glad for de mange input, det er godt at være omgivet af eksperter.

Christian: Jeg skriver i #1 at koden skal udsøge de medarbejdere der er aktive på den gældende dato. Din kode i #4 er egentlig bare en gentagelse af den jeg havde i forvejen, men uden dobbelt IF og END IF. De gør ingen forskel, men er selvfølgelig unødvendige.

Den kode der kom tættest var #2. Den havde kun den fejl, at var fratrædelsesdatoen udfyldt og udsøgningsdatoen lå før ansættelsesdatoen, kom medarbejderen stadig frem. Fdata får derfor point. Den tilrettede kode:
If Me![oplysninger pr] <> "" Then
        SQLStr = SQLStr & "[medarbejdernummer] like '*" & Me!Medarbejdernummer & "*' And "
        SQLStr = SQLStr & "(([ansættelsesdato] <= #" & Format(Me![oplysninger pr], "yyyy-mm-dd") & "# AND [fratrædelsesdato] Is Null)"
        SQLStr = SQLStr & " OR "
        SQLStr = SQLStr & "[medarbejdernummer] like '*" & Me!Medarbejdernummer & "*' And "
        SQLStr = SQLStr & "[ansættelsesdato] <= #" & Format(Me![oplysninger pr], "yyyy-mm-dd") & "# and "
        SQLStr = SQLStr & "([fratrædelsesdato] >= #" & Format(Me![oplysninger pr], "yyyy-mm-dd") & "#)) and "
    End If
Avatar billede dane022 Seniormester
17. februar 2010 - 21:18 #18
fdata, jeg har først lige set dine indlæg fra idag.
Håber du med mit sidste indlæg forstod hvad jeg mente, men det vigtige er jo at det er løst. Koden blev måske bare lidt længere end du selv ville have gjort den til, men for mig er det vigtigste at det virker
Avatar billede fdata Forsker
18. februar 2010 - 21:24 #19
No sweat. Din løsning er jo i runde tal magen til mit forslag.
Takker for point  ;o)
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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