Ermitteln der Projektzuordnungen von Mitarbeitern mit einer Stored Procedure (Allgemeines IBX-Tutorial)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Tutorial: Mit InterBase Express auf eine Datenbank zugreifen

In diesem Abschnitt erstellen Sie ein Formular, das mithilfe einer Stored Procedure die Projekte eines Mitarbeiters ermittelt. Das Erstellen dieses Formulars folgt weitgehend dem Vorgehen im Abschnitt Überwachen von Gehaltsänderungen, insbesondere weil auch hier das TDataModule "DmCSDemo" verwendet wird. Aber im Gegensatz zu dem Formular in Überwachen von Gehaltsänderungen werden einige Datenbankkomponenten hinzugefügt.

Nach dem Hinzufügen der Komponenten sieht das Formular für die Projektzuordnungen etwa folgendermaßen aus:

EmpProjAssignDesignTime.png


Im oberen TDBGrid wird die Tabelle EMPLOYEE angezeigt. Im unteren TDBGrid werden die Projekte des ausgewählten Mitarbeiters angezeigt.

Erstellen des Formulars

Fügen Sie zunächst dem Projekt ein weiteres VCL-Formular hinzu. Klicken Sie dazu in der Projektverwaltung mit der rechten Maustaste auf das Projekt, und wählen Sie den Menüeintrag Neue hinzufügen >VCL-Formular.

Legen Sie die Eigenschaften des Formulars fest:

  • Setzen Sie die Eigenschaft Caption auf "Employee Project Assignments".
  • Setzen Sie Name auf "FrmQueryProc".
  • Ändern Sie die Eigenschaft Height des Formulars in 370 und die Eigenschaft Width in 380.
  • Setzen Sie OldCreateOrder auf true.

Speichern Sie das Formular:

  • Delphi: Speichern Sie die Datei unter dem Namen Frmqrysp.pas.

So verwenden Sie das TDataModule-Modul in diesem Formular:

  • Delphi: Fügen Sie die folgende Zeile am Anfang des implementation-Abschnitts der Datei Frmqrysp.pas.pas ein:
uses DmCSDemo;

Hinzufügen von Datenbankkomponenten

  • Fügen Sie zum Abrufen der Informationen aus der Tabelle EMPLOYEE eine TDataSource-Komponente hinzu. Setzen Sie die Eigenschaft DataSet im Dropdown-Menü auf "DmEmployee.EmployeeTable". Beachten Sie, dass diese Datenmenge vom TDataModule "DmCSDemo" gefüllt wird. Setzen Sie die Eigenschaft Name auf "EmployeeSource".
  • Fügen Sie eine TIBQuery-Komponente hinzu, damit auf die Datenbanktabelle mit SQL-Anweisungen zugegriffen werden kann.
    • Ändern Sie die Eigenschaft Name in "EmployeeProjectsQuery".
    • Setzen Sie die Eigenschaft Database im Dropdown-Menü auf "DmEmployee.EmployeeDatabase".
    • Falls dies nicht bereits automatisch ausgeführt wurde, setzen Sie die Eigenschaft Transaction im Dropdown-Menü auf "DmEmployee.IBTransaction1".
    • Setzen Sie die Eigenschaft SQL, indem Sie neben dieser Eigenschaft auf die Ellipsenschaltfläche (...) klicken, um das Dialogfeld Anweisungstext-Editor zu öffnen. Geben Sie die folgende Zeile in den Bereich SQL: des Dialogfeldes ein:
Select * from Get_Emp_Proj( :EMP_NO )

CommandTextEdtProj Assign.png


Dieser SQL-Code ruft die Stored Procedure Get_Emp_Proj auf, die eine Datenmenge mit allen Projekten für die angegebene Mitarbeiternummer zurückgibt.

  • Fügen Sie eine weitere TDataSource-Komponente hinzu. Setzen Sie die Eigenschaft Name auf "EmployeeProjectsSource". Setzen Sie die Eigenschaft DataSet auf "EmployeeProjectsQuery". Diese TDataSource-Komponente dient als Schnittstelle zwischen der TIBQuery-Komponente und dem datensensitiven TDBGrid-Steuerelement, das Sie im nächsten Abschnitt hinzufügen werden.

