Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
J'aurais une petite question concernant les sources des DW, et j'aimerais savoir si une solution existe SVP.
Tout d'abord, je précise que je travaille en PB12, et que les bases sont des bases DB2 ou AS400 (selon les clients).
On me demande de vérifier si toutes les colonnes de toutes les DW sont bien de même type et de même taille que les champs des tables de la base de données.
En effet, on rencontre parfois des erreurs SQL lors de l'enregistrement lorsque les tailles des champs différent (par exemple, certaines tables ont évolué et les DW n'ont pas forcément été modifiées derrière), surtout chez nos clients qui tournent en AS400 (plus restrictif que DB2).
Seulement, dans notre code source, il y a une 50aine de bibliothèques, et plusieurs centaines voire sûrement plus d'un millier de DW.
Je voudrais donc savoir SVP s'il existait quelque chose d'automatique pour récupérer l'intégralité des sources des DW d'un projet (ou même d'une bibliothèque), plutôt que de sélectionner une à une toutes les DW et faire pour chacune d'elle à la main : clic-droit, Edit Source, Copier, Coller dans un fichier.
Merci d'avance.
Hors ligne
Bonjour,
Tu devrais regarder du côté des fonctions : Library... :
LibraryDirectory => permet d'obtenir la liste des objets d'une pbl
LibraryExport => permet d'extraire un objet de la pbl (syntaxe de l'objet)
Hors ligne
Bonjour,
Merci pour ta réponse.
Je ne connaissais pas encore ces fonctions (ça ne fait que 6 mois que je travaille sous PB), je vais m'y pencher.
Hors ligne
Re,
J'ai testé ces fonctions et elles semblent bien correspondre à ma demande.
En effet, j'ai réussi à récupérer la liste de toutes les librairies via la fonction getLibraryList().
Ensuite, j'ai traité la chaine en enlevant les virgules séparatrices pour récupérer le nom de chacune des librairies.
Pour chacune de ces librairies, j'ai récupéré la liste de toutes les DW lui appartenant via la fonction librarydirectory(nom_de_la_librairie,DirDataWindow!)
De même, j'ai traité la chaîne, pour ne récupérer que les noms des DW une à une.
Et là, maintenant que j'ai pu automatiquement récupérer mes noms de librairies et mes noms de DW, j'ai un petit souci :
string ls_ret, ls_lib, ls_dw ls_lib = récup du nom de ma librairie ls_dw = récup du nom de ma DW
Si je mets ceci :
ls_ret = LibraryExport (ls_lib, ls_dw, ExportDataWindow!)
Ca me retourne une chaîne vide qui, selon l'aide de LibraryExport, signifie qu'il y a une erreur.
Par contre, quand je mets ça :
ls_ret = LibraryExport (ls_lib, "dw_truc_muche", ExportDataWindow!)
Si j'écris le nom de la DW à la main directement dans le code, cela fonctionne, je récupère bien tout le contenu source de ma DW
J'ai testé, j'suis passée en mode DEBUG, rien à faire :
- avec le nom de la DW écrit à la main, ça fonctionne.
- avec le nom de la DW dans une variable, ça ne fonctionne pas.
Pourtant, ma variable ls_dw contient bien exactement dw_truc_muche, j'ai fait un Trim de la chaîne avant de la passer en argument de LibraryExport pour être sûre qu'aucun caractère (espace, tabulation, retour chariot) ne traîne à gauche ou à droite.
Auriez-vous une explication SVP ?
Merci d'avance.
Hors ligne
Bonjour,
pour ton problème de LibraryExport je ne sais pas.
Par contre, il existe l'outil PBL Peeper (Google est ton ami pour le trouver) qui permet d'avoir la liste des colonnes de tous les DWO d'un Workspace (onglet 'List' en haut et onglet 'DW Columns' à droite).
Tu auras des lignes du type :
Column Name(A) Object(B) PBL(C) Col #(D) DB Name(E) Data Type(F) Updateable(G) Where Clause(H) Key(I)
msgtitle d_definedmessages overloaded.pbl 2 swe_messages.msgtitle char(255) No Yes No
...
Tu peux l'exporter dans Excel.
A partir de là, quelques formule te permettent de construire un SELECT pour récupérer les infos de la DB.
Tu as besoin de (supposons pour la ligne 3):
NomTable(J) = SI(ESTNUM(TROUVE(".";E3));GAUCHE(E3;TROUVE(".";E3 )-1);E3)
NomColonne(K) = SI(ESTNUM(TROUVE(".";E3));DROITE(E3;NBCAR(E3)-TROUVE(".";E3 ));E3)
Select(L) = CONCATENER("select USER_TAB_COLUMNS.DATA_TYPE, USER_TAB_COLUMNS.DATA_LENGTH from USER_TAB_COLUMNS where upper(USER_TAB_COLUMNS.TABLE_NAME) = upper('";J3;"') and upper(USER_TAB_COLUMNS.COLUMN_NAME) = upper('";K3;"')")
Tu n'as plus qu'à exporter en Excel les résultats des selects (attention à l'ordre) et effectuer les comparaisons avec ceux de l'export de PBL Peeper.
Voilà une autre piste si tu ne t'en sors pas avec les LibraryExport.
J'espère que je ne me suis pas trop emmêlé les balises
Hors ligne
Bonjour,
Saria a écrit:
...
Code: pb
string ls_ret, ls_lib, ls_dw ls_lib = récup du nom de ma librairie ls_dw = récup du nom de ma DW
Si je mets ceci :
Code: pb
ls_ret = LibraryExport (ls_lib, ls_dw, ExportDataWindow!)Ca me retourne une chaîne vide qui, selon l'aide de LibraryExport, signifie qu'il y a une erreur.
Par contre, quand je mets ça :Code: pb
ls_ret = LibraryExport (ls_lib, "dw_truc_muche", ExportDataWindow!)
Si j'écris le nom de la DW à la main directement dans le code, cela fonctionne, je récupère bien tout le contenu source de ma DW
...
Auriez-vous une explication SVP ?
Merci d'avance.
juste pour être sûre, tu devrais essayer
string ls_dw ls_dw = "dw_truc_muche" ls_ret = LibraryExport (ls_lib, ls_dw, ExportDataWindow!)
Sinon en debug dans le Quick Watch, évalue ( ls_dw = "dw_truc_muche" ) qui devrait répondre "true".
tu as fait quoi Trim( ls_dw ) ou Trim( ls_dw, TRUE ) ? (le dernier retire aussi les tabulations qui ne sont pas toujours visible...)
Dernière modification par xlat (24-02-2012 15:34:40)
Hors ligne
Merci pour vos réponses.
Effectivement, si je mets :
boolean lb_test lb_test = (ls_dw = "dw_truc_muche")
lb_test vaut false.
J'ai donc fait :
ls_dw = trim(ls_dw, TRUE) lb_test = (ls_dw = "dw_truc_muche")
Et dans ce cas, lb_test vaut bien true, et LibraryExport fonctionne !
Merci beaucoup pour vos réponses rapides, j'avoue que je suis agréablement surprise (je pensais que PB n'était plus aussi utilisé et je ne pensais pas trouver un forum encore si actif).
Merci aussi pour l'outil PBL Peeper, je m'y pencherai dès lundi.
Bon week-end à tous !
Hors ligne