Quelquepart

Blog d'un développeur ABAP

Vous êtes ici : Accueil>Application>ZTOAD : Requêteur Open SQL

ZTOAD : Requêteur Open SQL

Rédigé par Sébastien Hermann dans Application -

Vous avez surement déjà été confronté à un bug dans un programme en production qui ne semble pas être reproductible en environnement de test.

Dans ces cas là, il n'est pas toujours évident de débugger directement le programme en production (problème de droits, sensibilité des données, risque de mauvaise exécution, documents créés avec votre user...). Quand le bug semble venir d'une requête SQL un peu compliquée (jointure sur 5 tables, subquery...), vous voila embarqué dans de fastidieuses recherches via SE16 avec 3 ou 4 modes ouverts pour essayer de comprendre le problème avec la requête (et encore... le problème ne vient peut-être même pas de cette requête la !)

Dans d'autres mondes, les développeurs n'ont pas ce genre de problèmes et peuvent composer en temps réel leur requêtes personnalisées directement sur la base de données. Sur SAP ce n'est pas possible. Vraiment ? Pas en standard en tout cas. Il suffit donc de créer un programme spécifique.

Dérivé de Z_TETARD lui même dérivé de YES4SQL, voici ZTOAD, mon requêteur SQL. Il permet de faire vos propres requêtes multi-tables, ou de copier coller celle du programme à débugger.

Les commentaires ABAP sont supprimés avant exécution, les alias de table sont compris, les requêtes sont mémorisées pour réutilisation (jusqu'à 99 requêtes).

ZTOAD nouveau se présente sous la forme d'une transaction à écran unique :

  • A gauche vos requêtes sauvegardées et votre historique de requête exécutées.
  • Au milieu votre éditeur de requête, qui accepte toute forme de select, mais également insert, delete, update...
  • A droite un explorateur de DDIC qui vous affiche les champs des tables présentes dans votre requête.
  • Et en bas une grille ALV affichant les résultats de la requête exécutée

L'aide ABAP est disponible lors de la saisie de requête, ainsi que l'aide intégrée du programme. Vous pouvez saisir plusieurs requêtes et choisir celle a exécuter sans avoir a effacer les autres. Vous pouvez partager vos requêtes avec les autres utilisateurs.

A noter : vous pouvez définir finement les autorisations par utilisateur pour chaque type de requête (SELECT, INSERT, UPDATE, DELETE). A la manière initiée dans ZAL11, cette gestion est simple et accessible au début du programme : Vous pouvez désactiver certaines commandes en quelques secondes sans avoir à comprendre les méandres du code.

Cette nouvelle version utilise une table pour stocker les requêtes, il faudra donc utiliser l'extension SAPLINK de gestion de tables pour pouvoir l'installer.

Télécharger ZTOAD - version pour SAP 4.6 n'est plus mis à jour

A noter : n’oubliez pas que vous aurez besoin de SAPLINK et son extension de gestion de table pour installer le programme.

#1 Cyrille a dit :

Bonjour,
Le téléchargement 4.7+ ne fonctionne pas, pouvez vous le rétablir svp

#2 Sébastien Hermann a dit :

Bonjour Cyrille,
Il faut faire un click droit sur le lien puis "enregistrer la cible sous…" et n’oubliez pas que vous aurez besoin de SAPLINK pour l’installer ensuite ;-)

#3 Peter Walcz a dit :

Hi Sébastien,

one of our complex query I'm trying to put into ZTOAD, currently in an ABAP program it looks like this:

SELECT es~subid AS a1,
vh~estcat AS a2,
tc~estnam AS a3,
du~vaclid AS a4,
du~rvlid AS a5,
st~substat AS a6
INTO TABLE @g_i_subid_prop
FROM ( estdu AS du INNER JOIN estva AS va ON du~recnmst EQ va~recn
INNER JOIN estvh AS vh ON vh~recn EQ va~recntvh
INNER JOIN estrh AS es ON vh~recnroot EQ es~recnroot
INNER JOIN tcg12 AS tc ON vh~estcat EQ tc~estcat )
LEFT OUTER JOIN ehsbt_appl_scope AS st ON st~recnroot EQ es~recnroot AND
st~vaclid EQ du~vaclid AND
st~rvlid EQ du~rvlid
WHERE du~actvflg EQ @g_v_false AND
du~namemst EQ 'ESTVA' AND "we are interested only in the value assignments
va~delflg EQ @g_v_false AND
tc~langu EQ 'E'.

Can you help me to change this to be able to put this into ZTOAD?

Thanks,
Peter

#4 Sébastien Hermann a dit :

Hi Peter,
Youy probably just have to remove the variable copy/pasted :)
And also remove the braquet around the joins :

SELECT es~subid AS a1,
vh~estcat AS a2,
tc~estnam AS a3,
du~vaclid AS a4,
du~rvlid AS a5,
st~substat AS a6
"INTO TABLE @g_i_subid_prop
FROM estdu AS du INNER JOIN estva AS va ON du~recnmst EQ va~recn
INNER JOIN estvh AS vh ON vh~recn EQ va~recntvh
INNER JOIN estrh AS es ON vh~recnroot EQ es~recnroot
INNER JOIN tcg12 AS tc ON vh~estcat EQ tc~estcat
LEFT OUTER JOIN ehsbt_appl_scope AS st ON st~recnroot EQ es~recnroot AND
st~vaclid EQ du~vaclid AND
st~rvlid EQ du~rvlid
WHERE du~actvflg EQ ' ' AND
du~namemst EQ 'ESTVA' AND "we are interested only in the value assignments
va~delflg EQ ' ' AND
tc~langu EQ 'E'.

I assume @g_v_false = space

#5 Peter Walcz a dit :

Hi Sébastien,

I received two dumps when I left the two comments ("INTO... "we are...) inside the statement.

Once I removed these there is no dump anymore, but I receive an error message:
"No field Specified"

Now the query looks like this:

SELECT es~subid AS a1,
vh~estcat AS a2,
tc~estnam AS a3,
du~vaclid AS a4,
du~rvlid AS a5,
st~substat AS a6
FROM estdu AS du INNER JOIN estva AS va ON du~recnmst EQ va~recn
INNER JOIN estvh AS vh ON vh~recn EQ va~recntvh
INNER JOIN estrh AS es ON vh~recnroot EQ es~recnroot
INNER JOIN tcg12 AS tc ON vh~estcat EQ tc~estcat
LEFT OUTER JOIN ehsbt_appl_scope AS st ON st~recnroot EQ es~recnroot AND
st~vaclid EQ du~vaclid AND
st~rvlid EQ du~rvlid
WHERE du~actvflg EQ ' ' AND
du~namemst EQ 'ESTVA' AND
va~delflg EQ ' ' AND
tc~langu EQ 'E'.

(actually only the comments were removed)

#6 Sébastien Hermann a dit :

ok. There are many problems :
in abap, you cannot use comma between selected fields, just space.
ZTOAD don't manage "AS" for field (and i dont see any valuable reason to manage it...)

So if you remove the "AS a1," , "AS a2," ... it is not working yet... because there is a bug in the program, but you helped me to find it :)

After the bug will be fixed... it will not work because there is more to one table linked to the left outer joined table. Does it work in standard ABAP program ? when i try it, i got the error, even if i use brakets. If you success to make the query work in a specific ABAP program, could you please copy paste me the code ?

#7 Sébastien Hermann a dit :

LEFT OUTER JOIN ehsbt_appl_scope AS st ON st~recnroot EQ es~recnroot AND
st~vaclid EQ du~vaclid AND
st~rvlid EQ du~rvlid

=> You link ehsbt_appl_scope to 2 tables (estdu and estrh) in a left outer join. It is not allowed by SAP.
But ESTDU have a field named RECNROOT, maybe you could use it instead of the one from estrh ?
this part become something allowed by SAP :
LEFT OUTER JOIN ehsbt_appl_scope AS st ON st~recnroot EQ du~recnroot AND
st~vaclid EQ du~vaclid AND
st~rvlid EQ du~rvlid

#8 Sébastien Hermann a dit :

Hello Peter,
You could try to download the new version 3.1 which fix some bugs.
If you change the left outer part of your query, it could give you some results :)

#9 Peter Walcz a dit :

Hi Sébastien,

I have to mention that the statement was copied here as it is from an abap program which works and syntax error free.

The NW version on which this runs fine is 740SP7.

Nevertheless I'll try the new version and see if your suggestion is also fine.

Thanks for your help,
Peter

#10 Peter Walcz a dit :

Hi Sébastien,

actually I'm still receiving the error message "Elements in the "SELECT LIST" list must be separated using comas.

I have this query now in ZTOAD:

SELECT es~subid AS a1,
vh~estcat AS a2,
tc~estnam AS a3,
du~vaclid AS a4,
du~rvlid AS a5,
st~substat AS a6
FROM estdu AS du INNER JOIN estva AS va ON du~recnmst EQ va~recn
INNER JOIN estvh AS vh ON vh~recn EQ va~recntvh
INNER JOIN estrh AS es ON vh~recnroot EQ es~recnroot
INNER JOIN tcg12 AS tc ON vh~estcat EQ tc~estcat
LEFT OUTER JOIN ehsbt_appl_scope AS st ON st~recnroot EQ es~recnroot AND
st~vaclid EQ du~vaclid AND
st~rvlid EQ du~rvlid
WHERE du~actvflg EQ ' ' AND
du~namemst EQ 'ESTVA' AND
va~delflg EQ ' ' AND
tc~langu EQ 'E'.

If I take a look at the generated program, the select statement looks like this:

SELECT ES~SUBID AS A1 VH~ESTCAT AS A2 TC~ESTNAM AS A3 DU~VACLID AS A4 DU~RVLID AS A5 ST~SUBSTAT AS A6
INTO TABLE t_result
UP TO
000100
ROWS
FROM
ESTDU AS DU INNER JOIN ESTVA AS VA ON DU~RECNMST EQ VA~RECN INNER JOIN ESTVH AS VH ON VH~RECN EQ VA~RECNTVH INNER JOIN ESTRH AS ES ON VH~RECNROOT EQ ES~RECNROOT INNER JOIN TCG12 AS TC ON VH~ESTCAT EQ TC~ESTCAT LEFT OUTER JOIN EHSBT_APPL_SCOPE AS ST ON
ST~RECNROOT EQ ES~RECNROOT AND ST~VACLID EQ DU~VACLID AND ST~RVLID EQ DU~RVLID
WHERE du~actvflg EQ ' ' AND du~namemst EQ 'ESTVA' AND va~delflg EQ ' ' AND tc~langu EQ 'E'

If I copy the generated program to another program and modify the first part of the statement like this:

SELECT ES~SUBID AS A1, VH~ESTCAT AS A2, TC~ESTNAM AS A3, DU~VACLID AS A4, DU~RVLID AS A5, ST~SUBSTAT AS A6 INTO TABLE @t_result

then it works.

I added the comas and the @ in front of t_result.

I hope it helps.

Regards,
Peter

#11 Sébastien Hermann a dit :

Suite aux nombreux retours positifs, voici une nouvelle version 3.2.1 qui prend en compte vos remarques :
- La nouvelle syntaxe open sql NW7.4 fonctionne
- L'objet d'autorisation utilise désormais des auth standard
- Ajout des commandes NATIVE SQL
- Possibilité de faire des requetes sans limite de nombre de lignes
et quelques autres points mineurs...

#12 Sébastien Hermann a dit :

Nouvelle version 3.3 :
- Ajout d'un paneau pour définir les préférences utilisateur
- Ajout d'une entrée de menu pour supprimer tout l'historique
- Ajout d'une option pour ajouter un retour chariot lors de l'ajout d'un champ de l'arborescence DDIC
- Ajout d'une colonne "Count" a la fin de la grille de données (SELECT)

#13 Sébastien Hermann a dit :

Nouvelle version 3.4.3
- Ajout d'un "code completion" dans l'éditeur
- Correction de la suppression d'historique
- Correction de 2 bugs de parsing et 1 bug d'interface (popup sauvegarde)
- Message d'erreur si vous lancez trop de requetes SQL (limitation SAP)

#14 robert a dit :

Bonjour,
il semblerait que la classe cl_gui_abapedit SAP BASIS 700 ne présente la méthode init_completer get_completer et d'autres.
Il n'y a même pas la classe cl_abap_parser.

ZTOAD est pas compatible avec SAP BASIS la version 700?

Merci, salutations

#15 Sébastien Hermann a dit :

Bonjour Robert,

ZTOAD devrait être compatible. Dans un premier temps tu as juste a mettre en commentaire le bout de code qui utilise la classe cl_abap_parser. C'est un petit ajout sans grande importance.

Je vais publier d'ici quelques jour une nouvelle version pour éviter ces désagréments sur les "vieilles" versions sap

#16 Sébastien Hermann a dit :

Nouvelle version 3.5 :
- Affichage de la liste des valeurs pour les champs du DDIC. La selection copie le résultat dans l'éditeur SQL
- Ajout d'un bouton Exécuter dans un fichier pour enregistrer le résultat de la requete dans un CSV au lieu de l'afficher a l'écran
- Rafraichissement de l'arborescence DDIC a l'exécution d'une requete, meme en cas d'erreur
- Option pour afficher les noms techniques dans l'ALV
- Proposition de sauvegarde a la sortie de l'écran
- Bouton "new query" et modification du Template de nouvelle requete
- Divers changement interne dans le code

Concernant cl_abap_parser, je n'ai pas pu le rendre "optionnel". La faute a une commande "SET HANDLER" de sap qui n'accepte pas de valeur dynamique. Il faudra donc le suprimer à la main du code si vous n'avez pas cette classe lorsque vous essayerez de compiler le programme. J'ai rapproché tout le code dans un seul bloc pour faciliter cette opération...

#17 Jesus Antonio a dit :

Congratulations for your program.
It is impressive to say the least.

Do you have any plans to support latest Open SQL Syntax? I mean like using a case in the select statement?

J.

#18 Radouane a dit :

Merci beaucoup, ton travail est très apprécié :)

#19 Sébastien Hermann a dit :

Merci pour les encouragements :)

@Jesus Antonio : Sorry but for the moment i dont have access to a sap server where new syntax is usable, so i cannot implement it.

Les commentaires sont fermés.