Decomposition sql - algorithme simple et efficace

Description

Une DLL qui permet de décomposer un texte SQL ou de jouer avec et d'avoir la décomposition de chaque Clause.

Pour mon utilisation perso je n'ai pas vraiment besoin de scruter le contenu de la clause From, raison pour laquelle la méthode utilisée pour le traitement de la clause From a des manquements et des limites. J'en ai plus besoin pour mon contrôle qui permet de visualiser des recordsets par passage des paramètres de CommandText et ConnectionString et Criteria.
De ce fait au lieu de Charger la Commande et après faire un .Filter=..., qui n'est pas optimisé je charge directement la commande ajustée sur les bons enregistrements.
Le problème également est que je dois compter les enregistrements, .MoveLast aprés .MoveFirst, il vaut mieux dans tous les cas avoir moins d'enregistrements à parcourir.

En réalité

J'ai ajouté à la propriété get SQL la possibilité de rajouter des valeurs dans les clauses WHERE, HAVING et ORDER BY de la SQL initiale.La propriété Let SQL permet de passer des paramètres jouant également sur les clauses citées plus haut.
On peut reinitialiser les critères et le tri.

L'algorithme utilisé est assez simple, le texte est préformaté en un passage de la chaine SQL et après la lecture devient aisé. Le principe de cette algorithme peut être réutilisé dans bien des cas.

Comme dab, vos commentaires seraient les bienvenus afin que je puisse optimiser le code.

Source / Exemple :


'méthode Init de la Classe
Public Function Init(ByVal psSQL As String, _
    Optional ByVal psLeftNameSeparator As String, _
    Optional ByVal psRightNameSeparator As String, _
    Optional ByVal psTextIdentificator As String)

    If psLeftNameSeparator <> vbNullString Then msLeftNameSeparator = psLeftNameSeparator
    If psRightNameSeparator <> vbNullString Then msRightNameSeparator = psRightNameSeparator
    If psTextIdentificator <> vbNullString Then msTextIdentificator = psTextIdentificator
    
    msSQL = TransformSQL(psSQL)
    
    'Pour mes besoins actuels, je ne joue qu'avec les instructions de la forme
    ' SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...
    ' au mieux avec TRANSFORM ... SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... PIVOT ...

    
    Call ExtraitVariable("PIVOT", msPivot)
    Call ExtraitVariable("ORDER BY", msOrderBy)
    Call ExtraitVariable("HAVING", msHaving)
    Call ExtraitVariable("GROUP BY", msGroupBy)
    Call ExtraitVariable("WHERE", msWhere)
    Call ExtraitVariable("FROM", msFrom)
    Call ExtraitVariable("SELECT", msSelect)
    Call ExtraitVariable("TRANSFORM", msTransform)
    
End Function

'Propriétés de la classe
Public Property Get SQL(Optional ByVal psWhereCriteria As String, _
    Optional ByVal psHavingCriteria As String, _
    Optional ByVal psSort As String) As String

Public Property Let SQL(Optional ByVal psWhereCriteria As String, _
    Optional ByVal psHavingCriteria As String, _
    Optional ByVal psSort As String, ByVal psSQL As String)

Public Property Get SQLTransform(Optional ByRef psField As String, Optional ByRef psCaption As String) As String

Public Property Get SQLSelect(Optional ByRef psPredicate As String, Optional ByRef paFields As Variant, Optional ByRef paCaptions As Variant) As String

'Propriété Get SQLFrom
'paTables est un tableau des tables utilisées dans la SQL
'paRelationShips est un tableau des relations
'L'algorithme utilisée pour pour cette proprité a des limites certes mais permet de retrouver nos petits dans bien des cas
Public Property Get SQLFrom(Optional ByRef paTables As Variant, Optional ByRef paRelationShips As Variant) As String

Public Property Get SQLWhere() As String

Public Property Let SQLWhere(ByVal psSQLWhere As String)

Public Property Get SQLGroupBy(Optional ByRef paFields As Variant) As String

Public Property Get SQLHaving() As String

Public Property Let SQLHaving(ByVal psSQLHaving As String)

Public Property Get SQLOrderBy(Optional ByRef paFields As Variant) As String

Public Function ClearOrderBy()

Public Property Get SQLPivot(Optional ByRef psField As String, Optional ByRef paColumnsNames As Variant) As String

Conclusion :


Pour aider cette DLL à retrouver les noms de tables dans la clause From, il vaudrait mieux que les tables dans la clause From soient des crochets ([...])

J'espère avoir des avis qui me permettront de voir les manquements et surtout de l'optimiser.

ASIMENGO

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.