Avatar billede hnto Nybegynder
03. januar 2011 - 09:53 Der er 17 kommentarer og
1 løsning

validering haster !!

Jeg har nogle felter der skal valideres inden man må komme videre i en funktion.

Den første del af nedenstående script måler jeg således på om felterne er udfyldt, og hvis de ikke er udfyldt, kommer der en simpel msgbox. først når alle felterne er udfyldt må funktionen "køre videre" med scriptet der starter med With CodeContextObject...


Private Sub Command8_Click()
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("tabel1", dbOpenDynaset)
         
         
Do
    If IsNull(rs![typenumber]) And IsNull(rs![stock]) Then
    MsgBox "du skal udfylde felterne TYPENUMBER & STOCK inden du kan gå videre"
    'rs.Edit
    'rs![felt 3].Value = "1"
    'rs.Update
    Else
    End If
    rs.MoveNext
Loop Until rs.EOF

rs.Close
Set rs = Nothing


With CodeContextObject
        DoCmd.SetWarnings False
        If (.ProductDataSupplierID = 1) Then
            .StatusID = 2
        End If
        If (.ProductDataSupplierID = 2) Then
            .StatusID = 4
        End If
        .DateStep1 = Date
        If (.ProductDataSupplierID = 2) Then
            .DateStep2 = Date
        End If
        If (.ProductDataSupplierID = 2) Then
            .DateStep3 = Date
        End If
        DoCmd.OpenQuery "QryProductIdUpdate", acViewNormal, acEdit
        DoCmd.OpenQuery "QryExistingProductInfoUpdate", acViewNormal, acEdit
        DoCmd.Close acForm, "FrmCreateCaseStep1"
End With

End Sub
Avatar billede mugs Novice
03. januar 2011 - 10:16 #1
Prøv at indsætte en Exit sub lige efter MsgBox, så koden forlades hvis betingelsen er opfyldt:
Do
    If IsNull(rs![typenumber]) And IsNull(rs![stock]) Then
    MsgBox "du skal udfylde felterne TYPENUMBER & STOCK inden du kan gå videre"
Exit sub
    'rs.Edit
    'rs![felt 3].Value = "1"
    'rs.Update
    Else
    End If
    rs.MoveNext
Loop Until rs.EOF
Avatar billede hnto Nybegynder
03. januar 2011 - 10:32 #2
det var nok en udemærket mulighed :-)
en sidste hurtig ting til dette....

kan man i starten af scriptet indbygge et lille filter der sikrer at det kun er de records i "tabel1" hvor feltet CASEID = formularens combo2 værdi.

noget ala...

Set rs = db.OpenRecordset("tabel1", dbOpenDynaset)
where tabel1.caseid = me!combo2.value

???
Avatar billede Slettet bruger
03. januar 2011 - 10:49 #3
På saxo.com kan du downloade gratis en manual om access. Her må du kunne finde et svar.
Avatar billede mugs Novice
03. januar 2011 - 10:56 #4
I den forespørgsel der ligger til grund for formularen, kan du indsætte et kriterie der henviser til formularens felt. Noget i stil med dette:

[forms]![formularnavn]![feltnavn]
Avatar billede hnto Nybegynder
03. januar 2011 - 11:01 #5
Mugs
ja sådan plejer jeg også at lave det, men i dette tilfælde er det en database der allerede er lavet, og her har man brugt formens filterfunktion ved at indsætte linkchilds i properties på selve formen. Dette betyder at det visuelle i formens subform / query er begrænset til formens combo værdi, men åbnes queryen "bagom" er der i denne alle poster. :-(
Avatar billede hnto Nybegynder
03. januar 2011 - 11:06 #6
jeg har prøvet at indsætte følgende i starten af scriptet, men det siger der skal defineres et object til dette under
Set QryCreateCaseStep1Sub.CaseID.Value = Me!Combo0.Value

......
Set db = CurrentDb
Set rs = db.OpenRecordset("QryCreateCaseStep1Sub", dbOpenDynaset)
Set QryCreateCaseStep1Sub.CaseID.Value = Me!Combo0.Value
......
Avatar billede mugs Novice
03. januar 2011 - 11:13 #7
Hvis du vil arbejde med et udsnit af forespørgslens felter med et filter, tror jeg ike der er anden udvej end at gennemløbe selve formularens poster fra start til slut.

Her tror jeg du med fordel kann bruge en Select Case struktur i stedet for alle If sætningerne:

If (.ProductDataSupplierID = 1) Then
            .StatusID = 2
        End If
        If (.ProductDataSupplierID = 2) Then
            .StatusID = 4
        End If
        .DateStep1 = Date
        If (.ProductDataSupplierID = 2) Then
            .DateStep2 = Date
        End If
        If (.ProductDataSupplierID = 2) Then
            .DateStep3 = Date
        End If
Avatar billede anlu Nybegynder
03. januar 2011 - 11:19 #8
Jeg kan umiddelbart se to muligheder:
1. Du kan referere til [forms]![formularnavn]![Combo0] som kriterie direkte i QryCreateCaseStep1Sub, men så kan den selvfølgelig kun bruges, hvor din form er åben.

2. Du kan skrive kriteriet direkte ind i en sql, når du åbner recordsettet:

Set rs = db.OpenRecordset("SELECT * FROM tabel1 WHERE CaseID = " & me!combo2.value, dbOpenDynaset)
Avatar billede hnto Nybegynder
03. januar 2011 - 11:55 #9
Anlu

den siger den ikke kan finde combo i dit SQL script, men det tror jeg er fordi me! er reference på den subform der har queryen indbygget med comboen ligger på hovedformen.
hvis jeg istedet for me! indsætter navnet på min hovedform og laver et DIM på denne siger den at den mangler et object.

ellers er det din løsning der er det jeg mangler :-)

Dim db As Database
Dim rs As Recordset
Dim FrmCreateCaseStep1 As Form
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT * FROM tabel1 WHERE CaseID = " & FrmCreateCaseStep1!Combo2.Value, dbOpenDynaset)
Avatar billede anlu Nybegynder
03. januar 2011 - 12:30 #10
Det er jo et spørgsmål om at referere rigtigt til kontrollerne - du mangler lige et Forms! foran dit fornavn, tror jeg:

Set rs = db.OpenRecordset("SELECT * FROM tabel1 WHERE CaseID = " & Forms!FrmCreateCaseStep1!Combo2.Value, dbOpenDynaset)
Avatar billede anlu Nybegynder
03. januar 2011 - 12:31 #11
Det er jo et spørgsmål om at referere rigtigt til kontrollerne - du mangler lige et Forms! foran dit fornavn, tror jeg:

Set rs = db.OpenRecordset("SELECT * FROM tabel1 WHERE CaseID = " & Forms!FrmCreateCaseStep1!Combo2.Value, dbOpenDynaset)
Avatar billede hnto Nybegynder
03. januar 2011 - 12:48 #12
Anlu,
det havde jeg prøvet uden held.

nu har jeg ændret queryen således den åbner med kriteriet på comboen og det virker som vanligt fint.

nu vil den så bare ikke udføre linie 5 (Set rs...) da der er for få parametre ?!?!?!?

script:

Private Sub Command8_Click()
   
Dim db As Database
Set db = CurrentDb

Dim rs As Recordset
Set rs = db.OpenRecordset("QryCreateCaseStep1Sub", dbOpenDynaset)
         
Do

    If IsNull(rs![Typename]) And IsNull(rs![StockArticle]) Then
    MsgBox "du skal udfylde felterne TYPENAME & STOCKARTICLE inden du kan gå videre"
    Exit Sub
    Else
    End If
    rs.MoveNext
Loop Until rs.EOF
rs.Close
Set rs = Nothing

