Créer une action

Résultat à obtenir

0 La Théorie

Les actions ont pour but principal de mettre à jour les tables du logiciel ou de notifier l'utilisateur
En l'occurrence le Framework dispose de quatre moyens d'accès aux tables.

1 le SQL littéral via sql.executeQuery()

2 le DAO du framework via sql.xxxx()

3 Un temporary SQL via sql.xxxTemporary...

4 Un SGBD interne temporaire via le package Wtmp classe tmp



1 Modifier la légende du bouton option

Modifier la string option de TableTestSAISIE

//String option="Option";
String option="Insertion";

2 Créer une action d'insertion de fiche automatique

Remplacer l'action d'affichage userOptionDo de TableTestSAISIE

public void userOptionDo(String actionCommandOption){
	if (actionCommandOption.equals(option)){
		//Gp.MB("Nouvelle action déclenché par le bouton : "+option);
		boolean insertOk=false;
		String tmpCode="00"; //Variable de nouveau code
		for (int i=code.getInt();i<99;i++){ // Parcours la table encours, à partir du code encours pour trouver un numéro de code libre
			tmpCode=CcsFmt.ligLig(""+i, 2); // Complète le nouveau code calculé avec des zéro à gauche
			if (!sql.readSeek(sql.t_table, "c_code", tmpCode)){ // Recherche si le nouveau code n'existe pas dans la table encours
				insertOk=true; // tmpCode n'existe pas comme code on stop le parcours de la table encours
				break;
			}
		}
		if (insertOk) { // Nouveau ok, on utilise une table temporaire pour créer un nouvel enregistrement
			sql.createTemporarySinceTable(); // Créé une copy temporaire de la table encours
			sql.insertTemporarySinceTable("c_code='"+code.getText()+"'"); // Peuple la table temporaire avec l'enregistrement encours
			sql.updateTemporarySinceTable("c_code='"+tmpCode+"',c_libe='Insertion automatique',c_stab=''"
				,"c_code='"+code.getText()+"'"); // Met à jour l'enregistrement temporaire avec le nouveau code
			sql.insertFromTemporaryTable("c_code='"+tmpCode+"'"); // Ajoute l'enregistrement temporaire à la table encours
			sql.dropTemporaryTable(); // Libère la mémoire de la table temporaire
			
			refreshUIWithNewIndex(tmpCode); //Change la fiche encours de l'UIs encours
		}
	}
}

Compiler et relancer, le bouton est présent et le clic sur insertion ajoute une nouvelle fiche automatiquement

3 Ce serait sympa de mettre une confirmation avant de faire l'insertion non!

Créer une méthode privé insertFiche() dans TableTestSAISIE

public void userOptionDo(String actionCommandOption){
	if (actionCommandOption.equals(option)){
		int retour=JOptionPane.NO_OPTION;
		retour = JOptionPane.showConfirmDialog(null,"Insertion automatique de fiche pour cette table :'"+sql.t_table+"'\n\n Ętes-vous sûre ?", "Attention Insertion Automatique !!!",JOptionPane.YES_NO_OPTION);
		if (retour==JOptionPane.OK_OPTION){
			insertFiche();
		}
	}
}
private void insertFiche(){
	boolean insertOk=false;
	String tmpCode="00"; //Variable de nouveau code 
	for (int i=code.getInt();i<99;i++){ // Parcours la table encours, à partir du code encours pour trouver un numéro de code libre 
		tmpCode=CcsFmt.ligLig(""+i, 2); // Complète le nouveau code calculé avec des zéro à gauche
		if (!sql.readSeek(sql.t_table, "c_code", tmpCode)){ // Recherche si le nouveau code n'existe pas dans la table encours
			insertOk=true; // tmpCode n'existe pas comme code on stop le parcours de la table encours 
			break;
		}
	}
	if (insertOk) { // Nouveau ok, on utilise une table temporaire pour créer un nouvel enregistrement
		sql.createTemporarySinceTable(); // Créé une copy temporaire de la table encours
		sql.insertTemporarySinceTable("c_code='"+code.getText()+"'"); // Peuple la table temporaire avec l'enregistrement encours
		sql.updateTemporarySinceTable("c_code='"+tmpCode+"',c_libe='Insertion automatique',c_stab=''"
				,"c_code='"+code.getText()+"'"); // Met à jour l'enregistrement temporaire avec le nouveau code
		sql.insertFromTemporaryTable("c_code='"+tmpCode+"'"); // Ajoute l'enregistrement temporaire à la table encours
		sql.dropTemporaryTable(); // Libère la mémoire de la table temporaire

		refreshUIWithNewIndex(tmpCode); //Change la fiche encours de l'UI encours
	}
}

Compiler et relancer

4 Soyons fous, utilisons de préférence les notifications du framework

Remplacer le JOptionPane par le sql.notify()

public void userOptionDo(String actionCommandOption){
	if (actionCommandOption.equals(option)){
		// int retour=JOptionPane.NO_OPTION;
		// retour = JOptionPane.showConfirmDialog(null, "Insertion automatique de fiche pour cette table :'"+sql.t_table+"'\n\n Ętes-vous sûre ?", "Attention Insertion Automatique !!!", JOptionPane.YES_NO_OPTION);
		// if (retour==JOptionPane.OK_OPTION){
		// insertFiche();
		// }
		String titre="Insertion automatique de fiche";
		String mess="Ętes-vous sûre ?";
		Object[] option = {"Oui, j'ajoute une fiche automatique","Non, surtout pas"};
		int reponse=sql.notify(titre, mess, option, sql.getAppliParam().JBRECORD, 0);
		if (reponse==0){
			insertFiche();
		}
	}
}

Compiler et relancer




9 Beaucoup de nouveaux points dans ce chapitre, consulter les sources pour approfondir ce qui suit


Les édits disposent de méthodes supplémentaires tels que code.getInt(), code.getDouble()
Le gestionnaire de contrôle de saisie CcsFmt propose des méthodes statiques de formatage
On utilise une méthode de DAO pour tester l'existance d'un code sql.readSeek(sql.t_table, "c_code", tmpCode)
L'emploi d'une base temporaire pour les mises à jour est présenté pour l'exemple sql.xxxxTemporary on aurait pu faire plus simple
L'utilisation sql.notify() permet de conserver une unité graphique au logiciel

Consulter la documentation générale, Section Contrôle et Saisie


Révision ...