GPCL

 

 (Gestion, Polygone, Centre, Loisir)



 Progiciel de gestion des centres de loisirs du Patronage Laïque de Lorient.
(En version Windows, Linux et Mac)



GPCLChargement

Chargement des données à l'ouverture du logiciel.


Contexte de l'application

Activités concernées

Participation à un projet d’évolution d’un SI (solution applicative et d’infrastructure portant prioritairement sur le domaine de spécialité du BTS SIO).

Prise en charge d’incidents et de demandes d'assistance liés au domaine de spécialité du candidat.

Elaboration de documents relatifs à la production et à la fourniture de services.

Productions relatives à la mise en place d’un dispositif de veille technologique et à l’étude d’une technologie, d’un composant, d’un outil ou d’une méthode




PROCESSUS METIER liés à cette application et au BTS SIO :

   A1.1.1 : Analyse du cahier des charges d’un service à produire :
      Etude du cahier des charges, des propositions de créations et des modifications à apporter sur l’application web.

   A1.2.3 : Evaluation des risques liés à l'utilisation d'un service :
      Sécurisation des données accessibles depuis le serveur.

   A1.3.1 : Test d’intégration et d'acceptation d'un service :
      Test de l'application sur serveur local et serveur distant.

   A1.3.3 : Accompagnement et mise en place d'un nouveau service :
      Accompagnement sur l'installation et la configuration du logiciel et du serveur.

   A1.3.4 : Déploiement d’un service :
      Déploiement en réelles conditions d’utilisation.

   A1.4.1 : Participation à un projet :
      Participation à la restructuration du service.

   A2.1.1 : Accompagnement des utilisateurs dans la prise en main d’un service :
      Formation des utilisateurs pour la mise à jour du site.

   A2.2.1 : Suivi et résolution d'incidents :
      Suivi du logiciel pour les mises à jours.

   A2.2.2 : Suivi et réponse à des demandes d'assistance :
      Assistance sur l'installation des stations Linux, du paramétrage du serveur.

   A2.3.1 : Identification, qualification et évaluation d'un probléme :
      Proposition de la solution logicielle sur la meilleure réception des données en intégralité suivant la connexion existante.

   A2.3.2 : Proposition d’amélioration d’un service :
      Proposition du module de communication entre la base de données et le logiciel existant en VBA.

   A3.1.1 : Proposition d'une solution d'infrastructure :
      Proposition sur la mise en place d'un serveur qui héberge la base de données.

   A3.1.2 : Maquetage et prototype d'une solution d'infrastructure :
      Prototype du serveur sur Raspberry PI.

   A3.2.1 : Installation et configuration d'éléments d'infrastructure :
      Installation et configuration de stations témoins sur Linux et du serveur.

   A3.2.2 : Remplacement ou mise à jour d’éléments défectueux ou obsolètes :
      Remplacement du logiciel client VBA en logiciel compatible multiplateforme (Java).

   A4.1.1 : Proposition d’une solution applicative :
      Proposition d’une solution multiplateforme.

   A4.1.2 : Conception ou adaptation de l’interface utilisateur d’une solution applicative :
      Conception du logiciel client et adaptation de logiciel VBA côté secrétaire pour la communication avec la base de données.

   A4.1.3 : Conception ou adaptation d’une base de données :
      Création d’une base de données sur le serveur Linux et création d'une base de données SQLite sur le logiciel client.

   A4.1.7 : Développement, utilisation ou adaptation de composants logiciels :
      Développement d'une solution logicielle et adaptation du logiciel centrale pour la communication avec la base de données.

   A4.1.10 : Rédaction d'une documentation d'utilisation :
      Création d'un menu d'aide aux usagers dans le logiciel.

Travaux effectués





Extrait développement


(Développement de l'application cliente GPCL en Java sur Netbeans)

 

Chargement du logiciel:


pageAccueil

Démarrage du programme :


                
                    
/* * Classe principale du programme. * Le programme démarre par cette classe. * * Auteur : ...................... Cavron Jérémy * Date de création : ............ 25/09/2014 * Date de modification : ........ 03/12/2014 */ //Package de départ du programme package gpcl; //Importation des classes nécessaires import control.ConnexionSystem; import control.GestionFichier; import control.ImportDonnees; import control.ThreadStart; import model.MemoString; import model.RequeteDBLocale; //importation des vues nécessaires import vue.FenPrinc; import vue.FenInit; import vue.FenRecRens; /** * * @author Cavron Jérémy */ public class GPCL extends Thread { //Déclaration des propriétés private static final FenPrinc FENETREPRINC = new FenPrinc();//Instanciation Fenetre principale private static final FenInit LAFENINIT = new FenInit();//Instanciation Fenetre de démarrage private static final ImportDonnees IMPORTLESDONN = new ImportDonnees();//Instanciation Classe ImportD private static final RequeteDBLocale REQUETE = new RequeteDBLocale();//Instanciation Classe Requete private static final ConnexionSystem connSys = new ConnexionSystem(); /** * Constructeur de la classe. */ public GPCL() { } /** * Procédure d'initialisation des composants */ private void init() { //Instanciation de classes GestionFichier gestFichier = new GestionFichier(); //Afficher la fenêtre FenInit LAFENINIT.setVisible(true); LAFENINIT.getProgBar().setValue(2);//Incrémentation de la progress bar LAFENINIT.setmodificationTxtCtrl("Vérification Base de données. \n"); //Condition si la base de données locale existe. Si oui. on importe les données //distante, sinon on crée la base de de données locale et on importe ensuite //les données distantes. if (gestFichier.verif(MemoString.NOMBDD)) { LAFENINIT.getProgBar().setValue(3);//Incrémentation de la progress bar LAFENINIT.setmodificationTxtCtrl("Base de données locale GPCL ok... \n"); //connexion à la bdd locale REQUETE.connexionLocale(); //Si la base de données locale à déjà les données du jour alors.. if (REQUETE.verifDateJourLocale(1)) { System.out.println("Base de données locale du jour déj` importée."); System.out.println("Ouverture du programme."); REQUETE.fermeConnexion(); } else { //sinon REQUETE.fermeConnexion(); //Connection internet en Dial up et suivant le système d'exploitation. connSys.Connexion(LAFENINIT.getJTxt()); //Importation des données de la base de données distante vers //la base de données locale FENETREPRINC.setLblNCentre(IMPORTLESDONN.importation(1)); //fermeture connexion internet connSys.DeconnexionSystem(); } FENETREPRINC.initClasse(); //Rendre visible la fenêtre FenPrinc FENETREPRINC.setVisible(true); //Fermeture de la fenêtre FenInit LAFENINIT.dispose(); } else { /* Sinon création de la base de données locales avec import des données distant */ System.out.println("La base de données locale est inexistante."); LAFENINIT.getProgBar().setValue(3);//Incrémentation de la progress bar LAFENINIT.setmodificationTxtCtrl("Création de la base de données. \n"); FenRecRens rensCentre = new FenRecRens(); //Rendre visible la fenêtre FenRecRens rensCentre.setVisible(true); /* Tant que getTxtVar ne retourne pas 1 on boucle Permet de faire une pause sur le chargement, le temps de remplir le formulaire */ while (!rensCentre.getTxtVar().equals("1")) { LAFENINIT.setmodificationTxtCtrl(""); } ...... /** * Procédure de départ du programme * * @param args the command line arguments */ public static void main(String[] args) { GPCL gpcl = new GPCL();//Instanciation de la même classe /* Création d'un thread pour l'affichage des messages console et l'incrémentation de la progress bar. reçoit en paramètre la progressBar et le JTextArea */ ThreadStart threadStart = new ThreadStart(gpcl.LAFENINIT.getProgBar(), gpcl.LAFENINIT.getJTxt()); //Démarrage du thread threadStart.start(); //Appel à l'initialisation de cette classe. gpcl.init(); //threadStart.stop(); } ....

Première ouverture du programme:


configCentre

Demande le nom du centre :


                
                    
/* * Class de renseignement et création de la base de données * locale. * * Auteur : ........................... Cavron Jérémy * Date de création : ................. 29/09/2014 * Date de modification : ............. 20/11/2014 */ package vue; import control.CreerDB; import javax.swing.JOptionPane; import control.Fichier; import model.MemoString; /** * * @author Cavron Jérémy */ public class FenRecRens extends javax.swing.JFrame { private static final Fichier fichier = new Fichier(); private String nomCentre; private int nb; CreerDB creationDB = new CreerDB(); /** * Constructeur de la classe */ public FenRecRens() { initComponents(); this.nb = 1; txtNomCon.setText(MemoString.NOMCONN); txtNomUt.setText(MemoString.UTCONN); txtMdp.setText(MemoString.MDPCONN); } /** * Procédure de création BDD * @param nb est de type entier. */ private void creationP(){ //Création de la base de données locale creationDB.createTable();//Création des tables //Initilisation des tuples //creationDB.setTuple(nomCentre, adresse, cP, ville); this.setVisible(false); System.out.println("Création de la base de données."); //Insertion creationDB.insertTuple(1, nomCentre);//insertion du premier centre } private void creationD(){ System.out.println("Insertion du deuxième centre."); //Insert nouveau centre creationDB.insertTuple(2, txtNomC.getText());//insertion du premier centre } //--- Getters --- /** * Retourne le nom du centre * @return nomCentre qui est de type String */ public String getNomC(){ return nomCentre; } //--- Setters --- public String getTxtVar(){ return txtVar.getText(); } private void creationFichier(){ fichier.creationFichier("", "connexion.cmd");//Création du fichier de connexion rasdial.exe fichier.creationFichier("", "deconnexion.cmd");//Création du fichier de déconnexion rasdial.exe fichier.ecrireDansFich("", "connexion.cmd", "rasdial.exe " + txtNomCon.getText() + " " + txtNomUt.getText() + " " + txtMdp.getText()); fichier.ecrireDansFich("", "deconnexion.cmd", "rasdial.exe /disconnect"); } ...

Menu Principal:


fenetrePrinc

 






Permet d'accéder à l'activité principale ou alors de changer de centre
(si l'utilisateur a enregistré 2 centres). Permet également de voir les erreurs de
connexion et le déroulement du programme. On peut aussi importer manuellement
les données. En mode normal d'utilisation, Si la date du jour (suivant
l'école ou la base de loisirs dans la base de données distante)
est identique à la date du jour actuelle, alors le logiciel télécharge
tout seul les données.



Fenêtre principale :


                
                    
/* * Classe FenPrinc. Fenêtre principale du programme GPCL * * Auteur : ................. Cavron Jérémy * Date de création : ....... 25/09/2014 * Date de modification : ... 02/12/2014 * */ package vue; //Les imports import control.ConnexionSystem; import control.DateFrEng; import java.text.DateFormat; import java.util.Date; import java.util.Locale; import javax.swing.JOptionPane; import javax.swing.JProgressBar; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import model.MemoString; import control.ThreadBarImportP; import control.Fichier; import control.ImportDonnees; import control.ThreadImport; import model.ConnexionDB; import model.RequeteDBLocale; /** * * @author Cavron Jérémy */ public class FenPrinc extends javax.swing.JFrame { //Déclaration des propriétés private Date dateCourante; private static final Fichier FICHIER = new Fichier(); private static final FenList fenetreList = new FenList(); private static final RequeteDBLocale REQUETEL = new RequeteDBLocale(); private static final ConnexionDB DBDISTANTE = new ConnexionDB(); private static final ImportDonnees IMPORT = new ImportDonnees(); private static final DateFrEng convertDate = new DateFrEng(); private int increment, lPercent, nbL; private static final ConnexionSystem connSys = new ConnexionSystem(); /** * Constructeur de la classe */ public FenPrinc() { this.setTitle(MemoString.VERSION); initComponents(); // Initialisation des composants } public void initClasse(){ FICHIER.resetFichier(MemoString.EMPLACEMENT_L, MemoString.NOM_FICHIER_L, MemoString.ENTETE_L); ecoutejdp(); setDateJour(); // Initialisation de la date du jour remplirCombo(); } private void remplirCombo(){ REQUETEL.connexionLocale(); //Remplissage du combox avec les nom des centres. 2 noms max for(int i=1;i<=REQUETEL.getCompteCentre(); i++){ this.cbxChoix.addItem(REQUETEL.getCentreBDD(i)); } REQUETEL.fermeConnexion(); } /** * Procédure de création d'écouteur sur le TextField du composant * JXDatePicker */ private void ecoutejdp() { //Déclaration et initialisation d'un écouteur DocumentListener DocumentListener l = new DocumentListener() { /** * Mise à jour quand le texte est mis à jour dans le champ * @param e est de type DocumentEvent */ @Override public void changedUpdate(DocumentEvent e) {} /** * Mise à jour quand le texte est inséré dans le champ * @param e est de type DocumentEvent */ @Override public void insertUpdate(DocumentEvent e) { btnImport.setEnabled(true); } /** * Mise à jour quand le texte est supprimé dans le champ * @param e est de type DocumentEvent */ @Override public void removeUpdate(DocumentEvent e) {} }; } ....

Importation des données distantes :


                
                    
/* * Classe qui importe les données de la base de données distante vers * la base de données locale * * Auteur : .................... Cavron Jérémy * Date de création : .......... 11/11/2014 * Date de modification : ...... 02/12/2014 */ package control; import java.util.ArrayList; import java.util.List; import model.Bv; import model.ConnexionDB; import model.Adherent; import model.RequeteDBLocale; /** * * @author Cavron Jérémy */ public class ImportDonnees { //Déclaration des propriétés private static final ConnexionDB connexion = new ConnexionDB(); private static final RequeteDBLocale requete = new RequeteDBLocale(); private static final Adherent unEnfant = new Adherent(); private List<Adherent> listEnfant= new ArrayList<>(); private List<Bv> listBv = new ArrayList<>(); private String dateChoisie; private String nomCentre; /** * Constructeur de la classe */ public ImportDonnees(){ } /** * Fonction qui importe les données distantes et retourne * le nom du centre. * @param idCentre est de type entier. * @return nomCentre est de type chaîne. */ public String importation(int idCentre){ //Connexion à la base de données distante connexion.connexion(); //Connexion à la base locale requete.connexionLocale(); nomCentre = requete.getCentreBDD(idCentre); if(connexion.recupDateJourBDD(nomCentre)){ requete.suppTuples(); } listEnfant.clear(); listBv.clear(); //Initialisation des listes listEnfant = connexion.getDonnees(nomCentre);//liste des enfants. listBv = connexion.getDonneesBv();//Liste des bons vacances. //vérification si la liste des enfants n'est pas vide if (!listEnfant.isEmpty()) { //Boucle sur le nombre total d'enfants récupéré for (int i = 0; i <= listEnfant.size() - 1; i++) { requete.setAdherent(listEnfant.get(i).getId(), listEnfant.get(i).getNomCentre(), listEnfant.get(i).getNumAdherent(), listEnfant.get(i).getDateCreation(), listEnfant.get(i).getNom(), listEnfant.get(i).getPrenom(), listEnfant.get(i).getDateNais(), listEnfant.get(i).getSoldeJour(), listEnfant.get(i).getQf(), listEnfant.get(i).getBvPre(), listEnfant.get(i).getBvActu(), listEnfant.get(i).getAdresse(), listEnfant.get(i).getVille(), listEnfant.get(i).getCp(), listEnfant.get(i).getComms(), listEnfant.get(i).getTuteur1(), listEnfant.get(i).getTelFix1(), listEnfant.get(i).getTelTrav1(), listEnfant.get(i).getTelMobil1(), listEnfant.get(i).getTuteur2(), listEnfant.get(i).getTelFix2(), listEnfant.get(i).getTelTrav2(), listEnfant.get(i).getTelMobil2(), listEnfant.get(i).getAutorise(), listEnfant.get(i).getMonte(), listEnfant.get(i).getDescent(), listEnfant.get(i).getInscritA(), listEnfant.get(i).getAideSoc(), listEnfant.get(i).getCircuitBus(), listEnfant.get(i).getRemarque(), listEnfant.get(i).getPrevMatin(), listEnfant.get(i).getPrevRepas(), listEnfant.get(i).getPrevAprem(), listEnfant.get(i).getMatinR(), listEnfant.get(i).getRepasR(), listEnfant.get(i).getArpremR(), listEnfant.get(i).getDatePro(), listEnfant.get(i).getNumMairie() ); } } else { System.out.println("Pas d'enfants de prévu aujourd'hui sur ce centre."); } if(!listBv.isEmpty()){ //Boucle sur le nimbre total des années de bons vacances. for(int i=0; i<= listBv.size() - 1; i++){ requete.setBvLocal(listBv.get(i).getId(), listBv.get(i).getAnnee()); } }else{ System.out.println("Pas de BV pour cette année."); } requete.fermeConnexion(); connexion.deconnexion(); return nomCentre; } } ....

Liste des enfants inscrits présents:


listeEnfant

 


1: Nom du centre

2: Menu : a) : imprimer avec aperçu - b) : imprimer - c) : enregistrer
d) : exporter - e) : aide utilisation

