[VBA] Waarom zit er zo'n verschil in zo'n simpele Syntax ?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Alfa Novanta
  • Registratie: Oktober 2001
  • Laatst online: 08-09 17:43

Alfa Novanta

VRRROOOAAARRRP

Topicstarter
Allereerst even melden dat ik geen programmeur ben, maar gewoon ICTer ;)

Vroeger (2001?) heb ik al eens een groter VBA project gedaan met een klasgenoot en we hebben ons toen een ongeluk gezocht om de syntax kloppend te krijgen. We hadden de beschikking over Office 2003 met Access.

Onlangs ben ik weer eens begonnen met een klein VBA projectje om mijn VBA en SQL skills weer een beetje op te krikken en gebruik ook nu weer Office 2003 met Access omdat ik mijn oude project dan nog eens kan raadplegen qua Syntax.

En ja hoor, ik stink er direct weer in en loop weer precies als toen te worstelen om de syntax kloppend te krijgen terwijl er in de basis met mijn query niks mis is.Vreemd genoeg vind ik de _juiste_ examples niet op internet. Deze variëren allemaal nét weer een beetje ..

Hieronder 2 regels code (willekeurig, niet gerelateerd);

code:
1
2
DoCmd.RunSQL "INSERT INTO uren SELECT tijd FROM rawdata WHERE " + fld.Name + " = 0"
DoCmd.RunSQL "UPDATE limieten SET min  = '" & minNew.Value & "' WHERE gebied = '" & meetpunt.Value & "'"


Waarom gebruik je de ene keer een + en de andere keer een & ?
Het eerste is een waarde in een tabel en de andere een input-object? :?

En waarom volsta je in bovenste regel met "+ bla + " en in de onderste regel ' " & bla & " ' ??
Is dat om hetzelfde als hierboven?

Waarschijnlijk iets heel onnozels, maar de syntax zoals ik die hierboven aangeef vind ik _nergens_ terug op internet. Het zal wel komen omdat het VBA is waarin je SQL statements gebruikt ..

Weet iemand of dit in Office 2007 of 2010 ook veranderd is of is het nog steeds opletten geblazen? Misschien dat dit anders aanleiding zou kunnen zijn eens over te stappen op een nieuwere Office. Voor de rest zag ik het nut nog niet zo en die ribbon kan ik ook nog maar niet aan wennen.

thanks :)

[ Voor 0% gewijzigd door Alfa Novanta op 20-12-2010 14:32 . Reden: typo ]

My Youtube channel: Alfa Novanta
AMD Ryzen 7 5800X | ASRock X470 Taichi | 32GB Kingston HyperX Predator DDR4-3200 RGB | Gigabyte RTX3090 Gaming OC 24GB GDDR6 | Windows 10 x64 | HP Reverb G2


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 16:33

Haan

dotnetter

Dit verschil verbaast mij eerlijk gezegd ook een beetje. In 'C'-like talen plak je strings aan elkaar met '+', in VB doe je dat met '&', maar ik heb niet eerder zo door elkaar gebruikt zien worden.

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • ZaZ
  • Registratie: Oktober 2002
  • Laatst online: 19-08 14:24

ZaZ

Tweakers abonnee

Gewoon altijd & gebruiken. + pikt VBA ook vaak wel, alleen als ie het kan casten naar een getal dan loop je het risico dat ie een berekening gaat doen, of probeert te doen.
Geen idee eigenlijk wat ie doet als je concat gedeelte te casten is naar een number. Dan heb je misschien ook nog kans op een type mismatch omdat ie dan bijv 88 bij "ik ben een string" op probeert te tellen.
Gewoon & gebruiken dus

Lekker op de bank


Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 13:18

Dido

heforshe

Waarom je die + en & door elkaar gebruikt zou ik niet weten, komt me ook vreemd over.

Je tweede vraag:
En waarom volsta je in bovenste regel met "+ bla + " en in de onderste regel ' " & bla & ' " ??
Is vrij eenvoudig te beantwoorden. Maar dat kun je ook zelf uitzoeken als je even de moeite neemt om de resulterende string van je geconcat te bekijken (dus de string die je daadwerkelijk de RunSQL inpompt).

hint: het heeft iets te maken met MyField = 0 en OtherField = 'blaat'

In je vraagstelling heb je trouwens de "en ' een keer omgedraaid. Dat doet vermoeden dat je grootste probleem met de syntax is dat je eigenlijk niet helemaal doorhebt wat je aan het doen bent, en met trial and error probeert te komen tot iets waarvan je denkt dat het doet wat jij wilt ;)

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

Verwijderd

Met de operator '+' kan je numerieke waarden optellen en kan je ook strings aan elkaar concateneren.

Met de operator '&' kan je twee expressies concateneren, waarbij elke expressie geconverteerd moeten kunnen worden naar string (dus in het voorbeeld van (waarschijnlijk) numeriek naar string).

Zie ook: http://msdn.microsoft.com/en-us/library/te2585xw(v=vs.80).aspx

Acties:
  • 0 Henk 'm!

  • Alfa Novanta
  • Registratie: Oktober 2001
  • Laatst online: 08-09 17:43

Alfa Novanta

VRRROOOAAARRRP

Topicstarter
ZaZ schreef op maandag 20 december 2010 @ 13:21:
Gewoon altijd & gebruiken. + pikt VBA ook vaak wel, alleen als ie het kan casten naar een getal dan loop je het risico dat ie een berekening gaat doen, of probeert te doen.
Geen idee eigenlijk wat ie doet als je concat gedeelte te casten is naar een number. Dan heb je misschien ook nog kans op een type mismatch omdat ie dan bijv 88 bij "ik ben een string" op probeert te tellen.
Gewoon & gebruiken dus
Scheelt wel typwerk anders en een extra kans op vergissen ... " + bla + " zijn 4 symbolen, ' " & bla & " ' zijn 6 symbolen. Als je veel code tikt gaat het met de + sneller B)
Dido schreef op maandag 20 december 2010 @ 13:21:

In je vraagstelling heb je trouwens de "en ' een keer omgedraaid. Dat doet vermoeden dat je grootste probleem met de syntax is dat je eigenlijk niet helemaal doorhebt wat je aan het doen bent, en met trial and error probeert te komen tot iets waarvan je denkt dat het doet wat jij wilt ;)
en bedankt .. was gewoon een typfout. Er staat ook een spatie tussen, stond in mijn code ook niet ;)

[ Voor 41% gewijzigd door Alfa Novanta op 20-12-2010 18:01 . Reden: typo ]

My Youtube channel: Alfa Novanta
AMD Ryzen 7 5800X | ASRock X470 Taichi | 32GB Kingston HyperX Predator DDR4-3200 RGB | Gigabyte RTX3090 Gaming OC 24GB GDDR6 | Windows 10 x64 | HP Reverb G2


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 16:33

Haan

dotnetter

ing._Buttje schreef op maandag 20 december 2010 @ 14:34:

Scheelt wel typwerk anders en een extra kans op vergissen ... " + bla + " zijn 4 symbolen, " ' & bla & ' " zijn 6 symbolen. Als je veel code tikt gaat het met de + sneller B)
Ik hoop dat dit als grapje was bedoeld?

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 01-09 22:18
Let er ook op dat de manier waarop jij de query samenstelt gevoelig is voor sql-injection.

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 13:18

Dido

heforshe

ing._Buttje schreef op maandag 20 december 2010 @ 14:34:
en bedankt .. was gewoon een typfout. Er staat ook een spatie tussen, stond in mijn code ook niet ;)
Erhm, nee dus.
Als jij dit serieus meent:
... " + bla + " zijn 4 symbolen, " ' & bla & ' " zijn 6 symbolen.
Dan snap je dus inderdaad niet wat je aan het doen bent (temeer daar je nu tot twee keer toe de ' en de " verkeerd om zet!)

Lees mijn vorige post nog eens heel goed, en schrijf nou eens de geconcateneerde strings uit? En post die dan eens?

[ Voor 6% gewijzigd door Dido op 20-12-2010 15:58 ]

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Mastermind schreef op maandag 20 december 2010 @ 15:55:
Let er ook op dat de manier waarop jij de query samenstelt gevoelig is voor sql-injection.
Het security-probleem is in Access niet echt aanwezig, maar het is wel wat onhandig als zaken met een quote niet goed werken. Dit is eenvoudig te verhelpen met een Replace daarop, zodat je er twee ipv 1 krijgt in je uiteindelijke query.
ing._Buttje schreef op maandag 20 december 2010 @ 14:34:
Scheelt wel typwerk anders en een extra kans op vergissen ... " + bla + " zijn 4 symbolen, " ' & bla & ' " zijn 6 symbolen. Als je veel code tikt gaat het met de + sneller B)
Ja, want veldnamen in een query zijn precies hetzelfde als waardes ofzo en Access die heeft een soort magische strings die de gebruikte +-en onthouden... :+ Overigens verdient het aanbeveling om ook veldnamen met een spatie erin te ondersteunen - ook hier escaping ([]) dus enzo.

Voor de duidelijkheid is dit de basisregel: In Access VBA gebruik je het beste altijd & om strings aan elkaar te koppelen, zodat er nooit een ongewenste optelling of foutmelding ontstaat. + gebruik je om getallen op te tellen.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
pedorus schreef op maandag 20 december 2010 @ 18:02:
In Access VBA gebruik je het beste altijd & om strings aan elkaar te koppelen, zodat er nooit een ongewenste optelling of foutmelding ontstaat. + gebruik je om getallen op te tellen.
In een non-strong typed taal gebruik je voor string-concatenation de string-concatenation operator om expliciet aan te geven dat je strings wil concatten en niet "per ongeluk" de string "1" + de string "5" wil optellen. Doe je dat niet dan moet je niet raar staan kijken als het antwoord "15" is. Het is sowieso een goed gebruik expliciet te zijn en zaken niet aan een interpreter/compiler/whatever over te laten.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • -Sander1981-
  • Registratie: November 2000
  • Laatst online: 22-04-2020
Ik zou de TS ten eerste willen aanraden goed naar deze hint te kijken:
Dido schreef op maandag 20 december 2010 @ 13:21:
hint: het heeft iets te maken met MyField = 0 en OtherField = 'blaat'
Ten tweede nog een hintje: gebruik een editor die syntax highlighting ondersteunt (als Access dat niet doet), dan is de code misschien iets begrijpelijker ;)
VBScript:
1
2
DoCmd.RunSQL "INSERT INTO uren SELECT tijd FROM rawdata WHERE " + fld.Name + " = 0"
DoCmd.RunSQL "UPDATE limieten SET min  = '" & minNew.Value & "' WHERE gebied = '" & meetpunt.Value & "'" 

I don't have a solution; but I do admire the problem.

Pagina: 1