Bijwerken lukt niet

Status
Niet open voor verdere reacties.

bikerron

Gebruiker
Lid geworden
9 mei 2009
Berichten
236
Hallo,
Ik heb een "bijwerk probleem".
Ik heb een formulier geopend en als er een record nog niet aanwezig is kan ik met behulp van dubbelklikken er voor zorgen dat er een registratieformulier wordt geopend, in de Add mode, dan kan ik een nieuw record aanmaken. Hierna sluit ik het registratieformulier en keer, automatisch, terug naar het eerste formulier.
So far so good.
Ik dacht dat ik dan meteen over dit "nieuwe record" kon beschikken, helaas pindakaas.
Als ik het formulier sluit en daarna weer open dan krijg ik het record wel te zien.
Ik heb geprobeerd met een Me.Require maar dat maakt niets uit.
Kortom.... waar ligt de oplossing.
Alvast bedankt voor de te nemen moeite.
Ronald

Bij het Dubbelklikken heb ik de volgende procedure ingesteld:
Code:
Private Sub Registernummer_DblClick(Cancel As Integer)
Dim strName As String, strWhere As String
strName = ""
strWhere = "[Registernummer] = """ & strName & """"

If vbYes = MsgBox("Wil je een nieuw Schip registreren?", vbYesNo + vbQuestion + vbDefaultButton2, gstrAppTitle) Then
        ' Het formulier FrmOnderhSchepen zal worden geopend om de nieuwe Domicilie in te kunnen voeren
        
        DoCmd.OpenForm "FrmOnderhSchepen", , , , acFormAdd, WacDialog, OpenArgs:=strName
        
' Statement hieronder is NIET van toepassing, ik kom altijd "terug" met een gewijzigd registratienummer '
' dus de afhandeling is "alles goed ingevoerd" '
If IsNull(DLookup("SchepenID", "Schepen")) Then
            ' Ooops
            MsgBox "Naam wijkt af van de Naam waarmee het formulier werd geopend. Probeer het opnieuw.", vbInformation, gstrAppTitle
            ' Access handelt deze boodschap verder af, foutieve update zal NIET worden uitgevoerd.
            
            Response = acDataErrContinue
        Else
            ' Alles goed ingevoerd, er wordt teruggegaan naar het aanroepend formulier
            Response = acDataErrAdded
        End If
    Else
        ' Don't want to add what they typed - show standard error message
        Response = acDataErrDisplay
    End If

End Sub

Bij het Registratieformulier (FrmOnderhSchepen) heb ik bij het laden ingesteld:
Code:
Private Sub Form_Load()
Dim intI As Integer
 If Not IsNull(Me.OpenArgs) Then
    'intI = InStr(Me.OpenArgs, ";")
    'Dim sArgs() As String
    If intI = 0 Then
     Me.Registernummer = Me.OpenArgs
    Else
     'Me.Naam = "Onbekend"
     'Me.schepen_TypenID = 1
    End If
 End If
End Sub
 
En waar heb je de Requery neergezet? Deze vind ik namelijk niet terug in je voorbeeldcode. Als je een Keuzelijst wilt bijwerken, dan moet je de Requery zetten na het terugkeren van het toevoegformulier. Wil je het record gebruiken op het hoofdformulier, dan moet de Recordsouce van het formulier worden bijgewerkt.
 
Michel,
Ik ben niet helemaal duidelijk geweest.
Ik maak GEEN gebruik van een List, maar wil bij dubbelklikken een nieuw record invoeren in een tabel met behulp van een formulier, gebaseerd op die tabel.
Dit gaat allemaal goed, ik "stap" over naar het onderhoudsformulier, vul de nieuwe gegevens is, sluit het formulier en kom dan ook terug in mijn formulier waar van uit ik kwam.
Ik zie op dat moment NIET dat het aantal records met 1 verhoogd is en met een <ctr F> actie is het nieuwe record ook niet te vinden. Pas na het sluiten en weer openen is het nieuwe record "benaderbaar".

Code:
Private Sub Registernummer_DblClick(Cancel As Integer)
Dim strName As String, strWhere As String
strName = "NIEUW"
strWhere = "[Registernummer] = """ & strName & """"

If vbYes = MsgBox("Wil je een nieuw Schip registreren?", vbYesNo + vbQuestion + vbDefaultButton2, gstrAppTitle) Then
        ' Het formulier FrmOnderhSchepen zal worden geopend om de nieuwe Schip in te kunnen voeren
        
        DoCmd.OpenForm "FrmOnderhSchepen", , , , acFormAdd, WacDialog, OpenArgs:=strName
        
        Me.Requery
        Response = acDataErrAdded
            
    Else
        ' Don't want to add what they typed - show standard error message
        Response = acDataErrDisplay
    End If


End Sub

In andere formulieren maak ik bij de "Not in List" opties ook gebruik van deze constructie, ZONDER de Me.Requery, en dat verloopt lekker naar wens.
Er is dus een verschil als je deze gebeurtenis bij "dubbelklikken EN zonder Not-in-list veld" wilt gebruiken.
Moet ik daarvoor iets anders doen?

Ronald
 
Je hoofdformulier is gebaseerd op een recordset uit tabel of query. Als je na het openen een record toevoegt aan die tabel, wordt die inderdaad niet gelijk gezien door je hoofdformulier. Een combobox maakt gebruik van een eigen recordset, dus vandaar dat je die via een Not In List procedure wèl kunt bijwerken en zien.
Je zult dus de Recordbron van het hoofdformulier met een Requery moeten bijwerken, wil je het nieuwe record zien. Vandaar mijn vraag waar je de Me.Requery opdracht hebt neergezet.
 
Hallo Michel,
Dat heb ik al in mijn vorige bericht proberen aan te geven:
Code:
If vbYes = MsgBox("Wil je een nieuw Schip registreren?", vbYesNo + vbQuestion + vbDefaultButton2, gstrAppTitle) Then
        ' Het formulier FrmOnderhSchepen zal worden geopend om de nieuwe Schip in te kunnen voeren
        
        DoCmd.OpenForm "FrmOnderhSchepen", , , , acFormAdd, acDialog, OpenArgs:=strName
        
      [B]  Me.Requery[/B]
        Response = acDataErrAdded
            
    Else
        ' Don't want to add what they typed - show standard error message
        Response = acDataErrDisplay
    End If
Direct NA de DoCmd opdracht.

Kan het evt zijn dat de opgegeven parameters behorende bij het Docmd statement onvoldoende is?

Ronald
 
If vbYes = MsgBox("Wil je een nieuw Schip registreren?", vbYesNo + vbQuestion + vbDefaultButton2, gstrAppTitle) Then
' Het formulier FrmOnderhSchepen zal worden geopend om de nieuwe Schip in te kunnen voeren

DoCmd.OpenForm "FrmOnderhSchepen", , , , acFormAdd, WacDialog, OpenArgs:=strName

Me.Requery

Met bovenstaande code doe je een requery op formulier "FrmOnderhSchepen". Je moet de requery uitvoeren op je 1e formulier, dus moet je verwijzen naar je 1e formulier. Je kunt dat doen bij het sluiten van je formulier "FrmOnderhSchepen".
 
Dus iets als:

Code:
        DoCmd.OpenForm "FrmOnderhSchepen", , , , acFormAdd, acDialog, OpenArgs:=strName
        Forms!frm_Basisformulier.Form.Requery
 
Altijd al het braafste jongetje in de klas geweest :D
 
Wel heren,
In ieder geval bedankt voor het mee denken maar het lukt mij nog niet.
Ik heb in het formulier, van waar ik de dubbelklik op activeer NADAT ik weer terugkeer na invoeren van een nieuwe record, het volgende geplaatst:

Code:
If vbYes = MsgBox("Wil je een nieuw Schip registreren?", vbYesNo + vbQuestion + vbDefaultButton2, gstrAppTitle) Then
        ' Het formulier FrmOnderhSchepen zal worden geopend om het nieuwe Schip in te kunnen voeren
        
        DoCmd.OpenForm "FrmOnderhSchepen", , , , acFormAdd, wacDialog, OpenArgs:=strName
        [B]Forms!FrmonderhFotosTst.Form.Requery[/B]



Op het formulier: FrmOnderhSchepen heb ik bij de on Close het volgende staan:

MacroUpdateFotos,
hiermee regel ik dat als er een record in deze tabel is ingevoerd dat terecht komt in de tabel met Foto's
Dit gaat goed, de nieuwe records worden keurig bijgeschreven maar het ge-opende formulier heeft zijn record pointer NIET verhoogd.
(Of zou het beter zijn de Macro te vervangen door de individuele Queries te benoemen in VB)

Als ik wat heen en weer spring tussen de records (op het formulier FrmOnderhFotosTst dus) komt het nieuwe record dus niet in beeld.
Pas NADAT ik dit formulier sluit en weer open heb ik beschikking over het nieuwe record.

In Visual Basic heb ik nu ook nog extra staan: (kan dat wel, 2 gebeurtenissen op deze manier?)
Code:
Private Sub Form_Close()
Forms!FrmonderhFotosTst.Form.Requery
End Sub

Ronald
 
Heren,
IK denk dat ik er wel achter ben waarom het formulier zich niet ververst.
Het heeft volgens mij te maken met HOE ik, met welke parameters, naar het andere formulier ga.
Als ik dit invoer:
Code:
DoCmd.OpenForm "FrmOnderhSchepen", , , , WacDialog, OpenArgs:=strName
dan wordt er NIET gewacht totdat het resultaat van het aanroepende formulier gereed is.
(is de WacDialog wel een geldige code?)

Als ik dit invoer:
Code:
DoCmd.OpenForm "FrmOnderhSchepen", DataMode:=acFormAdd, WindowMode:=acDialog, OpenArgs:=strName
Dan wordt het aanroepende formulier WEL geopend maar dan heb ik NIET de beschikking over alle velden, ik kan het scherm NIET meer verkleinen / vergroten en geen mogelijkheid met een scrollbalk of zo, alleen invullen (voor een deel).
Als ik dan een deel invul en vervolgens afsluit dan kom ik terug en het aantal records wordt correct bijgewerkt.

Ik mis dus iets in de Openform parameters lijkt mij.

(Ik maak gebruik van de code die ik al eerder in een "Not in List" gebeurtenis toepas, en daar gaat het wel goed in)

Als jullie me nog een hint kunnen geven dan zeeer graag.

Ronald
 
Ik heb (eigenlijk met opzet) niks gezegd over de WacDialog code; ik ging er vanuit dat je hem correct het geselecteerd uit de keuzelijst die je krijgt als je netjes de komma's doortikt. Je hebt ook niet eerder gemeld dat je formulier niet Modaal geopend werd, en de procedure dus pas verder loopt als het tweede formulier is gesloten.
Ik gebruik zelf in ieder geval altijd acDialog om een tweede formulier als Modaal te openen. Er zit technisch geen verschil of je dit gebruikt: WindowMode:=acDialog, of de komma's doortikt tot je bij de Windowmode bent aangeland. Het specifiek aanroepen is overzichtelijker, meer niet.

Wat je mist in je OpenArgs kan ik hier vandaan niet beoordelen. Met OpenArgs kun je in beginsel één waarde meegeven. Als je meerdere velden wilt vullen vanuit OpenArgs zul je dus een truc moeten gebruiken. Die truc is op zich simpel: combineer alle velden die je op het vervolg formulier wilt gebruiken tot één string met een bruikbaar scheidingsteken,dus bijvoorbeeld:

Code:
        DoCmd.OpenForm "fArtikelen", , , , acAdd, acDialog, NewData & "|Artikel|" & iBedrijf
Op het tweede formulier gebruik je de Split functie om de variabele te scheiden:
Code:
    If Not IsNull(Me.OpenArgs) Then
        Dim sArgs() As String
        sArgs = Split(Me.OpenArgs, "|")
        Me.cboBedrijfID.SetFocus
        Me.cboBedrijfID.Value = sArgs(2)
        Me.txtArtikel.SetFocus
        Me.txtArtikel.Value = sArgs(1)
        Me.txtArtikelID.SetFocus
        Me.txtArtikelID.Value = sArgs(0)
End If
 
Michel,
Het heeft inderdaad met Modaal en Popup te maken.
Als ik het 2de formulier op Popup=Ja en Modaal=Ja zet dan gaat het vlekkenloos.

Ik heb het voor mijn "Openargs" heel makelijk, slechts 1 waarde geef ik door en dat komt dus goed aan.
Ik zal jouw voorbeeld nog even bekijken.
Ik denk dat ik er dus nu uit ben, tenzij jij zegt:
Blijf bij het formulier met de JA instellingen voor Popup en modaal weg, dan moet het dus via de parameters van Openform.
 
Hoi Ron,

De Openargs optie heeft niks met de Popup of Modaal instellingen te maken, dus die mag daar zowiezo geen invloed op uitoefenen. Modaal is wel belangrijk; dat zorgt ervoor dat je eerst het tweede formulier invult, opslaat en afsluit voordat je terugkeert naar het eerste formulier. Hierbij maakt het ook niet uit of het formulier Popup is of niet. Althans: dat is de theorie. Door de optie acDialog mee te geven wordt het formulier altijd modaal geopend; de formulierinstellingen die je nu hebt ingesteld hebben daar dus ook geen invloed op. Sterker: ik kom regelmatig draadjes tegen waarbij mensen denken dat ze een formulier modaal hebben geopend door de instelling op Ja te zetten, en dat-ie dat toch niet doet.... De aanbeveling is dan ook om dat altijd via acDialog te doen!
Als het tweede formulier correct is geopend, kun je op geen enkel ander formulier iets doen, tot het tweede formulier is gesloten. Dat regelt dus ook de correcte werking van het eerste formulier, want daardoor weet je ook zeker dat een Refresh op het eerste formulier de aangepaste recordset krijgt.
 
Ben ik weer.....

Wilde net deze thread sluiten, toch nog maar even proberen met:
Popup en Modaal weer op Nee en jouw statement genomen.
Helaas pindakaas.

Dan maar weer Popup en Modaal op JA en opnieuw met volgende code:
Code:
DoCmd.OpenForm "FrmOnderhSchepen", DataMode:=acFormAdd, WindowMode:=acDialog, OpenArgs:=strName

Nou mooi niet, krijg geen beschikking over een klein / groot venster, ergo... helft van de gegevens kan ik niet bij.
Daar waar ik wel bij kan wordt keurig verwerkt en na terugkeer in mijn aanroepend formulier wordt het record netjes bijgewerkt.

Toen nog maar even een herstel en comprimeer aktie uitgevoerd op de Db, mooi niets.

Welke optie(s) heb ik nu nog?

Ronald
 
Eerlijk gezegd snap ik niet helemaal wat je bedoelt met 'Helft van de gegevens kan ik niet bij'. Als je daarmee de gegevens op het hoofdformulier bedoelt, dan klopt dat helemaal; door het tweede formulier met acDialog te openen kun je verder niks doen. Eerst dus dat tweede formulier sluiten. Verder begrijp ik uit je verhaal dat je hoofdformulier wèl wordt bijgewerkt, dus dat doet wat het moet doen. Toch?
Tenzij ik het dus verkeerd begrijp, en je vast komt te zitten op het tweede formulier waar je de helft niet kunt invullen?
 
Michel,
Ik heb 1 formulier (FrmOnderhSchepen) waarmee ik schepen registreren kan met daarop 3 keuzeboxen naar 3 andere tabellen.
Op het moment dat ik dit formulier normaal open zie ik een scrollbar verschijnen omdat het formulier niet standaard volledig word geopend. (Is dat evt. wel te regelen?)
Het scrollen heeft betrekking op de Detail sectie, hierin heb ik 2 Keuzelijsten zitten.
De andere keuzelijst bevindt zich in de Formulierkoptekst sectie.

Ik heb een ander formulier, FrmOnderhFotos waarmee ik per geregistreerd schip foto's van dat schip kan kan invoeren.
Als er van dat schip nog geen registratie bestaat dan is de gedachte dat als ik Dubbelklik op het invoerveld Registratienummer het formulier FrmOnderhSchepen activeer.
Dit geeft nogal wat problemen.
1. Het formulier wordt geopend met een Scrollbar maar ik kan het formulier niet zelf Maximaliseren.
2. Het vastleggen van een nieuwe registratie gaat goed maar als ik terugkeer naar het FrmOnderhFotos heb ik wisselende problemen, meestal gaat het goed maat het wil ook regelmatig gebeuren dat het hele schem grijs wordt en dat de applicatie hangt.
Hierna sluit ik de database maar kan hem niet meer opstarten, enige remedie is PC herstarten.
Op de een of andere manier verkracht ik iets met deze manier van formulier besturing.

Ik heb in een bijlage e.e.a proberen te verduidelijken.
Maar ik krijg deze bijlage niet kleiner dan 200K, en ik mag max. 100k aanleveren
Is er nog een manier om de bijlage naar je toe te krijgen?


Ik hoop dat je er uit kunt komen en mij verder kunt helpen met deze rare, onbetrouwbare, situatie.


Ronald
 
Je kunt hem wel mailen, als je wilt dat ik er nu even naar kijk. Met Winrar kun je overigens een zipje splitsen. Bij Splitsen geef je dan als grootte: 102400; dan krijg je bestandjes van precies 100kB.
 
Laatst bewerkt:
Even een, voorlopige update.
Nadat Michel mijn voorbeeld formulieren bekeken had kreeg ik van hem zeer nuttige tips terug om te kijken naar verbeteringen.
Hij had zelfs mooie FOR loops aangeleverd om een initialisatie van velden bij een nieuw record te bewerkstelligen.
En een zeer handige tip: NA bijwerken Formulier de mogelijkheid de "mutatiedatum" bij te werken.
Ik had deze actie bij ELK te wijzigen veld geplaatst hetgeen natuurlijk een zeer overbodig aantal procedures opleverde.
Maar... op dit moment werkt het nog niet, de "uitstap" naar een formulier nav dubbelklikken werkt wel maar op het moment van terugkeer kom ik in een hang situatie. Geen besturing meer over formulieren alleen het afsluiten van de Database helpt, maar daarna opstarten geeft zeer rare werkbalken. PC-uit en aan is dan de remedie, tot de volgende hanger.
Een ultieme oplossing zou kunnen zijn om, van al mijn formulier, de VSB-codes te doorlopen om te kijken of er nog iets is blijven hangen wat de boel in het 100 laat lopen.
Ik heb wel gemerkt dat VSB daar nogal slordig mee om kan gaan, als de gebeurtenis, bij een veld in het formulier is weggehaald dat de code nog wel degelijk aanwezig is binnen VSB, deze staat dan genoteerd onder: Algemeen.

Kortom: Ik ga al de VSB-code van mijn formulieren door om te kijken of er wat is blijven hangen, onder meer op aanraden van Michel.
Tot zover,

Ronald
 
Hallo ik ben weer een stapje verder.

Waar ik nu mee aan het stoeien ben is:
Ik zou graag de "focus" op het nieuwe record willen hebben, anders moet er weer een <ctrl F> actie uitgevoerd worden.
Maar nadat ik terug gekeerd ben doe ik een ME.Requery en het NIEUWE record is dan niet meer fysiek het LAATST toegevoegde record in het recordset.
Ik heb echter wel een ID in het recordset en dacht "even" aan te kunnen geven met iets dergelijks als Docmd.GoToRecord (MAX ID) maar dat lukt mij niet.
Zijn hier nog nuttige ideetjes voor me?

Nog even wat feedback over mijn oorspronkelijk Hang probleem"
In het formulier waarnaar toe ik sprong werden, NADAT ik terugkeer naar het begin formulier 2 Queries uitgevoerd die de tabel van waarmee het beginnende formulier werkt voorziet van een nieuw record.
Het vermoeden was dat dit een zodanige tijdrovende actie was dat daardoor de switch van het ene formulier naar het andere formulier + het ondertussen bijwerken van een tabel met 40.000 records te veel tijd neemt.
(Bij een test database met 1000 records ging alles goed).

Ik heb het nu anders aangepakt. Ik voer deze Queries pas uit als ik Terugkeer in het beginnend formulier. Dit ziet er goed uit.

Al vast bedankt
Ronald
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan