Laatst toegevoegd record tonen in formulier NA uitstapje naar ander formulier

Status
Niet open voor verdere reacties.

bikerron

Gebruiker
Lid geworden
9 mei 2009
Berichten
236
Hallo,
Ik blijf maar stoeien met een formulier dat net een NIEUW record heeft ontvangen uit een ander, registratieformulier.
Wat doe ik:
Na een dubbelklik actie kan de gebruiker een nieuwe registratie doen in een ANDER formulier.
Als de registratie voltooid is kom ik terug in het eerste formulier, is het record bijgeschreven in de tabel waar dit formulier gebruik van maakt, so far so good.
Wat wil ik:
het NET NIEUW ingevoerde record in het formulier tonen zodat een (vervolg) registratie afgemaakt kan worden.
(Anders moet er eerst weer een <ctr F> plaatsvinden, terwijl ik al weet dat het gewenste record getoond moet worden.)

Doordat er een Form.Requery aanwezig is zal het nieuwe record bekend gemaakt zijn aan de (het) recordset MAAR....
het nieuwe record ligt dan niet meer achterop.
Er is een uniek kenmerk in data, met behulp van een QUERYDEF laat ik een sorteeractie los zodat het laatst toegevoegde record als eerste in de (het) recordset aanwezig is.
Maar ..... ik zie dit NIET terug in mijn formulier, deze toont helaas het eerste record, daar waarmee ik de hele sessie al mee begonnen was.
Wat doe ik fout?

Hieronder de gebruikte code:
Code:
Private Sub Registernummer_DblClick(Cancel As Integer)
Dim strName As String, strWhere As String
'---- t.b.v Querydef samenstellen
Dim dbs As Database
Dim rs As DAO.Recordset
Dim strsql As String
Dim strqueryname As String
Dim qrydef As QueryDef

strName = "NIEUW"
strWhere = "[Registernummer] = '" & strName & "'"

On Error Resume Next

Set dbs = CurrentDb
strqueryname = "qrytijdelijk"
dbs.QueryDefs.Delete strqueryname
 strsql = "SELECT * from QryOnderhFotos ORDER BY FotoID DESC;"

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", acNormal, , , acFormAdd, acDialog, strName
    DoCmd.OpenForm "FrmOnderhSchepen", DataMode:=acFormAdd, WindowMode:=acDialog, OpenArgs:=strName
   
    ' Beginnen met het bijwerken van de Fototabel a.h.v eventuele wijzigingen in de Schepentabel
    ' Afzetten boodschappen die voortkomen uit de Bijwerk Queries, want dat weten we al

     DoCmd.SetWarnings False
     DoCmd.OpenQuery ("QryUpdShepen2Fotos")
     DoCmd.OpenQuery ("QryUpdRegisternummer2Fotos")

    ' Weer aanzetten van de boodschappen
     DoCmd.SetWarnings True
    
    Forms!Frmonderhfotostst.Form.Requery
    Set qrydef = dbs.CreateQueryDef(strqueryname, strsql)
   Set rs = qrydef.OpenRecordset
   Forms!Frmonderhfotostst.Form.RecordSource = Recordset

Hulp is zeeeeer welkom.
Al vast bedankt voor de te nemen moeite, Ronald
 
Er zijn talloze oplossingen mogelijk voor jouw probleem.

Dit is de meest simpele: maak een globale variabele aan in een module. dit is niet de module die achter je form zit. vul die variabele met het id van het record dat je hebt aangemaakt. open het form en als je een bound form hebt pas dan het filter aan of de gekoppelde query.

Piece of cake.

HTH:D
 
Hallo Guus,
Bedankt voor je reactie.
Maar.... Kun je me wat specifieke handvatten geven. Mijn kennis van VB is niet al te groot.

- Een module maken, hoe gaat dat dan in zijn werk?
- Waar plaats ik deze dan en hoe koppel ik deze dan aan de Query
- Hoe zorg ik voor de werking van het filter.

Ik denk dat ik deze, misschien simpele, acties nog niet doorgrond.
Ron
 
Hoi Ron,

Ik heb er naar gekeken, zoals je gevraagd had, en heb 'm (in ieder geval in bijgevoegde versie...) aan de praat, geloof ik! Met bloed zweet en tranen, want het domme ding knalt er op de meest onmogelijke momenten uit op het formulier Foto's, maar met een beetje mazzel kun je hem zelf wel testen.

