Update veld van een tabel. DoCmd.RunSQL

Status
Niet open voor verdere reacties.

KPTPTT

Gebruiker
Lid geworden
2 mrt 2018
Berichten
321
Hallo. In een tabel Bijlagen wil ik een veld Bijlage3 van een record updaten. Hiervoor vond ik DoCmd.RunSQL. De SQL regel blijft maar Syntax fouten veronen of vraagt om een parameterinstelling van FldName. De waarde van het veld is voor de update Null en moet geupdated worden met bijvoorbeeld de tekst Brief. Wat is er niet juist aan de Syntax, nm. komt deze overeen met de aanbeveling van MS. Van alles geprobeerd met en zonder single quotes.
Code:
Naam tabel is Bijlagen
FldName = Bijlage3
Oldname = "Brief"
Bijlagen_ID is numeriek

   DoCmd.SetWarnings False
   strSQL = "UPDATE Bijlagen SET Bijlagen.FldName = 'OldName' " & "WHERE Bijlagen.Bijlagen_ID = " & Me.Bijlagen_ID
   DoCmd.RunSQL strSQL
   DoCmd.SetWarnings True
 
Als ik de SQL string lees dan heb je in de tabel Bijlagen een veld dat fldName noemt en dat je overal de letterlijke inhoud "Oldname" wil geven overal waar de bijlagen_ID gelijk is aan de bijlagen_ID op het formulier.
als je het veld Bilage3 de inhoud "Brief" wil geven die je in de variabele OldName hebt opgeslagen (vergeet niet de variabele dan eerst te declareren) dan wordt de SQL string


