SIVOL Système d’Information Volailles MC Batut - T Heirman Comité de pilotage : MC Batut, B. Basso Artiguères : F Dubos*, MD Bernadet, M Ruinaut PEAT : Y Baumard, J Besnard, J Delaveau, D Gourichon, N Sellier URA : C. Beaumont*, M Chabault, N Sellier GABI : T Heirman, M Tixier Boichard*, A Vieaud SAGA : B Basso, R Duzert, C Marie-Etancelin, MM Richard* Depuis 2003 : 20 réunions (1 tous les 3 mois au début)
Quelles données gérer ? Modélisation des données : MCD fait avec PowerAMC
Pour qui ? : les UE et UR PSGen GFA URA URA SAGA Garen LGC UEPFG Jouy-en-Josas GABI PSGen (ancien GDA) E. Verrier Agathe Vieaud* Tours GFA URA Génétique Factorielle Avicole N. Sellier*/D.Gourichon* PEAT E. Duval M. Chabault* Unité de Recherche Avicole URA Garen O. Demeure F. Pitel LGC M. Ruinaut* MD Bernadet* C. Peillod Landes UEPFG Unité Expérimentale des Palmipèdes à Foie Gras G.Guy PalmiPôle C. Marie* B. Basso* SAGA Station d’Amélioration Génétique des Animaux Les UE dépendent des 2 départements GA et PHASE *=CP
Saisies portables sur le terrain Comment ? : interface + outils terrain Saisies portables sur le terrain Unité de Recherche Unité Expérimentale Extraction des données Valorisation des données SaS Enregistrement des données Suivi d’élevage JOUY EN JOSAS CTIG Sauvegardes Oracle 10g
Particularités des volailles Beaucoup de données : PEAT : 20 000 animaux identifiés par an Femelles en reproduction : GFA : 712 femelles contrôlées en individuel sur 4 mois 65796 œufs Pas d’identification normalisée Identification Sivol : Espèce de l’animal (2) : canard(6), poule(8), caille(9), dinde(10) (Sidex) Domaine de naissance (3): ART, GAV, GFA, URA Année de naissance (4) : 2008, 2009 Numéro de naissance (4) : boucle sur l’aile Lot de naissance (2) : 01,02,03, .etc. (ajouté pour passer 9999) Identification utilisée aussi par les autres UR volailles (Tours, Rhennes, LGC) Identification électronique en cours d’élaboration (E Ricard, B Basso)
Conduite par bande (cellule) Elevés au sol (cellule collective) ou en cage Bâtiment 340 Cellules Bâtiment 360 17 10 14 17 20 14 10 18 11 11 15 18 21 15 19 13 22 16 20 13 16 19 Cellule collective 1 2 3 4 5 6 7 8 9 10 11 Cellule divisée en cages Individuelle Collective
IHM : Interface Homme Machine Interface convivial créé avec les utilisateurs Connexion via un login/mot de passe Connexion sur une espèce et un domaine de production (autorisation) Multi-fenêtrage Droits différents suivant les utilisateurs rôles Oracle select/insert/update/delete sur les tables Développé sous VisualStudio 2005 (Framework 2.0, langage C#) utilisation des classes de Thierry pour BD, fonctions échangées avec Hervé et M-Hélène
Menu – Opérations regroupées par thèmes
Sélection : critères assez larges Opérateur : égale, différent, in, not in, entre, vide, non vide Pour les numériques : >, >=, <, <=
Affichage des données avec clés visuelles Touches dans la grille : comme dans Windows (en bleu foncé animaux sélectionnés) Se positionner sur UN animal : numéro de naissance ou numéro cage (orange) Trier les animaux : cliquer sur le titre de la colonne Ergonomie : quand on agrandit ou diminue la forme, les colonnes sont redimensionnées dgrv.ColumnHeadersDefaultCellStyle.BackColor = frmMaquette.coulColEnTete; dgrv.RowHeadersDefaultCellStyle.BackColor = frmMaquette.coulLigneEnTete; for (int i = 0; i < dgrv.ColumnCount; i++) dgrv.Columns[i].DefaultCellStyle.BackColor = frmMaquette.coulColNePasSaisir;
Actions possibles à partir d’une grille A partir de n’importe quelle grille, clic droit avec la souris Action à faire sur un ou plusieurs animaux Possible sur UN seul animal Dans toutes les grilles cmOperation.Enabled = true; menuCompter.Enabled = true; menuEnregistrer.Enabled = true; menuImprimer.Enabled = true; menuModifierReforme.Enabled = myDroit_Update; menuReactiver.Enabled = myDroit_Update; menuReformer.Enabled = myDroit_Update; menuChangerSexe.Enabled = myDroit_Update; Les droits : Insert, Update, Delete sur UNE table SELECT privilege FROM dba_tab_privs" WHERE grantee='" + myRole.ToString().ToUpper() + "'" AND table_name='" + nom_table + "'" AND privilege != 'SELECT'"
Saisie terrain : de nombreuses possibilités 1- Sur boîtier de saisie PDA : Saisie de la ponte Saisie des phénotypes liés à un locus visible à œil nu Saisie de mesures diverses (abattage, morphologie, comportement, prélèvement des mâles, échantillons) 2- Automate de pesées Baléa Pesées des animaux vivants Réforme, changement de sexe Chantiers divers (abattage, .etc.) Identification électronique 3- Saisie directe par l’IHM sur PC portable : Mirages, Eclosion Jaune = à saisir
Saisie de mesures diverses : exemple abattage Avant : Extraire les animaux à mesurer, choisir une première liste de mesures Envoyer le fichier au PDA Charger la liste sur le boîtier Se fait par bâtiment/cellule Choix des mesures à faire (10 maxi) Saisie par numéro animal ou par cage Saisie de la mesure : Contrôles de la mesure par rapport à des bornes (orange) et à un seuil (rouge) Listes possibles des animaux mesurés, non mesurés ou les deux avec mesures Gestion des doubles (avertit si animal déjà mesuré) Après : Extraire les mesures du PDA, envoyer les données au PC Importer les données, regarder le journal (anomalies)
MAJ à partir d’un fichier : souple DataGridView à 5 colonnes dgrv.Rows.Add("Domaine de naissance", "DOM_NAIS", "C", dimDomNais, 0); sql="select lib_champ,nom_champ,typ_data,dim,dec from sivol.parametre where dom_prod='" + myDomaine + "' and espece='" + myEspece + "and nom_table='" + nom_table + "';
MAJ des mesures d’abattage par l ’IHM Choisir les mesures à saisir sur les animaux Choisir les animaux
Suivi de l’élevage : liste et inventaire Extraction de données, listes, inventaires, bilans, statistiques élémentaires … Liste des pesées par animal sur une même ligne (poids en gramme, age en jour)
Suivi de l’élevage : résultats de ponte Après une éclosion : Exemple : série de ponte
Lien avec autres bases : Sidex Peut se faire par cellule ou à partir d’un fichier Il créé le fichier au format Sidex Il met un drapeau à chaque animal sélectionné pour indiquer que l’animal est parti dans Sidex
Lien avec autres bases : Gemma, BarCode Pour Gemma : Extraction des généalogies et des tubes pour les échantillons prélevés Il met un drapeau à chaque animal sélectionné pour indiquer que l’animal a été exporté dans Gemma Pour BarCode : feuille de route FR6 et FR7
Futur Remontées des anciennes généalogies GFA : de Niakwa -> reconstruire les généalogies Lignées de André Bordas : Thierry a commencé Lignées de Michèle Tixier Boichard : Thierry a commencé Lignées de Marie-Hélène Pinnard : non demandeuse Francis Minvielle (cailles) : non demandeur GAV : Lignées BC, Salmonelles (AIL), D+/D- reste quelques lignées à faire ART : Palmi Sivol : à faire Sivol IHM Finir demandes des utilisateurs Visual Studio 2008 (Framework 3) Boîtier de saisie : Tester en grandeur nature Sivol_Mesure Demande : charger un boîtier avec les animaux à réformer puis valider ou pas sur le terrain MAJ des docs : http://germinal.toulouse.inra.fr/~mcbatut/ Formations
Lié à Oracle ? Oui et non Utilisation de la classe clsDataBase (T. Heirman) Classe clsOracle pour l’IHM : OracleConnection, OracleCommand, OracleDataAdapter, OracleDataReader, OracleTransaction Classe clsSQLServeur pour .Net sur PDA : SqlConnection, SqlCommand, SqlDataAdapter, SqlDataReader, SqlTransaction Utilisation de fonction pour les dates sql_where = sql_where + " and B.d_nais = "+frmMaquette.to_good_format(dtpD_Nais1.Value.ToString(),frmMaquette.TYP_DATA_DATE); Liés à Oracle Triggers PL/SQL : mise à jour de la ponte, des pesées et des phénotypes Dictionnaire de données : les droits, le module d’extraction de données
Utilisation de la classe clsDataBase namespace INRA_Databases { public abstract class clsDataBase #region Lecture/Modification des attributs de classe public abstract string DataSource {get; set; } public abstract string User {get; set; } public abstract string Password {get; set; } #endregion #region Ouverture/Fermeture de la base de données public abstract bool bdOpen(); public abstract bool bdOpen(string ConnexionString); public abstract bool bdClose(); #region SELECT... FROM... , SELECT... FROM... WHERE... public abstract bool SQLResult_In_Dataset(string SQL); public abstract bool SQLResult_In_Dataset(DataSet ds_gen, string SQL, string nomTable); public abstract Object[,] SQLResult_in_Array(string SQL); public abstract Int64 SQLCount(string SQL); #region INSERT, UPDATE, DELETE public abstract bool ExecuteNonQuery(string SQL); }
Initialisations public const string dbDataSource="sivol"; static public int iDB_USED = 1; // Oracle // public int iDB_USED = 2; // MySQL // public int iDB_USED = 3; // PostGreSQL static public int iDB_USED = 4; // SQLServeur static public string myIdUser = ""; static public string myPassword = ""; static public string myEspece = ""; static public string myDomaine = ""; using INRA_Databases; namespace SIVOL { public class frmListerAnimaux : System.Windows.Forms.Form { private DataSet ds_gen; private clsDataBase ora_gen; … private void InitialiseDataSet() { ds_gen = new DataSet(); // Connexion à la base ora_gen = frmMaquette.InitDescripteurBD(); } } public static clsDataBase InitDescripteurBD() { clsDataBase myDB = null; switch (iDB_USED) { case 1: myDB = new clsOracle(); bIdentificationRequise = true; break; case 4: myDB = clsSQLServer(); bIdentificationRequise = false; break;} sChaineConnexion = myDB.ConnectionStringBuilder(dbDataSource, myIdUser, myPassword); try { bConnexionEtablie = myDB.bdOpen(sChaineConnexion); } catch { myDB = null; }
DataGridView : lié à une source de données - Le dataset ds_gen contient une collection de Tables (1 dataset par forme) string sql= " select .. from .. where .. order by.. "; string nomTable = "Cage"; if (ora_gen.SQLResult_In_Dataset(ds_gen, sql, nomTable)) { // Afficher les données dgrvCage.DataSource = ds_gen.Tables[nomTable]; Afficher_TitreColonnes(dgrvCage); - Travail sur le DataGridView for (int iLigne = 0; iLigne < dgrvCage.RowCount; iLigne++) { if (dgrvCage.Rows[iLigne].Selected) campagne = dgrvCage[col_campagne, iLigne].Value.ToString(); batiment = dgrvCage[col_batiment, iLigne].Value.ToString(); cellule = dgrvCage[col_cellule, iLigne].Value.ToString(); cage = dgrvCage[col_cage, iLigne].Value.ToString(); intra_cage = dgrvCage[col_intra_cage, iLigne].Value.ToString(); ...
DataGridView Peut être construit en conception : DataGridViewButtonColumn, DataGridViewCheckBoxColumn, DatGridViewComboBoxColumn, DataGridViewTextBoxColumn Peut être construit en dynamique for (int iColonne = 0; iColonne < nb_colonnes; iColonne++) { DataGridViewTextBoxColumn nouvelle_colonne = new DataGridViewTextBoxColumn(); dgrv.Columns.Add(nouvelle_colonne); // Attention j'ajoute 1 pour avoir col1, col2, .. . no_colonne = iColonne + 1; dgrv.Columns[iColonne].Name = "Col" + no_colonne.ToString(); dgrv.Columns[iColonne].HeaderText = "Col" + no_colonne.ToString(); dgrv.Columns[iColonne].Width = 80; }
DataGridView : contrôle sur une colonne private void dgrvMirIJ_CellEnter(object sender, DataGridViewCellEventArgs e) { int col; switch (cbOperation.SelectedIndex) { case 0: //Mirage1 if (dgrvMir1IJ.CurrentCell != null && dgrvMir1IJ.CurrentCell.Value != null) { col=frmMaquette.Chercher_NoColonne_DataGridView_ParSonNom(dgrvMir1IJ,"CD_MIRAGE1"); if (dgrvMir1IJ.CurrentCell.ColumnIndex == col) MIR1IJ_OLD = (string)dgrvMir1IJ.CurrentCell.Value; } break; … private void dgrvMirIJ_CellValidated(object sender, DataGridViewCellEventArgs e) { // valeurs acceptées de 1 à 4 pour le code du 1er mirage case 0: //Mirage1 if (dgrvMir1IJ.CurrentCell != null) col = frmMaquette.Chercher_NoColonne_DataGridView_ParSonNom(dgrvMir1IJ,"CD_MIRAGE1"); if (dgrvMir1IJ.CurrentCell.Value != null && int.Parse((string)dgrvMir1IJ.CurrentCell.Value) > 4) dgrvMir1IJ.CurrentCell.Value = MIR1IJ_OLD; } }
Merci de votre attention