chapitre 1 les datawindows -...

49

Upload: nguyenkhanh

Post on 25-Mar-2018

231 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004
Page 2: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

CHAPITRE 1 LES DATAWINDOWS Chapitre 1 LES DATAWINDOWS................................................................. 2

1.1 Présentation................................................................................................ 4 1.2 Les différents types de DataWindow......................................................... 6

1.2.1 Tableau Synthétique.......................................................................... 6 1.2.2 Représentations visuelles .................................................................. 7

1.2.2.1 Composite....................................................................................... 7 1.2.2.2 CrossTab......................................................................................... 7 1.2.2.3 FreeForm ........................................................................................ 7 1.2.2.4 Graph.............................................................................................. 7 1.2.2.5 Grid................................................................................................. 8 1.2.2.6 Group.............................................................................................. 8 1.2.2.7 Label............................................................................................... 8 1.2.2.8 N-Up............................................................................................... 8 1.2.2.9 OLE 2.0 .......................................................................................... 8 1.2.2.10 RichText ....................................................................................... 9 1.2.2.11 Tabular ......................................................................................... 9

1.3 Les différentes sources............................................................................. 10 1.4 L'assistant de création des Dwo............................................................... 11 1.5 Première utilisation d'un objet Dwo dans une fenêtre : le contrôle DataWindow..................................................................................................... 14

1.5.1 Conception de la fenêtre.................................................................. 14 1.5.2 Code................................................................................................. 14

1.5.2.1 La méthode SetTransObjet........................................................... 14 1.5.2.2 La méthode Retrieve .................................................................... 15

1.5.3 Exécution......................................................................................... 16 1.6 L'objet DataWindow : approfondissement de la conception................... 17

1.6.1 Le tri et la condition Where ............................................................ 17 1.6.2 La jointure ....................................................................................... 18 1.6.3 Modifier l'ordre SQL....................................................................... 20

1.7 L'objet DataWindow : la mise en forme.................................................. 21 1.8 Le contrôle DataWindow : Navigation.................................................... 22

1.8.1 Présentation ..................................................................................... 22 1.8.2 Les méthodes Scroll ........................................................................ 22

1.9 Le contrôle DataWindow : Mises à jour.................................................. 24 1.9.1 Présentation ..................................................................................... 24 1.9.2 Méthodes utilisées ........................................................................... 24

1.10 Le contrôle DataWindow : La gestion des erreurs ............................... 27 1.11 Le contrôle DataWindow : Trier........................................................... 29 1.12 Le contrôle DataWindow : Filtrer......................................................... 30

Page 3: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 3

1.13 Le contrôle DataWindow : Rechercher ................................................ 32 1.13.1 Présentation ..................................................................................... 32 1.13.2 Application : la recherche d'un client.............................................. 32

1.14 Les champs calculés dans l'objet DataWindow.................................... 34 1.14.1 Principes .......................................................................................... 34 1.14.2 Application ...................................................................................... 34

1.14.2.1 Dans l'ordre Select...................................................................... 34 1.14.2.2 Dans le dwo................................................................................ 35

1.15 Les Retrieval Argument dans une DWO .............................................. 36 1.15.1 Principes .......................................................................................... 36 1.15.2 Construction .................................................................................... 36 1.15.3 Programmation d'une Dw avec un retrieval Argument................... 38

1.15.3.1 Présentation ................................................................................ 38 1.15.3.2 Application : La visualisation des commandes.......................... 38 1.15.3.3 La création du champ Total........................................................ 40

1.16 Les DataWindowChilds dans l'objet..................................................... 41 1.16.1 Principe............................................................................................ 41 1.16.2 Création ........................................................................................... 41 1.16.3 Les scripts pour l'ajout d'une commande ........................................ 43

1.17 Les DataWindowChilds dans la fenêtre................................................ 45 1.17.1 Principes .......................................................................................... 45 1.17.2 Applications .................................................................................... 45

1.17.2.1 Premier cas : Ajouter un client lors de l'ajout d'une commande. 45 1.17.2.2 Deuxième cas : Ajouter un pays lors de l'ajout d'une ville ........ 48

Page 4: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 4

1.1 PRESENTATION Les DataWindows permettent de manipuler (récupérer, mettre à jour, trier, filtrer, …) des données provenant de tables de bases de données ou d'autres sources (Fichiers texte, Classeurs Excel, Fichiers Dbase,…). La technologie des DataWindows est implémentée en deux parties :

• Un objet DataWindow (Dwo) • Un contrôle ou composant DataWindow (Dw)

L'objet Dwo est le plus souvent un ordre SQL mis en forme graphique. Le contrôle Dw est un conteneur d'objet Dwo. On code en utilisant les méthodes ou les propriétés du conteneur pour manipuler les données du Dwo. Les schémas sont les suivants : Interactions Application-DataWindow Interactions Application – Transaction - Datawindow Paramètres de connexion Statut Infos BD

Application

Window

Objet DataWindow

Table(s) d'une BD

Contrôle DataWindow

Objet Transaction

Application

DataWindow Objet

Manipulation BD DataWindow

Contrôle (Présentation)

Page 5: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 5

• La DataWindow

La DataWindow – dans la version 8 – est disponible dans plusieurs environnements.

o DataWindow dans PowerBuilder o Web DataWindow : une datawindow sur un client léger. Il faut le

composant WebDataWindow sur le serveur de traitement mais pas de DLL sur le poste client.

