Sie sind auf Seite 1von 18

Sujet de Développement des applications informatiques (DAI) :

ÉTUDE DE CAS : gestion de ses stations service


Bien évidemment, la société X souhaiterait disposer d’un historique de chaque instance de paiement
effectué par chaque véhicule à une pompe. Ces instances de paiement enregistrent un prix en euros, le
carburant concerné, le nombre de litres distribué et enfin la date ainsi que l’heure précise (heure,
minute, seconde) où la transaction a été effectuée.

DOSSIER I : VB (10 pts)


Dans le serveur de base de données, nommé « ServerStation », on a implanté une base de
données nommée « dbStation » dont on a extraire une partie du modèle physique qui est la suivante:

L’application, sous VB.Net, permet la gestion de payement de carburant par les clients dans
les stations de service. L’IHM de cette application est la suivante :
Objet graphique Propriété Name
ComboBox CmbNumP
TextBox TextNLitre
TextBox TextPLitre
TextBox TextNumC
TextBox TextMrq
TextBox TextImmat
TextBox TextClr
TextBox TextNumS
TextBox TextRechMat
DateTimePicker DTPpayemet
Button CmdAjouter
Button CmdEnregistrer
DataGridView DGV
Travail à Faire :
I-1. Déclarer les objets nécessaires à la connexion, en mode non connecté, à la base de données. (1 pt)
I-2. Créer la procédure connecter qui permet de se connecter à la base de données En cas d’erreur, on
affiche un message d’erreur: (1 pt)
I-3. Donner le code de la procédure chargerDataSet permettant de charger le DataSet par les trois
tables Vehicule,Pompes et InstancePayement. (1,5 pts)
I-4. Donner le code de la procédure évènementielle de la zone texte « TxtNumS ». (1,5 pt)
Private Sub txtNumS_Validated (ByVal sender …., ByVal e As …) Handles txtNumS.Validated
…………
End Sub
Cette procédure permettant après la validation de remplir l’objet ComboBox nommé
« CmbNumP » par les numéros des pompes de la station dont sa numéro saisi dans la zone de
teste nommée « txtNumS ».

I-5. Donner le code de la procédure « Lister_vehicule » permettant de remplir l’objet


DataGridView nommé « DGV » par toutes les véhicule de la table vehicule (immat,marque ,
couleur,numCarte). (0,5 pt)
I-6. Donner le code de la procédure évènementielle de la zone texte « TxtRech ». (1pt)
Private Sub textRechMat_TextChanged(ByVal sender …., ByVal e As …) Handles
textRechMat.TextChanged
…………
End Sub

Cette procédure permet de rechercher un véhicule dont le matricule commence par les
caractères saisis dans la zone de texte « TxtRech ». Le résultat de recherche s’affichera dans
l’objet DataGridView (DGV).

I-7. Écrire le code des procédures évènementielles associées aux boutons :


a. CmdAjouter : pour ajouter un nouveau véhicule dans la base de données et actualiser, par
la suite, l’affichage de l’objet DataGridView et la base de données. (1,5 pt)
b. CmdEnregistrer : permet d’enregistrer le payement de carburant d’un client de station de
service sachant que le numInstance de la table InstancePayement est s’incrémente
automatique et lors d’enregistrement, on peut suivre les étapes suivantes :
• Récupérer, depuis la grille, la matricule du véhicule sélectionnée ;
• Ajouter un nouveau payement ;
• Mettre à jour la base de données. (2 pt)

DOSSIER II : WEB (8 pts)


Pour faciliter la tâche du service des ressources humaines, au niveau de la gestion des
employés.La société X, a opté pour le développementd’une application web, avec la technologie
PHP/MysSql, qui va permettre la saisie, la modification et la suppression des données des employés,qui
sont enregistrer dans la base de données « StationService » qui contient la table « Employe ».

N.B :Dans ce qui suit, on va se focaliser sur une petite partie de l’application mentionné ci-dessus.

Employe(numEmp, cin, nom, prenom, dateEMB, numStationService).

1. Compléter le script du fichier nommé « Connexion.php » qui permettra de se connecter au serveur et


de sélectionner la base de données « StationService». (1,5 pts)

<?php
$host = "ServeurX"; // L'adresse du serveur
$login = "SuperAd"; // Le nom d'utilisateur de mysql
$password = "1a2b3c"; // Le mot de passe de mysql
$base = "StationService"; // Le nom de la base
functionconnexion()
{
………………………………….
}
?>

2. Compléter le script PHP du fichier nommé « Installation.php », qui permettra de créer la table «
Employe » (02 pts)

<?php
//appel de la fonction connexion()
include("connexion.php");
connexion();
………………………………….
/* soumettre la requête formée à la base de données,
et affiche une éventuelle erreur à l'écran */
mysql_query($sql) or die(mysql_error());
// la déconnexion
mysql_close();
?>

3. Compléter le script de la page de consultation « Consultation.php » qui permettra d’afficher les


données enregistrées dans la table « Employe » comme présenter dans la figure 01.
(03 pts)

Figure 01: Page de consultation

<HTML>
<HEAD>
<TITLE>Page de consultation</TITLE>
</TITLE>
<META CHARSET="UTF-8"/>
</HEAD>
<BODY><H1 ALIGN="CENTER"> >Liste des employés</H1>
………………………………….
<?php
include("connexion.php");
// Etablir la connexion
connexion();
………………………………….
?>
<TABLE>
</BODY>
</HTML>

4. Ecrire en JavaScript, la fonction qui permettra d’affiche une boite de dialogue avec le message de
confirmation suivant « Voulez-vous
vous supprimer cet enregistrement»,
enregistrement», après avoir cliqué sur l’action «
Supprimer ». (0,75 pt)

5. Ecrire en PHP, le script qui permettra la redirection vers une page nommé « Accueil.php » (0,75 pt)

DOSSIER III : JAVA (14 pts)


La société X souhaiterait a besoin de mesurer à tout le moment l’état de chaque station de
service, ceci est très importante pour bien contrôler le rendement de chaque
chaqu une au niveau de
nombre de clients Fidèles ayant une carte d’abonnement argent réalisé.

Une vue abstraite de cette gestion nous a conduit au diagramme de classes suivant :

III-1. Le détail de la classe « Personnes»


Personnes est le suivant :
import java.util.Objects;
public class Personnes {
private String cin,nom,prenom;
public Personnes(String cin, String nom, String prenom) {
……………
}
@Override
public String toString() {
…………
}
@Override

public boolean equals(Object obj) {


………………
}

}
a) Définir le constructeur pour initialiser les attributs de cette classe. (0.5 pt)
b) Donner la définition de la méthode « toString », afin de retourner une chaine porteuse
d’informations sur une personne, la chaine aura la forme suivante : (1 pt)
cin xxxx , nom : xxxxx , prénom : xxxxxx.
c) Redéfinir la méthode « equals » pour qu’il compare deux personnes selon leurs cin ou les
noms et les prénoms. (1.5 pt)
III-2. Le détail de la classe « PropriétaireFidèle » est le suivant :
public class PropriétaireFidèle extends Personnes implements Comparable {
private Integer numCarte,point;
public PropriétaireFidèle(………….) {
……………
}
……. ….. Getter et Setter
@Override
public String toString() {
………………………
}
@Override
public int compareTo(Object t) {
………………
}

}
a) Proposer un constructeur adéquat permettant d’initialiser tous les attributs ; (1 pt)
b) Donner les getters et setters de toutes les propriétés de la classe PropriétaireFidèle. (1 pt)
c) Redifinir la méthode « toString », afin de retourner une chaine porteuse d’informations sur
une personne, la chaine aura la forme suivante : (1 pt)
cin xxxx , nom : xxxxx , prénom : xxxxxx , numéro carte xxxxx , points xxxxx
d) Redifinir la méthode compareTo qui compare deux Propriétaires Fidèles par leurs points.
(1 pt)
III-3. Le détail de la classe « StationServices» est le suivant :
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
public class StationServices {
private String adresse,tel;
private Date dateDernierControle;
private ArrayList<PropriétaireFidèle> listes;
public StationServices(String adresse, String tel, Date dateDernierControle) {
this.adresse = adresse;
this.tel = tel;
this.dateDernierControle = dateDernierControle;
listes= new ArrayList<PropriétaireFidèle>();
}
public boolean addPersonne(PropriétaireFidèle P){
………….
}
public boolean dellPersonne(PropriétaireFidèle p){
…………
}
public Personnes getPersonne(int index){
……………
}
public Personnes getPersonne(String cin){
…………….
}
public void tierListeParPoint(){
…………..
}

@Override
public String toString() {
…………..
}

Donner le code des méthodes suivantes :


a- addPersonne (…) : permet d’ajouter à la collection une nouvelle Personne et retourne l’état
de l’opération ; (1 pt)
b- dellPersonne () : permet de supprimer une Personne de la collection en se basant sur un
objet « PropriétaireFidèle » et retourne l’état de la suppression . (1 pt)
c- getPersonne () : permet de retourner une personne de la collection en se basant sur un
index. La vérification de la validité de l’index est indispensable ; (1 pt)
d- getPersonne () : permet de retourner une personne de la collection en se basant sur un le cin
d’une personne. (1 pt)
e- trierListeParPoint () qui permet de trier la collection par les point accumulés par les propriétaires.
(1.5 pt)
f- Redifinir la méthode « toString », afin de retourner une chaine porteuse d’informations sur toutes
les personnes de la stations , la chaine aura la forme suivante : (1.5 pt)
la Station de Service d adresse xxxxxx , tel xxxxx , date Dernier Contrôle xxxxxxx
cin xxxx , nom : xxxxx , prénom : xxxxxx , numéro carte xxxxx , points xxxxx
cin xxxx , nom : xxxxx , prénom : xxxxxx , numéro carte xxxxx , points xxxxx
……………….

DOSSIER IV : C/S (8 pts)


Les clients de la société X voudraient consulter leurs points à distant c’est pour cela la société
mise en place une application client serveur qui répondre à ce besoin sous une architecture donnée ci-
dessous :

Le client peut accéder à partir de son poste en envoyant le numéro de la carte au serveur1 ce
dernier contient un programme à l’écoute de tous les demandes clients. Le serveur1 envoie une
requête au serveur2 dont on a installé la base de données concernant les clients abonnés et pour
remettre cette connexion on a utilisé le Framework JDBC pour accéder à la base de données.
1- Questions de cours : (2 pt)
a- Donner l’architecture décrite ci-dessus?
b- Définir une Socket. Quelle est la différence entre socket TCP/IP et UDP ?
c- Que signifie le terme middleware.
2- Le programme coté client : (3 pt)
Ecrire un programme client en respectant les étapes suivantes:
• Demande de connexion au serveur.
• Saisir au clavier et envoyer le numéro de la carte.
• Recevoir les données envoyées par le serveur (le nombres des points accumulé dans le
numéro envoyé)
• Fermeture de la connexion à la fin (réception d’une ligne vide ‘NULL’).
3- Programme cote serveur: (3 pt)
Supposant que le serveur traite un seul client à la fois donner son programme en respectant
les étapes suivantes:
• Acceptation de la connexion
• Recevoir le numéro de la carte envoyé par le client
• Le serveur1 fait appel à une fonction prés compilé dans le serveur serveur2 nommée
« nombrePoint » qui reçoit comme paramètre le numéro de la carte et retourne le leur
nombre de point.
• Lorsque le serveur1 obtient le nombre de point, il l’envoie au client.
• Fermeture de la connexion.
Éléments de correction de DAI :

DOSSIER I : VB (10 pts)


I-1.

Imports System.Data.SqlClient
Public Class Form1
Private cn As SqlConnection
Private dst As New DataSet
Private adptVehicule As SqlDataAdapter
Private adptPayement As SqlDataAdapter
Private adptPompe As SqlDataAdapter
I-2.

Sub connecter()
Try
cn = New SqlConnection("Data Source=(local);Initial Catalog=sserv;Integrated
Security=True")
cn.Open()
Catch ex As Exception
MessageBox.Show("Erreur de connexion" + ex.Message)
End
End Try
End Sub
I-3.

Sub chargerDataSet()
Dim cmdv, cmdp, cmdpp As SqlCommand
cmdv = New SqlCommand("select * from vehicule", cn)
cmdp = New SqlCommand("select * from InstancePayement ", cn)
cmdpp = New SqlCommand("select * from Pompes ", cn)
adptPayement = New SqlDataAdapter(cmdp)
adptPompe = New SqlDataAdapter(cmdpp)
adptVehicule = New SqlDataAdapter(cmdv)
adptVehicule.Fill(dst, "vehicule")
adptPayement.Fill(dst, "InstancePayement")
adptPompe.Fill(dst, "Pompes")
End Sub

I-4.

Private Sub TextNumS_Validated(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles TextNumS.Validated
With dst.Tables("Pompes")
For i = 0 To .Rows.Count - 1
If .Rows(i).Item("numStation") = Integer.Parse(TextNumS.Text.Trim) Then
CmbNumP.Items.Add(.Rows(i).Item("numPomp"))
End If

Next
End With

End Sub
I-5.

Sub Lister_vehicule()
Me.DGV.DataSource = dst.Tables("vehicule")
End Sub
I-6.

Private Sub TextRechMat_TextChanged(ByVal sender As System.Object, ByVal e As


System.EventArgs) Handles TextRechMat.TextChanged
Dim dv As New DataView(dst.Tables("vehicule"))
dv.RowFilter = "immat like '" & TextRechMat.Text.Trim & "%'"
Me.DGV.DataSource = dv
End Sub

I-7.

Private Sub CmdAjouter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles CmdAjouter.Click
Dim dr As DataRow
dr = dst.Tables("vehicule").NewRow
dr(0) = TextImmat.Text
dr(1) = TextMrq.Text
dr(2) = TextClr.Text
dr(3) = TextNumC.Text
dst.Tables("vehicule").Rows.Add(dr)

Dim bd As New SqlCommandBuilder(adptVehicule)


adptVehicule.Update(dst, "vehicule")
dst.Clear()
chargerDataSet()
Lister_vehicule()
End Sub

Private Sub CmdEnregistrer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)


Handles CmdEnregistrer.Click
Dim mat As String = DGV.CurrentRow.Cells(0).Value

Dim dr As DataRow
dr = dst.Tables("InstancePayement").NewRow
dr(1) = mat
dr(2) = CmbNumP.SelectedValue
dr(3) = Val(TextPLitre.Text.Trim)
dr(4) = Val(TextNLitre.Text.Trim)
dr(5) = DTPpayemet.Value.Date.ToString
dst.Tables("vehicule").Rows.Add(dr)

Dim bd As New SqlCommandBuilder(adptPayement)


adptVehicule.Update(dst, "InstancePayement")
dst.Clear()
chargerDataSet()

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles


MyBase.Load
connecter()
chargerDataSet()
Lister_vehicule()
End Sub

End Class

DOSSIER II : WEB (8 pts)

6.
<?php
$host = "ServeurX"; // L'adresse du serveur
$login = "SuperAd"; // Le nom d'utilisateur de mysql
$password = "1a2b3c"; // Le mot de passe de mysql
$base = "StationService"; // Le nom de la base
functionconnexion()
{
global $host, $login, $password, $base;
$db = mysql_connect($host, $login, $password);
mysql_select_db($base,$db);
}
?>

7.

<?php
//appel de la fonction connexion()
include("connexion.php");
connexion();
//les instructions de formation de la requête SQL
$sql= "CREATE TABLE IF NOT EXISTS `Employe` (";
//insérer dans la table la colonne "numEmp" de type int (entier)
$sql .= "`numEmp` int NOT NULL auto_increment,";
//insérer la colonne "cin" de type "nchar" et qui ne peut être nulle
$sql .= "`cin` nchar(10) NOT NULL,";
$sql .= "`nom` nchar(10) NOT NULL,";
$sql .= "`prenom` nchar(10) NOT NULL,";
$sql .= "`dateEmb` date NOT NULL,";
$sql .= "`numStationService` int NOT NULL,";
$sql .= "PRIMARY KEY (`numEmp`),";
$sql .= "UNIQUE KEY `numEmp_2` (`numEmp`),";
$sql .= "KEY `numEmp` (`numEmp`)";
// déterminer le type de table
$sql .= ") ENGINE=MyISAM;";
/* soumettre la requête formée à la base de données,et affiche une éventuelle erreur à l'écran */
mysql_query($sql) or die(mysql_error());
// la déconnexion
mysql_close();
?>

8.

<HTML>
<HEAD>
<TITLE>Page de consultation</TITLE>
<META CHARSET="UTF-8"/>
</HEAD>
<BODY><H1 ALIGN="CENTER">Liste des employés</H1>
<TABLE BORDER=1 BGCOLOR="#A6CAF0">
<TR>
<TD>CIN</TD>
<TD>Nom</TD>
<TD>Prénom</TD>
<TD>Date d’embauche</TD>
<TD>Numéro station-service</TD>
<TD>Actions</TD>
</TR>
<?php
include("connexion.php");
// Etablir la connexion
connexion();
// On récupère les enregistrements de la table Employe
$query = "select * from Employe";
$result = mysql_query($query);
// On parcourt la liste des enregistrements
while ($row = mysql_fetch_assoc($result)) {
$cin= $row['CIN'];
$nom = $row['Nom'];
$prenom = $row['Prenom'];
$dateemb= $row['dateEmb'];
$numstationservice= $row['numStationService'];
$numemp= $row['numEmp'];
echo "<tr> \n";
echo "<td>$cin</td> \n";
echo "<tr><td>$nom</td> \n";
echo "<td>$prenom</td> \n";
echo "<td>$dateemp</td> \n";
echo "<td>$numstationservice</td> \n";
echo "<td><a href=\"modifier.php?id=$numemp\">Modifier</a>";
echo " <a href=\"supprimer.php?id=$numemp\">Supprimer</a></td>";
echo "</tr>";
}
// Fermeture de la connexion à la BD
mysql_close();
?>
<TABLE>
</BODY>
</HTML>

9.

<scriptlanguage="javascript">
functionsure(){
return confirm("Vous êtes sûr de vouloir valider la suppression ?");
}
</script>

10.

<?php
include("connexion.php");
connexion();
header('Location: acceuil.php');
?>

DOSSIER III : JAVA (14 pts)


III-1. la classe « Personnes»:
import java.util.Objects;
public class Personnes {
private String cin,nom,prenom;

public Personnes(String cin, String nom, String prenom) {


this.cin = cin;
this.nom = nom;
this.prenom = prenom;
}
public String getCin() {
return cin;
}
public String getNom() {
return nom;
}
public String getPrenom() {
return prenom;
}
public void setCin(String cin) {
this.cin = cin;
}
public void setNom(String nom) {
this.nom = nom;
}
public void setPrenom(String prenom) {
this.prenom = prenom;
}
@Override
public String toString() {
return "cin=" + cin + ", nom=" + nom + ", prenom=" + prenom ;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Personnes other = (Personnes) obj;
if (!Objects.equals(this.cin, other.cin) && (!Objects.equals(this.nom, other.nom) ||
!Objects.equals(this.prenom, other.prenom) ) ) {
return false;
}

return true;
}

}
III-2. la classe « PropriétaireFidèle »:
public class PropriétaireFidèle extends Personnes implements Comparable {
private Integer numCarte,point;
public PropriétaireFidèle(int numCarte, int point, String cin, String nom, String prenom) {
super(cin, nom, prenom);
this.numCarte = numCarte;
this.point = point;
}

public int getNumCarte() {


return numCarte;
}

public int getPoint() {


return point;
}

public void setNumCarte(int numCarte) {


this.numCarte = numCarte;
}

public void setPoint(int point) {


this.point = point;
}

@Override
public String toString() {
return super.toString() + ", numCarte=" + numCarte + ", point=" + point ;
}

@Override
public int compareTo(Object t) {
PropriétaireFidèle f=(PropriétaireFidèle)t;
return this.point.compareTo(f.getPoint());
}

}
III-3. la classe « StationServices»:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;

public class StationServices {


private String adresse,tel;
private Date dateDernierControle;
private ArrayList<PropriétaireFidèle> listes;

public StationServices(String adresse, String tel, Date dateDernierControle) {


this.adresse = adresse;
this.tel = tel;
this.dateDernierControle = dateDernierControle;
listes= new ArrayList<PropriétaireFidèle>();

public String getAdresse() {


return adresse;
}

public String getTel() {


return tel;
}

public Date getDateDernierControle() {


return dateDernierControle;
}

public void setAdresse(String adresse) {


this.adresse = adresse;
}

public void setTel(String tel) {


this.tel = tel;
}

public void setDateDernierControle(Date dateDernierControle) {


this.dateDernierControle = dateDernierControle;
}
public boolean addPersonne(PropriétaireFidèle P){
return listes.add(P);
}

public boolean dellPersonne(PropriétaireFidèle p){


return listes.remove(p);
}
public Personnes getPersonne(int index){
if (index>0 && index <listes.size())
return listes.get(index);
return null;
}
public Personnes getPersonne(String cin){
PropriétaireFidèle p = new PropriétaireFidèle(0,0,cin,"","");
if (listes.contains(p))
return listes.get(listes.indexOf(p));
return null;
}
public void tierListeParPoint(){
Collections.sort(listes);
}

@Override
public String toString() {
String s="la Station de Service d adresse " + adresse + ", tel " + tel + ", date Dernier Controle "
+ dateDernierControle + "\n";
for (PropriétaireFidèle p : listes)
s+=p+"\n";
return s;
}

}
DOSSIER IV : C/S (8 pts)

Das könnte Ihnen auch gefallen