strSQL = "UPDATE Bijlagen set Bijlagen.Bijlage3 = """ & Oldname & """ WHERE Bijlagen.Bijlagen_ID = " & Me.Bijlagen_ID

als ook fldname een string variabele is die je flexibel opvult wordt de string:

strSQL = "UPDATE Bijlagen set Bijlagen." & fldname & " = """ & Oldname & """ WHERE Bijlagen.Bijlagen_ID = " & Me.Bijlagen_ID
 
Code:
strSQL = "UPDATE Bijlagen SET FldName = """ & OldName & """ WHERE Bijlagen_ID = " & Me.Bijlagen_ID

Tardis
 
Dank voor jullie bijdragen. Voor mij duizelde het van de quotes, etc. De oplossing van Tardis geeft een foutmelding, er wordt gevraagd een opgave van de parameter voor de FldName op te geven. De oplossing van Noelag zorgt voor de update van het veld echter wordt door Access een melding gegeven of je zeker weet dat de record definitief moet worden aangepast. Je kunt dan Ja of Nee kiezen. Deze melding is in de praktijk ongewenst maar hoe die te omzeilen? Tevens worden bij mij alle velden Bijlagen van de record, in dit geval vanaf Bijlage3 tm Blijage 26, ingevuld met de inhoud van OldName. Dit moet ik verder in mijn code gaan uitzoeken. De SQL update wordt in een For Next loop gebruikt. In ieder geval weer een stukje verder gekomen. Graag nog een suggestie voor de Access melding om te omzeilen.
 
Als je de variabele wilt gebruiken (waarom zou je trouwens?) dan dit
Code:
Dim fldName As String, OldName As String
FldName = Bijlage3
OldName = "Brief"

   DoCmd.SetWarnings False
   strSQL = "UPDATE Bijlagen SET " &  FldName  & "=""" OldName & """ WHERE Bijlagen_ID = " & Me.Bijlagen_ID
   CurrentDB.Execute StrSQL, dbFailOnError
   DoCmd.SetWarnings True

, anders dit:

Code:
Dim fldName As String, OldName As String
FldName = Bijlage3
OldName = "Brief"

   DoCmd.SetWarnings False
   strSQL = "UPDATE Bijlagen SET [Bijlage3] = ""Brief"" WHERE Bijlagen_ID = " & Me.Bijlagen_ID
   CurrentDB.Execute StrSQL, dbFailOnError
   DoCmd.SetWarnings True

En duizelen van quootjes? Even weten waarom en het is niet zo moeilijk. Een enkele " betekent: einde string. Als je het teken zélf nodig hebt, omdat je een tekstveld gaat vullen, volstaat één " dus niet. Vandaar dat je er twee typt ("") zodat Access weet dat het de "als teken moet beschouwen. Zie je er drie, dan zijn er dus twee bedoeld om het " teken te genereren, en één om het begin of het eind van de string te definiëren. FldName & "=""" OldName & """.
 
Dank voor je bijdrage. De strSQL regel geeft een syntaxfout maar geeft niet aan wat. Ik heb nu gebruik gemaakt van de regel van Noellag < strSQL = "UPDATE Bijlagen SET Bijlagen.FldName = 'OldName' " & "WHERE Bijlagen.Bijlagen_ID = " & Me.Bijlagen_ID > en daarna de OctaFish regel CurrentDB.Execute StrSQL, dbFailOnError. Het resultaat werkt en het Acces meldingsscherm wordt niet meer getoond. Al met al een goed resultaat.
 
Vermijd, als het even kan, de enkele quoots
Code:
strSQL = "UPDATE Bijlagen SET FldName = ""OldName"" WHERE Bijlagen_ID = " & Me.Bijlagen_ID
Zou toch echt moeten werken :).
 
Hoi OctaFish. Helaas geeft de regel weer een foutmelding en met name in de volgende regel, Te weinig parameters. Ik kan mij voorstellen dat het je eer te na is, maar het werkt nu goed en wil het zo laten:). Bedankt voor je medewerking en waarschijnlijk tot een volgende keer.
Code:
DoCmd.SetWarnings False
                    strSQL = "UPDATE Bijlagen set Bijlagen." & FldName & " = """ & OldName & """ WHERE Bijlagen.Bijlagen_ID = " & Me.Bijlagen_ID   'Voeg Bijlage toe
                    CurrentDb.Execute strSQL, dbFailOnError
                    DoCmd.SetWarnings True
                    Me.Form.Requery                 'Herstel form Bijlagen
 
Als Oldname een variabele is, dan moet het inderdaad met drie quootjes. Had ik ook aangegeven in bericht #5. Daar was ik dan wél weer een ampersand vergeten, zie ik nu. En ja, dan doet de code het uiteraard niet :).
 
Zijn we er toch uitgekomen en je uitleg van je quootjes is helder. Is nog wel een punt dat ik in de regel niet een string kan onderscheiden, is dat na de ampersand?
 
Wat bedoel je daar mee? Normaal gesproken staat een String tussen dubbele aanhalingstekens. Dus: Msgbox “Dit is een voorbeeld.”. Heb je variabele gegevens, die bijv. uit een formulier komen, dan moet je de string opsplitsen in brokken. Dit: Msgbox “Dit is “ & “een voorbeeld.” is dus precies hetzelfde als de eerste msgbox. Je breidt alles dus aan elkaar.
Code:
MsgBox “Vandaag is het “ & Date & “, maar niet morgen!”
En zo breidt je zo’n string dan steeds verder uit.
 
Weer een duveltje in de testcode. De eerste code werkt goed echter als ik de tweede code voor een ander veld BijlagePad1 gebruik, treedt op deze regel een error op "Fout 3144, De instructie UPDATE bevat een syntaxfout". CurrentdB regel wordt geel. Ik heb de eerste code gekopieerd en alleen twee andere variabelen BijlagePad1 (veld waarin het Path staat) en ChDir (PathName) aangepast .
Code:
DoCmd.SetWarnings False
                    strSQL = "UPDATE Bijlagen set Bijlagen." & FldName & " = """ & OldName & """ WHERE Bijlagen.Bijlagen_ID = " & Me.Bijlagen_ID   'Voeg Bijlage toe
                    CurrentDb.Execute strSQL, dbFailOnError
                    DoCmd.SetWarnings True
                    Me.Form.Requery                 'Refresh form Bijlagen
                    
ChDir = "D:\Bijlagen_email_db\Vervangen\T schijf\" 

                    DoCmd.SetWarnings False
                    strSQL = "UPDATE Bijlagen set Bijlagen." & BijlagePad1 & " = """ & ChDir & """ WHERE Bijlagen.Bijlagen_ID = " & Me.Bijlagen_ID   'Voeg Bijlage toe
                    CurrentDb.Execute strSQL, dbFailOnError
                    DoCmd.SetWarnings True
Kijk ik ergens overheen?

Kan ik de tweede toevoeging van het Path met de eerste code strSQL combineren?
 
Laatst bewerkt:
Ik snap eerlijk gezegd niet waarom je het veld dat je wilt bijwerken in een variabele zet; dat heeft alleen maar zin als je met een loop werkt en de naam regelmatig verandert, of ergens anders vandaan komt (een keuzelijst bijvoorbeeld). Als je maar twee velden wilt bijwerken, kun je net zo goed de naam er hard in zetten
Daarnaast is ChDir een intern commando; het is echt een heel slecht idee om interne namen te gebruiken als variabele. Moet je nooit doen. Gebruik dan iets als:

PHP:
NewDir = "D:\Bijlagen_email_db\Vervangen\T schijf" 
strSQL = "UPDATE Bijlagen set BijlagePad2 = """ & NewDir & """ WHERE Bijlagen_ID = " & Me.Bijlagen_ID
 
De coderegel staat inderdaad in een loop. Ik heb maar een klein stukje code op de site gezet. Ik wil alle bijlagen uit een email dmv een loop in de map Bijlagen stoppen, vandaar de variabele. ChDir had ik niet in de gaten, een slimme opmerking. ChDir aangepast in NewDir maar nog steeds in de tweede code de Syntaxfout zoals beschreven in #12. Beide strSQL coderegels zijn exact gelijk en toch een fout in de tweede. Kan ik ook de tweede strSQL regels in één regel samenvoegen? In de eerste regel wordt een veld geupdated met altijd de waarde Null. De tweede regel kan soms een veld updaten met een bepaalde stringwaarde of waarde Null. Wat kan de fout zijn en hoe kan ik combineren?
 
Nooit een goed idee om maar een klein stukje van de code te plaatsen. Wellicht denk je dat we niet tegen grote lappen code kunnen :).
Dan nog:
Ik wil alle bijlagen uit een email dmv een loop in de map Bijlagen stoppen, vandaar de variabele.
Als je de mails in de db wilt opslaan (dat lees ik hier overigens niet) dan is je bijlage veld maar één veld, en heeft het geen zin om daar een loop voor te gebruiken. Wél voor de waarde die je opslaat, maar niet voor het veld.
En als je meer dan één bijlageveld hebt, dan deugt de tabel structuur niet.
 
Laatst bewerkt:
Zet eens :
debug.print strSQL
telkens je een SQL string hebt opgebouwd, dan kan je in het immediate pane de resultaat string lezen en kopiëren. Als je die string kopieert en probeert uit te voeren kan je meestal zien waar de fout zit.
 
Het is tobben geblazen. Er staat nog een vraag: "Hoe kan ik een tweede veld NewDir van de tabel Bijlagen updaten in dezelfde code"? De tweede coderegels strSQL combineren tot één, die van FldName en NewDir.

Het blijkt dat de update van het veld in de meeste gevallen goed gaat echter soms veranderd in de strSQL code Update het Bijlage_ID nummer van bv. 19 (het formuliernummer) naar 0. In de tabel worden dan twee records gemaakt, 19 en 0.
Ik heb nog getest of de opslag van de tweede coderegel (met NewDIr) op een andere (oneigenlijke) manier kan worden opgeslagen met DoCmd. Save.

Om te voorkomen dat tijdens de opslag er soms twee indexnummer zijn (19,0) heb ik het vaste ID nummer gedestilleerd en gebruik deze in de nieuwe strSQL Update code. Hiermee krijg ik een foutmelding. Fout 3075. Syntaxfout (operator ontbreekt) in Query-expressie "brief.docx" & &. Hoe moet ik de code strSQL Update aanpassen. Hierbij de loop (het is slechts een testversie!!) IN de tavel zijn velden 1-26 opgenomen om de bijlagen op te slaan. Iedere record behoort bij een uniek (Bijlagen_ID) Bijlagen formulier.
Code:
Dim SourceFileName  As String
Dim DestinFileName  As String
Dim i As Integer                                    'Counter Bijlagen velden in tabel Bijlagen (max 26)
Dim FldName As String
Dim VldNr As String
Dim VldName As String
Dim Fld As String
Dim strSQL  As String
Dim BijlagePad1 As String
Dim BijlagePad As String

Dim IDnr As Integer
'Bepaal IndexNr ID                                                                    'Bepaling index ID
IndexNr = "Bijlagen_ID = " & Me.Bijlagen_ID                              'Current ID werkorder (Wrknr)"  Bijlage_ID = 19
Lengte = Len(IndexNr)                   '16
IDnr = Lengte - 14
IDnr = Right(IndexNr, IDnr)                                                       'Resultaat: Indexnumer ID van het huidige formulier

 
CurrDir = "D:\Bijlagen_email_db\Vervangen\"                             'Save the current folder
NewDir = "D:\Bijlagen_email_db\Vervangen\T schijf\"                  'Verander de map naar de nieuwe map AANPASSEN T schijf

    strFileSpec = CurrDir & "*.*"
    sFile = Dir(strFileSpec)                                                           'Haal de eerste file in de map
    
        VldNr = Right("Bijlage1", 1)                                                'Bepaal nummer van bijlage
        VldName = Left("Bijlage1", 7)                                             'Eerste deel van de naam Bijlage (Bijlage1)
        VldNr = VldNr - 1                                                               'Zet volg nummer op 0
        FldName = VldName & VldNr                                               'Maak Bijlage0
   
    Do While Len(Nz(sFile)) > 0                                                    'Rename until no more files
        OldName = sFile                                                                'CurrDir &
        SourceFileName = CurrDir & sFile                                        'Map  met bestand "Vervangen"
        DestinFileName = NewDir & sFile                                         'Map T schijf en bestand

'Opslag in tabel
        For i = 1 To 26                             'Voor 26 bijlagen wordt inhoud veld BijlagenX onderzocht en bij Null de Bijlage opgeslagen
            VldNr = VldNr + 1
            FldName = VldName & VldNr               'Volgende BijlageX samenstellen

                If Not IsNull(DLookup(FldName, "[Bijlagen]", "[Bijlagen_ID]=" & Me.[Bijlagen_ID])) Then 'Is het veld BijlageX reeds voorzien met een bijlage?
                    FldName = FldName               'Fake instructie
                Else
                'Veld is Null
                    DoCmd.SetWarnings False
                    'strSQL = "UPDATE Bijlagen set Bijlagen." & FldName & " = """ & OldName & """ WHERE Bijlagen.Bijlagen_ID = " & Me.Bijlagen_ID   'Voeg Bijlage in de tabel toe, TIJDELIJK vervallen voor test
                    strSQL = "UPDATE Bijlagen set Bijlagen." & FldName & " = """ & OldName & """ & WHERE Bijlagen_ID ='" & [IDnr] & "'"                   'Voeg Bijlage in de tabel toe, TEST met Indexnummer ID    FOUTMELDING  3075

                    CurrentDb.Execute strSQL, dbFailOnError
                    DoCmd.SetWarnings True
                    Me.Form.Requery                                                                    'Refresh form Bijlagen, bijlagenamen worden zichtbaar
                  
                    'DoCmd.SetWarnings False                                                       'Tijdelijk vervallen voor test. Tweede coderegel. Inpassen in eerste coderegel!!!!!!!!!!!!!!!!
                    'strSQL = "UPDATE Bijlagen set Bijlagen." & BijlagePad1& " = """ & NewDir & """ WHERE Bijlagen.Bijlagen_ID = " & Me.Bijlagen_ID   'Voeg Bijlage toe, TIJDELIJK vervallen 
                    'CurrentDb.Execute strSQL, dbFailOnError
                    'DoCmd.SetWarnings True

                    'If Me.BijlagePad1 & "" = "" Then
                        'Me.BijlagePad1 = NewDir                                                     'Tijdelik vervallen voor test. Gaan combineren met eerste code regel strSQL !!!!!!!!!!!!!!!
                        'DoCmd.RunCommand acCmdSaveRecord                              'Save bijlage in record
                    'End If
                    
                    i = 26                          'Bijlage is opgeslagen, volgende bijlage ophalen
                    
                    On Error Resume Next                                                              'Voor als het bestand al bestaat en dus meerdere malen wordt opgeslagen vanuit dezelfde mail
                    Name SourceFileName As DestinFileName                                  'Verplaatst de file naar de volgende map T schijf
                    On Error GoTo 0
                End If
        Next i
            sFile = Dir                                                                                         'Get next file to rename
    Loop
    On Error Resume Next
    If CurrDir <> "" Then
        Kill CurrDir & "*.*"                                                                                'Wist alle voorgande bestanden uit de map [Folder]
        On Error GoTo 0
    End If
  
         Set oOutlook = Nothing
         'Set ObjApp = Nothing                                                                          'Geeft ook een FOUTMELDING dat het obj (Outlook is eerder gedefinieerd) niet bestaat !!!!!!!!!!!!!!!! Tijdelijk uitgeschakeld.
         Set currentExplorer = Nothing '
         Set obj = Nothing
 
Als de tweede velden in één regel SQL code zou kunnen is volgens mij het probleem opgelost. Hoe kan ik dit doen en hoe ziet de Syntax er uit?
Variabelen zijn: FldName = "Bijlage3", OldName = "BriefX", BijlagePad1 = Veldnaam, NewDir = "D:\bijlagen"
Code:
strSQL = "UPDATE Bijlagen set Bijlagen." & FldName & " = """ & OldName & """ WHERE Bijlagen.Bijlagen_ID = " & Me.Bijlagen_ID   'Voeg de Bijlage in de tabel toe
strSQL = "UPDATE Bijlagen set Bijlagen." & "BijlagePad1" & " = """ & NewDir & """ WHERE Bijlagen.Bijlagen_ID = " & Me.Bijlagen_ID   'Voeg Path in de tabel toe
                   DoCmd.SetWarnings False 
                   CurrentDb.Execute strSQL, dbFailOnError
                   DoCmd.SetWarnings True
Omdat het index ID nummer is bepaald in de variabele IDnr zou dit mogelijk ook een correcte Syntax kunnen zijn. Is dit juist?
Code:
strSQL = "UPDATE Bijlagen set Bijlagen." & FldName & " = """ & OldName & """ & WHERE Bijlagen_ID ='" & [IDnr] & "'"
 
Laatst bewerkt:
strSQL = "UPDATE Bijlagen set Bijlagen." & FldName & " = """ & OldName & """ , Bijlagen." & BijlagePad1 & " = """ & NewDir & """ WHERE Bijlagen.Bijlagen_ID = " & Me.Bijlagen_ID
 
Dank voor je hulp. Ik had ook zoals iets geprobeerd met een komma voor de tweede set maar dat werkte niet. Helaas geeft de regel een foutmelding tav. de Syntax in Update. De regel < CurrentDb.Execute strSQL, dbFailOnError > wordt geel. Fout 3075. Syntaxfout (operator ontbreekt) in query-expressie [Bijlagen_ID]=. Wat zou het kunnen zijn?
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan