Recordgegevens niet opslaan bij selecteren subformulier

Status
Niet open voor verdere reacties.

remcop1989

Gebruiker
Lid geworden
29 mrt 2012
Berichten
492
Ik heb een formulier "formulier 1" waarop een record voor een tabel wordt ingevuld.
Op dit formulier heb ik een subformulier "subformulier 1" waarop gedetailleerde gegevens worden ingevuld voor dat record.

Het komt voor dat de ingevulde gegevens niet opgeslagen moeten worden en het formulier gesloten moet. Ik heb daartoe de volgende code achter een knop geplakt:

Code:
Private Sub Knop50_Click()
Dim LResponse As Integer
LResponse = MsgBox("Wilt u de ingevoerde gegevens opslaan?", vbYesNoCancel, "Opslaan")

If LResponse = vbYes Then
   DoCmd.Close acForm, Me.Form.Name
   DoCmd.OpenForm "Offertes"
ElseIf LResponse = vbNo Then
    Me.Form.Undo
    DoCmd.Close acForm, Me.Form.Name
    DoCmd.OpenForm "Offertes"
End If

End Sub

Dit werkt prima als alleen gegevens in het formulier worden ingevuld en NIET in het subformulier.
Zodra er echter ook gegevens in het subformulier worden ingevuld en de knop wordt aangeklikt, dan slaat hij de gegevens TOCH op voor beide tabellen.

Hoe kan ik dit oplossen?
 
Zodra je in een (gekoppeld, anders werkt het formulier niet) subformulier een record toevoegt, moet het hoofdrecord bestaan. Ergo: op het moment dat je in het subformulier een invoer wilt annuleren, ben je al te laat voor het hoofdformulier, want het record is dan al aangemaakt. Je zult dat record dus met een Delete moeten verwijderen.
 
Oké, dat klinkt inderdaad logisch en in de richting waarin ik ook al dacht.

Ik heb nu dit:

Code:
Private Sub Knop50_Click()
Dim LResponse As Integer
LResponse = MsgBox("Wilt u de ingevoerde gegevens opslaan?", vbYesNoCancel, "Opslaan")

If LResponse = vbYes Then
   DoCmd.Close acForm, "Nieuwe offerte", acSaveYes
ElseIf LResponse = vbNo Then
    DoCmd.RunSQL ("DELETE * FROM Offertes WHERE Offertenummer=" & Me.txtOffertenummer & ";")
    DoCmd.Close acForm, "Nieuwe offerte", acSaveNo
End If

    DoCmd.OpenForm "Offertes"
End Sub

Dat heb ik hier gevonden: http://www.microsoftaccesstips.nl/default.asp?hmid=2&smid=2&pagid=2&taalcode=NL&tipid=6

Ik weet niet of ik hier zomaar met een SQL statement mag werken?

Ik krijg echter de melding:

Fout 3075 tijdens uitvoering:
Syntaxis (operator ontbreekt) in query-expressie
Offertenummer =2013RP0002

Het offertenummer klopt wel met het huidige record. Ik kan echter niet ontdekken waar de fout in de query zit....

Is er eventueel een (beter) alternatief?
 
Je probeert een criterium op basis van een numerieke opmaak los te laten op een tekstveld. En dat kan niet.
Code:
DoCmd.RunSQL ("DELETE * FROM Offertes WHERE Offertenummer= '" & Me.txtOffertenummer & "'")
 
Okee, ik kom nu al wat verder maar krijg de meldingen in de foto's in de bijlagen.

Komt dit doordat het gaat om een sleutelveld?
 

Bijlagen

  • melding 2.JPG
    melding 2.JPG
    25,6 KB · Weergaven: 42
  • melding 1.JPG
    melding 1.JPG
    23,2 KB · Weergaven: 47
Laatst bewerkt:
Ik heb het opgelost door hem eerst de record uit tabel offertedetails en dan pas uit offertes te laten verwijderen. Er is namelijk een 1 op veel relatie tussen offertes en respectievelijk offertedetails.

De volgende code werkt:

Code:
Private Sub Knop50_Click()
Dim LResponse As Integer
LResponse = MsgBox("Wilt u de ingevoerde gegevens opslaan?", vbYesNoCancel, "Opslaan")

If LResponse = vbYes Then
   DoCmd.Close acForm, "Nieuwe offerte", acSaveYes
ElseIf LResponse = vbNo Then
    DoCmd.RunSQL ("DELETE * FROM Offertedetails WHERE Offertenummer= '" & Me.txtOffertenummer & "'")
    DoCmd.RunSQL ("DELETE * FROM Offertes WHERE Offertenummer= '" & Me.txtOffertenummer & "'")
    DoCmd.Close acForm, "Nieuwe offerte", acSaveNo
End If

    DoCmd.OpenForm "Offertes"
End Sub

Ik krijg nu alleen nog melding nummer 1 uit de bijlage van mijn vorige post hierboven. Hoe kan ik die omzetten in een melding van mijzelf? De vorige keer kreeg ik hiervoor een code met "case ####" maar ik weet niet hoe ik het nummer van de melding kan opzoeken, dat staat er niet bij. Of gaat dit niet?
 
Laatst bewerkt:
Er is namelijk een 1 op veel relatie tussen offertes en respectievelijk offertedetails.
Dan kun je volstaan met het verwijderen van het record uit Offertes, mits je de optie <Records trapsgewijs verwijderen> in het Relaties venster hebt aangezet. Die verwijdert namelijk gelijk alle gekoppelde subrecords.
 
Oke, helder, dank je.

Werkt de huidige code ook als het record nog niet is opgeslagen? Indien dit niet werkt: Hoe moet ik daarmee omgaan?

Wat betreft die melding die ik krijg bij verwijderen: dat is een melding met de strekking "u staat op het punt # van # records te verwijderen. Weet u zeker dat u wilt doorgaan" etc.
Kan ik deze melding "afvangen" en er een "eigen draai aan geven"
 
Als het record nog niet is opgeslagen, kun je het annuleren. Bijvoorbeeld door de BeforeUpdate status met Cancel af te vangen. De melding komt omdat je het bevestigen van actiequeries aan hebt staan. Zelf zet ik die meldingen (in Opties) altijd uit, want ze zijn behoorlijk vervelend. Je kunt ze ook met VBA uitzetten middels DoCmd.Setwarnings False (voor de uitvoer) en DoCmd.Setwarnings True als de query is uitgevoerd.
 
Hoe kan ik het before update event dan het beste combineren met "knop50" die de code hierboven in zich heeft?
 
Niet; de BeforeUpdate is een gebeurtenis op het formulier. Die triggert dus als je het formulier bijwerkt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan