Jump to content
  • 0

Fout in ExecuteSQL


caroline

Question

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 to comment

8 answers to this question

Recommended Posts

  • 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 to comment
  • 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 to comment
  • 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 to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...