Ga naar inhoud
  • 0

Fout in ExecuteSQL


caroline

Vraag

Ik geraak er niet aan uit... Wat klopt er niet in de volgende ExecuteSQL statement:

 

ExecuteSQL ( "

SELECT COUNT(c_1)

FROM products_members

WHERE year ='2014'

GROUP BY member_id

ORDER BY member_id ASC

"; "" ; "" )

 

- Zonder de WHERE lukt het wel, maar natuurlijk moet ik enkel de cijfers voor 2014 hebben. (dit wordt later dynamisch).

- Het veldje "year" in de tabel "products_members" is een number, maar ook als ik het als text zet lukt het niet. (Weet trouwens niet of ik het best als number of text zet?)

- ook zonder quotes lukt het niet.

 

Wat doe ik verkeerd?

Link naar reactie

8 antwoorden op deze vraag

Aanbevolen berichten

  • 0

YEAR is een "reserved word" (van een functie) en die moet dus worden geqouted en het veld year is een number en daarvan moet de de waarde weer niet worden gequoted. Je formule wordt dan:

ExecuteSQL ( "SELECT COUNT(c_1)
FROM products_members
WHERE \"year\" = 2014 
GROUP BY member_id
ORDER BY member_id ASC
"; "" ; "" )

maar filemaker heeft een handige feature waardoor je met het veldtype geen rekening hoeft te houden. Je plaatst op de plek van de waarde een vraagteken en in de argumentenlijst kan je dan de waarde plaatsen:

ExecuteSQL ( "SELECT COUNT(c_1)
FROM products_members
WHERE \"year\" = ? 
GROUP BY member_id
ORDER BY member_id ASC
"; "" ; "" ; 2014 )

Op deze manier zal je formule verwacht ik wel werken.

Link naar reactie
  • 0

De meningen zijn een beetje verdeeld over hoe je hiermee om zou moeten gaan. Sommigen vinden het handig om standaard alle kolomnamen te quoten: \"kolomnaam\"

Anderen doen dat alleen bij reserved words dmv een custom-function:

Let( [ 
qte=PatternCount ( 
"¶ABSOLUTE¶ACTION¶ADD¶ALL¶ALLOCATE¶ALTER¶AND¶ANY¶ARE¶AS¶ASC¶ASSERTION¶AT¶AUTHORIZATION¶AVG¶BEGIN¶BETWEEN¶BINARY¶BIT¶BIT_LENGTH¶BLOB¶BOOLEAN¶BOTH¶BY¶CASCADE¶CASCADED¶CASE¶CAST¶CATALOG¶CHAR¶CHARACTER¶" & 
"CHARACTER_LENGTH¶CHAR_LENGTH¶CHECK¶CHR¶CLOSE¶COALESCE¶COLLATE¶COLLATION¶COLUMN¶COMMIT¶CONNECT¶CONNECTION¶CONSTRAINT¶CONSTRAINTS¶CONTINUE¶CONVERT¶CORRESPONDING¶COUNT¶CREATE¶CROSS¶CURDATE¶CURRENT¶" & 
"CURRENT_DATE¶CURRENT_TIME¶CURRENT_TIMESTAMP¶CURRENT_USER¶CURSOR¶CURTIME¶CURTIMESTAMP¶DATE¶DATEVAL¶DAY¶DAYNAME¶DAYOFWEEK¶DEALLOCATE¶DEC¶DECIMAL¶DECLARE¶DEFAULT¶DEFERRABLE¶DEFERRED¶DELETE¶DESC¶DESCRIBE¶" & 
"DESCRIPTOR¶DIAGNOSTICS¶DISCONNECT¶DISTINCT¶DOMAIN¶DOUBLE¶DROP¶ELSE¶END¶END_EXEC¶ESCAPE¶EVERY¶EXCEPT¶EXCEPTION¶EXEC¶EXECUTE¶EXISTS¶EXTERNAL¶EXTRACT¶FALSE¶FETCH¶FIRST¶FLOAT¶FOR¶FOREIGN¶FOUND¶FROM¶FULL¶" & 
"GET¶GLOBAL¶GO¶GOTO¶GRANT¶GROUP¶HAVING¶HOUR¶IDENTITY¶IMMEDIATE¶IN¶INDEX¶INDICATOR¶INITIALLY¶INNER¶INPUT¶INSENSITIVE¶INSERT¶INT¶INTEGER¶INTERSECT¶INTERVAL¶INTO¶IS¶ISOLATION¶JOIN¶KEY¶LANGUAGE¶LAST¶" & 
"LEADING¶LEFT¶LENGTH¶LEVEL¶LIKE¶LOCAL¶LONGVARBINARY¶LOWER¶LTRIM¶MATCH¶MAX¶MIN¶MINUTE¶MODULE¶MONTH¶MONTHNAME¶NAMES¶NATIONAL¶NATURAL¶NCHAR¶NEXT¶NO¶NOT¶NULL¶NULLIF¶NUMERIC¶NUMVAL¶OCTET_LENGTH¶OF¶ON¶" & 
"ONLY¶OPEN¶OPTION¶OR¶ORDER¶OUTER¶OUTPUT¶OVERLAPS¶PAD¶PART¶PARTIAL¶POSITION¶PRECISION¶PREPARE¶PRESERVE¶PRIMARY¶PRIOR¶PRIVILEGES¶PROCEDURE¶PUBLIC¶READ¶REAL¶REFERENCES¶RELATIVE¶RESTRICT¶REVOKE¶RIGHT¶" & 
"ROLLBACK¶ROUND¶ROWID¶ROWS¶RTRIM¶SCHEMA¶SCROLL¶SECOND¶SECTION¶SELECT¶SESSION¶SESSION_USER¶SET¶SIZE¶SMALLINT¶SOME¶SPACE¶SQL¶SQLCODE¶SQLERROR¶SQLSTATE¶STRVAL¶SUBSTRING¶SUM¶SYSTEM_USER¶TABLE¶TEMPORARY¶" & 
"THEN¶TIME¶TIMESTAMP¶TIMESTAMPVALTIMEVAL¶TIMEZONE_HOUR¶TIMEZONE_MINUTE¶TO¶TODAY¶TRAILING¶TRANSACTION¶TRANSLATE¶TRANSLATION¶TRIM¶TRUE¶UNION¶UNIQUE¶UNKNOWN¶UPDATE¶UPPER¶USAGE¶USER¶USERNAME¶USING¶USAGE¶" & 
"USER¶USERNAME¶USING¶VALUE¶VALUES¶VARBINARY¶VARCHAR¶VARYING¶VIEW¶WHEN¶WHENEVER¶WHERE¶WITH¶WORK¶WRITE¶YEAR¶ZONE¶" ; ¶ & Upper ( name ) & ¶ ) or 
PatternCount ( name ; " " ) or 
Left ( name ; 1 ) = "_" or 
Left ( name ; 1 ) = "#" ] ; 
If ( qte ; Quote ( name ) ; name ) )

De naam van de functie mag je zelf bedenken en er is maar één parameter: name

Voor mezelf heb ik het nog wat verder opgeleukt, maar dit is de essentie. De lijst met reserved words heb ik uit de ODBC-documentatie van filemaker (de map extra's) geplukt ;-) (De opgedeelde tekst-strings is omdat filemaker een beetje moeite heeft met hele lange ononderbroken tekst-strings)

Link naar reactie
  • 0
Ik ga toch voor de optie om geen reserved words te gebruiken.

daar gaan de meeste mensen wel voor, maar zoals je ziet is de lijst vrij lang en je vergist je gemakkelijk cq je vergeet gemakkelijk dat sommige woorden reserved zijn, van woorden als:

order, begin, check, exception, from, index, interval, language, national, open, option, references, privileges, temporary, translation, user, username

is het lang niet altijd even voor de hand liggend dat ze reserved zijn, maar ze staan wel in de lijst en je sql-functie werkt gewoon niet als ze niet zijn gequoted en je zoekt je snel suf naar zo'n fout. Alles quoten of een cf gebruiken bespaart je gewoon veel zoekwerk en tijd

Link naar reactie

Doe mee aan dit gesprek

Je kunt dit nu plaatsen en later registreren. Indien je reeds een account hebt, log dan nu in om het bericht te plaatsen met je account.

Gast
Beantwoord deze vraag...

×   Geplakt als verrijkte tekst.   Plak in plaats daarvan als platte tekst

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

×
×
  • Nieuwe aanmaken...