schrijven naar tabel Logboek werkt niet (lijkt niet te werken....)

  • Onderwerp starter Onderwerp starter IsR
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.
Daar zit misschien iets in??? Die optie is "greyed-out". Hoe krijg ik die weer geactiveerd?
 
Moet je eerst een fout maken in de db :). Grijs is dus goed.
 
Ok, dat is dan tenminste nog iets, maar het probleem dat er niets gelogd wordt, is daarmee nog niet opgelost, helaas.

Net computer en access opnieuw opgestart. Helaas, (eigenwijs toch proberen) zoals al verwacht, nog steeds geen resultaat.
Wie o wie heeft nu nog een idee?
Het is juist zo'n belangrijke specificatie die gewenst is.........

Kan het zijn dat er een bepaalde verwijzing in VB aangevinkt moet zijn wat bij mij niet het geval is?
Aangevinkt staan:
-Visual Basic for Applications
-Microsoft Access 15.0 Access Object Library
- OLE Automation
- Microsoft Office 15.0 Access database engine Object Library.

Macro's staan ingeschakeld en ik heb de locatie waar mijn database is opgeslagen toegevoegd aan vertrouwde locaties.
 
Laatst bewerkt:
Ik zou ofwel de hele db moeten zien, of een keer moeten meekijken met Teamviewer o.i.d.
 
De database met enkel de 2 tabellen en het 1 formulier dat ik je gisteren gepost heb (waarin je zelf de code hebt aangepast), werkt al niet.
(jij hebt toch uitgeprobeerd in Access in 2013? Niet in 2010, zover dat wat uitmaakt?)

Dat heb ik nl. uitgeprobeerd nadat ik het in mijn originele versie had aangepast. Dus een kijkje in de hele originele database zal weinig uithalen.
Daarbij is dat omwille van privacy verder ook niet gewenst.
 
Tja, dan wordt het lastig om nog veel te kunnen doen. Voor mij of wie dan ook. Het enige dat ik je nogmaals kan adviseren, is om in de stapmodus door de hele procedure te lopen, en wel vanaf de eerste regel. Overigens snap ik niet helemaal waarom je de code bij de gebeurtenis <Muis omhoog> hebt gezet, en niet bij <Bij klikken>. Maar zelfs dat mag niet uitmaken. Al zou ik dat in ieder geval ook een keer veranderen. Je weet maar nooit.
Zet eens onderbrekingspunten bij
Code:
                    If Left(.Name, 2) = "NW" Then
en
Code:
                    With CurrentDb.OpenRecordset("SELECT * FROM tLogboek")
want dat zijn triggers waarop wat moet gebeuren. En als je zegt dat er geen logrecord wordt gemaakt, bedoel je dan dat de wijzigingen wél worden aangebracht?
 
Ik heb de code nog niet doorlopen, maar ik kan je wel vast antwoord geven op je laatste vraag:
Ja de wijzigingen in de tabel contactpersonen worden wel doorgevoerd (na opslaan van de diverse wijzigingen in form & tabel).

Het betreft het puur wegschrijven van de wijziging in de logtabel, wat niet gebeurt.
Overigens zie ik in de NW-velden van het form ook geen gegevens verschijnen, behalve bij ContactID.

Er worden dus ook geen waarden in de nieuwe velden geplaatst. Niet na bijwerken velden, niet bij klikken op de button.
Moet elk origineel veld als Tag het NWveld hebben? Dit is nl. wel bij contactID het geval, bij de overige velden niet.
(al zou dit niet uit moeten maken omdat het bij jou wel werkt zoals nu ontworpen.....)
 
Dit snap ik niet:
(na opslaan van de diverse wijzigingen in form & tabel)
De grap is nu juist dat de procedure de records update! Sowieso verander je niks in de oorspronkelijke (gekoppelde) velden; je typt toch alleen waarden in de niet-gekoppelde velden in? En die velden worden nooit meegenomen bij het 'opslaan' van het formulier, want ze zijn niet gekoppeld aan een veld en tabel. Dus er vált helemaal niks op te slaan. Tenzij je de knop gebruikt die m.b.v. de recordsets a) de tabel bijwerkt, en b) de logtabel vult.

Omdat je eerder al schreef dat je niet in de stapmodus door de code kan lopen (wat ik overigens vreemd vind), vraag ik me af of de code "uberhaupt wel loopt! En als dat niet zo is, staat de beveiliging in je db wellicht te hoog.
 
Nou Octafish,
je laatste opmerking heeft me aan het denken gezet en ik heb even getest en het lijkt er inderdaad op dat ik de verkeerde velden heb ingevuld.........:o
Jouw database opnieuw gedownload en vervolgens waarden in de niet-afhankelijke velden gezet en......zowaar er kwam wat in mijn logboek.
Na een test in de originele database met 1 veld, lijkt dit nu ook te werken.
Ik ga nu meer velden opnemen in de test en laat ik het resultaat weten.
 
