Page 3 sur 3

Re: Remise à zéro d'un compteur

MessagePublié: 22 Fév 2012 à 19:21
par roubech
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 )

Re: Remise à zéro d'un compteur

MessagePublié: 22 Fév 2012 à 19:25
par roubech
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

Re: Remise à zéro d'un compteur

MessagePublié: 23 Fév 2012 à 09:13
par Scualito
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.

Re: Remise à zéro d'un compteur

MessagePublié: 23 Fév 2012 à 10:35
par roubech
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 ...

Re: Remise à zéro d'un compteur

MessagePublié: 01 Mars 2012 à 17:36
par cyril08
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 ?

Re: Remise à zéro d'un compteur

MessagePublié: 01 Mars 2012 à 20:01
par roubech
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à

Re: Remise à zéro d'un compteur

MessagePublié: 02 Mars 2012 à 07:19
par cyril08
Ok donc je vais regarder pour que le calcul se fasse à la création

Re: Remise à zéro d'un compteur

MessagePublié: 02 Mars 2012 à 08:37
par cyril08
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é

Re: Remise à zéro d'un compteur

MessagePublié: 02 Mars 2012 à 10:05
par Scualito
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 ?

Re: Remise à zéro d'un compteur

MessagePublié: 02 Mars 2012 à 11:03
par cyril08
bien vu mais meme instancié j'ai pas de changement

Re: Remise à zéro d'un compteur

MessagePublié: 02 Mars 2012 à 11:53
par Scualito
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 ?

Re: Remise à zéro d'un compteur

MessagePublié: 02 Mars 2012 à 15:11
par cyril08
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!!!!!