o WebDataWindow DTC : le DTC est un activeX qui génère le composant DW sur un serveur Le composant génère la WebDataWindow pour le client.

o DataWindow Web Control for ActiveX : un activeX à utiliser sur une page Web. Le client doit supporter les activeX.

o DataWindow, Java Edition : un composant JavaBeans dans les applications Java construites avec PowerJ.

o DataWindow Plug-in : un plug-in de navigateur (Browser) qui affiche des "rapports" PowerBuilder.

• L'objet DataWindow

Le DWO est un objet que l'on utilise pour manipuler des données provenant d'une BD ou d'une autre source (Fichiers, Excel, Dbase,…) ou d'un PSR File (PowerSoftReport) avec des données statiques. On définit les Dwo dans l'atelier DataWindow (DataWindow Painter) ou dans le DataWindow Builder pour les développeurs de Jbuider qui ne possèdent pas PowerBuilder.

Page 6: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 6

1.2 LES DIFFERENTS TYPES DE DATAWINDOW

1.2.1 Tableau Synthétique

Type Composite Plusieurs Dwo à la base d'un nouveau

Dwo CrossTab Analyse croisée FreeForm Une fiche par écran Graph Graphique Grid Une grille Group Des regroupements selon une ou

plusieurs valeurs Label Etiquettes N-Up Plusieurs enregistrements sur une

même ligne (N-Uplets) OLE 2.0 Dwo contenant des objets OLE RichText Format RTE Tabular Format table sans encadrement C'est ce que propose l'onglet DataWindow de la fenêtre New.

Page 7: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 7

1.2.2 Représentations visuelles

1.2.2.1 Composite

1.2.2.2 CrossTab

1.2.2.3 FreeForm

1.2.2.4 Graph

Page 8: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 8

1.2.2.5 Grid

1.2.2.6 Group

1.2.2.7 Label

1.2.2.8 N-Up

1.2.2.9 OLE 2.0

Page 9: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 9

1.2.2.10 RichText

1.2.2.11 Tabular

Page 10: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 10

1.3 LES DIFFERENTES SOURCES

Source Icône Quick Select

Dwo basé sur une table

SQL Select

Dwo basé sur une ou plusieurs tables

Query

Dwo basé sur une requête

External

Dwo basé sur un fichier ou du code

Stored Procedure Dwo basé sur une procédure stockée C'est ce que propose cette étape de création de l'assistant.

Page 11: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 11

1.4 L'ASSISTANT DE CREATION DES DWO Dans ce paragraphe nous allons voir les principales étapes de l'assistant de création d'un objet DataWindow. Pour cette première approche nous verrons une construction simple. Un Dwo basé sur une table ( Clients ) avec une présentation en grille (Grid). Pour créer un Dow vous cliquez sur le bouton New et vous sélectionnez l'onglet DataWindow. Vous sélectionnez le type de DataWindow ( ici Grid) et vous cliquez sur OK.

Vous sélectionnez la source ( ici Quick select) et cliquez sur OK.

Vous sélectionnez la table ( ici Clients )

Page 12: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 12

Vous sélectionnez la ou les colonnes ( ici Add All )

Vous conservez ou modifiez certaines caractéristiques de mise en forme des éléments du Dwo. Vous conservez ces valeurs comme valeurs par défaut en cochant la case à cocher Save as default .

PB vous présente un état récapitulatif de vos choix.

Le Dwo apparaît en conception et en prévisualisation. Nombreuses sont les propriétés que nous allons pouvoir modifier. Pour cette première étape nous allons enregistrer ce dwo avec le nom suivant dwo_clients_grid et l'utiliser dans l'application, plus exactement dans une fenêtre.

Page 13: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 13

Page 14: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 14

1.5 PREMIERE UTILISATION D'UN OBJET DWO DANS UNE FENETRE : LE CONTROLE DATAWINDOW.

1.5.1 Conception de la fenêtre Vous créez une fenêtre et vous posez un contrôle DataWindow sur cette fenêtre. Vous trouvez le contrôle DataWindow dans la boîte à outils. Vous reliez le contrôle Dw à l'objet Dwo grâce à la propriété DataObject. Vous cliquez sur les points de suspension pour récupérer le nom du dwo.

Ce qui donne cette fenêtre-ci

1.5.2 Code Pour afficher des données dans la DataWindow il suffit d'utiliser deux méthodes (SetTransObjet et Retrieve) applicables aux contrôles DataWindow.

1.5.2.1 La méthode SetTransObjet La méthode SetTransObject relie le contrôle dw à la base de données via le paramètre passé de type transaction. Il s'agit d'un objet séparé.

Page 15: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 15

• Syntaxe Dw_control.SetTransObject(Objet_Transaction)

• Exemple Dw_clients.SetTransObject(SQLCA) Notes : Vous pouvez utiliser la méthode SetTrans à la place de la méthode SetTransObject. La méthode SetTrans utilise un objet de type transaction mais le gère de façon interne. Le script serait le suivant : SQLCA.DBMS = "ODBC" SQLCA.DBParm = "ConnectString='DSN=dsn_oracle_locale;UID=pb8;PWD=p',DelimitIdentifier='No'" Dw_clients.SetTrans(SQLCA) La connexion et la déconnexion sont automatiques. Vous n'avez pas utiliser les instructions Connect ; et Disconnect ; Les connexions internes sont utiles si le nombre de connexions est limité. La connexion est immédiatement libérée lorsque c'est nécessaire. Mais elle est plus lente. De plus elle nécessite plus de ressources car chaque accès à la base demande une nouvelle connexion. Dernier inconvénient vous ne gérez pas les fins de transaction (Commit et Rollback).

