Killteck
Messages postés8Date d'inscriptionmercredi 27 décembre 2000StatutMembreDernière intervention21 juillet 2011
-
6 oct. 2009 à 21:18
cs_Ayr
Messages postés221Date d'inscriptionmercredi 9 avril 2003StatutMembreDernière intervention13 décembre 2009
-
7 oct. 2009 à 02:26
Bonsoir j'ai un problème avec mon code mon appelle de procédure m'affiche une erreur dans le programme principal alors que ma structure est correctement déclaré...
Voici tout mon code :
Public Class Form1
Structure Table
Dim Numero As Integer
Dim Statut As String
End Structure
Public Sub InitTableau(ByRef T_Salarié() As Table)
Dim i As Integer
Dim reponse As String
i = 1
reponse = "oui"
Do While reponse = "oui"
T_Salarié(i).Numero = i
T_Salarié(i).Statut = InputBox("Veuillez indiquez le statuts du salarié n° " & i)
i = i + 1
Loop
End Sub
Function Mystere(ByVal taux As Double, ByVal Nb25 As Double, ByVal Nb50 As Double)
Dim resultat As Double
resultat = (169 * taux) + (taux * 1.25 * Nb25) + (taux * 1.5 * Nb50)
Return resultat
End Function
Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim T_Salarié() As Table
Dim T_SB() As Double
Dim H_Sup25 As Double
Dim H_Sup50 As Double
Dim TxAnnuel As Double
Dim Tx1 As Double
Dim Tx2 As Double
Dim I As Integer
Dim TotalSalaire As Double
Dim SalaireBrut As Object
Dim FSys As Object
Call InitTableau( T_Salarié()
)
Est la il me marque : Le nombre d'indices est inférieur au nombre de dimensions du tableau indexé.
I = 1
Tx1 = 50
Tx2 = 60
Do While T_Salarié(I).Numero = ""
H_Sup25 = InputBox("Veuilez indiquez le nombre d'heure mensuelles suplémentaire a 25% du salarié n° " & I)
H_Sup50 = InputBox("Veuilez indiquez le nombre d'heure mensuelles suplémentaire a 50% du salarié n° " & I)
If T_Salarié(I).Statut = "saisonnier" Then
TxAnnuel = Tx1
Else : TxAnnuel = Tx2
End If
T_SB(I) = Mystere(TxAnnuel, H_Sup25, H_Sup50)
I = I + 1
Loop
FSys = CreateObject("Scripting.FileSystemObject")
SalaireBrut = FSys.CreateTextFile("c:\windows\bureau\fichier.txt")
With SalaireBrut
Do While T_SB(I) <> ""
.writeLine(T_SB(I))
I = I + 1
Loop
End With
I = 1
Do While T_SB(I) <> ""
TotalSalaire = TotalSalaire + T_SB(I)
I = I + 1
Loop
MsgBox("Le total des salaires est de " & TotalSalaire)
MsgBox("Le salaire moyen est de " & TotalSalaire / I)
End Sub
End Class
Voila le problème je ne comprend pas pourquoi il me marque ce message d'erreur alors que ma structure est correctement déclarer. J'espère que vous pourrez m'aider.
1) tu es en VB Net et non VB 6.0 ( d'après ta sub Button_1)
2) ton tableau T_Salarié() est bien déclaré mais il n'est pas dimensionné
3) Dans ta Sub Initableau ta boucle est infinie car réponse ne passe jamais à "non"
4) Les tableaux commencent à 0 : dim T_salarié(0 to 99) pour 100 salariés de 0 à 99
5) Inutile de faire une Sub pour initialiser le tableau
6) Quand ton tableau est créé inutile de faire des boucles Do While pour l'explorer et faire les calculs : utilise une boucle For Next car tu connais la taille de ton tableau
bon courage et bonne prog
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
cs_Ayr
Messages postés221Date d'inscriptionmercredi 9 avril 2003StatutMembreDernière intervention13 décembre 20092 7 oct. 2009 à 02:26
Bonjour,
7) Tu définie mal la visibilité de ta structure. Laisse faire au minimum le compilateur, définie toi même quand tu veux que tes différents éléments doivent êtres Private ou Public. C'est mieux pour la lisibilité.
8) Dans ton exemple, Numero n'est pas utilisé, tu n'as donc pas besoin de la structure.
9) Dans InitTableau il est préférable de définir réponse comme un Boolean. Mais comme le dit Galain, dans ton cas tu es sensé connaitre la taille du tableau.
10) Ta fonction Mystere n'a pas de type de retour. Tu doit le définir.
Function Mystere(ByVal taux As Double, ByVal Nb25 As Double, ByVal Nb50 As Double) As Double
Dans l'évènement click du bouton :
11) Tx1 et Tx2 ne varient pas, tu peux les définir comme constantes.
12) La fonction InputBox renvoie un string et H_Sup25 et H_Sup50 sont des Double. Il est très préférable de faire la convertion de type. Même genre de problème pour SalaireBrut et FSys.
13) Tu es en .Net, utilise les classes de System.IO pour écrire et lire dans un fichier.
14) Tu fait plusieurs boucles où tu pourrais en utiliser qu'une. Dans ce cas T_SB n'a pas besoin d'être un tableau.
15) Si tu tiens à séparer la saisie des statut et du nombre d'heures sup, T_Salarié doit être un tableau, sinon tu peux éliminer encore une boucle (celle d'init du tableau) et T_Salarié n'a pas besoin d'être un tableau.
Voilà à quoi pourrait ressembler ton code si on saisie le statut et le nombres d'heure en deux temps:
Public Class Form1
Private Const NbSalaries As Integer = 2 '-- remplacer 2 par le nombre voulu
Private Const TAUX1 As Integer = 50
Private Const TAUX2 As Integer = 60
Function Mystere(ByVal taux As Integer, ByVal Nb25 As Double, ByVal Nb50 As Double) As Double
Return (169 * taux) + (taux * 1.25 * Nb25) + (taux * 1.5 * Nb50)
End Function
Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim T_Salarié(NbSalaries) As String
Dim T_SB As Double
Dim H_Sup25 As Double
Dim H_Sup50 As Double
Dim TotalSalaire As Double
For i As Integer = 0 to T_Salarié.Length - 1
T_Salarié(i) = InputBox("Veuillez indiquez le statuts du salarié n° " & i)
Next i
Using SalaireBrut As System.IO.StreamWriter = New System.IO.StreamWriter("d:\fichier.txt")
For I As Integer = 0 to T_Salarié.Length - 1
H_Sup25 = CType(InputBox("Veuilez indiquez le nombre d'heure mensuelles suplémentaire a 25% du salarié n° " & I), Double)
H_Sup50 = CType(InputBox("Veuilez indiquez le nombre d'heure mensuelles suplémentaire a 50% du salarié n° " & I), Double)
T_SB Mystere(If(T_Salarié(I) "saisonnier", TAUX1, TAUX2), H_Sup25, H_Sup50)
SalaireBrut.WriteLine(T_SB)
TotalSalaire += T_SB
Next i
SalaireBrut.Close()
End Using
MsgBox("Le total des salaires est de " & TotalSalaire.ToString("# ##.00 €"))
MsgBox("Le salaire moyen est de " & (TotalSalaire / T_Salarié.Length).ToString("# ##.00 €"))
End Sub
End Class
De manière plus générale:
Pense à utiliser Option Strict On.
Si tu as beaucoup de salariés, tu devrais penser à une manière plus ergonomique de saisir les infos. Tu cours un risque important d'erreurs de saisie avec ta méthode, sans compter le côté rébarbatif.