Remise à zéro d'un compteur

Forum destiné aux questions sur le développement : Formules, LotusScript, Java ...

Re: Remise à zéro d'un compteur

Messagepar roubech » 22 Fév 2012 à 19:21

tu as lu ça ? c'est pas le même principe, car le compteur est stocké dans un doc à part
http://www-01.ibm.com/support/docview.w ... wg21087993
avantage : ca t'évite de récupérer des milliers de docs dans ton DbColumn pour ne prendre qu'une valeur
inconvénient : il faut gérer les accès concurrents au doc compteur

sinon, pour reprendre ton pb et la voie sur laquelle tu t'es engagée :
Tu veux stocker un compteur incrémental dans tes docs et tu veux recommencer à compter chaque année.
Supposons que tu as un champ "NumFiche" de type nombre et un champ "AnneeFiche" de type texte
Tu crées une vue "AllByNum", avec une 1ère colonne catégorisée sur "AnneeFiche" et une 2nde colonne triée décroissant sur NumFiche
Si tu veux récupérer le numéro du dernier doc créé en 2000, tu fais un DbLookup sur cette vue en lui passant comme clé "2000" et tu vas récupérer la liste de tous les numéros. Il te suffit alors de prendre le premier de la liste (car tri décroissant). Reste plus qu'à ajouter 1 pour avoir le numéro de ton nouveau doc
Code : Tout sélectionner
tlkp := @DbLookup( ""; ""; "AllByNum"; "2000"; 2 );
@If( @IsError(tLkp); 1; @Subset(tLkp; 1)+1 )


Pour compléter, la valeur "2000" que j'ai prise là en exemple, c'est en fait l'année d'un champ date de ton doc, appelons le "DateFiche". J'imagine que ce champ est soit calculé à la création si les utilisateurs n'ont pas le droit de le modifier ou modifiable avec valeur par défaut @Now s'il peuvent la changer. Le tout, est de faire en sorte, qu'une fois que le numéro est calculé, on ne vienne pas changer la date (ou alors il faut changer le numéro mais ça n'aurait pas de sens)
Bref, dans ce cas, tu remplaces "2000" par le champ AnneeFiche qui est alors calculé avec @Text(@Year(DateFiche))
Code : Tout sélectionner
tlkp := @DbLookup( ""; ""; "AllByNum"; AnneeFiche; 2 );
@If( @IsError(tLkp); 1; @Subset(tLkp; 1)+1 )
Avatar de l’utilisateur
roubech
Modérateur
Modérateur
 
Message(s) : 4976
Inscrit(e) le : 01 Fév 2007 à 20:22
Localisation : Lille

Re: Remise à zéro d'un compteur

Messagepar roubech » 22 Fév 2012 à 19:25

Scualito a écrit:Salut

Et en modifiant la vue "(Numfichcom)" pour qu'elle n'affiche que les documents de l'année courante... Comme ça, au début de chaque année, elle sera vide et hop, ca repart à 0.

++

Tu fais comment une vue qui n'affiche que les docs de l'année courante ?
Si tu utilise @Today dans la formule de sélection d'une vue, son index ne sera pas stocké et recalculé à chaque sollicitation de la vue : c'est pas bon
Avatar de l’utilisateur
roubech
Modérateur
Modérateur
 
Message(s) : 4976
Inscrit(e) le : 01 Fév 2007 à 20:22
Localisation : Lille

Re: Remise à zéro d'un compteur

Messagepar Scualito » 23 Fév 2012 à 09:13

Si tu utilise @Today dans la formule de sélection d'une vue, son index ne sera pas stocké et recalculé à chaque sollicitation de la vue : c'est pas bon


C'est pas faux. Mais c'est une solution...

roubech a écrit:tu as lu ça ? c'est pas le même principe, car le compteur est stocké dans un doc à part
http://www-01.ibm.com/support/docview.w ... wg21087993
avantage : ca t'évite de récupérer des milliers de docs dans ton DbColumn pour ne prendre qu'une valeur
inconvénient : il faut gérer les accès concurrents au doc compteur


Autre inconvénient... Dans les bases multi-serveurs, ca devient vite problématique avec cette solution.
Avatar de l’utilisateur
Scualito
Posteur habitué
Posteur habitué
 
Message(s) : 230
Inscrit(e) le : 31 Déc 2004 à 15:47
Localisation : Savoie

Re: Remise à zéro d'un compteur

Messagepar roubech » 23 Fév 2012 à 10:35

Scualito a écrit:Autre inconvénient... Dans les bases multi-serveurs, ca devient vite problématique avec cette solution.

c'est ce que j'ai sous entendu dans "gere le accès conccurents", mais je ne suis pas entré dans le détails car la solution "de base" à le dbllokup a déjà été proposée il y a un an si tu remonte l'historique du post, mais apparemment elle n'est toujours pas comprise, donc j'évite d'embrouiller ...
Avatar de l’utilisateur
roubech
Modérateur
Modérateur
 
Message(s) : 4976
Inscrit(e) le : 01 Fév 2007 à 20:22
Localisation : Lille

Re: Remise à zéro d'un compteur

Messagepar cyril08 » 01 Mars 2012 à 17:36

Alors désolé pour le retard de réponse.

Sans utiliser la pratique du Dblookup proposé par Roubech que je remercie, la semaine dernière je suis arrivé quasiment à resoudre le pb en :

j'ai placé deux champs dans mon masque qui me permette de bien savoir si j'arrivais a récupérer les valeurs année et numéro de mon doc en tete de vue:

champ tma : @Subset(@Text(@DbColumn("":"NoCache";"":"";"(Numfichcom)";1));1)

champ tmn : @Subset(@Text(@DbColumn("":"NoCache";"":"";"(Numfichcom)";2));1)

Ensuite dans le querysave du masque j'ai mis le code suivant pour qu'a l'enregistrement cela verifie si il y a eu changement d'année pour repartir de '001'
Tma := @TextToNumber(@Subset(@Text(@DbColumn("":"NoCache";"":"";"(Numfichcom)";1));1));

@If( @Text(Tma) < @Text(@Year(Annee)) ; @Do(@SetField("Num";"001");@Command([FileSave]); @Command([FileCloseWindow]);@Command([ViewRefreshFields]));@Do(@Command([FileSave]); @Command([FileCloseWindow])))

Cela fonctionne bien mais a chaque enregistrement qq soit le cas de figure, j'ai un message d'erreur 'tentative d'éxécutions d'événements imbriqués de masque'

Si quelqu'un connait ce message ?
cyril08
Posteur expérimenté
Posteur expérimenté
 
Message(s) : 349
Inscrit(e) le : 22 Nov 2010 à 17:11

Re: Remise à zéro d'un compteur

Messagepar roubech » 01 Mars 2012 à 20:01

Le QuerySave s'éxécute avant l'écriture finale sur disque, parce que la sauvegarde a été demandée ( par un bouton d'action avec un @Command([FileSave]) par exemple)
Tu n'a donc pas besoin et tu ne dois surtout pas demander un autre save à ce moment là
Avatar de l’utilisateur
roubech
Modérateur
Modérateur
 
Message(s) : 4976
Inscrit(e) le : 01 Fév 2007 à 20:22
Localisation : Lille

Re: Remise à zéro d'un compteur

Messagepar cyril08 » 02 Mars 2012 à 07:19

Ok donc je vais regarder pour que le calcul se fasse à la création
cyril08
Posteur expérimenté
Posteur expérimenté
 
Message(s) : 349
Inscrit(e) le : 22 Nov 2010 à 17:11

Re: Remise à zéro d'un compteur

Messagepar cyril08 » 02 Mars 2012 à 08:37

Voila ce que j'ai fais, le problème est que mon RAZ du compteur lorsque l'on change d'année ne fonctionne pas

Tmp := @Text(@DbColumn("" : "NoCache"; ""; "(Numfichcom)"; 2));
Tma := @TextToNumber(@Subset(@Text(@DbColumn("":"NoCache";"":"";"(Numfichcom)";1));1));
Numero := @If(@IsError(Tmp) | Tmp = ""; "001";
@TextToNumber(@Right(@Subset(Tmp; 1); 3)) < 9; "00" + @Text(@TextToNumber(@Right(@Subset(Tmp; 1); 3)) + 1);
@TextToNumber(@Right(@Subset(Tmp; 1); 3)) < 99; "0" + @Text(@TextToNumber(@Right(@Subset(Tmp; 1); 3)) + 1);
@Text(@TextToNumber(@Right(@Subset(Tmp; 1); 3)) + 1));
FIELD Annee:=Annee;

REM {Le champ est calculé avec calcul après validation et non calculé à la création, ainsi il est réévalué au moment de l'enregistrement. Ceci permet d'éviter des doublons si création simultanée par 2 personnes. Par contre, il faut le calculer seulement lors de la création du document. @IsNewDoc n'est pas utilisable (agent de création)};

@If(Num="";Numero;@Text(Tma) < @Text(@Year(Annee));@SetField("Num";"001");Num)

Je ne vois pas pourquoi, le test du if me semble cohérent pourtant. De ce que je détecte a chaque fois seul la 1ére condition est balayé, l'incrément est toujours fonctionnel meme quand je simule un changement d'année sur le dernier doc enregistré
cyril08
Posteur expérimenté
Posteur expérimenté
 
Message(s) : 349
Inscrit(e) le : 22 Nov 2010 à 17:11

Re: Remise à zéro d'un compteur

Messagepar Scualito » 02 Mars 2012 à 10:05

Salut,

A première vue...
Num n'est pas instancié (à moins que ce soit un champ....). Y'a pas de Num:=Quelque chose
Donc, il est toujours ""
Donc, ton résultat est toujours Numero

Je me trompe ?
Avatar de l’utilisateur
Scualito
Posteur habitué
Posteur habitué
 
Message(s) : 230
Inscrit(e) le : 31 Déc 2004 à 15:47
Localisation : Savoie

Re: Remise à zéro d'un compteur

Messagepar cyril08 » 02 Mars 2012 à 11:03

bien vu mais meme instancié j'ai pas de changement
cyril08
Posteur expérimenté
Posteur expérimenté
 
Message(s) : 349
Inscrit(e) le : 22 Nov 2010 à 17:11

Re: Remise à zéro d'un compteur

Messagepar Scualito » 02 Mars 2012 à 11:53

Ok, alors autre piste...
Tu testes @Text(Tma) < @Text(@Year(Annee)) => Ca revient à faire "OM" < "PSG".... Même s'il est évident que OM < PSG :D, je doute que DOMINO sache faire une "comparaison inférieur" en texte...
Vu que Tma et @Year(Annee) sont tout deux numériques, il faudrait plutôt faire Tma<@year(Annee)

Ca marche pas mieux en virant les @text ?
Avatar de l’utilisateur
Scualito
Posteur habitué
Posteur habitué
 
Message(s) : 230
Inscrit(e) le : 31 Déc 2004 à 15:47
Localisation : Savoie

Re: Remise à zéro d'un compteur

Messagepar cyril08 » 02 Mars 2012 à 15:11

j'ai essayé le RAZ n'est pas effective, je ne pense pas que ce soit le test sur l'année qui soit mauvais car j'ai essayé avec un bouton en mettant :

Tma := @TextToNumber(@Subset(@Text(@DbColumn("":"NoCache";"":"";"(Numfichcom)";1));1));

@If( @text(Tma) != @Text(@Year(Annee)) ; @Do(@SetField("Num";"001");@Command([ViewRefreshFields]));@Prompt([Ok];"RAZ";"RAZ non autorisé!!!!"))

je ne vois pas pourquoi ce n'est pas juste

sinon pas mal le OM>PSG. Euh pardon PSG>OM!!!!!
cyril08
Posteur expérimenté
Posteur expérimenté
 
Message(s) : 349
Inscrit(e) le : 22 Nov 2010 à 17:11

Précédent

Retour vers Développement

cron