1.5.2.2 La méthode Retrieve La méthode Retrieve() exécute l'ordre Select qui est à la base du Dwo. La méthode Retrieve remplit le buffer Primary! de la datawindow. Nous verrons par la suite que la méthode Retrieve() peut être utilisée avec des arguments (de 1 à 16).

• Syntaxe Dw_control.Retrieve()

• Exemple Dw_Clients.Retrieve()

Page 16: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 16

Il faut que l'application soit connectée à une base de données. La connexion est faite soit sur l'événement Open de l'application, soit sur l'événement Open de la fenêtre ou ailleurs. Dans cet exemple le code se trouve sur l'événement Constructor de la DataWindow. // Evénement Constructor this.SetTransObject(sqlca) this.Retrieve()

1.5.3 Exécution

Notes : les trois buffers d'une DataWindow.

DataWindow

(Contrôle)

Primary!

Filter!

Delete!

Page 17: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 17

1.6 L'OBJET DATAWINDOW : APPROFONDISSEMENT DE LA CONCEPTION

1.6.1 Le tri et la condition Where

Lors d'une étape de la conception de l'ordre Select qui est à la base du Dwo vous pouvez préciser un ou plusieurs ordres de tri. Vous cliquez à l'intersection de la colonne que vous voulez trier et de la ligne Sort; Vous ouvrez la liste et deux valeurs vous sont proposées : Ascending et Descending. Vous pouvez appliquez un ou plusieurs critères ( condition Where ) en inscrivant une condition à l'intersection d'une colonne et de la ligne Criteria. Deux (ou plus) critères sur la même ligne forment un ET logique. Pour former un OU logique vous posez des conditions sur plusieurs lignes. Vous pouvez utiliser les opérateurs de comparaison et les opérateurs ensemblistes. N'oubliez jamais que vous formez, grâce à un assistant graphique, un ordre SQL. Nous verrons dans le paragraphe suivant certaines limites concernant Oracle.

Page 18: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 18

1.6.2 La jointure Comme la jointure nécessite au moins deux tables il faut passer par un SQL Select pour pouvoir sélectionner plusieurs tables.

Vous pouvez, dans une interface différente de celle qui a été vue précédemment, appliquer un tri; il faut Drag/Droper la ou les colonnes de la gauche vers la droite alors que vous êtes dans l'onglet Sort.

L'onglet Where permet de poser des conditions. Vous sélectionnez la colonne dans la liste Column l'opérateur, dans la liste Operator l'opérateur et la valeur dans le champ suivant. Si vous cliquez droit vous obtenez ce menu volant

qui vous permet d'utiliser des fonctions, des Select imbriqués,…

Page 19: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 19

Pour modifier la jointure, qui est par défaut une équi-jointure, pour en faire un jointure externe ou une theta-jointure, vous cliquez sur le symbole = du lien de jointure. Vous obtenez cette fenêtre; vous pouvez choisir le type de jointure.

Exemple de jointure

Les jointures et l'ordre de tabulation .

Puisqu'il s'agit d'une jointure, par défaut sans mise à jour, les tabulations sont à 0.

Page 20: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 20

1.6.3 Modifier l'ordre SQL Vous pouvez modifier l'ordre SQL en cliquant sur le bouton SQL . Vous retrouvez l'interface précédente (cf plus haut). Vous pouvez ainsi ajouter ou enlever des colonnes, des champs calculés, l'ordre de tri,…

Page 21: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 21

1.7 L'OBJET DATAWINDOW : LA MISE EN FORME Vous disposez de barres d'outils de formatage pour modifier l'apparence des contrôles.

et des propriétés cf le chapitre suivant sur les compléments.

Page 22: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 22

1.8 LE CONTROLE DATAWINDOW : NAVIGATION

1.8.1 Présentation

• Objectif L'objectif de ce paragraphe est de voir les méthodes qui permettent de naviguer dans les enregistrements et de sélectionner l'enregistrement courant.

• Ecran

1.8.2 Les méthodes Scroll

• Syntaxes Dw_.ScrollNextRow() Dw_.ScrollPriorRow() Dw_.ScrollToRow(n) où n représente l'enregistrement à atteindre; le premier étant de rang 1. Nous utilisons la méthode SelectRow – sur l'événement RowFocusChanging - pour sélectionner l'enregistrement courant

• Scripts // Clicked Cb_Premier dw_clients_complet.ScrollToRow(1) // Clicked Cb_Precedent dw_clients_complet.ScrollPriorRow() // Clicked Cb_Suivant

Page 23: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 23

dw_clients_complet.ScrollNextRow() // Clicked Cb_Dernier long ll_count ll_count = dw_clients_complet.RowCount() dw_clients_complet.ScrollToRow(ll_count) // Script RowFocusChanging // CurrentRow et NewRow sont les arguments de l'événement This.SelectRow(currentRow,false) This.SelectRow(newrow,true)

Page 24: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 24

1.9 LE CONTROLE DATAWINDOW : MISES A JOUR

1.9.1 Présentation

• Objectif Dans ce paragraphe nous allons voir comment ajouter, modifier, supprimer des enregistrements et valider ces mises à jour dans la base de données. La mise à jour s'effectue en deux temps : d'abord dans la DataWindow, ensuite vers la BD.

• Ecran

1.9.2 Méthodes utilisées

• L'ajout : la méthode InsertRow L' ajout se passe en deux temps. Dans un premier temps il faut ajouter une ligne dans la datawindow pour que l'utilisateur puisse saisir les nouvelles valeurs, dans un deuxième temps l'utilisateur saisit les valeurs. A l'exécution de cette méthode la ligne porte le drapeau New!. Lorsque l'utilisateur saisit une nouvelle valeur le drapeau passe à NewModified! Syntaxe : Dw_.InsertRow(n) Où n correspond à la ligne d'insertion avec 0 pour dernière ligne. La méthode renvoie le numéro de la ligne d'insertion. Exemple // Clicked cb_nouveau

Page 25: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 25

long ll_row ll_row = dw_clients_complet.InsertRow(0) dw_clients_complet.ScrollToRow(ll_row) dw_clients_complet.SetRow(ll_row) dw_clients_complet.SetColumn(2)

• La modification

Pour la modification il n'y a aucune méthode. L'utilisateur clique dans une cellule et saisie de la nouvelle valeur. Lorsque l'utilisateur a modifié une valeur l'indicateur de statut de la ligne est passé à DataModified!

• La suppression : la méthode DeleteRow() Syntaxe : Dw_.DeleteRow(n). Où n correspond à la ligne que vous voulez supprimer. Vous mettez 0 pour la ligne courante. Cette méthode transfère la ligne supprimée dans le buffer Delete! Exemple // Clicked Cb_supprimer dw_clients_complet.DeleteRow(0)

• La validation : la méthode Update()

Fonctionnement La méthode Update([AcceptText] , [ResetFlags] ) valide les mise à jour faites dans la datawindow dans la base de données. Cette méthode réalise une boucle sur les lignes de la DW et analyse les indicateurs de statut de chaque ligne. Elle exécute les ordres SQL Insert, Delete et Update en fonction des flags qui ont été positionnés dans le buffer Primary! pour les Insert et Update et en fonction des lignes qui se trouvent dans le buffer Delete! pour les ordres Delete. Arguments La méthode Update() possède deux arguments facultatifs qui par défaut sont à TRUE; le premier fait passer la valeur (String), qui se trouve dans le contrôle Edit de la cellule courante, dans le buffer de la DW; le deuxième réinitialise les drapeaux. Retour

Page 26: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 26

La méthode Update() renvoie 1 si tout s'est bien passé et –1 si la méthode a échoué. Exemple // Clicked de Cb_valider long ll_id_client, ll_ctr for ll_ctr = 1 to dw_clients_complet.rowcount() if dw_clients_complet.getitemstatus( ll_ctr, 0, primary!) = NewModified! then select seq_clients.nextval into :ll_id_client from dual ; dw_clients_complet.SetItem(ll_ctr,1,ll_id_client) end if next if dw_clients_complet.Update() = 1 then Commit using sqlca ; Messagebox("Alerte!!!","Validation définitive") else Rollback using sqlca ; Messagebox("Alerte!!!","Validation Impossible") end if

Commentaires L'Id_client s'obtient par la séquence Oracle seq_client. Il faut d'abord balayer la datawindow pour connaître les nouvelles lignes en utilisant la méthode GetItemStatut(Ligne, colonne, Buffer), où 0 signifie toute la ligne. Ensuite nous récupérons la nouvelle valeur que nous affectons à la première colonne de la ligne examinée. Enfin nous appliquons la méthode Update() en testant la valeur de retour. Si tout se passe bien la validation est définitive (Commit) autrement toutes les mises à jour sont annulées (Rollback).

Page 27: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 27

1.10 LE CONTROLE DATAWINDOW : LA GESTION DES ERREURS

Ce n'est pas directement avec l'objet SQLCA que l'on gère les erreurs SQL dans une datawindow; c'est avec l'événement DBError. Cet événement possède cinq arguments :

Argument Contenu Sqldbcode Le code d'erreur du fournisseur Sqlerrtext Le texte d'erreur du fournisseur Sqlsyntax L'ordre SQL à l'origine de l'erreur Buffer Le buffer de la dw (Primary!, Delete!, Filter!) Row La ligne de la dw où s'est produit l'erreur

Si vous ne voulez par avoir la boîte de dialogue standard vous terminez votre code avec un Return 1.

Page 28: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 28

• Exemple

// DBError // Args : sqldbcode, sqlerrtext, sqlsyntax, buffer, row messagebox("Erreur SQL N° : " + string(sqldbcode),sqlerrtext + char(13) + char(10) + " à la ligne : " + string(row)) Return 1

Contexte multi-utilisateurs Si un autre utilisateur a modifié et validé le même enregistrement une erreur survient. Vous pouvez récupérer les valeurs de la ligne modifiée et ainsi réinitialiser les drapeaux en utilisant la méthode ReselectRow(n). Vous ajoutez dans ce cas-là la ligne suivante avant d'instruction Return. this.reselectrow(row)

Page 29: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 29

1.11 LE CONTROLE DATAWINDOW : TRIER Pour trier dynamiquement une datawindow il faut utiliser deux méthodes :

• La méthode SetSort(Chaîne) • La méthode Sort()

Syntaxes Dw_.SetSort(Nom_de_colonne Ordre_de_tri) Où ordre_de_tri prend soit la valeur A (Ascending) soit la valeur D (Descending). La méthode SetSort prépare le tri. Dw_.Sort() La méthode Sort est sans argument; elle exécute le tri. Exemple Dans cet exemple nous allons trier sur l'événement doublecliked de la datawindow. Lorsque l'utilisateur double-clique dans une cellule d'une colonne, la dw est triée sur cette colonne en mode ascendant ou descendant. Cela dépendra du tri précédent. Nous utilisons un variable d'instance (ib_ordre) pour conserver l'ordre de tri. Nous récupérons la colonne courante grâce à la propriété name de l'argument - dwo - de l'événement. // Doubleclicked sur dw_clients_complet string ls_col, ls_sort, ls_ordre ls_col = dwo.name ib_ordre = not ib_ordre if ib_ordre then ls_ordre = "A" else ls_ordre = "D" ls_sort = ls_col + " " + ls_ordre this.SetSort(ls_sort) this.Sort()

Page 30: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 30

1.12 LE CONTROLE DATAWINDOW : FILTRER Pour filtrer dynamiquement une datawindow il faut utiliser deux méthodes :

• La méthode SetFilter(Chaîne) • La méthode Filter()

Une fois le filtre exécuté le buffer Primary! contient les enregistrements correspondant aux enregistrements affichés, ie ceux qui correspondent à la condition et les enregistrements non correspondants sont dans le buffer Filter! (Ils sont "Filtered Out").

• Syntaxes Dw_.SetFilter(Condition_where) Où Condition_where correspond à la syntaxe suivante nom_de_colonne opérateur valeur….. Attention au type (Chaîne, numérique, date) de la colonne sur laquelle s'appuie le filtre pour préparer la chaîne. La méthode SetFilter prépare le filtre. Pour annuler le filtre vous passez une chaîne vide comme argument. Dw_.Filter() La méthode Filter est sans argument; elle exécute le filtre. Exemple

Dans cet exemple nous allons filtrer sur le nom du client. C'est à partir de l'événement clicked du bouton ayant une lettre pour texte que nous appelons une fonction de niveau fenêtre (wf_filtrer).

Page 31: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 31

Scripts Appel de la fonction sur le bouton A // Clicked de cb_a wf_filtrer(this.text)

La fonction : elle reçoit la lettre comme argument. La condition est formée à partir du nom de la colonne, de l'opérateur LIKE et de la lettre contenu dans l'argument. Notez le caractère générique propre à Oracle. // wf_filtrer(as_lettre) string ls_filtre if as_lettre <> "*" then Ls_filtre = "Nom_client like '" + as_lettre + "%'" dw_clients_complet.SetFilter(ls_filtre) else dw_clients_complet.SetFilter("") end if dw_clients_complet.Filter()

Notes : la méthode Update() s'applique à tous les buffers, donc aussi au buffer Filter!.

Page 32: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 32

1.13 LE CONTROLE DATAWINDOW : RECHERCHER

1.13.1 Présentation

• Objectif : Rechercher un enregistrement dans une datawindow

• Méthode : Find

• Syntaxe : dw_.Find ( expression, début, fin ) Les arguments sont : Exepression de type Where. Début : A partir de quelle ligne dans la datawindow. Fin : Jusqu'à quelle ligne dans la datawindow.

• Exemple : il_rang = dw_clients_complet.find("Nom_client = 'Dupont '" , 1 , dw_clients_complet.rowcount())

1.13.2 Application : la recherche d'un client La ddlb contient les noms des clients. L'utilisateur sélectionne un nom puis clique sur le bouton Rechercher. Ensuite il peut cliquer sur suivant.

• Ecran

// Constructor de ddbl_noms_clients DECLARE lc_noms_clients CURSOR FOR SELECT CLIENTS.NOM_CLIENT FROM CLIENTS ; string ls_nom_client open lc_noms_clients ;

Page 33: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 33

if sqlca.sqlcode <> 0 then messagebox("Erreur open",sqlca.sqlerrtext) fetch lc_noms_clients into :ls_nom_client ; if sqlca.sqlcode <> 0 then messagebox("","Erreur fetch") do while sqlca.sqlcode = 0 ddlb_noms_clients.additem(ls_nom_client) fetch lc_noms_clients into :ls_nom_client ; loop close lc_noms_clients ; this.SelectItem(1)

// Clicked de cb_rechercher il_rang = dw_clients_complet.find("Nom_client = '" + ddlb_noms_clients.text + "'" ,1,dw_clients_complet.rowcount()) if il_rang > 0 then dw_clients_complet.scrolltorow (il_rang) else MessageBox("Infos","Non trouvé") End if

// Clicked de cb_rechercher_suivant il_rang = dw_clients_complet.find("Nom_client = '" + ddlb_noms_clients.text + "'" ,il_rang + 1 , dw_clients_complet.rowcount() + 1) if il_rang > 0 then dw_clients_complet.scrolltorow (il_rang) else MessageBox("Infos","Recherche terminée") End if

Page 34: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 34

1.14 LES CHAMPS CALCULES DANS L'OBJET DATAWINDOW

1.14.1 Principes Il existe deux façons de créer des champs calculés dans un Dwo :

• Dans l'ordre Select • En ajoutant un champ calculé à l'ordre Select

Dans le premier cas le champ ne sera pas mis à jour lors de la modification d'un des éléments de calcul, le calcul sera exécuté par le SGBD sur le serveur. Dans le deuxième cas le calcul est fait dans la datawindow sur le poste client, la mise à jour, dans l'interface est immédiate.

1.14.2 Application

1.14.2.1 Dans l'ordre Select Nous allons créer une requête qui calcule les prix en francs. Avec l'assistant de création de dwo - vous devez choisir SQL Select – une fois que vous avez choisi les colonnes, vous allez dans l'onglet Compute, vous cliquez droit, vous sélectionnez la(les) colonne(s) objet de calcul et vous formez votre expression calculée.

Onglet Compute Onglet Syntax

Comme il s'agit d'une requête les tabulations sont à zéro. Si vous voulez tester vous devez mettre d'autres valeurs aux tabulations.

Page 35: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 35

1.14.2.2 Dans le dwo Vous créez un dwo basé sur la table produits et nous allons ajouter un "Compute Field" Vous êtes en mode création et vous allez dans la boîte à outils, vous sélectionnez Compute Field et vous le posez dans la zone choisie (Detail, Header, Footer,…). Cette fenêtre s'ouvre et vous saisissez l'expression de calcul.

Le champ s'appelle compute_1 . Vous modifier éventuellement les propriétés et ajouter un texte. Vous pouvez tester en Preview la mise à jour du prix et son effet direct sur l'affichage du prix en francs.

Page 36: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 36

1.15 LES RETRIEVAL ARGUMENT DANS UNE DWO

1.15.1 Principes A titre d'exemple nous prendrons les tables Cdes et Ligcdes. Pour pouvoir travailler en Maître-Détails il faut que la deuxième datawindow affiche les enregistrements correspondant à l'enregistrement courant de la première datawindow. Pour cela il faut créer un Retrieval Argument dans le dwo qui est à la base de la deuxième datawindow pour que celle-ci exécute un Select qui soit fonction de la valeur de la commande affichée en haut. Le retrieval argument est un paramètre de la condition Where. Exemple d'interface La visualisation des commandes.

1.15.2 Construction Vous construisez le dwo ligcdes_visu en mode grid et une fois terminée vous passez en mode SQL. Vous allez dans le menu Design / Retrieval Arguments

Page 37: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 37

Vous saisissez le nom de l'argument et son type. (Vous pouvez avoir 16 arguments).

Vous revenez vers l'interface SQL et vous ajoutez une condition Where

Vous sélectionnez la colonne dans la liste présente dans la cellule Column , l'opérateur dans la liste présente dans la cellule Operator et l'argument dans la liste après avoir cliquez droit dans la cellule Value.

Vous devrez répéter cette opération si vous avez plusieurs arguments. A partir de maintenant l'ordre SQL Select sera toujours un ordre paramétré. Même en conception PB vous demandera de saisir une valeur pour afficher le Dwo.

Page 38: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 38

1.15.3 Programmation d'une Dw avec un retrieval Argument.

1.15.3.1 Présentation L'utilisation d'une datawindow en relation avec un dwo possédant un Retrieval Argument diffère en un seule endroit : l'utilisation de la méthode Retrieve. Cette fois-ci il faut passer un argument à l'appel de cette méthode. La syntaxe n'est plus dw_.Retrieve() mais dw_.Retrieve(argument [, argument 2,…]) Exemple : dw_ligcdes.Retrieve(21)

1.15.3.2 Application : La visualisation des commandes

• Ecran La dw_cdes_visu (FreeForm) est basée sur une jointure Cdes X Clients. La dw_ligcdes_visu (Grid) est basée sur un jointure Ligcdes X Produits et contient l'argument. Pour le champ total cf à la fin de ce sous-paragraphe.

• Scripts // Constructor de dw_cdes_visu this.SetTransObject(sqlca) dw_ligcdes_visu.SetTransObject(sqlca) this.Retrieve()

Page 39: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 39

// RowFocusChanged de dw_cdes_visu long ll_cde int li_count ll_cde = this.GetItemNumber(currentrow,1) li_count = dw_ligcdes_visu.Retrieve(ll_cde) if li_count > 0 then st_total.text = "Total : " + string(dw_ligcdes_visu.GetItemNumber(1,"c_total")) else st_total.text = "Total : 0" end if

// Clicked sur pb_suivant dw_cdes_visu.ScrollNextRow()

• Commentaires

Les deux SetTransObject doivent être exécutés ensemble et en premier lieu.Le Retrieve sur ligcdes sera exécuté à partir du bouton suivant. Récupération de id_cde avec GetItemNumber et l'argument de l'événement ll_cde = this.GetItemNumber(currentrow,1)

Récupération des lignes de commandes (Ligcdes) avec le retrieve paramétré li_count = dw_ligcdes_visu.Retrieve(ll_cde)

Affectation du total après un test avec GetItemNumber et le nom de la "colonne" (Cf plus bas) GetItemNumber(1,"c_total")

Page 40: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 40

1.15.3.3 La création du champ Total Le total affiché dans la fenêtre est le report du total – invisible – calculé dans le dwo grâce à un Compute Field de type Sum. Dans le dwo, en conception, vous sélectionnez d'abord le champ ou la colonne que vous voulez sommer. Dans la boîte à outils vous cliquez sur Sigma et ce champ sera posez automatiquement dans la zone Summary sous le champ sélectionné. Voici sa page de propriétés. Vous changez le nom (Compute_.. par c_total) et vous notez l'expression.

Page 41: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 41

1.16 LES DATAWINDOWCHILDS DANS L'OBJET

1.16.1 Principe Si nous voulons avoir une liste déroulante, contenant des données provenant d'une BD, dans un champ d'une dwo nous devons créer une DataWindowChild. Une DataWindow Child dans un dwo en conception est aussi appelée une DropDownDataWindow (DropDownDW). Il faut au préalable créer le dwo pour la liste puis modifier les caractéristiques de la colonne qui doit recevoir cette DDDW. Exemple d'interface

1.16.2 Création Pour la saisie des commandes nous aurons besoin d'une liste de clients. La Dwo_Clients_liste est un dwo de type Grid. Les clients sont triés par le nom. Dans le dwo_cdes_saisie nous sélectionnons la colonne id_client et affichons les propriétés contenues dans l'onglet Edit.

Page 42: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 42

La première propriété à changer est Style Type; vous sélectionnez DropDownDW. L'interface change. Les propriétés suivantes auront ces valeurs-ci :

Propriété Valeur Signification AllowEditing Vrai Saisie permise Always Show Arrow Vrai Flèche VscrollBar Vrai Ascenseur Width 200 Largeur une fois ouverte en

pourcentage de la largeur DataWindow Dwo_clients_liste Source DisplayColumn Nom_client Colonne affichée DataColumn Id_client Colonne récupérée

Page 43: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 43

1.16.3 Les scripts pour l'ajout d'une commande // Cliked de pb_plus_cdes dans w_cdes_saisie // Nouvelle Commande long ll_row // ---------- les dw sont vidées dw_cdes_saisie.reset ( ) dw_ligcdes_saisie.reset ( ) // ---------- insertion d'une ligne ll_row = dw_cdes_saisie.insertrow(0) // Insertion d'une nouvelle ligne de commande pb_plus_ligcdes.triggerevent(clicked!) dw_cdes_saisie.setitem ( ll_row, "date_cde", today() ) //dw_cdes_saisie.object.data[1,2] = today ( ) dw_cdes_saisie.setfocus ( ) // ---------- la colonne id_client devient la colonne active dw_cdes_saisie.setcolumn("id_client")

// Clicked de pb_plus_ligcdes dans w_cdes_saisie long ll_row ll_row = dw_ligcdes_saisie.insertrow(0) dw_ligcdes_saisie.setfocus ( ) dw_ligcdes_saisie.setrow(ll_row) dw_ligcdes_saisie.setcolumn("id_produit")

// Clicked de pb_moins_ligcdes dw_ligcdes_saisie.deleteRow(0)

// Clicked de pb_valider long ll_cde int li_ligcdes_count, li_ctr li_ligcdes_count = dw_ligcdes_saisie.rowcount() If li_ligcdes_count = 0 THEN messagebox("Attention!!!","Vous devez saisir au moins une ligne") return // -------- Arrête l'exécution du script End If select seq_cdes.nextval into :ll_cde from dual ; dw_cdes_saisie.SetItem(1,1,ll_cde) if dw_cdes_saisie.Update(true,false) = 1 then for li_ctr = 1 to li_ligcdes_count

Page 44: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 44

dw_ligcdes_saisie.SetItem(li_ctr,1,ll_cde) next if dw_ligcdes_saisie.Update(true,false) = 1 then dw_cdes_saisie.resetupdate ( ) dw_ligcdes_saisie.resetupdate ( ) commit; messagebox("Commit","de l'ensemble") else rollback; messagebox("Rollback","de l'ensemble") end if else rollback; messagebox("Rollback","de l'ensemble") end if

• L'ajout d'une ligne de commande avec la touche Tabulation

Pour utiliser la touche Tabulation dans une DataWindow il faut déclarer un User-Event qui recouvre l'événement pbm_dwnkey qui n'est disponible en standard dans la liste des événements d'une dw. Nous appellerons cet événement personnalisé ue_touche. Nous utilisons l'argument Key et l'énuméré KeyTab! pour tester ainsi le numéro de la ligne et de la colonne actives.

NB : à la place de li_col = 4 vous pouvez utiliser l'instruction : Li_col = integer(This.Object.DataWindow.Column.count)

Page 45: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 45

1.17 LES DATAWINDOWCHILDS DANS LA FENETRE

1.17.1 Principes Pour afficher le contenu dans la fenêtre il n'y a aucun code à écrire. N'exécutez-pas de Retrieve(). Le Retrieve() du parent remplit aussi cette liste. En revanche où il faudra coder ce sera pour ajouter, rechercher un élément dans la liste, actualiser la liste. Les méthodes utilisées sont celles des DataWindow. Nous passerons par une variable de type DataWindowChild pour manipuler cette datawindow qui n'est pas un contrôle.

1.17.2 Applications

1.17.2.1 Premier cas : Ajouter un client lors de l'ajout d'une commande.

• Principes

Cet exemple a pour objectif de traiter l'événement ItemError d'une datawindow et de manipuler une variable de type DataWindowChild pour atteindre une DropDownDataWindow. Nous allons utiliser, avec les limites que cela comporte, l'événement Itemerror. Lorsque l'utilisateur saisit un nom qui n'existe pas une erreur se produit. Vous dévions cette erreur et ouvrons une fenêtre modale pour la saisie du nouveau client. Au retour nous ajoutons dans la liste – plutôt que de rafraîchir la liste par un accès à la BD – le nouveau client ( ie son code, son nom et son prénom ) en passant par une structure globale. Et nous affectons l'id_client à la cellule de la liste et pour que celui-ci soit sélectionné nous utilisons ScrollToRow.

