Syntaxe d'une requête SQL avec CAST et/ou CONCAT dans une macro

Bonjour !

J’arrive bien à faire des INSERT dans une table à partir d’une macro mais ça se corse lorsque que la requête contient des CONCAT ou des CAST… Je n’arrive pas à trouver la bonne structure.

La requête, qui fonctionne bien en mode SQL, est la suivante :

SELECT ROWNUM( ) "Ligne", "T_PAIEMENTS"."T_PAI_DatePaiement" "Date", "T_MODESPAIEMENT"."T_MOD_JournalComptable" "Journal", "T_MODESPAIEMENT"."T_MOD_CodeComptable" "Compte", 'LA' "LibelleAutomatique", CONCAT( '"Encaissement ', "T_MOD_LibelleModePaiement", '"' ) "LibelleManuel", CONCAT( '"', CAST( ( "ID_PAI" + 200000 ) AS VARCHAR ( 20 ) ), '"' ) "Piece", CASE WHEN "T_CHE_MontantCheque" > 0 THEN "T_CHE_MontantCheque" ELSE ABS( "T_PAI_MontantPaye" ) END "Montant", CASE WHEN "T_PAI_MontantPaye" > 0 THEN 'D' ELSE 'C' END "Sens", CASE WHEN "T_CHE_DateRemiseEnBanque" > "T_PAI_DatePaiement" THEN "T_CHE_DateRemiseEnBanque" ELSE "T_PAI_DatePaiement" END "Echeance", 'EUR' "Devise" FROM { oj "T_CHEQUES" RIGHT OUTER JOIN "T_PAIEMENTS" ON "T_CHEQUES"."T_CHE_Ref_Paiements" = "T_PAIEMENTS"."ID_PAI" }, "T_MODESPAIEMENT", "T_ADHERENTS", "T_SOUSCRIPTEURS" WHERE "T_PAIEMENTS"."T_PAI_Ref_ModePaiement" = "T_MODESPAIEMENT"."ID_MOD" AND "T_ADHERENTS"."T_ADH_Ref_Souscripteurs" = "T_SOUSCRIPTEURS"."ID_SOU" AND "T_PAIEMENTS"."T_PAI_Ref_Souscripteurs" = "T_SOUSCRIPTEURS"."ID_SOU"

Lorsque je la transforme pour faire un INSERT, via une macro, dans une table temporaire, cela donne ça:

"INSERT INTO ""T_EXPORT_COMPTA"" (""Ligne"", ""Date"", ""Journal"", ""Compte"", ""LibelleAuto"", ""LibelleManuel"", ""Piece"", ""Montant"", ""Sens"", ""Echeance"", ""Devise"") SELECT ROWNUM( ) ""Ligne"", ""T_PAIEMENTS"".""T_PAI_DatePaiement"" ""Date"", ""T_MODESPAIEMENT"".""T_MOD_JournalComptable"" ""Journal"", ""ID_SOU"" + 41100000 ""Compte"", 'LA' ""LibelleAutomatique"", CONCAT( '"Encaissement ', ""T_SOU_NomPrenom"", '"' ) ""LibelleManuel"", CONCAT( '"', CAST( ( ""ID_SOU"" + 300000 ) AS VARCHAR ( 20 ) ), '"' ) ""Piece"", CASE WHEN ""T_CHE_MontantCheque"" > 0 THEN ""T_CHE_MontantCheque"" ELSE ABS( ""T_PAI_MontantPaye"" ) END ""Montant"", CASE WHEN ""T_PAI_MontantPaye"" > 0 THEN 'C' ELSE 'D' END ""Sens"", CASE WHEN ""T_CHE_DateRemiseEnBanque"" > ""T_PAI_DatePaiement"" THEN ""T_CHE_DateRemiseEnBanque"" ELSE ""T_PAI_DatePaiement"" END ""Echeance"", 'EUR' ""Devise"" FROM { oj ""T_CHEQUES"" RIGHT OUTER JOIN ""T_PAIEMENTS"" ON ""T_CHEQUES"".""T_CHE_Ref_Paiements"" = ""T_PAIEMENTS"".""ID_PAI"" }, ""T_MODESPAIEMENT"", ""T_ADHERENTS"", ""T_SOUSCRIPTEURS"" WHERE ""T_PAIEMENTS"".""T_PAI_Ref_ModePaiement"" = ""T_MODESPAIEMENT"".""ID_MOD"" AND ""T_ADHERENTS"".""T_ADH_Ref_Souscripteurs"" = ""T_SOUSCRIPTEURS"".""ID_SOU"" AND ""T_PAIEMENTS"".""T_PAI_Ref_Souscripteurs"" = ""T_SOUSCRIPTEURS"".""ID_SOU"""

C’est à dire que j’ai entouré tous les noms de Tables/Champ par des doubles quotes et cela fonctionne bien tant que je n’utilise pas les fonctions CONCAT ou CAST…

D’où mes interrogations :
Peut-on utiliser ces fonctions (CONCAT ou CAST) dans ces conditions ?
Ou bien est-ce la structure de ces fonctions qui mérite des doubles-quotes mais où ?

Merci pour votre aide.

PS : J’utilise LiboBase 6.4.7.2 et hsqldb 2.5.1 en mode client/serveur

Hello !

Je me réponds à moi même : on peut utiliser sans PB ces fonctions CONCAT ou CAST dans une requete SQL appelée via une macro. Néanmoins, pour des raisons de lisibilité mieux vaut utiliser CHAR(34) pour concaténer une doublequote avec du texte…

Donc voilà ce que donne l’instruction, qui fonctionne :

insertSQL2 = "INSERT INTO ""T_EXPORT_COMPTA"" (""Ligne"", ""Date"", ""Journal"", ""Compte"", ""LibelleAuto"", ""LibelleManuel"", ""Piece"", ""Montant"", ""Sens"", ""Echeance"", ""Devise"") SELECT ROWNUM( ) ""Ligne"", ""T_PAIEMENTS"".""T_PAI_DatePaiement"" ""Date"", ""T_MODESPAIEMENT"".""T_MOD_JournalComptable"" ""Journal"", ""ID_SOU"" + 41100000 ""Compte"", 'LA' ""LibelleAuto"", CONCAT( CHAR(34), 'Encaissement ', ""T_SOU_NomPrenom"", CHAR(34)) ""LibelleManuel"", CONCAT( CHAR(34), CAST( ( ""ID_SOU"" + 300000 ) AS VARCHAR ( 20 ) ), CHAR(34)) ""Piece"", CASE WHEN ""T_CHE_MontantCheque"" > 0 THEN ""T_CHE_MontantCheque"" ELSE ABS( ""T_PAI_MontantPaye"" ) END ""Montant"", CASE WHEN ""T_PAI_MontantPaye"" > 0 THEN 'C' ELSE 'D' END ""Sens"", CASE WHEN ""T_CHE_DateRemiseEnBanque"" > ""T_PAI_DatePaiement"" THEN ""T_CHE_DateRemiseEnBanque"" ELSE ""T_PAI_DatePaiement"" END ""Echeance"", 'EUR' ""Devise"" FROM { oj ""T_CHEQUES"" RIGHT OUTER JOIN ""T_PAIEMENTS"" ON ""T_CHEQUES"".""T_CHE_Ref_Paiements"" = ""T_PAIEMENTS"".""ID_PAI"" }, ""T_MODESPAIEMENT"", ""T_ADHERENTS"", ""T_SOUSCRIPTEURS"" WHERE ""T_PAIEMENTS"".""T_PAI_Ref_ModePaiement"" = ""T_MODESPAIEMENT"".""ID_MOD"" AND ""T_ADHERENTS"".""T_ADH_Ref_Souscripteurs"" = ""T_SOUSCRIPTEURS"".""ID_SOU"" AND ""T_PAIEMENTS"".""T_PAI_Ref_Souscripteurs"" = ""T_SOUSCRIPTEURS"".""ID_SOU"" AND ""T_PAIEMENTS"".""T_PAI_DatePaiement"" >= {d " & maDateDeDEB2 & " } AND ""T_PAIEMENTS"".""T_PAI_DatePaiement"" <= {d " & maDateDeFIN2 & " }"

A noter que les variables sont à mettre entre & comme ci-dessus où maDateDeFIN2 correspond à une variable que je récupère dans mon formulaire.