Hinzufügen visueller Komponenten

  • Fügen Sie im unteren Bereich des Formulars eine TStatusBar-Komponente ein. In dieser Statuszeile werden Informationen über die Projekte des aktuell ausgewählten Mitarbeiters angezeigt. Setzen Sie SimplePanel auf true.
  • Fügen Sie drei TPanel-Komponenten hinzu, und ordnen Sie sie wie in der folgenden Abbildung an. Diese TPanel-Komponenten dienen als Rahmen zum Anordnen der visuellen Komponenten. Passen Sie deren Größe so an, dass sie das gesamte Formular mit Ausnahme der TStatusBar-Komponente ausfüllen.

EmpProjAssignFrmPanels.png


  • Fügen Sie "Panel1" für die Navigation in den Datensätzen der Datenbank eine TDBNavigator-Komponente hinzu. Setzen Sie die Eigenschaft DataSource im Dropdown-Menü auf "DmEmployee.EmployeeSource". Diese Datenquelle wird vom TDataModule-Modul gefüllt. Wählen Sie unter der Eigenschaft VisibleButtons alle Schaltflächen aus. Setzen Sie ShowHint auf true, damit für die Schaltflächen der TDBNavigator-Komponente Hinweise angezeigt werden.
  • Platzieren Sie eine TBitBtn-Komponente auf der rechten Seite von "Panel1". Setzen Sie die folgenden Eigenschaften:
    • Setzen Sie Caption auf "E&xit". Das Tastenkürzel ALT+X führt dann dieselbe Aktion wie das Klicken auf die Schaltfläche aus.
    • Setzen Sie im Dropdown-Menü die Eigenschaft Kind auf "bkClose". Mit dieser Einstellung führt die Schaltfläche einen Befehl zum Schließen des Dialogfeldes aus, wenn Sie auf die TBitBtn-Schaltfläche klicken.
  • Platzieren Sie eine TDBGrid-Komponente auf "Panel2". Ändern Sie deren Größe so, dass sie die gesamte TPanel-Komponente ausfüllt. Setzen Sie die Eigenschaft DataSource im Dropdown-Menü auf "EmployeeSource".
  • Platzieren Sie eine weitere TDBGrid-Komponente auf "Panel3". Ändern Sie deren Größe so, dass sie die gesamte TPanel-Komponente ausfüllt. Setzen Sie die Eigenschaft DataSource im Dropdown-Menü auf "EmployeeProjectsSource". Die in der TIBQuery-Komponente enthaltene SQL-Abfrage ermittelt die Datenmenge mit allen Projekten für eine gegebene Mitarbeiternummer. Die TDataSource-Komponente "EmployeeProjectsSource" stellt die Datenmenge von TIBQuery für die TDBGrid-Komponente bereit.

Hinzufügen von Ereignisbehandlungsroutinen und weiterem Quelltext

Vervollständigen Sie das Formular durch Hinzufügen einer Routine und Erstellen von drei Ereignisbehandlungsroutinen. Für TBitBtn ist keine Ereignisbehandlungsroutine erforderlich, weil dieser Schaltfläche bereits ein Befehl zugeordnet ist.

Fügen Sie die Routine WriteMsg hinzu, die in der TStatusBar-Komponente eine Meldung anzeigt.

Delphi

Fügen Sie dem private-Bereich des Abschnitts type von Frmqrysp.pas diese Prozedur hinzu:

procedure WriteMsg( strWrite : String );

Sie können mit der Klassenvervollständigung (öffnen mit STRG+UMSCH+C einen Stub für diese Funktion im implementation-Abschnitt erstellen.

Fügen Sie den folgenden Code in die neue Prozedur ein:

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

Erstellen Sie als Nächstes eine Ereignisbehandlungsroutine für die TDataSource-Komponente "EmployeeSource". Wählen Sie auf der Registerkarte Design die TDataSource-Komponente "EmployeeSource" aus, und doppelklicken Sie dann im Objektinspektor auf das Ereignis OnDataChange. Diese Ereignisbehandlungsroutine überwacht, welcher Mitarbeiter im oberen TDBGrid ausgewählt ist, und aktualisiert die TStatusBar-Komponente und das untere TDBGrid. Fügen Sie für die Ereignisbehandlungsroutine den folgenden Code hinzu:

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;

Schreiben Sie zum Abschluss zwei Ereignisbehandlungsroutinen für das Formular selbst. Wählen Sie auf der Registerkarte Design das Formular aus. Doppelklicken Sie im Objektinspektor auf das Ereignis OnShow, um den Skeleton-Code für das Ereignis zu erstellen. Fügen Sie folgenden Quelltext hinzu:

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;

Doppelklicken Sie bei weiterhin ausgewähltem Formular im Objektinspektor auf das Ereignis OnHide, um dafür den Code-Stub zu erstellen. Ändern Sie den Stub folgendermaßen:

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;

Damit ist das Formular fertig gestellt.

Anzeigen des Formulars für die Tabellendarstellung

Ändern Sie das im Abschnitt Erstellen des Hauptformulars erstellte Hauptformular. Fügen Sie eine Schaltfläche für die Anzeige des erstellten Formulars für die Mitarbeiterprojekte hinzu.

Delphi

Fügen Sie der uses-Klausel am Anfang des implementation-Abschnitts von Frmmain.pas eine zusätzliche Zeile hinzu, damit das Hauptformular die gerade hinzugefügte Unit FrmQrySP finden kann:

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

Fügen Sie dem Formular Frmmain eine weitere TButton-Komponente hinzu, die derjenigen im Abschnitt Erstellen des Hauptformulars (Allgemeines IBX-Tutorial)|Erstellen des Hauptformulars hinzugefügten entspricht. Setzen Sie TButton.Caption auf "Query Stored Procedure Demo". Setzen Sie TButton.Name auf "BtnQrySP". Fügen Sie dann der neu erstellen Schaltfläche eine Ereignisbehandlungsroutine hinzu, indem Sie auf der Registerkarte Design des Formulars Frmmain auf diese TButton-Komponente doppelklicken. Verwenden Sie den folgenden Quellcode für die Ereignisbehandlungsroutine:

Delphi

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

Ausführen der Anwendung

Compilieren Sie die Anwendung, und führen Sie sie aus. Das Hauptformular wird angezeigt:

FrmMainEmplProjAssign.png


Klicken Sie zum Anzeigen des neuen Formulars auf die neue TButton-Komponente "Query Stored Procedure Demo":

EmpProjAssignWithProjects.png


Im oberen TDBGrid wird die Tabelle EMPLOYEE aus der Datenbank angezeigt. In der Statuszeile (TStatusBar) wird angezeigt, dass der aktuell ausgewählte Mitarbeiter keine Projekte hat. Das untere TDBGrid zeigt außer dem Feldnamen PROJ_ID keine Daten an, weil dem Mitarbeiter keine Projekte zugeordnet sind. Wenn Sie einen Mitarbeiter auswählen, dem Projekte zugeordnet sind, wird Folgendes angezeigt:

EmpProjAssignWithProjects.png


Das untere TDBGrid zeigt die Datenmenge, die von der SQL-Anweisung der TIBQuery-Komponente zurückgeliefert wird: die Datenmenge enthält alle Projekte für eine gegebene Mitarbeiternummer. In der Statuszeile (TStatusBar) wird die Anzahl der Projekte des Mitarbeiters angezeigt.

Damit ist dieses Projekt abgeschlossen. Sie können es analog dem mit RAD Studio installierten Beispiel CsDemos erweitern.

Zurück

Überwachen von Gehaltsänderungen