De oplossing is achteraf redelijk simpel. Om te beginnen:
Op het formulier Schepen heb ik bij het sluiten een extra regel gezet, die het nieuwe Registernummer op het Fotos formulier zet.
Code:
    sNieuweBoot = Me.Registernummer
    Forms!frmOnderhFotos.Form!txtNieuwSchip.Value = sNieuweBoot
Ten tweede er zat een foutje in de DLookup formule. Die is in mijn variant:
Code:
    If IsNull(DLookup("[Registernummer]", "Schepen", "[Registernummer]='" & Me.txtNieuwSchip & "'")) Then
Verder heb ik een dus tekstvak op het formulier gezet, dat gevuld wordt vanuit het Schepen formulier. Dit veld wordt vervolgens, als het tweede formulier dus is afgesloten, gebruikt om het juiste record te vinden:
Code:
    Set rs = Me.Recordset.Clone
    rs.FindFirst "[Registernummer] = '" & Me.txtNieuwSchip & "'"
    If Not rs.EOF Then Me.Bookmark = rs.Bookmark
 

Bijlagen

Hallo Michel,
Ben zeer blij dat je een oplossing hebt kunnen bedenken, sorry dat het je zoveel bloed en zweet gekost heeft. Helaas zijn ICT-bedenksels niet altijd een fluitje van een cent of zo iets.
Ik heb nog 3 opmerkingen / vragen waar ik even niet uit kom:

1. Schepenformulier:
Er is vanuit gegaan dat het Schepen formulier geopend wordt door het Fotoformulier maar het Schepenformulier kan ook "zelfstandig" worden geopend.
In dat geval komt er een VB-error omdat op het moment van sluiten er van uit gegaan wordt fat het Fotoformulier geopend is.
Vraag: Hoe test ik af of het formulier, open staat?

2. Fotoformulier
Op het Fotoformulier heb je een tekstvak bijgeplaatst waarmee ik kan zoeken naar een geregistreerd schip met foto's.
Op zich is dat een handig feature maar op het moment dat ik een nieuw VOLGNUMMER wil gaan maken, het "fotorecord van het schip met het volgnummer wat op dat moment voorstaat is vol" komt onderstaande foutmelding:

Code:
Private Sub Keuzelijst_met_invoervak167_AfterUpdate()
    ' De record zoeken die overeenkomt met het besturingselement
    Dim rs As Object

    Set rs = Me.Recordset.Clone
    rs.FindFirst "[Registernummer] = '" & Me![Keuzelijst met invoervak167] & "'"
   If Not rs.EOF Then[B] [COLOR="orange"] Me.Bookmark = rs.Bookmark[/COLOR][/B]
End Sub
Vraag: Hoe is dit op te lossen?
(Misschien is het weer handiger om een picklist op het oorpronkelijke registernummer te plaatsen, ipv de dubbelklik actie, en dan een Not in list actie, maar dat heb ik ook al eens geprobeerd, toen ging het kopieren ook niet.

3. Fotoformulier:Als ik een nieuw schip wil registreren wordt het Schepenformulier aktief, als dan echter dit formulier direct weer sluit, ik heb dus NIETS ingevuld, dan krijg ik een foutmelding vanuit het Schepenformulier:
Code:
Private Sub Form_Close()
Dim sNieuweBoot As String
Dim tmp As String

[B][COLOR="orange"]sNieuweBoot = Me.schepen_Registernummer[/COLOR][/b]
Vraag: Hoe kan ik dat afvangen?

Algemeen:
Ik zag dat je in het Schepenformulier de queries in VB gemaakt hebt ipv mijn oplossing met het aanroepen van 2 bestaande queries. In mijn huidige versie gaf dat vastlopers en ik heb deze queries nu ondergebracht in het Fotoformulier, direct NA terugkomst vanuit het Schepenformulier. Ik heb tot nu toe geen vastlopers meer.
 
Dat zijn er weer een paar :)
Nummertje 1:
Met bijgaande code kun je controleren of het Fotoformulier geopend is of niet. Met een IF kun je vervolgens dan de noodzakelijke acties laten uitvoeren, of niet.
Code:
Function fIsLoaded(ByVal strFormName As String) As Integer
'Returns a 0 if form is not open or a -1 if Open
    If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> 0 Then
        If Forms(strFormName).CurrentView <> 0 Then
            fIsLoaded = True
        End If
    End If
End Function