3: Liste des enfants (clique actif sur une ligne
pour avoir des informations complémentaires)

4: Etat des actions apportées



Fenêtre liste des enfants :


                
                    
/* * Classe FenList. Cette classe permet la visualisation, la gestion de la liste * Permet l'impression de document. * * Auteur : ..................... Cavron Jérémy * Date de création : ........... 01/11/2014 * Date de modification : ....... 03/12/2014 */ package vue; //Les imports de bibliothèques import control.Imprimer; import control.PrintPreview; import java.awt.Color; import java.awt.print.PrinterJob; import java.util.ArrayList; import java.util.List; import javax.print.attribute.HashPrintRequestAttributeSet; import javax.swing.JLabel; import javax.swing.JCheckBox; import javax.swing.ImageIcon; import javax.swing.JOptionPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumnModel; import control.CouleurCelluleS; import control.CouleurCellulesPrev; import control.ImportDonnees; import java.awt.Font; import java.awt.event.ItemEvent; import java.text.MessageFormat; import javax.print.attribute.standard.DialogTypeSelection; import javax.print.attribute.standard.MediaPrintableArea; import javax.print.attribute.standard.OrientationRequested; import javax.print.attribute.standard.Sides; import javax.swing.table.DefaultTableCellRenderer; import model.ConnexionDB; import model.Adherent; import model.RequeteDBLocale; import control.ConnexionSystem; import javax.swing.JTextArea; /** * Classe FenList qui hérite d'une JFrame * * @author Cavron Jérémy */ public class FenList extends javax.swing.JFrame{ private static final ImportDonnees IMPORTLESDONN = new ImportDonnees();//Instanciation Classe ImportD private static final JCheckBox CHOIXTOTAL = new JCheckBox(); private static final JCheckBox CHOIXPRESENT = new JCheckBox(); private static final JLabel MESSAGE = new JLabel();//instance d'un JLabel. Création de message private Imprimer imprimer; private FenAide aide; private PrinterJob printerJob = PrinterJob.getPrinterJob(); private HashPrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet(); private static final RequeteDBLocale requete = new RequeteDBLocale(); private List<Adherent> listEnfant = new ArrayList<>(); private int lIdDuCentre, matinR, repasR, apremR; private String nomCentre; private Object[] tuple; private static final ConnexionDB connexionSrv = new ConnexionDB();//instance de la classe connexion serveur private static final ConnexionSystem CONNSYS = new ConnexionSystem(); /** * Constructeur de la classe FenList */ public FenList() { initComponents();//Initialisation des composants de la fenêtre. initCheckBox();//Initialisation des check box. } public void setId(int id){ lIdDuCentre = id; } /** * Procédure de suppression des lignes du tableau. * @param model est de type DefaultTableModel. */ public void suppLignes(DefaultTableModel model) { for (int i = model.getRowCount() - 1; i >= 0; i--) { model.removeRow(i); } } /** * Procédure d'initialisation du tableau. Ramplissage du tableau avec la BDD * locale. * @param filtre est de type chaîne. C'est le paramètre pour filtrer le tableau. */ public void initTableau(String filtre) { //Initialisation du modèle DefaultTableModel defaultModel = (DefaultTableModel) tbList.getModel(); TableColumnModel tcm = tbList.getColumnModel(); tuple = new Object[defaultModel.getColumnCount()]; CouleurCellulesPrev cCP = new CouleurCellulesPrev(); tcm.getColumn(14).setCellRenderer(new CouleurCelluleS()); DefaultTableCellRenderer entetePrev = new DefaultTableCellRenderer(); entetePrev.setBackground(new Color(0, 153, 255)); entetePrev.setFont(new Font("Courier New", Font.BOLD, 12)); //Entête en bleu for(int i=1;i<=3; i++){ tcm.getColumn(i).setHeaderRenderer(entetePrev); } //Entête en rouge DefaultTableCellRenderer entetePointage = new DefaultTableCellRenderer(); entetePointage.setBackground(new Color(255, 51, 51)); for(int i=4;i<=6; i++){ tcm.getColumn(i).setHeaderRenderer(entetePointage); } tcm.getColumn(14).setHeaderRenderer(entetePointage); //blocage modification taille de certaines cellules for(int i=1;i<=6; i++){ tcm.getColumn(i).setResizable(false); } //Suppression de la liste des enfants (pour remettre à 0) for (int i = 0; i <= listEnfant.size() - 1; i++) { listEnfant.clear(); } //Connexion à la BDD locale requete.connexionLocale(); this.lblTitre.setText(nomCentre + " - " + "Liste des inscrits"); //Initialisation de la liste des enfants listEnfant = requete.getDonneesLocale(nomCentre, filtre); //vérification si la liste des enfants n'est pas vide if (!listEnfant.isEmpty()) { //Boucle sur le nombre total d'enfants récupéré for (int i = 0; i <= listEnfant.size() - 1; i++) { tuple[0] = listEnfant.get(i).getNom() + " " + listEnfant.get(i).getPrenom(); tuple[1] = listEnfant.get(i).getPrevMatin(); tuple[2] = listEnfant.get(i).getPrevRepas(); tuple[3] = listEnfant.get(i).getPrevAprem(); tuple[4] = listEnfant.get(i).getMatinR(); tuple[5] = listEnfant.get(i).getRepasR(); tuple[6] = listEnfant.get(i).getArpremR(); tuple[7] = listEnfant.get(i).getDateNais(); tuple[8] = listEnfant.get(i).getSoldeJour(); tuple[9] = listEnfant.get(i).getBvPre(); tuple[10] = listEnfant.get(i).getBvActu(); tuple[11] = listEnfant.get(i).getAideSoc(); tuple[12] = listEnfant.get(i).getQf(); tuple[13] = listEnfant.get(i).getVille(); /*Si on trouve des commentaires dans Spécial alors afficher "Oui"*/ if(!listEnfant.get(i).getComms().equals("")){ tuple[14] = "Oui"; }else{ tuple[14] = ""; } tuple[15] = listEnfant.get(i).getCircuitBus(); tuple[16] = listEnfant.get(i).getRemarque(); defaultModel.addRow(tuple);//Envoi des données dans le tableau } System.out.println("Remplissage du tableau ok."); } else { System.out.println("Pas d'enfants de prévu aujourd'hui sur ce centre."); } //Fermeture de la connexion à la BDD locale requete.fermeConnexion(); } .....

L'objet Adhérent (enfant) :


                
                    
/* * Classe Adherent. Objet enfant. * * Auteur : ................... Cavron Jérémy * Date de création : ......... 11/11/2014 * Date de modification : ..... 02/12/2014 */ package model; /** * * @author jeremycavron */ public class Adherent { //Déclaration des propriétés private String nomCentre, dateCreation, nom, prenom, dateNais, qf, adresse, ville, cp, commentaire, tuteur1, telFix1, telTrav1, telMobil1, tuteur2, telFix2, telTrav2, telMobil2, monte, descent, aideSoc, circuitBus, remarque, datePro; private boolean bvPre, bvActu, autorise, inscriptAnne, prevMatin, prevRepas, prevAprem, matin_R, repas_R, aprem_R; private float soldeJour; private int id, numAdherent, numMairie; /** * Constructeur de la classe. */ public Adherent() { } /** * Constructeur 2 de la classe. * @param id est de type entier. * @param nomCentre est de type chaîne. * @param numAdherent est de type entier. * @param dateCreation est de type chaîne. * @param nom est de type chaîne. * @param prenom est de type chaîne. * @param dateNais est de type chaîne. * @param soldeJour est de type réel. * @param qf est de type chaîne. * @param bvPre est de type booléen. * @param bvActu est de type booléen. * @param adresse est de type chaîne. * @param ville est de type chaîne. * @param cp est de type chaîne. * @param commentaire est de type chaîne. * @param tuteur1 est de type chaîne. * @param telFix1 est de type chaîne. * @param telTrav1 est de type chaîne. * @param telMobil1 est de type chaîne. * @param tuteur2 est de type chaîne. * @param telFix2 est de type chaîne. * @param telTrav2 est de type chaîne. * @param telMobil2 est de type chaîne. * @param autorise est de type booléen. * @param monte est de type chaîne. * @param descent est de type chaîne. * @param inscriptAnne est de type booléen. * @param aideSoc est de type chaîne. * @param circuitBus est de type chaîne. * @param remarque est de type chaîne. * @param prevMatin est de type booléen. * @param prevRepas est de type booléen. * @param prevAprem est de type booléen. * @param matin_R est de type booléen. * @param repas_R est de type booléen. * @param aprem_R est de type booléen. * @param datePro est de type chaîne. * @param numMairie est de type entier. */ public Adherent(int id, String nomCentre, int numAdherent, String dateCreation, String nom, String prenom, String dateNais, float soldeJour, String qf, boolean bvPre, boolean bvActu, String adresse, String ville, String cp, String commentaire, String tuteur1, String telFix1, String telTrav1, String telMobil1, String tuteur2, String telFix2, String telTrav2, String telMobil2, boolean autorise, String monte, String descent, boolean inscriptAnne, String aideSoc, String circuitBus, String remarque, boolean prevMatin, boolean prevRepas, boolean prevAprem, boolean matin_R, boolean repas_R, boolean aprem_R, String datePro, int numMairie) { this.id = id; this.nomCentre = nomCentre; this.numAdherent = numAdherent; this.dateCreation = dateCreation; this.nom = nom; this.prenom = prenom; this.dateNais = dateNais; this.soldeJour = soldeJour; this.qf = qf; this.bvPre = bvPre; this.bvActu = bvActu; this.adresse = adresse; this.ville = ville; this.cp =cp; this.commentaire = commentaire; this.tuteur1 = tuteur1; this.telFix1 = telFix1; this.telTrav1 = telTrav1; this.telMobil1 = telMobil1; this.tuteur2 = tuteur2; this.telFix2 = telFix2; this.telTrav2 = telTrav2; this.telMobil2 = telMobil2; this.autorise = autorise; this.monte = monte; this.descent = descent; this.inscriptAnne = inscriptAnne; this.aideSoc = aideSoc; this.circuitBus = circuitBus; this.remarque = remarque; this.prevMatin = prevMatin; this.prevRepas = prevRepas; this.prevAprem = prevAprem; this.matin_R = matin_R; this.repas_R = repas_R; this.aprem_R = aprem_R; this.datePro = datePro; this.numMairie=numMairie; } //--- Les Getters --- /** * Fonction qui retourne l'id de l'adhérent. * @return id est de type entier. */ public int getId(){ return id; } ....

Information complémentaires sur le clic d'une ligne:


pageComplementaire

 




Fenêtre aperçu avant impression:


apercu

 




                
                    
/* * Classe PrintPreview. Permet d'avoir un aperçu avant impression. * * Source externe (internet) */ package control; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.awt.print.PageFormat; import java.awt.print.Printable; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import java.text.MessageFormat; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JToolBar; import javax.swing.border.MatteBorder; /** * * @author Cavron Jérémy */ public class PrintPreview extends JFrame implements Runnable { protected JScrollPane AfficheAire; protected int m_wPage; protected int m_hPage; protected int width; protected int height; protected Printable m_cible; protected JComboBox m_cbxEchelle; protected PreviewContainer m_apercu; protected PageFormat pp_pf = null; protected JButton formatButton; protected JButton shrinkButton;//Bouton réduire. @SuppressWarnings("unused") private static final int INCH = 72; private static boolean bScallToFitOnePage = false; private String msg; JTable table; protected void getThePreviewPages() { m_wPage = (int) (pp_pf.getWidth()); m_hPage = (int) (pp_pf.getHeight()); int scale = getDisplayScale(); width = (int) Math.ceil(m_wPage * scale / 100); height = (int) Math.ceil(m_hPage * scale / 100); int pageIndex = 0; try { while (true) { BufferedImage img = new BufferedImage(m_wPage, m_hPage, BufferedImage.TYPE_INT_RGB); Graphics g = img.getGraphics(); g.setColor(Color.white); g.fillRect(0, 0, m_wPage, m_hPage); if (bScallToFitOnePage) { m_cible.print(g, pp_pf, -1); PagePreview pp = new PagePreview(width, height, img); m_apercu.add(pp); break; } else if (m_cible.print(g, pp_pf, pageIndex) != Printable.PAGE_EXISTS) { break; } PagePreview pp = new PagePreview(width, height, img); m_apercu.add(pp); pageIndex++; } } catch (OutOfMemoryError om) { JOptionPane.showMessageDialog(this, "L'image est trop volumineuse. Problème mémoire.", "Aperçu avant impression", JOptionPane.INFORMATION_MESSAGE); } catch (PrinterException e) { e.printStackTrace(); System.err.println("Erreur d'impression : " + e.toString()); } } protected void previewThePages(int orientation) { if (AfficheAire != null) { AfficheAire.setVisible(false); } m_apercu = new PreviewContainer(); getThePreviewPages(); AfficheAire = new JScrollPane(m_apercu); getContentPane().add(AfficheAire, BorderLayout.CENTER); setLocationRelativeTo(null); setVisible(true); System.gc(); } .....

Impression directe :


                
                    
/* * Classe Imprimer qui permet d'imprimer les documents. * * Auteur : ................... Cavron Jérémy * Date de création: ......06/11/2014 * Date de modification: ..06/11/2014 */ package control; import java.awt.print.PrinterException; import java.text.MessageFormat; import javax.print.attribute.HashPrintRequestAttributeSet; import javax.print.attribute.standard.OrientationRequested; import javax.swing.JTable; /** * * @author CAVRON Jérémy */ public class Imprimer { //Déclaration des varibales private JTable newTable = new JTable(); private String titre; /** * Constructeur de la classe Imprimer * @param choix est de type entier. Permet de savoir si c'est une impression * complète ou seulement la liste des présents. * @param titre est de type chaîne. Représente le titre de la page qui sera imprimé. * @param maTable est un objet de type table. Représente le tableau à imprimer */ public Imprimer(int choix, String titre, JTable maTable){ System.out.println(choix); setNewTable(maTable); setTitre(titre); impression(); } /** * Setter de la table * @param maTable est de type JTable */ private void setNewTable(JTable maTable){ newTable = maTable; } /** * Setter du titre de la page * @param titre est de type chaîne */ private void setTitre(String titre){ this.titre = titre; } /** * Procédure d'impression du document */ private void impression(){ MessageFormat tete = new MessageFormat(titre);//Entête de la page MessageFormat pied = new MessageFormat("Page{0, number, integer}");//Pied de la page HashPrintRequestAttributeSet printRequestSet = new HashPrintRequestAttributeSet(); printRequestSet.add(OrientationRequested.LANDSCAPE);//Orientation en mode paysage try{ newTable.print(JTable.PrintMode.FIT_WIDTH, tete, pied, false, printRequestSet, true); }catch(PrinterException e){ System.out.println("Problème d'impression"); } } }

Extrait de sauvegarde sur base de données locale :


                
                    
/** * Procédure de mise à jour sur la base de données locale. * @param id est de type entier. * @param matinR est de type booleen. * @param repasR est de type booleen. * @param apremR est de type booleen. * @param message est de type JLabel. Il permet d'afficher un message dans la * barre des tâches. */ public void sauvegardeCBX(int id, boolean matinR, boolean repasR, boolean apremR, JLabel message){ message.setText("Sauvegarde en cours. Patientez..."); try{ stmt = c.createStatement(); String sql = "UPDATE ADHERENT SET MATIN_R = '" + matinR + "', " + " REPAS_R = '" + repasR + "', APREM_R = '" + apremR + "' WHERE ID = " + id + ";"; stmt.executeUpdate(sql); c.commit(); message.setText("Sauvegarde effectuée avec succès."); }catch(Exception ex){ message.setText("Problème de sauvegarde."); System.out.println("Problème de suavegarde. " + ex); } }

Export des données de la base locale vers la base de données distante :


                
                    
/** * Procédure d'exportation de la mise à jour sur BDD distante. * @param id est de type entier. * @param matinR est de type entier. * @param repasR est de type entier. * @param apremR est de type entier. * @param message est de type JLabel. */ public void updateDonn(int id, int matinR, int repasR, int apremR, JLabel message){ message.setText("Exportation des données en cours. Patientez..."); try{ stmt = connexion.createStatement(); String maDate = dateFrEng.getFrToEng(dateFrEng.getDateCourante()); String sql = "UPDATE ADHERENT SET DATECREATION = '" + maDate + "', MATIN_R = '" + matinR + "', " + " REPAS_R = '" + repasR + "', APREM_R = '" + apremR + "' WHERE ID = " + id + ";"; stmt.executeUpdate(sql); message.setText("Export au serveur effectué avec succès."); }catch(Exception ex){ message.setText("Pas de connexion au serveur."); System.out.println("Problème de mise à jour de la BDD distante. " + ex); } }

Import/Export partie Access:



Import du driver ODBC-MySQL pour Windows

driverODBC

 




Paramétrage ODBC-SQL pour Access:

paramACCESS

 




Export : partie Access:



langage VBA

                
                    
' Module de classe ExportImportSrv. Exporte et importe les données vers le serveur. ' ' ' Auteur : ..................... Cavron Jérémy ' Date de création : ........... 03/12/2014 ' Date de modification : ....... 04/12/2014 ' '--- Constructeur du module de classe --- Public Sub ExportSrv() '--- Déclaration des propriétés --- Dim SQL As String Dim DB As DAO.Database Dim rsTlc As DAO.Recordset Dim rsAdh As DAO.Recordset Dim i As Integer Dim nb As Integer Dim lPercent As Single '--- Initialisation --- On Error GoTo Gestion_Erreurs Set DB = CurrentDb SQL = "SELECT * FROM touslescentres" 'Initialisation de la variable SQL Set rsTlc = DB.OpenRecordset(SQL, dbOpenDynaset) 'Initialisation du recorSet de la table touslescentres Set rsAdh = CurrentDb.OpenRecordset("ADHERENT") 'Initialisation du recordSet pour la table ADHERENT nb = DCount("[Centre année]", "touslescentres") 'Compte le nombre d'enregistrement de la table touslescentres '--- Début --- 'Ouverture de la fenêtre de progression DoCmd.OpenForm "FormAttente" Forms("FormAttente").lblInfo.Caption = "Veuillez patienter durant l'exportation ... " 'Initialisation du texte Forms("FormAttente").lblProgressBar.Width = 0 'Initialisation de la progressBar ' Nécessaire pour redonner la main à windows le temps de traiter les messages dans la pile DoEvents 'Suppression de l'ancienne table CurrentDb.Execute "DELETE * FROM ADHERENT;" 'Boucle sur tous les champs de la table touslescentres et copie vers le serveur For i = 1 To nb ' Calcul du pourcentage d'avancement lPercent = i / nb ' Met à jour l'étiquette d'avancement Forms("FormAttente").lblProgress.Caption = "Exportation en cours ... " & Format(lPercent, "00%") ' Met à jour la barre de progression Forms("FormAttente").lblProgressBar.Width = Forms("FormAttente").lblProgressBack.Width * lPercent ' Repaint le formulaire Forms("FormAttente").Repaint With rsAdh .AddNew .Fields("ID") = i 'id de l'adhérent 'nom du centre If IsNull(rsTlc.Fields("Centre année")) Then .Fields("NOMCENTRE") = "" Else .Fields("NOMCENTRE") = rsTlc.Fields("Centre année") End If ....

Import : partie Access:



langage VBA

                
                    
Public Sub Import() '--- Déclaration des propriétés --- Dim SQL As String Dim DB As DAO.Database Dim rsTlc As DAO.Recordset Dim rsAdh As DAO.Recordset Dim i As Integer Dim nb As Integer Dim lPercent As Single '--- Initialisation --- On Error GoTo Gestion_Erreurs Set DB = CurrentDb SQL = "SELECT * FROM touslescentres" 'Initialisation de la variable SQL Set rsTlc = DB.OpenRecordset(SQL, dbOpenDynaset) 'Initialisation du recorSet de la table touslescentres Set rsAdh = CurrentDb.OpenRecordset("ADHERENT") 'Initialisation du recordSet pour la table ADHERENT nb = DCount("ID", "ADHERENT") 'Compte le nombre d'enregistrement de la table ADHERENT '--- Début --- 'Ouverture de la fenêtre de progression DoCmd.OpenForm "FormAttente" Forms("FormAttente").lblInfo.Caption = "Veuillez patienter durant l'importation ... " 'Initialisation du texte Forms("FormAttente").lblProgressBar.Width = 0 'Initialisation de la progressBar ' Nécessaire pour redonner la main à windows le temps de traiter les messages dans la pile DoEvents 'Boucle sur tous les champs de la table touslescentres et copie vers le serveur For i = 1 To nb ' Calcul du pourcentage d'avancement lPercent = i / nb ' Met à jour l'étiquette d'avancement Forms("FormAttente").lblProgress.Caption = "Importation en cours ... " & Format(lPercent, "00%") ' Met à jour la barre de progression Forms("FormAttente").lblProgressBar.Width = Forms("FormAttente").lblProgressBack.Width * lPercent ' Repaint le formulaire Forms("FormAttente").Repaint rsTlc.Edit 'Pointage matin If IsNull(rsAdh.Fields("MATIN_R")) Then rsTlc.Fields("Matin_R").Value = 0 Else If (rsAdh.Fields("MATIN_R").Value = 1) Then rsTlc.Fields("Matin_R").Value = -1 Else rsTlc.Fields("Matin_R").Value = 0 End If End If rsTlc.Update ....

Production


... En Cours de rédaction ....

Source privées, non disponibles. (voir dans travaux effectués, les extraits de codes).


Retour d'expériences

J'ai eu l'occasion durant ce stage de gérer tout le projet pour lequel il m'avait été confié. De la proposition de solution à la formation d'utilisateurs en passant par le développement d'une structure imposée. A la fin du stage, le centre à mis en place des abonnements 3G haut débit pour chaque école et base de loisirs. Donc ma solution n'est plus autant optimisée pour l'utilisation des ressources qui utilisaient une connexion bas débit (Elle fonctionne parfaitement en haut débit, mais la meilleur solution dans ce cas est une application web). J'ai proposé au centre un nouveau projet qui passera par une solution complètement web. Ce qui sera adaptée au haut débit. De plus j'ai proposé de commander des tablettes tactiles pour faire les pointages. Ce qui enlèvera l'impression des listes d'états des présences et fera gagner un gain de temps. Sinon durant le stage, j'ai même été amené à dépanner les postes de certains utilisateurs et j'ai donné des conseils en sécurité pour le réseau interne du centre.
Pour résumer, j'ai été amené à la confirmation de mes compétences en tant que chef de conduite d'un projet. Donc beaucoup de charges mais très appréciable.