Je suis en train (d'essayer

Mon besoin est d'extraire les nom des champs et des tables pour vérifier si l'orthographe est correcte.
Mais ils peuvent être dans le select, le left join, le where, le group by, le order by, ... et le nom des tables peuvent ne pas y être.
J'ai commencé à y travailler pour le select et voici ce que ça donne :
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=..\..\..\Autoit - Icones_encrypted\Porte documents.ico
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Array.au3>
#include <SQL.au3>
#Include <String.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
; DESCRIPTIF SCRIPT
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
$script_titre="ANALYSEUR SQL"
$script_desc="Analyseur de requêtes SQL"
$auteur="BM"
$maj="27/09/19" ; MES : 20/09/19
$ver="1.01"
$nom_fenetre_gui=$script_titre & " - v." & $ver
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
; GUI PRINCIPALE
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#Region ### START Koda GUI section ### Form=x:\dropbox\developpement\autoit - bm'tools_encrypted\developpement\analyseur requêtes sql\analyseur sql 1.kxf
Global $Form1 = GUICreate($nom_fenetre_gui, 1174, 466, -1, -1)
Global $Group_sql = GUICtrlCreateGroup(" REQUETE ", 8, 8, 601, 233)
Global $Edit_sql = GUICtrlCreateEdit("", 16, 24, 585, 209,$ES_AUTOVSCROLL + $WS_VSCROLL + $ES_MULTILINE + $ES_WANTRETURN)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $Btn_analyse = GUICtrlCreateButton("Analyse", 528, 248, 75, 25)
Global $Group_resultat = GUICtrlCreateGroup(" RESULTAT ", 8, 280, 601, 177)
Global $ListView_resultat = GUICtrlCreateListView("", 16, 296, 586, 150)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $Group_analyse = GUICtrlCreateGroup(" ANALYSE REQUETE ", 616, 8, 545, 449)
Global $Edit_pb = GUICtrlCreateEdit("", 624, 24, 521, 425)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
; A mettre après Edits
; $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_MULTILINE + $ES_WANTRETURN)
; Récup noms des tables et des champs
$sql="select TABLE_NAME,COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS " & _
"ORDER BY TABLE_NAME,COLUMN_NAME"
Global $tab_tables_et_champs=f_220_bdd2($sql)
;_ArrayDisplay($tab_tables_et_champs)
; EXEMPLES DE REQUÊTES
$sql="SELECT TOP 1 CLIENT.CLIENT_CODE,CLIENT.PRESTAT_CODE AS TEST,CLIENT.FOURN_CODE,CLIENT.DO_CODE,ST_CODE,RTRIM(CLIENT_NOM) AS CLIENT_NOM,RTRIM(PRESTAT_ID) AS PRESTAT_ID,RTRIM(FOURN_ID) AS FOURN_ID,RTRIM(DO.DO_ID) AS DO_ID,RTRIM(CLIENT_NUM) AS CLIENT_NUM,CLIENT_RESILIE " & _
"FROM SRV WITH(NOLOCK) " & @CRLF & _
"LEFT JOIN DO WITH(NOLOCK) ON SERVICE.DO_CODE=DO.DO_CODE " & _
"LEFT JOIN FOURN ON SERVICE.FOURN_CODE=FOURN.FOURN_CODE " & _
"LEFT JOIN PRESTAT ON SERVICE.PRESTAT_CODE=SI.PRESTAT_CODE " & _
"LEFT JOIN CLI WITH(NOLOCK) ON SERVICE.CLIENT_CODE=CLIENT.CLIENT_CODE " & _
"WHERE SERVICE.SERVICE_CODE='3327811'"
; Si utilsiation exemple, affichage requête
GUICtrlSetData($Edit_sql,$sql)
; Boucle dans GUI
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Btn_analyse
f_analyse_sql(GUICtrlRead($Edit_sql))
EndSwitch
WEnd
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
; FONCTION : ANALYSE SQL
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Func f_analyse_sql($sql)
; Ajoute retour à la ligne
$sql=StringReplace($sql,@CRLF,"")
$sql=StringReplace($sql,"FROM ", @CRLF & "FROM ")
$sql=StringReplace($sql,"LEFT JOIN ", @CRLF & "LEFT JOIN ")
$sql=StringReplace($sql,"WHERE ", @CRLF & "WHERE ")
$sql=StringReplace($sql,"AND ", @CRLF & "AND ")
; réaffiche la requête
GUICtrlSetData($Edit_sql,$sql)
; Vide les problèmes
GUICtrlSetData($Edit_pb,"")
; Passe requête en majuscules
$sql=StringUpper($sql)
; Supprime les retours chartiots pour analyse
$sql=StringReplace($sql,@CRLF,"")
; >>> ANALYSE PARTIE SELECT
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
If StringLeft($sql,6)="SELECT" Then
; Position du FROM
$from_pos=StringInStr($sql,"FROM ")
; FROM manquant
If $from_pos=0 Then
GUICtrlSetData($Edit_pb,"'FROM' manquant ou mal orthographié")
EndIf
; Position du WITH(NOLOCK)
$with_no_lock_pos=StringInStr($sql,"WITH(NOlOCK)")
; WITH(NOLOCK) manquant
If $with_no_lock_pos=0 Then
GUICtrlSetData($Edit_pb,GUICtrlRead($Edit_pb) & "'WITH(NOLOCK)' manquant ou mal orthographié" & @CRLF)
EndIf
; Nom table principale
$nom_table_from=StringMidBornes($sql,$from_pos+5,$with_no_lock_pos-2)
; Vérif table from
f_verif_table($nom_table_from)
; Récup SELECT
$select=_ArrayToString(StringRegExp($sql, "SELECT (.*) FROM", 3), "")
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $select = ' & $select & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
; Supprime TOP si existe
If StringLeft($select,3)="TOP" Then
$top_2eme_espace=StringInStr($select," ",0,2)
$top=StringMidBornes($select,1,$top_2eme_espace)
$select=StringMid($select,$top_2eme_espace+1)
EndIf
; PB AS
StringReplace($select," AS "," ")
$as_nb=@extended
If $as_nb>0 Then
GUICtrlSetData($Edit_pb,GUICtrlRead($Edit_pb) & "Pour renommer les champs, il ne faut plus utiliser 'AS'. Vous l'avez fait " & $as_nb & " fois" & @CRLF)
EndIf
; CHAMPS SELECT
$tab_champs=StringReplace($select," ",",")
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $tab_champs = ' & $tab_champs & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
$tab_champs=StringSplit($select,",")
;_ArrayDisplay($tab_champs)
; Boucle dans les champs
For $i=1 to UBound($tab_champs)-1
; Récup champ
$champ_en_cours=$tab_champs[$i]
; Supp RTRIM(
$champ_en_cours=StringReplace($champ_en_cours,"RTRIM(","")
; Supp )
$champ_en_cours=StringReplace($champ_en_cours,")","")
; Récup position 1er espace
$pos_espace=StringInStr($champ_en_cours," ")
; Si espace, ne conserve que ce qui est avant
If $pos_espace>0 then $champ_en_cours=StringLeft($champ_en_cours,$pos_espace-1)
If $champ_en_cours<>"*" then f_verif_champ($champ_en_cours)
Next
; ANALYSE JOINTURES LEFT JOIN
$left_join=StringRegExp($sql, "LEFT JOIN .* ON .*=.*\s", 3)
_ArrayDisplay($left_join)
EndIf
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
If GUICtrlRead($Edit_pb)="" Then GUICtrlSetData($Edit_pb,"Pas d'erreur détectée")
EndFunc
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
; FONCTION : BDD 192.168.0.220 / bdd 03/05/16
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Func f_220_bdd2($254_bdd_sql)
;~ #include <Array.au3>
;~ #include <SQL.au3>
;~ #Include <String.au3>
$oADODB = _SQL_Startup()
; Arrêt si erreur SQL
If $oADODB = $SQL_ERROR then
MsgBox(262144+16,"SQL","Erreur connexion SQL")
Return
EndIf
; Mot de passe crypté
$mdp_crypte=_StringEncrypt(0,"XXX","YYYY",2)
; Connexion SQL
If _sql_Connect(-1,"192.168.0.122","bdd","bdd",$mdp_crypte) = $SQL_ERROR then
_SQL_Close()
Return 0
EndIf
; Test si requête SELECT
If StringLeft($254_bdd_sql,6)="SELECT" Then
; Execute requête SELECT
Local $aData,$iRows,$iColumns
$sql_query = _SQL_GetTable2D(-1,$254_bdd_sql,$aData,$iRows,$iColumns) ; ATTENTION LIGNE 0 A SUPPRIMER CAR DOUBLON
_SQL_Close()
Return $aData
Else
; Execute requête INSERT, UPDATE, DELETE
_SQL_Execute(-1,$254_bdd_sql)
_SQL_Close()
Return 1
EndIf
EndFunc
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Func StringMidBornes($SMB_chaine,$SMB_debut,$SMB_fin)
Return StringMid($SMB_chaine,$SMB_debut,$SMB_fin-$SMB_debut+1)
EndFunc
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Func f_verif_table($table)
; Recherche nom table
$table_id=_ArraySearch($tab_tables_et_champs, $table,0,0,0,0,1,0) ; Recherche exacte dans colonne 0
; Msg si nom base incorrect
If $table_id=-1 Then
GUICtrlSetData($Edit_pb,GUICtrlRead($Edit_pb) & "'" & $table & "' n'est pas un nom de table correct" & @CRLF)
EndIf
EndFunc
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Func f_verif_champ($champ)
; Récup position point
$pos_point=StringInStr($champ,".")
;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $pos_point = ' & $pos_point & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
; Si point, séparation table et champ
If $pos_point>0 Then
; Récup table
$table_en_cours=StringLeft($champ,$pos_point-1)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $table_en_cours = ' & $table_en_cours & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
; Vérif table
f_verif_table($table_en_cours)
; Récup champ
$champ=StringMid($champ,$pos_point+1)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $champ = ' & $champ & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
; Recherches toutes occurences champ
$tab_champ_dans_tables=_ArrayFindAll($tab_tables_et_champs,$champ,Default,Default,Default,0,1) ; Correspondance exacte dans la colonne 1
$table_champ_ok=0
; Boucle dans liste pour trouver si table+champ OK
For $i=0 to UBound($tab_champ_dans_tables)-1
If $tab_tables_et_champs[$tab_champ_dans_tables[$i]][0]=$table_en_cours then
$table_champ_ok=1
ExitLoop
EndIf
Next
; Erreur correspondance champ et table
If $table_champ_ok=0 Then
GUICtrlSetData($Edit_pb,GUICtrlRead($Edit_pb) & "'" & $champ & "' n'existe pas dans la table '" & $table_en_cours & "'" & @CRLF)
EndIf
Else
; Si pas de nom de table
; Récup champ
$champ=StringMid($champ,$pos_point+1)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $champ = ' & $champ & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
; Recherche nom table
$champ_id=_ArraySearch($tab_tables_et_champs, $champ,0,0,0,0,1,1) ; Recherche exacte dans colonne 1
; Msg si nom champ incorrect
If $champ_id=-1 Then
GUICtrlSetData($Edit_pb,GUICtrlRead($Edit_pb) & "'" & $champ & "' n'est pas un nom de champ correct" & @CRLF)
EndIf
EndIf
EndFunc
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#AutoIt3Wrapper_Icon=..\..\..\Autoit - Icones_encrypted\Porte documents.ico
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Array.au3>
#include <SQL.au3>
#Include <String.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
; DESCRIPTIF SCRIPT
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
$script_titre="ANALYSEUR SQL"
$script_desc="Analyseur de requêtes SQL"
$auteur="BM"
$maj="27/09/19" ; MES : 20/09/19
$ver="1.01"
$nom_fenetre_gui=$script_titre & " - v." & $ver
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
; GUI PRINCIPALE
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#Region ### START Koda GUI section ### Form=x:\dropbox\developpement\autoit - bm'tools_encrypted\developpement\analyseur requêtes sql\analyseur sql 1.kxf
Global $Form1 = GUICreate($nom_fenetre_gui, 1174, 466, -1, -1)
Global $Group_sql = GUICtrlCreateGroup(" REQUETE ", 8, 8, 601, 233)
Global $Edit_sql = GUICtrlCreateEdit("", 16, 24, 585, 209,$ES_AUTOVSCROLL + $WS_VSCROLL + $ES_MULTILINE + $ES_WANTRETURN)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $Btn_analyse = GUICtrlCreateButton("Analyse", 528, 248, 75, 25)
Global $Group_resultat = GUICtrlCreateGroup(" RESULTAT ", 8, 280, 601, 177)
Global $ListView_resultat = GUICtrlCreateListView("", 16, 296, 586, 150)
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $Group_analyse = GUICtrlCreateGroup(" ANALYSE REQUETE ", 616, 8, 545, 449)
Global $Edit_pb = GUICtrlCreateEdit("", 624, 24, 521, 425)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
; A mettre après Edits
; $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_MULTILINE + $ES_WANTRETURN)
; Récup noms des tables et des champs
$sql="select TABLE_NAME,COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS " & _
"ORDER BY TABLE_NAME,COLUMN_NAME"
Global $tab_tables_et_champs=f_220_bdd2($sql)
;_ArrayDisplay($tab_tables_et_champs)
; EXEMPLES DE REQUÊTES
$sql="SELECT TOP 1 CLIENT.CLIENT_CODE,CLIENT.PRESTAT_CODE AS TEST,CLIENT.FOURN_CODE,CLIENT.DO_CODE,ST_CODE,RTRIM(CLIENT_NOM) AS CLIENT_NOM,RTRIM(PRESTAT_ID) AS PRESTAT_ID,RTRIM(FOURN_ID) AS FOURN_ID,RTRIM(DO.DO_ID) AS DO_ID,RTRIM(CLIENT_NUM) AS CLIENT_NUM,CLIENT_RESILIE " & _
"FROM SRV WITH(NOLOCK) " & @CRLF & _
"LEFT JOIN DO WITH(NOLOCK) ON SERVICE.DO_CODE=DO.DO_CODE " & _
"LEFT JOIN FOURN ON SERVICE.FOURN_CODE=FOURN.FOURN_CODE " & _
"LEFT JOIN PRESTAT ON SERVICE.PRESTAT_CODE=SI.PRESTAT_CODE " & _
"LEFT JOIN CLI WITH(NOLOCK) ON SERVICE.CLIENT_CODE=CLIENT.CLIENT_CODE " & _
"WHERE SERVICE.SERVICE_CODE='3327811'"
; Si utilsiation exemple, affichage requête
GUICtrlSetData($Edit_sql,$sql)
; Boucle dans GUI
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Btn_analyse
f_analyse_sql(GUICtrlRead($Edit_sql))
EndSwitch
WEnd
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
; FONCTION : ANALYSE SQL
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Func f_analyse_sql($sql)
; Ajoute retour à la ligne
$sql=StringReplace($sql,@CRLF,"")
$sql=StringReplace($sql,"FROM ", @CRLF & "FROM ")
$sql=StringReplace($sql,"LEFT JOIN ", @CRLF & "LEFT JOIN ")
$sql=StringReplace($sql,"WHERE ", @CRLF & "WHERE ")
$sql=StringReplace($sql,"AND ", @CRLF & "AND ")
; réaffiche la requête
GUICtrlSetData($Edit_sql,$sql)
; Vide les problèmes
GUICtrlSetData($Edit_pb,"")
; Passe requête en majuscules
$sql=StringUpper($sql)
; Supprime les retours chartiots pour analyse
$sql=StringReplace($sql,@CRLF,"")
; >>> ANALYSE PARTIE SELECT
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
If StringLeft($sql,6)="SELECT" Then
; Position du FROM
$from_pos=StringInStr($sql,"FROM ")
; FROM manquant
If $from_pos=0 Then
GUICtrlSetData($Edit_pb,"'FROM' manquant ou mal orthographié")
EndIf
; Position du WITH(NOLOCK)
$with_no_lock_pos=StringInStr($sql,"WITH(NOlOCK)")
; WITH(NOLOCK) manquant
If $with_no_lock_pos=0 Then
GUICtrlSetData($Edit_pb,GUICtrlRead($Edit_pb) & "'WITH(NOLOCK)' manquant ou mal orthographié" & @CRLF)
EndIf
; Nom table principale
$nom_table_from=StringMidBornes($sql,$from_pos+5,$with_no_lock_pos-2)
; Vérif table from
f_verif_table($nom_table_from)
; Récup SELECT
$select=_ArrayToString(StringRegExp($sql, "SELECT (.*) FROM", 3), "")
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $select = ' & $select & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
; Supprime TOP si existe
If StringLeft($select,3)="TOP" Then
$top_2eme_espace=StringInStr($select," ",0,2)
$top=StringMidBornes($select,1,$top_2eme_espace)
$select=StringMid($select,$top_2eme_espace+1)
EndIf
; PB AS
StringReplace($select," AS "," ")
$as_nb=@extended
If $as_nb>0 Then
GUICtrlSetData($Edit_pb,GUICtrlRead($Edit_pb) & "Pour renommer les champs, il ne faut plus utiliser 'AS'. Vous l'avez fait " & $as_nb & " fois" & @CRLF)
EndIf
; CHAMPS SELECT
$tab_champs=StringReplace($select," ",",")
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $tab_champs = ' & $tab_champs & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
$tab_champs=StringSplit($select,",")
;_ArrayDisplay($tab_champs)
; Boucle dans les champs
For $i=1 to UBound($tab_champs)-1
; Récup champ
$champ_en_cours=$tab_champs[$i]
; Supp RTRIM(
$champ_en_cours=StringReplace($champ_en_cours,"RTRIM(","")
; Supp )
$champ_en_cours=StringReplace($champ_en_cours,")","")
; Récup position 1er espace
$pos_espace=StringInStr($champ_en_cours," ")
; Si espace, ne conserve que ce qui est avant
If $pos_espace>0 then $champ_en_cours=StringLeft($champ_en_cours,$pos_espace-1)
If $champ_en_cours<>"*" then f_verif_champ($champ_en_cours)
Next
; ANALYSE JOINTURES LEFT JOIN
$left_join=StringRegExp($sql, "LEFT JOIN .* ON .*=.*\s", 3)
_ArrayDisplay($left_join)
EndIf
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
If GUICtrlRead($Edit_pb)="" Then GUICtrlSetData($Edit_pb,"Pas d'erreur détectée")
EndFunc
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
; FONCTION : BDD 192.168.0.220 / bdd 03/05/16
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Func f_220_bdd2($254_bdd_sql)
;~ #include <Array.au3>
;~ #include <SQL.au3>
;~ #Include <String.au3>
$oADODB = _SQL_Startup()
; Arrêt si erreur SQL
If $oADODB = $SQL_ERROR then
MsgBox(262144+16,"SQL","Erreur connexion SQL")
Return
EndIf
; Mot de passe crypté
$mdp_crypte=_StringEncrypt(0,"XXX","YYYY",2)
; Connexion SQL
If _sql_Connect(-1,"192.168.0.122","bdd","bdd",$mdp_crypte) = $SQL_ERROR then
_SQL_Close()
Return 0
EndIf
; Test si requête SELECT
If StringLeft($254_bdd_sql,6)="SELECT" Then
; Execute requête SELECT
Local $aData,$iRows,$iColumns
$sql_query = _SQL_GetTable2D(-1,$254_bdd_sql,$aData,$iRows,$iColumns) ; ATTENTION LIGNE 0 A SUPPRIMER CAR DOUBLON
_SQL_Close()
Return $aData
Else
; Execute requête INSERT, UPDATE, DELETE
_SQL_Execute(-1,$254_bdd_sql)
_SQL_Close()
Return 1
EndIf
EndFunc
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Func StringMidBornes($SMB_chaine,$SMB_debut,$SMB_fin)
Return StringMid($SMB_chaine,$SMB_debut,$SMB_fin-$SMB_debut+1)
EndFunc
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Func f_verif_table($table)
; Recherche nom table
$table_id=_ArraySearch($tab_tables_et_champs, $table,0,0,0,0,1,0) ; Recherche exacte dans colonne 0
; Msg si nom base incorrect
If $table_id=-1 Then
GUICtrlSetData($Edit_pb,GUICtrlRead($Edit_pb) & "'" & $table & "' n'est pas un nom de table correct" & @CRLF)
EndIf
EndFunc
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Func f_verif_champ($champ)
; Récup position point
$pos_point=StringInStr($champ,".")
;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $pos_point = ' & $pos_point & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
; Si point, séparation table et champ
If $pos_point>0 Then
; Récup table
$table_en_cours=StringLeft($champ,$pos_point-1)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $table_en_cours = ' & $table_en_cours & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
; Vérif table
f_verif_table($table_en_cours)
; Récup champ
$champ=StringMid($champ,$pos_point+1)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $champ = ' & $champ & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
; Recherches toutes occurences champ
$tab_champ_dans_tables=_ArrayFindAll($tab_tables_et_champs,$champ,Default,Default,Default,0,1) ; Correspondance exacte dans la colonne 1
$table_champ_ok=0
; Boucle dans liste pour trouver si table+champ OK
For $i=0 to UBound($tab_champ_dans_tables)-1
If $tab_tables_et_champs[$tab_champ_dans_tables[$i]][0]=$table_en_cours then
$table_champ_ok=1
ExitLoop
EndIf
Next
; Erreur correspondance champ et table
If $table_champ_ok=0 Then
GUICtrlSetData($Edit_pb,GUICtrlRead($Edit_pb) & "'" & $champ & "' n'existe pas dans la table '" & $table_en_cours & "'" & @CRLF)
EndIf
Else
; Si pas de nom de table
; Récup champ
$champ=StringMid($champ,$pos_point+1)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $champ = ' & $champ & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
; Recherche nom table
$champ_id=_ArraySearch($tab_tables_et_champs, $champ,0,0,0,0,1,1) ; Recherche exacte dans colonne 1
; Msg si nom champ incorrect
If $champ_id=-1 Then
GUICtrlSetData($Edit_pb,GUICtrlRead($Edit_pb) & "'" & $champ & "' n'est pas un nom de champ correct" & @CRLF)
EndIf
EndIf
EndFunc
; XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Les Dieux des expressions régulières auraient-ils une formule magique pour avoir NOM_TABLE.NOM_CHAMP dans un tableau ou est-ce que j'en demande un peu trop et que je doive analyser bloc par bloc ?
Si c'est la cas, est-il possible d'extraire les nom de champs et de tables de cette expression :
LEFT JOIN DO WITH(NOLOCK) ON SERVICE.DO_CODE=DO.DO_CODE
LEFT JOIN FOURN ON SERVICE.FOURN_CODE=FOURN.FOURN_CODE
LEFT JOIN PRESTAT ON SERVICE.PRESTAT_CODE=SI.PRESTAT_CODE
...Sachant que le nombre de LEFT JOIN (ou INNER JOIN) n'est pas limité.
J'ai tenté ça :
LEFT JOIN(.*) WITH\(NOLOCK\) ON (.*)=(.*)
Mais je ne sais pas lui dire que tout le bloc peut-être 0 ou n fois.
Ou alors, exclure tous les mots pouvant être dans une requête (Select, where, left join, ...) et prendre le reste ?
Merci d'avance pour vos conseils.
Amicalement.
BM