With CodeContextObject
        DoCmd.SetWarnings False
        If (.ProductDataSupplierID = 1) Then
            .StatusID = 2
        End If
        If (.ProductDataSupplierID = 2) Then
            .StatusID = 4
        End If
        .DateStep1 = Date
        If (.ProductDataSupplierID = 2) Then
            .DateStep2 = Date
        End If
        If (.ProductDataSupplierID = 2) Then
            .DateStep3 = Date
        End If
        DoCmd.OpenQuery "QryProductIdUpdate", acViewNormal, acEdit
        DoCmd.OpenQuery "QryExistingProductInfoUpdate", acViewNormal, acEdit
        DoCmd.Close acForm, "FrmCreateCaseStep1"
End With
End Sub
Avatar billede anlu Nybegynder
03. januar 2011 - 13:03 #13
Hmm... jeg ved ikke om man ikke kan bruge referencer til kontroller i queries, når man åbner dem via RecordSet?

Kan du ikke lige skrive hvordan din WHERE-betingelse i QryCreateCaseStep1Sub ser ud?
Avatar billede hnto Nybegynder
03. januar 2011 - 14:48 #14
den er rimelig simpel

WHERE (((ProductIdNumber.CaseID)=[Forms]![FrmCreateCaseStep1]![Combo0]));
Avatar billede anlu Nybegynder
03. januar 2011 - 15:23 #15
Er fejlen i #9 så ikke bare at der refereres til Combo2 i stedet for Combo0? Evt. lige med Forms! foran?
Avatar billede hnto Nybegynder
04. januar 2011 - 08:25 #16
hej anlu,
nej den er god nok, idet denne er korigeret igennem databasen, men ellers havde du ret :-)

dette er kriteriet i forespørgslen:
WHERE (((ProductIdNumber.CaseID)=[Forms]![FrmCreateCaseStep1]![Combo0]));

dette er scriptet på formen:
(bemærk at den stadig skriver at der er for få argumenter angivet i linie 5 i nedenstående, og det fatter jeg simpelthen ikke...)

Private Sub Command8_Click()
Dim db As Database
Set db = CurrentDb
Dim rs As Recordset
Set rs = db.OpenRecordset("QryCreateCaseStep1Sub", dbOpenDynaset)

Do

    If IsNull(rs![Typename]) And IsNull(rs![StockArticle]) Then
    MsgBox "du skal udfylde felterne TYPENAME & STOCKARTICLE inden du kan gå videre"
    Exit Sub
    Else
    End If
    rs.MoveNext
Loop Until rs.EOF
rs.Close
Set rs = Nothing

With CodeContextObject
        DoCmd.SetWarnings False
        If (.ProductDataSupplierID = 1) Then
            .StatusID = 2
        End If
        If (.ProductDataSupplierID = 2) Then
            .StatusID = 4
        End If
        .DateStep1 = Date
        If (.ProductDataSupplierID = 2) Then
            .DateStep2 = Date
        End If
        If (.ProductDataSupplierID = 2) Then
            .DateStep3 = Date
        End If
        DoCmd.OpenQuery "QryProductIdUpdate", acViewNormal, acEdit
        DoCmd.OpenQuery "QryExistingProductInfoUpdate", acViewNormal, acEdit
        DoCmd.Close acForm, "FrmCreateCaseStep1"
End With
End Sub
Avatar billede hnto Nybegynder
04. januar 2011 - 09:48 #17
har fundet "fejlen" selvom jeg ikke forståe den opstår.
det var fordi der i queryen var den berygtede where klausul

fjerner jeg denne og ligger den ind i scriptet istedet virker den del. Nu skal jeg så bare have subformen tl at selectere ud fra det der står i comboen på en eller anden måde,

angiv svar anlu så du kan få point.
Avatar billede anlu Nybegynder
04. januar 2011 - 19:12 #18
Ok - men giv også en masse point til Mugs for den hjælp han gav på dit oprindelige spm :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