Ik zet de oorspronkelijke velden doorgaans uit, zodat je alleen de mutatievelden kunt invullen. Wellicht helpt dat in het gebruik.
 
Dat op zich was ook het plan, maar bij het testen had ik ze allebei zichtbaar gehouden, desondanks het hele verhaal toch niet helemaal goed gelezen/begrepen in de eerdere instanties en de verkeerde velden gebruikt als mutatieveld, vandaar de verwarring...
 
Octafish, het testen in de originele database lijkt nu wel aardig te werken. Ben nu nog wat aan het "tweaken":.

In de mutatievelden heb ik de "besturingselementbron" leeg gelaten (zoals beschreven). Dan worden de mutaties weggeschreven in het logboek = goed.
Als ik echter een record eerst wil zoeken (via een macro die een query start) voordat ik dat wil bewerken, moeten de mutatievelden de huidige waarden uit de tabel contactpersonen tonen.
Dit bewerkstelligde ik eerst door in de besturingselement de corresponderende veldnaam van de tabel in te vullen. Maar dan worden de mutaties dus niet weggeschreven in het logboek nadat ik iets gewijzigd heb.

Voorbeeld: veld NWvoornaam1 heeft waarde "test" en wil ik wijzigen naar "test1" via het mutatieveld NWvoornaam1.
Besturingselementbron = leeg. Waarde test1 wordt weggeschreven in de logtabel.
Besturingselementbron = voornaam1, veld NWvoornaam1 toont de huidige waarde:"test" bij record zoeken. Wijzigen naar "test1" genereert geen wijziging in de logtabel.

Hoe kan ik de huidige waarden uit de tabel contactpersonen in het mutatieveld NWvoornaam1 laten zien en toch een wijziging hiervan in de logtabel krijgen?
 
Octafish of iemand anders nog suggesties voor het antwoord op mijn laatste vraag?

Ik wil de property controlsource tijdelijk vullen met de tag van een veld middels deze code.
Code:
For Each ctl In Controls
      With ctl
        Select Case .ControlType
         Case acTextBox, acComboBox
           If Left(.Name, 2) = "NW" Then
           .ControlSource = .Tag
          End If
      End Select
    End With
    Next ctl

Hoe krijg ik bovenstaande via VBA de property controlsource nu weer ongedaan?
Of hoe maak ik deze property weer "leeg" of wel hoe haal ik de waarde die via bovenstaande code is ingevuld weer weg?
 
Laatst bewerkt:
Het laatste stukje van mijn puzzel ontbreekt nog.
Volgens mij ben ik zo dichtbij, maar ik krijg het niet voor elkaar. Wie o Wie kan mij aub helpen met de laatste loodjes?
 
Ik heb nu een tussen"oplossing"....

als ik per niet-afhankelijk veld een GotFocus-event maak met de volgende code:
Code:
If NWtxtvoornaam1.controlsource <> "" then NWtxtvoornaam1.controlsource = ""

Dan worden evt. wijzigingen wel in het logboek weggeschreven.

Ik kan me alleen niet voorstellen deze oplossing de mooiste is (zou ik voor alle velden een gotfocus event moeten maken......).
Wat wel de mooiste oplossing is, kom ik dus niet uit.
Help!
 
Ik heb geen idee wat je aan het doen bent; in mijn voorbeeldje heb ik een knop <Opslaan> die 2 handelingen uitvoert: de onderliggende tabel muteren, en de wijziging toevoegen aan de historie tabel. Dat werkt perfect. Je wijzigt iets door een waarde in één van de niet-gebonden velden in te vullen (kolom nieuwe waarde) en door op <Opslaan> te klikken. Vervolgens wordt de waarde gemuteerd in de hoofdtabel middels de regels
Code:
    With CurrentDb.OpenRecordset(strSQL)
        If .RecordCount > 0 Then
            .Edit
            .Fields(sVeld).Value = sWaarde_Nieuw
            .Update
            .Close
        End If
    End With
En daarna wordt de waarde toegevoegd aan de Historie tabel:
Code:
    With CurrentDb.OpenRecordset("SELECT * FROM tHistorie")
        .AddNew
        !Extern_ID = Me.Extern_ID
        !Datum = Date
        !Tijd.Value = TimeSerial(Hour(Now()), Minute(Now()), 0)
        !UserID = sUser
        !ActieID = Me.cboActiesoort.Value
        !Tabel = "[Brontabel]"
        !Veld_Ori = sVeld
        !Waarde_Ori = sWaarde_Ori
        !Waarde_Nieuw = sWaarde_Nieuw
        !Mutatiedatum = Me.Mutatiedatum
        !Geactiveerd = True
        .Update
        .Close
    End With
Nergens hoef ik een tag te veranderen....
 
Octafish,
Vreselijk bedankt voor je reactie weer.
Dat stukje code van jou werkt ook prima bij mij (sinds ik de nieuwe waardes in de juiste velden invoer :) ).

Het probleem dat ik probeer op te lossen is als volgt:

Als ik het formulier Contactpersonen open (originele db), staat op dat formulier een knop die een zoek-query start, waarbij ik kan zoeken op een (deel van) achternaam.

De query (nu voor het gemak in SQL weergave is:

SELECT tContactpersonen.achternaam, tContactpersonen.contact_ID, tContactpersonen.meisjesnaam, tContactpersonen.tussenvoegsel, tContactpersonen.voorletters, tContactpersonen.voornaam1, tContactpersonen.voornaam2,
FROM tContactpersonen WHERE (((tContactpersonen.achternaam) Like [en/of voer (deel) van achternaam in] & "*"));

Ik wil nu dat het resultaat van deze query (de opgeslagen gegevens) getoond wordt in de niet-afhankelijke velden.
Dit is mij gelukt door de besturingselementbron te vullen met het corresponderende veld uit de tabel.

Dus bijvoorbeeld:
De query start en ik zoek op achternaam "klaas".
De waarden van gevonden records die hiermee corresponderen moeten in de niet-afhankelijke / de grijze velden worden getoond.
Dit lukt mij alleen als in de eigenschappen van bijv. veld NWvoornaam1, de besturingselementbron = voornaam1 staat (en het veld daardoor eigenlijk niet meer afhankelijk is)

Probleem is echter, dat als de eigenschap besturingselementbron gevuld is, de wijzigingen niet meer in de logtabel worden weggeschreven als ik op de knop <opslaan> klik.
Als ik de eigenschap besturingselementbron leeg laat bij NWvoornaam1, dan functioneert het wegschrijven naar de logtabel wel weer, maar het queryresultaat is niet zichtbaar.

Dit heb ik dus geprobeerd bij het uitvoeren van de query eerst alle besturingselementbronnen te vullen met de corresponderende veldnamen (de code uit post #53) om vervolgens vóór ik op de knop <opslaan> klik alle besturingselementbronnen weer leeg te maken. Maar dit laatste lukt mij dus niet, ik krijg de code daarvoor niet juist.

De eigenlijke vraag is dus, hoe laat ik het resultaat van de query in de niet-afhankelijke velden zien?
Voor de volledigheid heb ik in de testdatabase de query toegevoegd, zodat je (hopelijk) kan zien wat ik bedoel.
Van het veld NWvoornaam1 is de besturingselementbron gevuld; wijzigingen daarin worden niet weggeschreven in de logtabel, maar tonen wel een query-resultaat, wijzigingen in de overige velden worden wel weggeschreven in de logtabel (logisch, is volgens jouw instructies gehandhaafd), maar er worden geen resultaten van de query vertoond.

Bekijk bijlage TestLog dd 2112.zip


Ik hoop dat ik een beetje duidelijk heb gemaakt wat ik wil.
 
Als ik het formulier Contactpersonen open (originele db), staat op dat formulier een knop die een zoek-query start, waarbij ik kan zoeken op een (deel van) achternaam.
Dat zou mij al veuls te ingewikkeld zijn; gewoon een keuzelijst gebruiken waarbij je een persoon zoekt. Eén klik op de naam, en je formulier is gefilterd. Of, alternatief, een tekstvak waarin je 'live' filtert op de naam. Dat doe je uiteraard op basis van de recordbron die je gebruikt. Maar nooit een losse knop met die code.
De gevonden waarden laat je zien in de gekoppelde velden, niet in de niet-afhankelijke velden. Waarom zou je dat anders willen? Ik zie de noodzaak niet! Maar ik kijk zo wel even naar je bestandje :).
 
Ik wil de gekoppelde velden niet laten zien en met het gebruik van de niet-afhankelijke velden voortkomen dat mensen rechtstreeks in de tabel contactpersonen kunnen wijzigen.
Bedankt vast voor het meedenken en -kijken weer.
Wordt zeer gewaardeerd
 
Dan gooi je het principe van het complete formulier overboord.....
Ik wil de gekoppelde velden niet laten zien en met het gebruik van de niet-afhankelijke velden voortkomen dat mensen rechtstreeks in de tabel contactpersonen kunnen wijzigen.
Dat is zó makkelijk op te lossen door het formulier te beveiligen. Zet de eigenschap <Bewerken toestaan> op Nee en je bent er... En wat je zoekfunctie betreft: gooi die macro weg (heb ik als eerste gedaan; ik ben echt volslagen allergisch voor de macro functie van Access) en zet een tekstvak in je koptekst met deze code:

Code:
Private Sub Zoekveld_Change()
    If Len(Me.Zoekveld.Text) > 0 Then
        Me.Filter = "[achternaam] Like ""*" & Me.Zoekveld.Text & "*"""
        Me.FilterOn = True
        Me.Zoekveld.SelStart = Me.Zoekveld.SelLength
    Else
        Me.Filter = ""
        Me.FilterOn = False
    End If
End Sub

En waarom het opslaan onder gebeurtenis <Bij muis omhoog>? Die hoort natuurlijk gewoon bij het <Bij klikken> te staan.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan