Obtenir les affectations des projets aux employés avec une procédure stockée (tutoriel général IBX)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Tutoriel : Utilisation de InterBase Express pour accéder à une base de données

Dans cette section, vous allez construire une fiche qui utilise une procédure stockée pour trouver les projets d'un employé. Le processus de création de cette fiche est très similaire à la procédure suivie dans Surveiller les modifications des salaires, d'autant plus que vous utiliserez de nouveau le TDataModule "DmCSDemo". Vous ajouterez des composants de base de données, à la différence de la fiche de la rubrique Surveiller les modifications des salaires.

Voici l'aspect de la fiche des affectations de projets après l'ajout des composants :

EmpProjAssignDesignTime.png


Le TDBGrid supérieur montre la table EMPLOYEE. Le TDBGrid inférieur montre les projets de l'employé sélectionné.

Créer la fiche

Commencez en ajoutant une autre fiche VCL au projet. Dans le Gestionnaire de projets, cliquez avec le bouton droit sur le projet puis cliquez sur l'élément de menu Ajouter nouveau > Fiche VCL.

Adaptez les propriétés de la nouvelle fiche :

  • Définissez Caption sur "Employee Project Assignments".
  • Définissez Name sur "FrmQueryProc".
  • Définissez la propriété Height de la fiche sur 370, et Width sur 380.
  • Définissez OldCreateOrder sur true.

Enregistrez la fiche :

  • Pour Delphi, enregistrez le fichier sous Frmqrysp.pas.

Pour utiliser le TDataModule dans cette fiche :

  • Pour Delphi, ajoutez la ligne suivante au début de la section implementation de Frmqrysp.pas :
 uses DmCSDemo;

Ajouter des composants de base de données

  • Ajoutez un composant TDataSource pour obtenir des informations de la table EMPLOYEE. Définissez DataSet sur "DmEmployee.EmployeeTable" depuis le menu déroulant. Notez que cet ensemble de données est fourni par le TDataModule "DmCSDemo". Remplacez la propriété Name par "EmployeeSource".
  • Ajoutez un TIBQuery pour accéder à une table de base de données en utilisant des instructions SQL.
    • Remplacez la propriété Name par "EmployeeProjectsQuery".
    • Définissez Database sur "DmEmployee.EmployeeDatabase" depuis le menu déroulant.
    • Si nécessaire, définissez Transaction sur "DmEmployee.IBTransaction1" depuis le menu déroulant.
    • Définissez la propriété SQL en cliquant sur le bouton points de suspension (...) relatif à cette propriété, qui affiche la boîte de dialogue Editeur de texte de commande. Entrez cette ligne dans le volet SQL: de la boîte de dialogue :
 Select * from Get_Emp_Proj( :EMP_NO )

CommandTextEdtProj Assign.png

Ce code SQL appelle la procédure stockée Get_Emp_Proj, qui renvoie un ensemble de données contenant tous les projets associés au numéro d'employé donné.

  • Ajoutez un autre TDataSource. Remplacez la propriété Name par "EmployeeProjectsSource". Définissez DataSet sur "EmployeeProjectsQuery". Ce TDataSource sert d'interface entre le TIBQuery et le contrôle orienté données TDBGrid que vous ajouterez à la section suivante.

Ajouter des composants visuels

  • Ajoutez un TStatusBar en bas de la fiche. Utilisez ce contrôle pour afficher des informations sur les projets de l'employé actuellement sélectionné. Définissez SimplePanel sur true.
  • Ajoutez trois composants TPanel, en les positionnant comme illustré dans la figure ci-dessous. Ces TPanels fournissent un cadre de travail pour le positionnement des composants visuels. Redimensionnez-les afin de remplir la zone de la fiche, à l'exception du TStatusBar.

EmpProjAssignFrmPanels.png


  • Ajoutez un TDBNavigator dans "Panel1" pour naviguer parmi les enregistrements de la base de données. Définissez DataSource sur "DmEmployee.EmployeeSource" depuis le menu déroulant. Cette source de données est fournie par le TDataModule. Sous la propriété VisibleButtons, cochez tous les boutons. Définissez ShowHint sur true, afin d'afficher les conseils des boutons d'outil du TDBNavigator.
  • Placez un TBitBtn sur le côté droit de "Panel1". Définissez les propriétés suivantes :
    • Définissez Caption sur "Exit". Ainsi l'appui sur ALT+x est identique à un clic sur le bouton.
    • Définissez Kind sur "bkClose" depuis le menu déroulant. Ce paramétrage permet au bouton d'exécuter une commande pour fermer la boîte de dialogue quand vous cliquez sur le TBitBtn.
  • Placez un TDBGrid sur "Panel2". Redimensionnez-le pour remplir le TPanel. Définissez DataSource sur "EmployeeSource" depuis le menu déroulant.
  • Placez un autre TDBGrid sur "Panel3". Redimensionnez-le pour remplir le TPanel. Définissez DataSource sur "EmployeeProjectsSource" depuis le menu déroulant. La requête SQL formulée dans le TIBQuery obtient l'ensemble de données contenant tous les projets d'un numéro d'employé donné. Le TDataSource "EmployeeProjectsSource" rend l'ensemble de données du TIBQuery disponible pour le TDBGrid.

Ajouter des gestionnaires d'événements et un autre code

Complétez la fiche en ajoutant une routine et en créant trois gestionnaires d'événements. Vous n'avez pas besoin d'un gestionnaire d'événements pour le TBitBtn, car ce bouton a déjà une commande associée à son clic.

Ajoutez une routine WriteMsg qui affiche un message dans le TStatusBar.

Delphi

Ajoutez cette procédure dans la partie private de la section type de Frmqrysp.pas :

 
 procedure WriteMsg( strWrite : String );

Vous pouvez utiliser l'achèvement de classe en appuyant sur CTRL-MAJ-C pour créer un stub pour cette fonction dans la section implementation.

Ajoutez ce code pour la nouvelle procédure :


 procedure TFrmQueryProc.WriteMsg(StrWrite: String);
 begin
    StatusBar1.SimpleText := StrWrite;
 end;

Créez ensuite un gestionnaire d'événements pour le composant TDataSource "EmployeeSource". Sélectionnez le TDataSource "EmployeeSource" dans l'onglet Conception, puis double-cliquez sur l'événement OnDataChange dans l'inspecteur d'objets. Ce gestionnaire d'événements effectue le suivi de l'employé actuellement sélectionné dans le TDBGrid supérieur et met à jour le TStatusBar et le TDBGrid inférieur. Ajoutez ce code pour le gestionnaire d'événements :

Delphi


procedure TFrmQueryProc.EmployeeSourceDataChange(Sender: TObject;
  Field: TField);
begin
  { Execute the ProjectsQuery, which uses a query procedure }
  EmployeeProjectsQuery.Close;
  EmployeeProjectsQuery.Params[0].AsInteger :=
    DmEmployee.EmployeeTable.FieldByName('EMP_NO').AsInteger;
  EmployeeProjectsQuery.Open;

  WriteMsg('Employee ' + DmEmployee.EmployeeTable.FieldByName('EMP_NO').AsInteger +
           ' is assigned to ' + IntToStr(EmployeeProjectsQuery.RecordCount) +
           ' project(s).');
end;

Enfin, écrivez deux gestionnaires d'événements pour la fiche elle-même. Dans l'onglet Conception, sélectionnez la fiche. Dans l'inspecteur d'objets, double-cliquez sur l'événement OnShow pour créer le code squelette de l'événement. Ajoutez le code suivant :

Delphi

 procedure TFrmQueryProc.FormShow(Sender: TObject);
 begin
   DmEmployee.EmployeeTable.Open;
   { Allow data flow from the EmployeeTable to the local EmployeeSource.  This
     will allow DataChange events to execute the query procedure }
   EmployeeSource.Enabled := True;
   { Explicit query preparation is not required, but gives the best possible
     performance }
   with EmployeeProjectsQuery do if not Active then Prepare;
 end;

Tandis que la fiche est toujours sélectionnée, dans l'inspecteur d'objets, double-cliquez sur l'événement OnHide pour créer le stub du code de cet événement. Modifiez le stub comme suit :

Delphi


 procedure TFrmQueryProc.FormHide(Sender: TObject);
 begin
   { Turn off the DataChange event for our form, since DmEmployee.EmployeeTable
     is used elsewhere }
   EmployeeSource.Enabled := False;
 end;

Ceci termine la fiche.

Afficher la fiche de visualisation de la table

Modifiez la fiche principale créée dans Créer une fiche principale Ajoutez un bouton sur cette fiche pour afficher la fiche des projets de l'employé que vous venez de créer.

Delphi

Ajoutez une ligne supplémentaire à la clause uses au début de la section implementation de Frmmain.pas, afin que la fiche principale connaisse l'unité FrmQrySP que vous venez d'ajouter :

 uses
    FrmQrySP,   { The Query Stored Procedure demo }
    FrmTrigg,   { The Trigger Demo }
    FrmViews;   { The View Demo }

Ajoutez un autre TButton à la fiche Frmmain, semblable au TButton qui a été ajouté dans Créer une fiche principale. Définissez TButton.Caption sur "Query Stored Procedure Demo". Définissez TButton.Name sur "BtnQrySP". Ajoutez ensuite un gestionnaire d'événements pour le nouveau bouton en double-cliquant sur ce TButton dans l'onglet Conception de la fiche Frmmain. Utilisez le code suivant pour le gestionnaire d'événements :

Delphi

 procedure TFrmLauncher.BtnQrySPClick(Sender: TObject);
 begin
   FrmQueryProc.ShowModal;
 end;

Exécuter l'application

Construisez et exécutez l'application. La fiche principale s'affiche :

FrmMainEmplProjAssign.png


Cliquez sur le nouveau TButton "Query Stored Procedure Demo" pour afficher la nouvelle fiche :

FrmEmpProjAssignRunTime.png


Le TDBGrid supérieur affiche la table EMPLOYEE de la base de données. Le TStatusBar montre que l'employé actuellement sélectionné n'a pas de projet. Le TDBGrid inférieur n'affiche pas de données à part le nom de champ PROJ_ID, puisque l'employé n'a pas de projet. Si vous sélectionnez un employé avec des projets, vous voyez ceci :

EmpProjAssignWithProjects.png


Le TDBGrid inférieur montre l'ensemble de données renvoyé par la commande SQL du TIBQuery : l'ensemble de données contenant tous les projets d'un numéro d'employé donné. Le TStatusBar montre le nombre de projets de l'employé.

Ceci termine ce projet. Vous pouvez le développer avec les lignes données dans l'exemple CsDemos, installé avec RAD Studio.

Précédent

Surveiller les modifications des salaires