03. januar 2011 - 09:53Der 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
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
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. :-(
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 ......
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
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)
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)
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
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
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,
Ok - men giv også en masse point til Mugs for den hjælp han gav på dit oprindelige spm :o)
Synes godt om
Ny brugerNybegynder
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.