J’ai besoin de dupliquer un formulaire avec certaines conditions :
Certaines valeurs sont copiées telles quelles
Certaines valeurs sont supprimées sur la copie
Certaines valeurs sont placées dans d’autres champs
Certaines valeurs sont définies par l’utilisateur au lancement de la copie (par exemple l’année concernée, la date d’acquisition, etc.)
Actuellement j’ai la méthode initCopy qui me permet les points 1-3, mais il faut que je rajoute le point 4 et je pense que ça passe par une action.
Est-ce que je peux déclencher le initCopy via une action?
@Override
public void initCopy(){
AppLog.info(getClass(), " le initCopy a été appelé ::::: ", getFieldValue("ParticipationTitreAnnee") , getGrant());
calculTitreId();
valeurParDefautCopie();
}
public void valeurParDefautCopie(){
AppLog.info(getClass(), " la définition des valeurs par défaut à la copie a été appelée", null , getGrant());
//défini l'année suivant celle du titre copié
String annee = getFieldValue("ParticipationTitreAnnee");
int newyear = Tools.nouvelleAnnee(1,annee);
setFieldValue("ParticipationTitreAnnee",newyear);
setFieldValue("ParticipationTitreNbTitreVille",getFieldValue("ParticipationTitreNbTitreVilleTotal"));
setFieldValue("ParticipationTitreSoldeAu1",getFieldValue("ParticipationTitreSoldeActuel"));
setFieldValue("ParticipationTitreEtatFinFondsPropresN1",0);
setFieldValue("ParticipationTitreReevDep",0);
setFieldValue("ParticipationTitreCours",0);
setFieldValue("ParticipationTitreMontantDivAnneePrec",getFieldValue("ParticipationTitreMontantDiv"));
setFieldValue("ParticipationTitreMontantDiv",0);
setFieldValue("ParticipationTitreTauxRendementAnneePrec",getFieldValue("ParticipationTitreTauxRendement"));
setFieldValue("ParticipationTitreValeurVenaleSubstAnneePrec",getFieldValue("ParticipationTitreValeurVenaleSubst"));
setFieldValue("ParticipationTitreValeurVenaleBoursiereAnneePrec",getFieldValue("ParticipationTitreValeurVenaleBoursiere"));
setFieldValue("ParticipationTitreEcartVvVc0101",getFieldValue("ParticipationTitreEcartVvVc3112"));
setFieldValue("ParticipationTitreEcartVnVc0101",getFieldValue("ParticipationTitreEcartVnVc3112"));
}
Le formulaire en recopie reste en soit une création modifiable par l’utilisateur une fois l’initCopy passé. Donc il peut y renseigner les champs (4) avant d’enregistrer. Pourquoi vouloir passer par une action pour renseigner les mêmes champs au final ?
Effectivement, le métier peut tout renseigner et une action n’est pas vraiment nécessaire pour ce cas. Mais il y a le point 5 (que j’ai pas pensé à mentionner ) :
Une fois la copie réalisée, tous les champs du formulaire original sont verrouillés
C’est essentiellement pour ce point que je pensais passer par une action. Mais peut-être vois-tu une meilleure option ?
Plutôt qu’une action qui va réinventer la roue, il faut à mon avis pour gérer cette notion de “versionning” de record :
positionner un champ/verrou dans une colonne sur votre précédent record lors de la création par recopie au postCreate
ce champ sera utilisé par le hook isUpdateEnable pour interdire la mise à jour.
Par exemple :
public String postCreate() {
// Lock the original record
String originId = getCopyId();
if (isCopied() && !Tool.isEmpty(originId)) {
getGrant().update("update mytable set myrecordlock='1' where row_id="+Tool.toSQL(originId));
}
return super.postCreate();
}
public boolean isUpdateEnable(String row[]) {
// Denied locked records
if ("1".equals(getFieldValue("myRecordLock", row)))
return false;
return super.isUpdateEnable(row);
}
Si je peux ne pas réinventer la roue… c’est mieux…
J’ai créé la colonne ParticipationTitreVerrou (Texte court)
et le code avec ma table et le champs
@Override
public String postCreate() {
// Lock the original record
String originId = getCopyId();
if (isCopied() && !Tool.isEmpty(originId)) {
getGrant("update participation_titre set participation_titre_verrou='1' where row_id="+Tool.toSQL(originId));
}
return super.postCreate();
}
public boolean isUpdateEnable(String row[]) {
// Denied locked records
if ("1".equals(getFieldValue("ParticipationTitreVerrou", row)))
return false;
return super.isUpdateEnable(row);
}
le getGrant me donne une erreur que je ne comprends pas.
Compile error:Class compilation error (status 1)
/home/fabrice/tomcat/webapps/ROOT/WEB-INF/src/com/simplicite/objects/Participation/ParticipationTitre.java:88: error: method getGrant in class ObjectCore cannot be applied to given types;
getGrant("update participation_titre set participation_titre_verrou='1' where row_id="+Tool.toSQL(originId));
^
required: no arguments
found: String
reason: actual and formal argument lists differ in length
1 error
#ERROR
c’est une erreur de ma part. Le post ne compile pas et j’ai pas testé ce code pour te donner l’idée générale de l’algo. Les API simplicité ne devraient plus avoir de secret pour toi depuis le temps