OVH Cloud OVH Cloud

dépassement de capacité

9 réponses
Avatar
steph
Bonjour,
j ai un programme en vb que je viens de modifier :
j ai chang=E9 la boucle a =3D a + 1 par a =3D a*2
le pb est que j ai maintenantle message d erreur "depassement de
capacit=E9"
j ai mis ttes mes variables en variant mais rien a faire
ps : j ai des tableaux
qu est ce que ca veut dire ?

9 réponses

Avatar
Damran
Bonjour,
j ai un programme en vb que je viens de modifier :
j ai changé la boucle a = a + 1 par a = a*2
le pb est que j ai maintenantle message d erreur "depassement de
capacité"
j ai mis ttes mes variables en variant mais rien a faire
ps : j ai des tableaux
qu est ce que ca veut dire ?

Les variables sont-elles de type 'long' ou 'double' ? Car si c'est juste

'integer', tu risque effectivement d'avoir un dépassement de capacité.

--
Damran

Avatar
steph
en fait j avais au debut des variables integer mais j ai tout mis en
variant...
dans un tableau, les variables doivent elles etre ttes de meme type ?
avec mon message d erreur j ai la ligne suivante de soulignée :
ResFinal = ResFinal + (tabL(1, indTab) * tabL(2, indTab)) / TotNum
sachant que ds tabl(1,) j avais un integer que j ai mis en variant
dans tabl(2,) javais une variable varfacteurR dt je navais pas
précisé le type : je l ai maintenant mis en variant
ps : lorsque je veux mettre cette variable en long, ma ligne :
If InStr(varFacteurR, ",") Then
varFacteurR = Remplacement(CStr(varFacteurR), ",",
".")
qui me permet de remplacer les virgules par des points me donne un
message d erreur "type incompatible"

aide moi pleaaaase
Avatar
Jessy Sempere [MVP]
Bonjour

Peux-tu mettre le code complet, ce sera plus clair (y compris tes
déclarations de variable.)

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"steph" a écrit dans le message news:

en fait j avais au debut des variables integer mais j ai tout mis en
variant...
dans un tableau, les variables doivent elles etre ttes de meme type ?
avec mon message d erreur j ai la ligne suivante de soulignée :
ResFinal = ResFinal + (tabL(1, indTab) * tabL(2, indTab)) / TotNum
sachant que ds tabl(1,) j avais un integer que j ai mis en variant
dans tabl(2,) javais une variable varfacteurR dt je navais pas
précisé le type : je l ai maintenant mis en variant
ps : lorsque je veux mettre cette variable en long, ma ligne :
If InStr(varFacteurR, ",") Then
varFacteurR = Remplacement(CStr(varFacteurR), ",",
".")
qui me permet de remplacer les virgules par des points me donne un
message d erreur "type incompatible"

aide moi pleaaaase
Avatar
steph
ok mais il est long .... en fait la premiere partie s occupe de ranger
dans une table (T_DetailFacteurR) chaque enregistrement ainsi que son
nombre d 'occurence.
La deuxième partie calcule resultat :
Option Compare Database
Option Explicit




Public Function funcFacteurR() As Double


'//////////// REMPLISSAGE T_DETAILFACTEURR
/////////////////////////

'Déclaration d'un recordset (feuille de données mémoire)
Dim rstFacteurR As Recordset
'Ouverture du recordset correspondant à la requête FacteurR
'et affectation mémoire dans le recordset rstFacteurR par le set
Set rstFacteurR = CurrentDb.OpenRecordset("FacteurR")

'on lance une requête de suppression sur notre table de travail
'currentDb est un mot reservé Access indiquant la base de données
en cours
CurrentDb.Execute "DELETE * FROM [T_DetailFacteurR];"

'Déclaration de nos trois variables qui vont stocker l'état
précédent
Dim varFacteurR As Variant

Dim varNumChantier As Long
Dim varDateComite As Date
'Déclaration et mise à 0 de notre compteur
Dim cptFacteurR As Integer
cptFacteurR = 0

'on boucle sur les enregistrements de notre recordset jusqu'à EOF
(End Of File, fin du recordset)
Do While Not rstFacteurR.EOF

'au premier passage, on met directement les valeurs dans nos
variables
If cptFacteurR = 0 Then
varFacteurR = rstFacteurR.Fields("FacteurR")
varNumChantier = rstFacteurR.Fields("NumChantier")
varDateComite = rstFacteurR.Fields("DateComite")
Else
'on regarde si on a eu un changement de chantier, de date
ou de FacteurR
If (varFacteurR <> rstFacteurR.Fields("FacteurR")) Or
(varNumChantier <> rstFacteurR.Fields("NumChantier")) Or (varDateComite
<> rstFacteurR.Fields("DateComite")) Then
'pour éviter un problème d'insertion dans la base, on
remplace les virgules par un point
If InStr(varFacteurR, ",") Then
varFacteurR = Remplacement(CStr(varFacteurR), ",",
".")
End If

'pour éviter tout problème d'insertion, on met à 0
s'il est null
If IsNull(varFacteurR) Then
varFacteurR = 0
End If

'on lance une requête d'insertion de nos données
CurrentDb.Execute "INSERT INTO [T_DetailFacteurR]
(NumChantier, DateComite, FacteurR, L) VALUES (" & varNumChantier & ",
#" & Format(varDateComite, "dd/mm/yyyy") & "#, " & varFacteurR & "," &
cptFacteurR & ");"

'on mémorise nos valeurs pour pouvoir les comparer
plus tard avec les suivantes
varFacteurR = rstFacteurR.Fields("FacteurR")
varNumChantier = rstFacteurR.Fields("NumChantier")
varDateComite = rstFacteurR.Fields("DateComite")
cptFacteurR = 0
End If
End If
'on incrément notre compteur
cptFacteurR = cptFacteurR + 1
'on passe à l'enregistrement suivant
rstFacteurR.MoveNext
Loop

If InStr(varFacteurR, ",") Then
varFacteurR = Remplacement(CStr(varFacteurR), ",", ".")
End If
CurrentDb.Execute "INSERT INTO [T_DetailFacteurR] (NumChantier,
DateComite, FacteurR, L) VALUES (" & varNumChantier & ", #" &
Format(varDateComite, "dd/mm/yyyy") & "#, " & varFacteurR & "," &
cptFacteurR & ");"



'/////////////// CALCUL FACTEUR ////////////////////////

'Déclaration, ouverture et affectation mémoire d'un recordset sur
R_DetailFacteurR
Dim rstCalc As Recordset
'Set rstCalc = CurrentDb.OpenRecordset("R_DetailFacteurR")
Set rstCalc = CurrentDb.OpenRecordset("SELECT
T_DetailFacteurR.NumChantier, T_DetailFacteurR.Datecomite,
T_DetailFacteurR.FacteurR, T_DetailFacteurR.L FROM T_DetailFacteurR
WHERE (((T_DetailFacteurR.NumChantier) = " &
Forms![F_InfosChantiers]![NumChantier] & ") And
((T_DetailFacteurR.Datecomite) = #" &
Forms![F_InfosChantiers]![DateInfos] & "#)) ORDER BY
T_DetailFacteurR.NumChantier, T_DetailFacteurR.Datecomite,
T_DetailFacteurR.FacteurR;")

'Déclaration et affectation de variables diverses
Dim Numerateur As Long


Dim Elem, TotNum As Long, ResFinal As Long

varNumChantier = rstCalc.Fields("NumChantier")
varDateComite = rstCalc.Fields("DateComite")
Dim tabL() As Long
ReDim tabL(2, 0)
cptFacteurR = 0
Numerateur = 0

TotNum = 0
Dim indTab As Integer


Dim asup

'on vide détailResultat
CurrentDb.Execute "DELETE * FROM [T_DetailResultat];"

'on boucle sur le recordset
Do While Not rstCalc.EOF

'on regarde si l'on n'a pas eu un changement
If (varNumChantier <> rstCalc.Fields("NumChantier")) Or
(varDateComite <> rstCalc.Fields("DateComite")) Then

'on boucle sur le tableau de nos numérateurs pour
totaliser
'For indTab = 0 To (LBound(tabL))
For indTab = 0 To cptFacteurR - 1
TotNum = TotNum + tabL(1, indTab)
Next

'on boucle et pour chaque numérateur, on calcule en
fonction du total calculé ci-dessus
'For indTab = 0 To LBound(tabL)
For indTab = 0 To cptFacteurR - 1
If InStr(ResFinal, ".") Then
ResFinal = Remplacement(CStr(ResFinal), ".", ",")
End If
ResFinal = ResFinal + (tabL(1, indTab) * tabL(2,
indTab)) / TotNum
If InStr(ResFinal, ",") Then
ResFinal = Remplacement(CStr(ResFinal), ",", ".")
End If

'pour pouvoir tracer le résultat, on enregistre chaque
pas
CurrentDb.Execute "INSERT INTO [T_DetailResultat]
(NumChantier, DateComite, Resultat, TotNum) VALUES (" & varNumChantier
& ", #" & Format(varDateComite, "dd/mm/yyyy") & "#, " & ResFinal & ","
& TotNum & ");"
Next

'on remet à 0 le total pour le suivant
ResFinal = 0
'on met à jour nos variables de comparaison
varNumChantier = rstCalc.Fields("NumChantier")
varDateComite = rstCalc.Fields("DateComite")
'on vide le tableau et on remet à 0
ReDim tabL(2, 0)
cptFacteurR = 0
Numerateur = 0
Else
'on calcule le numérateur
Numerateur = (Numerateur * 2) * (rstCalc.Fields("L"))


'on aggrandit le tableau

ReDim Preserve tabL(2, cptFacteurR)
'on stocke dedans le numérateur et le facteurR pour
pouvoir calculer tout à l'heure
tabL(1, cptFacteurR) = Numerateur
tabL(2, cptFacteurR) = rstCalc.Fields("FacteurR")

cptFacteurR = cptFacteurR + 1

'on passe à l'enregistrement suivant
rstCalc.MoveNext

End If

TotNum = 0
Loop

For indTab = 0 To cptFacteurR - 1
TotNum = TotNum + tabL(1, indTab)
Next

'on boucle et pour chaque numérateur, on calcule en fonction du
total calculé ci-dessus
'For indTab = 0 To LBound(tabL)
For indTab = 0 To cptFacteurR - 1
If InStr(ResFinal, ".") Then
ResFinal = Remplacement(CStr(ResFinal), ".", ",")
End If
ResFinal = ResFinal + (tabL(1, indTab) * tabL(2, indTab)) /
TotNum
If InStr(ResFinal, ",") Then
ResFinal = Remplacement(CStr(ResFinal), ",", ".")
End If

'pour pouvoir tracer le résultat, on enregistre chaque pas
CurrentDb.Execute "INSERT INTO [T_DetailResultat] (NumChantier,
DateComite, Resultat, TotNum) VALUES (" & varNumChantier & ", #" &
Format(varDateComite, "dd/mm/yyyy") & "#, " & ResFinal & "," & TotNum &
");"
'FacteurR = ResFinal
Next

If InStr(ResFinal, ".") Then
ResFinal = Remplacement(CStr(ResFinal), ".", ",")
End If
funcFacteurR = ResFinal
'MsgBox "C'est fini, le résultat et le détail sont dans la table
T_DetailResultat"

'on vide l'espace mémoire alloué à nos recordset
Set rstFacteurR = Nothing
Set rstCalc = Nothing

End Function


Public Function Remplacement(strText As String, strSearch As String,
strReplace As String)

'Permet de remplacer dans la chaine strText, la chaine strSearch
par strReplace
'Fonction intégrée dans les versions supérieures d'Access

Dim strTmp As String
Dim intPos As Integer

If IsNull(strText) Then
Remplacement = Null
Else
strTmp = strText
intPos = InStr(1, strTmp, strSearch)
Do While intPos > 0
strTmp = Left(strTmp, intPos - 1) & strReplace & _
Mid(strTmp, intPos + Len(strSearch))
intPos = InStr(intPos + Len(strReplace), strTmp, strSearch)
Loop
Remplacement = strTmp

End If

End Function
Avatar
steph
ps : je pense que c la fonction Remplacement qui ne va pas (elle
naccepte pas les types single)
merci de ton aide
Avatar
steph
Remplacement, c'est la fonction qui est definie a la fin du code
(oui access 97)
Avatar
Jessy Sempere [MVP]
Re,

Mais c'est quoi Remplacement

Utilises si tu es sous Access 2000 et plus Replace(...)
Sinon si tu es sous Access97, tu peux utiliser :
http://access.jessy.free.fr/htm/Equivalence/fReplace.htm

@+
Jessy Sempere - Access MVP

------------------------------------
Site @ccess : http://access.jessy.free.fr/
Pour l'efficacité de tous :
http://users.skynet.be/mpfa/
------------------------------------
"steph" a écrit dans le message news:

ps : je pense que c la fonction Remplacement qui ne va pas (elle
naccepte pas les types single)
merci de ton aide



Avatar
steph
oui on a exactement la meme fonction
mais qd je mets un type single elle naccepte pas
et puis les variables d un tableau doivet elles etre de meme type ?
je ne comprends pas depssement de capacité
Avatar
Gafish
steph wrote:
oui on a exactement la meme fonction
mais qd je mets un type single elle naccepte pas
et puis les variables d un tableau doivet elles etre de meme type ?
je ne comprends pas depssement de capacité


Le message dépassement est peut être du à la division par TotNum, si TotNum
= 0, tu auras une division par zéro, et ca expliquerait ton message

Arnaud
--
Charte du forum : http://users.skynet.be/mpfa/
Recherche dans les archives :
http://groups.google.fr/group/microsoft.public.fr.access?hl=fr