Ces quelques lignes de code en Visual Basic Script permettent d’informer l’architecte, prenant connaissance des symboles graphiques sur un diagramme, de déterminer si les tables contenu dans un modèle physique sont présentent au niveau d’un schéma de base de données passé en paramètre et si des enregistrements sont associés à ces tables.
Compatible avec PowerDesigner/PowerAMC 16.5
'****************************************************************************** '* Nom du fichier : CHECK_TABLE.vbs '* Définition : Si la table n'existe pas dans le SGBD on modifie l'épaisseur et la couleur de la ligne. '* S'il n'y a pas d'enregistrement associé à la table on modifie la couleur de remplissage de l'objet '* Modèle: Modèle de données physique (PDM) '* Objets: Table '* Auteur: Benoît Le Nabec '* URL : http://www.Powerd911.guru '* Créé: 2015-01-01 '* Version: 1.0 '****************************************************************************** Dim model Set model = ActiveModel ' Appel la Sub procedure main main model ' Sub Procedure main sub main( ByRef aModel ) ' Déclaration et connexion au schéma du SGBD Oracle Dim ADODBConnection: Set ADODBConnection = CreateObject("ADODB.Connection") Dim connected: connected = ConnectToOra( ADODBConnection ) ' Si la connexion n'a pu être établi if ( not connected ) then 'Indiquer au niveau de la trace que la connexion n'a pu être établi output "La connexion a échouée" Set ADODBConnection = Nothing exit sub end if output "La connexion a été un succès" ' Création de l'objet qui va contenir le résultat Dim ADODBRecordSet Set ADODBRecordSet = CreateObject("ADODB.Recordset") Dim rowCount 'Indique si l'objet existe Dim tableName 'Nom de la table Dim rowCountData 'Indique si nous avons des enregistrements Dim owner ' On demande à l'utilisateur d'inscrire le nom du schéma owner = InputBox("Nom du schéma :", "Identification du schéma", "SYSTEM") ' Pour chaque table dans le modèle For each table in aModel.Tables tableName = Trim( table.Name ) 'Vérifie si l'objet existe dans le schéma passé en paramètre rowCount = GetRowCount( ADODBConnection, ADODBRecordSet, tableName, owner ) 'Si l'objet existe if (RowCount) then output "L'objet '" + tableName + "' existe dans le schéma '" + owner + "'" rowCountData = GetRowCountData( ADODBConnection, ADODBRecordSet, tableName, owner ) ' Pour chaque table affichée dans un diagramme For each symbol in table.Symbols symbol.LineWidth = 3 ' modifie l'épaisseur des lignes symbol.LineColor = RGB(138, 110, 21) ' Modifie la couleur de la ligne pour "or" 'Si la table ne contiens pas d'enregistrement if rowCountData = "0" then output "L'objet '" + tableName + "' n'a pas de données" ' Assigne la couleur bleu à titre de couleur de remplissage symbol.FillColor = RGB(178,214,252) else output "L'objet '" + tableName + "' a des données" ' Assigne la couleur grise à titre de couleur de remplissage symbol.FillColor = RGB(100,100,100) end if Next else output "L'objet '" + tableName + "' n'existe pas dans le schéma '" + owner + "'" ' Pour chaque table affichée dans un diagramme For each symbol in table.Symbols symbol.LineWidth = 0 ' modifie l'épaisseur des lignes symbol.LineColor = RGB(0, 128, 192) ' Modifie la couleur de la ligne pour "or" Next end if Next ' Rafraichissement du diagramme courant ActiveDiagram.RedrawAllViews() 'Fermeture de la connexion au SGBD ADODBConnection.Close Set ADODBRecordSet = Nothing Set ADODBConnection = Nothing exit sub end sub 'Fonction de connexion à un SGBD Oracle function ConnectToOra( ByRef aConnection ) 'Default. Uses a server-side cursor Const adUseClient = 3 aConnection.CursorLocation = adUseClient aConnection.ConnectionTimeout = 300 Dim strConnection Dim userid Dim password ' On demande à l'utilisateur l'identifiant de connexion userid = InputBox("Code utilisateur :", "Identification", "SYSTEM") ' On demande à l'utilisateur le mot de passe password = InputBox("Mot de passe :", "Identification", "new_password") strConnection = "Provider=OraOLEDB.Oracle;Data Source=MyDB;User ID=" + userid + ";Password=" + password output "Connexion à Oracle" aConnection.Open strConnection 'Si il y'a une erreur if ( 0 <> err ) then output "Une erreur s'est produite lors de la connexion au SGBD Oracle : " & _ err.number & " " & err.description & " " & err.Source ConnectToOra = vbFalse exit function End if ' Connexion au SGBD Oracle réussie ConnectToOra = vbTrue Exit Function End Function const GET_ROW_COUNT_ERROR = -1 const GET_ROW_COUNT_NOT_FOUND = -2 ' Indique si l'objet existe function GetRowCount( ByRef aConnection, ByRef aRecordSet, aTableName, owner ) Dim SQLSelect SQLSelect = "select count(*) from all_tables where owner = '" + owner + "' and table_name ='" + aTableName + "'" 'Exécute la requête Set aRecordSet = aConnection.Execute( SQLSelect ) ' Si une erreur est détectée if ( 0 <> err ) then output "Une erreur a été rencontrée lors de l'exécution de la requête " & _ SQLSelect & ": " & err.number & " " & err.description & " " & err.Source 'Indique qu'une erreur a été rencontrée GetRowCount = GET_ROW_COUNT_ERROR exit function End if ' Indique qu'aucun enregistrement n'a été trouvé if ( aRecordSet.BOF and aRecordSet.EOF ) then GetRowCount = GET_ROW_COUNT_NOT_FOUND Exit Function end if ' Retourne le nombre d'enregistrement GetRowCount = aRecordSet.Fields(0).Value Exit Function end function ' Indique si nous avons trouvé des données function GetRowCountData( ByRef aConnection, ByRef aRecordSet, aTableName, owner ) Dim SQLSelect SQLSelect = "select count(*) from " + aTableName 'Exécute la requête Set aRecordSet = aConnection.Execute( SQLSelect ) ' Si une erreur est détectée if ( 0 <> err) then output "Une erreur a été rencontrée lors de l'exécution de la requête " & _ SQLSelect & ": " & err.number & " " & err.description & " " & err.Source 'Indique qu'une erreur a été rencontrée GetRowCount = GET_ROW_COUNT_ERROR exit function End if ' Indique qu'aucun enregistrement n'a été trouvé if ( aRecordSet.BOF and aRecordSet.EOF ) then GetRowCount = GET_ROW_COUNT_NOT_FOUND Exit Function end if ' Retourne le nombre d'enregistrement GetRowCountData = aRecordSet.Fields(0).Value Exit Function end function