Avatar billede madssch Nybegynder
11. april 2006 - 15:44 Der er 25 kommentarer og
1 løsning

Opret række vha. VB

Hej Eksperter.

Jeg har en Access Database med en formular. Formularen har følgende felter:

- KundeID
- ProduktID
- Pris
- Dato
- Kommentar

Ved klik på "OpretKnap", skal dataene indsættes i tabellen "tblKundeProdukt".

Jeg har oprettet følgende hændelsesprocedure (som ikke virker):

Option Compare Database

Private Sub OpretKnap_Click()

INSERT INTO 'tblKundeProdukt' [KundeID, ProduktID, Pris, Dato, Kommentar]
VALUES [Kunde.Value, Produkt.Value, Pris.Value, Dato.Value, Kommentar.Value]

End Sub

Jeg er ikke vant til at programmere i Access, så jeg har ingen anelse om, hvad der er galt.

På forhånd tak.
Avatar billede terry Ekspert
11. april 2006 - 16:06 #1
Try using DoCmd.RunSQL "Here goes your SQL...."
Avatar billede terry Ekspert
11. april 2006 - 16:11 #2
DoCmd.RunSQL "INSERT INTO tblKundeProdukt (field  list goes here) VALUES (Values go here)
Avatar billede terry Ekspert
11. april 2006 - 16:15 #3
If your values are in variables or text boxes then these need to be replaced by the actual values in the SQL string. You do this something like this

".... VALUES ('" & Kunde & "', '" & Produkt & "', " & Pris & .....


Notice that text values must be inside '' and numbers without
Avatar billede terry Ekspert
11. april 2006 - 16:18 #4
but why do you want to do in in code? If the form is bound to a table then the data will automatically get written to the table
Avatar billede -anders- Juniormester
11. april 2006 - 16:26 #5
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open "tblKundeProdukt", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
Set rs = New ADODB.Recordset
rs.AddNew
'Værdier der er indtastet i felterne på formen'
Me!KundeID
Me!ProduktID
Me!Pris
Me!Dato
Me!Kommentar
rs.Update
rs.Close
Set rs = Nothing

Placer koden under klik-hændelse på din knap. Koden gør nøjagtig det samme som de andre forslag, det er bare en anden måde at gøre det på.
Avatar billede -anders- Juniormester
11. april 2006 - 16:39 #6
Som terry også er inde på, hvis du knytter din indtastningsform til tabellen, køre det automatisk helt uden brug af kode. Prøv at åbne din form i designvisning, og klik på egenskaber for formen, klik på fanebladet data, det er her du kan angive postkilden til din form feks. en tabel eller forspørgsel :o)
Avatar billede -anders- Juniormester
11. april 2006 - 16:52 #7
'Sorry en fejl i den første kode, nedenstående testet, og virker

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open "tblKundeProdukt", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
rs.AddNew
'Værdier der er indtastet i felterne på formen'
Me!KundeID
Me!ProduktID
Me!Pris
Me!Dato
Me!Kommentar
rs.Update
rs.Close
Set rs = Nothing
Avatar billede madssch Nybegynder
11. april 2006 - 18:22 #8
Det ser umiddelbart ud til at virke, men når jeg klikker på min button som indeholder Sub'en, skal jeg bekræfte, at jeg vil oprette posten.

Kan jeg undgå dette?

Points til Terry for første "korrekte" løsning.

Tak til -anders- for inputs!
Avatar billede -anders- Juniormester
11. april 2006 - 19:08 #9
Ja sagtens, øverst i koden skriver du DoCmd.SetWarings False, og i slutning af koden skriver du DoCmd.SetWarings False. Det vigtigt at du husker det sidste da alle advasler ellers vil være slået fra i hele programmet.

Hvis du en dag for mod på det så prøv mit forslag, der behøver du ikke at slå nogle advarsler til eller fra.

Forsat god arbejdslyst med projektet :o)
Avatar billede -anders- Juniormester
11. april 2006 - 19:09 #10
Sorry det skulle jo være DoCmd.SetWarrings True til sidst
Avatar billede madssch Nybegynder
11. april 2006 - 19:20 #11
Går ud fra du mener "DoCmd.SetWarnings False" - det virker i hvert fald.  :)

Jeg har et tillægsspørgsmål, som jeg håber, at du vil hjælpe mig med. Så skal jeg efterfølgende oprette et nyt spørgsmål med points til dig:

På min form har jeg en kombinationsboks (dropdown). Den henter data fra en tabel. Tabellen indeholder felterne CustomerID og CustomerName.

Hvordan får jeg formen til at sende CustomerID til databasen, mens CustomerName bliver vist i kombinationsboksen?

Jeg går ud fra, at dette kan gøres uden yderligere programmering?

Korrekt svar er 60 points værd.  ;-)
Avatar billede -anders- Juniormester
11. april 2006 - 19:23 #12
Det kommer an på hvad du mener med at sende CustomerID til "Databasen", kunne du uddybe en smule mere
Avatar billede -anders- Juniormester
11. april 2006 - 19:25 #13
Ja, det er DoCmd.SetWarnings False jeg mener, men husk DoCmd.SetWarnings True til sidst :o)
Avatar billede madssch Nybegynder
11. april 2006 - 19:27 #14
Prøver:

I HTML ville man gøre følgende:

<option value="CustomerID">CustomerName</option> hvor CustomerID er et unikt ID fra en tabel og CustomerName er kundens navn.

Det skal være CustomerID som gemmes i databasen, men personen som benytter denne lille applikation, skal se CustomerName i kombinationsboksen.

Gav det mere mening?
Avatar billede -anders- Juniormester
11. april 2006 - 19:33 #15
Ja da, men HTML er jeg ikke så skrap i, men i ren Access ville jeg skrive følgende evt. på comboens AfterUpdate Event:

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open "NavnPåDinTabel", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
rs.AddNew
'Fanger værdien i kolonne 0 altså CustomerID'
rs!NavnPåFeltIDinTabel = Me!NavnPåDinCombo
rs.Update
rs.Close
Set rs = Nothing
'Code End'

DVS. at bruger ser kolonne 1 kundens navn, men det er CustomerID der skrives til feltet i din tabel, du kan så sætte CustomerID kolonnen til kolonnebredde 0 cm hvis du ikke ønsker at bruger ser CustomerID.
Avatar billede -anders- Juniormester
11. april 2006 - 19:38 #16
Koden kan naturlivis også køre ved klik på en knap efter bruger har valgt en kunde i comboen. For at undgå fejl kunne knappen være deativeret indtil man har valgt en kunde i comboen feks:

På comboens afterupdate event kunne du skrive:
Me!NavnPåDinKnap.Enable = True, og så lægge kodeforslaget på knappens OnClick event i stedet, mulighederne er mange :o)
Avatar billede madssch Nybegynder
11. april 2006 - 19:45 #17
Ja, det kan jeg forstå.

Er for nyligt begyndt at sætte mig ind i VB.NET, så jeg kender godt til de uanede muligheder. Synes bare ikke lige VB6 ville fungere med min VB.NET kode!  :D

Som lovet: http://www.eksperten.dk/spm/702254
Avatar billede terry Ekspert
11. april 2006 - 19:45 #18
sorry for my absence

anders do you want some of these points for your assistance here?

and thanks fo rthepoints madssch
Avatar billede -anders- Juniormester
11. april 2006 - 19:47 #19
terry> nej tak mine indlæg var blot ment som kommentar.

madssch> fik du mine forslag med comboen til at virke, ellers behøver du ikke give point
Avatar billede terry Ekspert
11. april 2006 - 19:50 #20
OK :o)

have a good Easter everyone.
Avatar billede madssch Nybegynder
11. april 2006 - 20:00 #21
Ja, jeg fik det til at virke! Takker.

Kan du til allersidst se hvorfor dette fejler? Vil du have det, opretter jeg et spørgsmål mere!  :D

Option Compare Database


Dim CreateNewRow As Boolean

CreateNewRow = True


Private Sub OpretKnap_Click()

    Call CheckFormFields
   
   
    If CreateNewRow = True Then

        DoCmd.SetWarnings False
   
        Dim SqlString As String
       
        SqlString = "INSERT INTO tblKundeProdukt (KundeID, ProduktID, Pris, Dato, Kommentar)"
        SqlString = SqlString & "VALUES (Kunde.Value, Produkt.Value, Pris.Value, Dato.Value, Kommentar.Value)"
       
        DoCmd.RunSQL SqlString
       
        DoCmd.SetWarnings True
       
        Kunde.Value = ""
        Produkt.Value = ""
        Pris.Value = ""
        Dato.Value = ""
        Kommentar.Value = ""
       
        MsgBox ("Posten blev oprettet korrekt!")
   
    Else
   
        MsgBox ("Posten kunne ikke oprettes!")
   
    End If

End Sub


Public Sub CheckFormFields()

    If Kunde.Value = "" Then CreateNewRow = False
   
    If Produkt.Value = "" Then CreateNewRow = False
   
    If Pris.Value = "" Then CreateNewRow = False
   
    If Dato.Value = "" Or Not IsDate(Dato.Value) Then CreateNewRow = False
     
End Sub
Avatar billede terry Ekspert
11. april 2006 - 20:20 #22
no need for more points

I think the problem is because you are DIMing a variable outside a function/sub

Try

Private CreateNewRow As Boolean

then intialize it in the form open event for example
Avatar billede terry Ekspert
11. april 2006 - 20:22 #23
I think you can use DIM outside the function/sub but I like to do it this way, but you do need to initialize it in a function/sub
Avatar billede madssch Nybegynder
11. april 2006 - 20:41 #24
Hvad mener du med at initialisere den inde i sub'en?
Avatar billede terry Ekspert
11. april 2006 - 20:46 #25
you need to put this line in a sub/function. If you want to set it to True as early as possible then use the forms On Open or on Load event

CreateNewRow = True
Avatar billede madssch Nybegynder
11. april 2006 - 20:50 #26
Ok. Det prøver jeg.

Ellers laver jeg bare mit tjek inde i min onClick event.

Tak til jer begge!
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