Page 46: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 46

• Ecrans

Cdes Clients

Accessoirement

• Scripts // ItemError de dw_cdes_saisie string ls_col, ls_nom, ls_prenom int li_rep long ll_row, ll_id_client datawindowchild ldwc_client gstruct_clients lstruct_clients ls_col = dwo.name if ls_col = "id_client" then li_rep = messagebox("Infos!!!","Ce client n'existe pas. Le créer?",Exclamation!,YesNo!,1) if li_rep = 1 then OpenWithParm(w_client_nouveau,data) lstruct_clients = message.PowerObjectParm if lstruct_clients.id_client <> 0 then ls_nom = lstruct_clients.nom_client ls_prenom = lstruct_clients.prenom_client ll_id_client = lstruct_clients.id_client This.GetChild("id_client",ldwc_client) // ldwc_client.SetTransObject(sqlca) // ldwc_client.Retrieve() ll_row = ldwc_client.InsertRow(0)

Page 47: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 47

ldwc_client.SetItem(ll_row,1,ll_id_client) ldwc_client.SetItem(ll_row,2,ls_nom) ldwc_client.SetItem(ll_row,3,ls_prenom) ldwc_client.ScrollToRow(ll_row) This.SetItem(ll_row,1,ll_id_client) end if end if return 1 end if //0 (Default) Reject the data value and show an error message box //1 Reject the data value with no message box //2 Accept the data value //3 Reject the data value but allow focus to change

// Open de w_client_nouveau long ll_row string ls_nom this.width = 2050 this.height = 1170 dw_clients.SetTransObject(sqlca) ll_row = dw_clients.InsertRow(0) dw_clients.setcolumn( 3 ) ls_nom = message.stringparm dw_clients.SetItem(ll_row,2,ls_nom)

// Clicked sur cb_valider long ll_id_client gstruct_clients lstruct_clients select seq_clients.nextval into :ll_id_client from dual ; dw_clients.SetItem(1,1,ll_id_client) if dw_clients.update() = 1 then lstruct_clients.id_client = ll_id_client lstruct_clients.nom_client = dw_clients.GetItemString(1,2) lstruct_clients.prenom_client = dw_clients.GetItemString(1,3) closewithreturn(parent,lstruct_clients) else messagebox("Alerte !!!","Ajout annulé") end if

// Clicked cb_annuler dans w_client_nouveau gstruct_clients lstruct_clients lstruct_clients.id_client = 0 closewithreturn(parent,lstruct_clients)

Page 48: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 48

1.17.2.2 Deuxième cas : Ajouter un pays lors de l'ajout d'une ville

• Principes

Ajouter un pays inexistant dans la base lors de l'ajout d'une nouvelle ville : voilà l'objectif. Il est impossible de faire comme dans le script précédent parce les deux colonnes sont de types string. Le principe utilisé est le suivant : lorsque l'utilisateur saisit une valeur, l'événement ItemChanged est déclenché automatiquement. Nous allons rechercher la valeur dans la DDDW ou DWChild. Si la chaîne saisie ne contient que des chiffres nous recherchons dans la colonne id_pays sinon nous recherchons dans la colonne nom_pays avec la méthode Find. Pour le reste les scripts sont similaires aux scripts précédents.

• Ecrans

Villes Pays

• Scripts

// ItemChanged de dw_villes // dans ItemError il y a Return 2 string ls_col, ls_data any la_data string ls_pays_nom, ls_id_pays long ll_rang DataWindowChild ldwc_pays ls_col = dwo.name la_data = data if ls_col = "id_pays" then this.GetChild("id_pays",ldwc_pays) ls_data = string(la_data)

Page 49: CHAPITRE 1 LES DATAWINDOWS - pascal.buguet.free.frpascal.buguet.free.fr/pdfsEtZips/pwrs_06_les_dw.pdf · PowerBuilder – Les DataWindows © Pascal Buguet Imprimé le 19 août 2004

PowerBuilder – Les DataWindows

© Pascal Buguet Imprimé le 19 août 2004 Page 49

if isnumber(ls_data) then ll_rang = ldwc_pays.Find("id_pays='"+ls_data+"'",1,ldwc_pays.RowCount()) if ll_rang > 0 then return else ll_rang = ldwc_pays.Find("nom_pays='"+ls_data+"'", 1, & ldwc_pays.RowCount()) if ll_rang > 0 then return end if // isNumber openWithParm(w_pays_nouveau,ls_data) ls_pays_nom = message.StringParm if ls_pays_nom <> "" then ldwc_pays.SetTransObject(sqlca) ldwc_pays.Retrieve() ls_id_pays = left(ls_pays_nom,3) this.SetText(ls_id_pays) this.AcceptText() end if this.SetColumn("id_pays") // ou autre focus return 2 end if

// Open de w_pays_nouveau dw_pays.SetTransObject(sqlca) dw_pays.InsertRow(0) if isnumber(Message.StringParm) then dw_pays.SetItem(1,1,message.StringParm) dw_pays.SetColumn(2) else dw_pays.SetItem(1,2,message.StringParm) end if

// Clicked sur pb_valider string ls_pays_nom if gf_validation(dw_pays) = 1 then ls_pays_nom = dw_pays.getitemString(1,1) + "-" + dw_pays.GetItemString(1,2) closewithreturn(parent,ls_pays_nom) end if

// Clicked sur pb_annuler closewithreturn(parent,"")