Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Langages serveur > ASP
ASP Forum sur la programmation ASP. Avant de poster : Cours ASP, FAQ ASP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/08/2007, 16h19   #1
Futur Membre du Club
 
Inscription : août 2007
Messages : 36
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 36
Points : 16
Points : 16
Par défaut changer des nombres dans une chaine

bonjour, j'ai un truc très précis, à faire en ASP:

j'ai un système de fichier, dont les noms sont stockés dans une base de données, et comme je veux un historique, je ne change pas le nom d'un fichier, je le stocke avec un numéro de version qui est censé évoluer selon le temps:
le nom relatif du fichier sera de cette forme:

filename_vX.Y.extension

pour changer ce nom dans le fichier, je procède de la manière suivante:
-j'extrais l'extension puis la version, puis je récupère le nom
-j'ai une chaine _vX.Y qui représente la version.
X représente un numéro de version majeure, et Y un numéro de version mineure.
au départ la version était représentée en réels dans ma base, mais quand je changeais le numéro en ajoutant +0,1 par exemple, cela engendrait à long terme des erreurs, et je me suis retrouvé avec une version 2,599999 après une version 2.5, et en plus, si je décide d'avoir 11 versions mineures avant de passer à la version majeure (ici avec 2 versions majeures déjà), je peux vouloir passer de la version 2.9 à la version 2.10, donc je ne peux pas gérer ça facilement avec les décimaux (parce que je ne sais pas combien de décimales j'aurais, et il faut gérer l'incrément)

pour ne pas trop massacrer la base qui était déjà très lourde au moment où je suis arrivé à mon stage, j'ai juste fais passer la colonne de réel flottant à varchar.

mais mon problème, c'est que les fonctions que j'ai faites pour remplacer l'incrément ne fonctionnent pas, et je n'ai aucun moyen d'avoir les résultats intermédiaires, car je fais des tests sur un serveur distant, et les tests ne peuvent que se limiter à un test d'intégration...

je vous donne les fonctions dont je me sers
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
Function Extension(NomFichier)
  Dim n, varTemp
   varTemp=CStr(NomFichier)
   n=inStr(varTemp,".")
  Do
    If n=0 Then Exit Do
    varTemp=Right(varTemp, Len(varTemp)-n)
    n=inStr(varTemp,".")
  Loop
 Extension=CStr(Right(nomFichier,Len(varTemp)+1))
End Function
 
 
Function Version(NomFichierSE) ' On utilise le nom du fichier sans l'extension qui est déjà extraite
  Dim n, varTemp
   varTemp=CStr(NomFichierSE)
   n=inStr(varTemp,"v")
  Do
    If n=0 Then Exit Do
    varTemp=Right(varTemp,Len(varTemp)-n) 
    n=inStr(varTemp,"v")
  Loop
  Version=CStr(Right(NomFichierSE,Len(VarTemp)+2))
End Function
 
' Pour vmin et vmax, on aura StrVersion de la forme _vX.Y
' vmin renverra Y et vmax renverra X
Function vmin(StrVersion)
  Dim n
  Dim temp
   temp=CStr(StrVersion)
   n=inStr(temp,".")
  Do
    If n=0 Then Exit Do
    temp= Right(temp,Len(temp)-n)
    n=inStr(temp,".")
  Loop
  vmin=Cint(temp)
End Function
 
Function vmax(StrVersion)
  Dim temp
  Dim vmin
  vmin=vmin(StrVersion)
  temp=Left(StrVersion,Len(StrVersion)-Len(vmin)-1)
  vmax=Cint(Right(temp,Len(temp)-2))
End Function
 
Function UpGrade(strVersion, Importance)
'On aura une chaine de type: _vXX.YY
  Dim vmin
  Dim vmax
  vmin=vmin(strVersion)
  vmax=vmax(strVersion)
 
  If Importance like "majeure" Then
         vmax=CStr(vmax+1) 
         vmin=CStr("0")
    Else vmin=CStr(vmin+1)
  End if
 
UpGrade="_v"& vmax &"."& vmin
End Function
et l'appel est ici:
Code :
1
2
3
4
5
vFichier_Ext = Extension(vFichier)  'On extrait l'extension, en comprenant le point
vFichier_Name = Left(vFichier, Len(vFichier)-Len(vFichier_Ext))
vFichier_Vers= Version(vFichier_Name) 'On extrait du reste la version du fichier, s'il y en a une, afin de pouvoir la changer
vFichier_Name= Left(vFichier, Len(vFichier)-Len(vFichier_Vers)-Len(vFichier_Ext))   'On extrait le reste: le nom du fichier
vNewVersionFichier=Upgrade(vFichier_Vers,"mineure")
je sais que mes fonctions Extension et Version sont bonnes, car je les utilise dans une autre page (celle qui crée le fichier au départ, à la version 0.1), et les résultats sont bons

l'erreur réside donc dans les fonctions vmin, vmax et upgrade, le problème est que j'ai appris l'ASP sur le tas en commençant mon stage, et que je me suis inspiré des codes sources de mon prédécesseur, donc il est probable que j'aurais pu faire mieux, mais je savais pas comment...

maintenant que j'ai expliqué le contexte, voici ma question:

quelqu'un pourrait-il me donner un moyen d'extraire d'une chaine du type "_vX.Y" X et Y étant des nombres inconnus bien sur, et de passer cette chaine à "_vX.(Y+1)" ou "_v(X+1).0"? ceci en ASP coté serveur svp

merci d'avance pour vos réponses
newbiegeek est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2007, 16h22   #2
Futur Membre du Club
 
Inscription : août 2007
Messages : 36
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 36
Points : 16
Points : 16
en fait, je viens de m'apercevoir que je faisais passer mes variable de int à string de cette manière, je vais tester en enlevant les CStr que j'ai mises dans la fonction Upgrade, c'est peut etre ça qui m'a fait bugguer
newbiegeek est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2007, 16h26   #3
Futur Membre du Club
 
Inscription : août 2007
Messages : 36
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 36
Points : 16
Points : 16
en fait ça marche quand meme pas, donc j'ai besoin de votre aide, car là j'ai plus d'idée.

HELP!!! PLEASE HELP!!!
newbiegeek est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2007, 17h35   #4
Membre confirmé
 
Avatar de gderenne
 
Inscription : juillet 2007
Messages : 248
Détails du profil
Informations personnelles :
Âge : 39

Informations forums :
Inscription : juillet 2007
Messages : 248
Points : 217
Points : 217
Salut,

En faisant ainsi, cela ne fonctionne toujours pas ?
Code ASP :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Function UpGrade(strVersion, Importance)
'On aura une chaine de type: _vXX.YY
  Dim intMin
  Dim intMax
  intMin = vmin(strVersion)
  intMax = vmax(strVersion)
 
  If Importance = "majeure" Then
         intMax = intMax + 1 
         intMin = 0
    Else intMin = intMin + 1
  End if
 
UpGrade = "_v" & intMax & "." & intMin 
End Function
__________________
Cordialement,
Gil DERENNE
Ingénieur du Son
gderenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2007, 08h56   #5
Futur Membre du Club
 
Inscription : août 2007
Messages : 36
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 36
Points : 16
Points : 16
non, ça marche pas, je crois que je vais faire un truc bourrin sur les chaines (genre itératif), mais je pensais qu'il était possible de gérer plus facilement que ça (même en fortran c'est plus facile mon truc... )
newbiegeek est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2007, 09h41   #6
Futur Membre du Club
 
Inscription : août 2007
Messages : 36
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 36
Points : 16
Points : 16
j'ai fait une fonction bourrine, mais ça marche toujours pas, je comprend pas pourquoi, parce que là j'ai plus de conversion à faire, tout se passe en chaine de caractère

voici les codes des 3 fonctions.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 
' Pour vmin et vmax, on aura StrVersion de la forme _vX.Y
' vmin renverra Y et vmax renverra X
Function vmin(StrVersion)
  Dim n
  Dim temp
   temp=CStr(StrVersion)
   n=inStr(temp,".")
  Do
    If n=0 Then Exit Do
    temp= Right(temp,Len(temp)-n)
    n=inStr(temp,".")
  Loop
  vmin=temp
End Function
 
Function vmax(StrVersion)
  Dim temp
  Dim vmin
  vmin=vmin(StrVersion)
  temp=Left(StrVersion,Len(StrVersion)-Len(vmin)-1)
  vmax=Right(temp,Len(temp)-2)
End Function
 
Function UpGrade(strVersion, Importance)
'On aura une chaine de type: _vXX.YY
Dim intmin,intmax,nbtemp,dernierchiffre,resultat
intmin=vmin(strVersion)
intmax=vmax(strVersion)
resultat=""
If Importance Like "majeure" Then
  nbtemp=CStr(vmax)
Else
  nbtemp=CStr(vmin)
End If
  Do
  dernierchiffre=Right(nbtemp,1) 'on prend le chiffre des unités
  nbtemp=Left(nbtemp,Len(nbtemp)-1) 'on prend le nombre de dizaines
  If dernierchiffre <>"9" Then Exit Do
  resultat="0" & resultat
  Loop
  'on sort avec dernierchiffre qui est soit un chiffre entre 0 et 8, soit un caractère vide qu'on prendra pour un 0 (= on met un "1" au début de la chaine résultat)
  Select Case dernierchiffre
	 Case "0" Or "": resultat=nbtemp & "1" & resultat
	 Case "1": resultat= nbtemp & "2" & resultat
	 Case "2": resultat= nbtemp & "3" & resultat
	 Case "3": resultat= nbtemp & "4" & resultat
	 Case "4": resultat= nbtemp & "5" & resultat
	 Case "5": resultat= nbtemp & "6" & resultat
	 Case "6": resultat= nbtemp & "7" & resultat
	 Case "7": resultat= nbtemp & "8" & resultat
	 Case "8": resultat= nbtemp & "9" & resultat
  End Select
 
If Importance Like "majeure" Then
  UpGrade = "_v" & resultat & ".0"
Else UpGrade = "_v" & intmax & "." & resultat
End If
 
End Function
je commence à me demander si c'est pas mes fonctions vmin et vmax qui bugguent

je vais finir par criser si ça marche pas
newbiegeek est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2007, 11h57   #7
Membre confirmé
 
Avatar de gderenne
 
Inscription : juillet 2007
Messages : 248
Détails du profil
Informations personnelles :
Âge : 39

Informations forums :
Inscription : juillet 2007
Messages : 248
Points : 217
Points : 217
Est-ce que vmin(chaine) et vmax(chaine) donnent bien un nombre comme résultat ?

Si oui, ma fonction fonctionne...

Si non, en effet, il y a un problème dans tes fonctions vmin et vmax.

J'ai pas trop le temps de voir maintenant, je regarderais plus tard (sauf si un autre à déjà trouvé la solution avant moi
__________________
Cordialement,
Gil DERENNE
Ingénieur du Son
gderenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2007, 12h59   #8
Membre confirmé
 
Avatar de gderenne
 
Inscription : juillet 2007
Messages : 248
Détails du profil
Informations personnelles :
Âge : 39

Informations forums :
Inscription : juillet 2007
Messages : 248
Points : 217
Points : 217
A y est...

Voici le résultat (désolé, j'ai completement modifié ton travail, mais il y avait vraiement beaucoup de trucs que je ne comprenait pas...) :
Code :
1
2
3
4
5
Function fnVMin(strVal)
  Dim intPosition
  intPosition = InStr(strVal, ".")
  fnVMin = CInt(Right(strVal, Len(strVal) - intPosition))
End Function
Code :
1
2
3
4
5
Function fnVMax(strVal)
  Dim intPosition
  intPosition = InStr(strVal, ".")
  fnVMax = Cint(Left(strVal, intPosition - 1))
End Function
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Function fnUpGrade(strVersion, Importance)
    Dim intMin, strMin
    Dim intMax, strMax
    intMin = fnVMin(strVersion)
    intMax = fnVMax(strVersion)
 
    If Importance = "majeure" Then
        intMax = intMax + 1 
        intMin = 0
    Else 
        intMin = intMin + 1
    End If
 
    If Len(CStr(intMin)) = 1 Then 
        strMin = "0" & CStr(intMin)
    Else
        strMin = CStr(intMin)
    End If
 
    strMax = CStr(intMax)
 
    'On aura une 'chaine' de type: _v(nX)X.YY
    fnUpGrade = "_v" & strMax & "." & strMin 
End Function
Pour faire fonctionner tout ca :
Code :
Response.Write fnUpGrade("1.04", "mineure") ' Donne _v1.05
ou
Code :
Response.Write fnUpGrade("1.04", "majeure") ' Donne _v2.00
__________________
Cordialement,
Gil DERENNE
Ingénieur du Son
gderenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2007, 13h46   #9
Futur Membre du Club
 
Inscription : août 2007
Messages : 36
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 36
Points : 16
Points : 16
ah bah merci, c'est super si ça marche, j'ai pas besoin que cela soit positionné automatiquement sur 2 chiffres, mais je vais tester tout ça

merci bien
newbiegeek est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2007, 14h50   #10
Futur Membre du Club
 
Inscription : août 2007
Messages : 36
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 36
Points : 16
Points : 16
bon, c'est nickel, ça marche, c'est le bonheur ^^

merci à gderenne, à developpez.net, à toute la communauté de développeurs, à ma maman, à mon poisson rouge...

non en fait surtout à gderenne qui m'a pondu une super solution ^^
newbiegeek est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2007, 14h58   #11
Membre confirmé
 
Avatar de gderenne
 
Inscription : juillet 2007
Messages : 248
Détails du profil
Informations personnelles :
Âge : 39

Informations forums :
Inscription : juillet 2007
Messages : 248
Points : 217
Points : 217
De rien... C'est bonheur

N'hésite pas avec le bouton Resolu.
__________________
Cordialement,
Gil DERENNE
Ingénieur du Son
gderenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2007, 15h24   #12
Futur Membre du Club
 
Inscription : août 2007
Messages : 36
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 36
Points : 16
Points : 16
justement, j'allais le faire ^^
newbiegeek est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h39.


 
 
 
 
Partenaires

Hébergement Web