Vraagje 2:
De keuzelijst is (dacht ik) niet noodzakelijk voor de hele operatie; ik heb 'm na het posten nog aangepast, en je hoeft 'm alleen te laten kijken naar het tekstvak dat ik er heb bijgezet. Ook de DLookup aanroep die er in zit kan eigenlijk vervallen: bij het aanmaken van een nieuw schip zet hij namelijk het Registratienummer van de boot in het tekstvak. De DLookup zoekt 'm ook op, maar is, zeker bij grote bestanden zoals die van jou, erg traag. En het gaat er uiteindelijk om dat je een Registratie maakt voor een nieuwe boot, en dat nummer gelijk kunt gebruiken in het formulier. Vandaar dat ik 'm dus laat plaatsen vanuit het Schepenformulier.

Puntje 3:
Heeft vermoed ik met het vorige te maken. Ik zou dat met een On Error Goto opvangen. Je kunt bijvoorbeeld een check doen op het RegistratieNummer. Als je niks toevoegt, dan staat daar vermoed ik nog NIEUW als registratiecode, dus die kun je mooi als checkpunt gebruiken voor de sluitroutine.
Overigens zou ik op het Schepenformulier een mooie sluitknop maken; ik vind het zelf niet logisch om het kruisje te moeten gebruiken, ook al omdat je dat ook zou moeten kunnen gebruiken als je een formulier wilt sluiten zonder iets op te slaan... Ik zou de code dus naar een knop cmdOpslaan verplaatsen, en het kruisje gebruiken voor het annuleren van de handeling.

Algemeen:
Ik probeer het gebruik van aparte queries zoveel mogelijk te vermijden; in de code wil ik kunnen zien wat er gebeurt, en kan ik dat nog bijsturen, door bijvoorbeeld de variabelen te checken voordat ze in de SQL verdwijnen. Door aparte qeuries te gebruiken verlies je die controle. Het zou toch weinig uit moeten maken voor de werking van het formulier of je een query start, of een SQL commando afvuurt... Je problemen lagen dan ook niet in de queries, denk ik :)
 
Hallo Michel,
Is ie weer
Er is iets geks aan de hand met dit forum. Ik heb je antwoordt gelezen en mee aan de stoei gegaan maar nu zie ik het antwoordt niet meer op het forum terug, wat kan dat nu zijn?

Je stelde een functie voor, ik snap de bedoeling maar WAAR plaats ik dat, bij Algemeen en dan declaraties ?
Hoe / waar roep ik deze functie dan weer aan.
Ik zag dat je in de voorbeeld03-file een module "opfrissen" gemaakt hebt maar ik zie niet waar je deze aanroept / gebruikt.
Moet ik deze functie negeren?

(omdat je antwoordt niet meer in deze thread staat weet de codering even niet meer, heb je deze nog bij de hand?)

Ronald
 
Hoi Roland,

Hopelijk doet het forum het weer, want ik zag vanavond ook in de mail dat je weer een post had gemaakt, die ik vervolgens niet kon zien. Zal wel een storinkje zijn geweest. Maar ik zie alles weer, dus ook de code die ik vanmiddag heb gepost.
In beginsel kun je de functie neerzetten waar je wilt, maar het mooist is in een Module, niet bij een formulier. In een module kun je hem overal gebruiken. Je roept hem zo aan: MsgBox fIsLoaded("List Distributors").In dit voorbeeld met een Msgbox, zodat je kunt zien wat de uitkomst is (0 of -1).

De Opfrissen code is eigenlijk de code die wordt gebruikt als je een knop maakt om een Record op te zoeken. Die dus een klein beetje aangepast is. Hij wordt wel degelijk aangeroepen, dus je hebt 'm wel nodig ;)

Code:
Me.Form.Requery
Me.Refresh
[B][COLOR=blue]Call Opfrissen[/COLOR][/B]
End Sub
 
Sub Opfrissen()
Dim rs As Object
    
    Set rs = Me.Recordset.Clone
    rs.FindFirst "[Registernummer] = '" & Me.txtNieuwSchip & "'"
    If Not rs.EOF Then Me.Bookmark = rs.Bookmark
End Sub
 
Hallo Michel,
I'm a Happy Camper:thumb:

Het werkt allemaal perfect.
Zeer bedankt voor je tijd, moeite en geduld om mij te helpen.
Ik heb er weer van geleerd en kan het toepassen voor een volgende uitdaging.
Ik denk dat ik nog wel eens terug kom hoor met een (ander) probleem.
Nogmaals bedankt

Ronald
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan