Problème de code

penchu Messages postés 167 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 janvier 2006 - 26 avril 2005 à 11:06
penchu Messages postés 167 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 janvier 2006 - 28 avril 2005 à 15:05
Bonjour à tous,



je suis en stage dans une entreprise dans laquelle on m'a demandé de
faire un programme de gestion des stocks avec un envoi de commande chez
le fournisseur.



Voici le problème. J'ai une datagrid, et en dessous, des textbox qui
affichent toutes les données de la ligne sélectionnée. Je peux m'y
déplacer, et les textbox changent en fonction de l'endroit ou je me
trouve dans la datagrid.

Tout fonctionne nickel sauf la fonction de commande.

En fait dans ma base de données (une seule table), pour chaque pièce j'ai le fournisseur correspondant.

Je voudrais, pour chaque fournisseur créer un dossier avec son nom.
Dans ce dossier, je mettrais des fichiers textes dont le nom est la
date du jour. Ces fichiers contiendront les pièces du stock dont le
stock minimum est atteint.

A partir de ce moment chaque fichier sera envoyé à un contremaitre par
mail, qui fera suivre après vérification, vers les fournisseurs
respectifs.



Pour l'instant, si je veux faire ça, je dois faire une recherche par
fournisseur dans ma base de données pour que le fichier se remplisse
avec les pièces de ce fournisseur affichées dans ma datagrid. Mais le
problème c'est que je dois faire ça pour tous les fournisseurs. Donc ça
ne peux pas aller (il suffit d'imaginer qu'il y ait 2500 fournisseurs ).

Donc en gros, comment faire ça automatiquement en cliquant sur un seul bouton?



Merci beaucoup beaucoup beaucoup à ceux qui pourront m'aider.



voic mon code actuel



Sub commande_auto(ByVal fournisseur As String)

Dim ligne, colonne As Single

Dim date_fichier As Date

date_fichier = System.DateTime.Now.ToShortDateString()

Dim nom_fichier As String

nom_fichier = nom_fichier + date_fichier

nom_fichier = nom_fichier.Replace("/", "_")



If Not (Directory.Exists("c:" & fournisseur)) Then

Directory.CreateDirectory("c:" & fournisseur)

End If

Dim sw_fournisseur As New
StreamWriter("c:" & fournisseur & "" & nom_fichier &
".txt", True)



sw_fournisseur.WriteLine("Ici je mets l'adresse de ma société")



ligne = 0

While (ligne >= 0)

On Error GoTo fin

Dim test As String

test = repertoire.Item(ligne, colonne)

For colonne = 1 To DtSet.Tables(0).Columns.Count - 1

Select Case colonne

Case 1


sw_fournisseur.WriteLine("Machine : " & repertoire.Item(ligne,
colonne))

Case 2


If ((fournisseur "martin") Or (fournisseur "Martin") Or
(fournisseur = "MARTIN")) Then


sw_fournisseur.WriteLine("OM : " & repertoire.Item(ligne, colonne))


End If

Case 4


sw_fournisseur.WriteLine("Référence : " & repertoire.Item(ligne,
colonne))

Case 14


sw_fournisseur.WriteLine("Quantité : " & repertoire.Item(ligne,
colonne) + 4)

End Select

Next colonne

colonne = 0

ligne += 1


sw_fournisseur.WriteLine(ControlChars.Tab &
"______________________" & vbCrLf)

End While

fin:

sw_fournisseur.Close()

End Sub

14 réponses

Horfee Messages postés 188 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 10 août 2009
26 avril 2005 à 14:12
je suppose que tu remplit ton datagrid a partir donc le truc c dans ta requete sql tu met un order by fournisseur, comme ca tu auras toutes les pieces trié par nom de fournisseur
ensuite a chaque ligne tu fais un truc du style :
if fournisseur_actuel=fournisseur_ancien then
'tes inscriptions dans le fichier
else
ancien_fournisseur=fournisseur_actuel
' fermeture nacien fichier
' ouverture nouveau fichier'
'inscription de la premiere ligne uniquement : les autres lignes seront traité par le if
end if
sinon je vois pas trop comment ca marche ton code :
while (ligne>=0)... ligne +=1 ---> toujours verifié!! donc la boucle ne s'arrete que lors d'une erreur ( survenue surement apres la tentative d'une lecture de ligne vide)
ensuite tu utilise un dataset je pense (dtset) et un objet de type tableau (repertoire), qu'est ce dont???
donne moi les infos sur la structure de la table et je t'aiderais un peu plus... parce que c pas bien compliqué ton probleme
0
penchu Messages postés 167 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 janvier 2006
26 avril 2005 à 14:45
repertoire c'est mon datagrid


dtset, c'est effectivement mon dataset.


Voici mon code complet.

http://users.skynet.be/penchu/code.doc
0
Horfee Messages postés 188 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 10 août 2009
26 avril 2005 à 23:58
bon alors deja en ce qui concerne le sql, a eviter :

les "SELECT * FROM..." dans certains cas c'est deconseillé car
surcharge la com, surtout si tu passe par un reseau ( bd distante)

ne jms tout mettre dans une seule table --> créer plusieurs tables
permet de garder une cohérence des données ( si le nom du fournisseur
change, on ne le change pas pour tout les lignes)

les fonction LIKE sont certes puissantes mais a eviter... bon des fois on peut pas faire autrement



en ce qui concerne le code, apparament ton dataset est equivalent a ton
datagrid, donc tant qu'a faire n'en n'utiliser qu'un des deux ( pour la
lisibilité du code)

tant que ligne courante <> derniere ligne

if fournisseur_actuel=fournisseur_ancien then
'tes inscriptions dans le fichier
else
ancien_fournisseur=fournisseur_actuel
' fermeture nacien fichier
' ouverture nouveau fichier'
'inscription de la premiere ligne uniquement : les autres lignes seront traité par le if
end if

fin tant que

je pense que ca devrait etre sympa ca!

ensuite pour ne pas ecrire et donc ecraser plusieurs fois le meme
fichier, soit tu l'ouvre en mode creation,ecriture et append ( rajout
en fin de fichier) soit tu change ta requete en "SELECT * FROM pieces
ORDER BY fournisseur" ( je sais là j'utilise un SELECT * mais c juste
pour l'exemple : a ne pas utiliser)

voilà bonne prog ++
0
penchu Messages postés 167 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 janvier 2006
27 avril 2005 à 10:08
[citation]en ce qui concerne le code, apparament ton dataset est equivalent a ton datagrid, donc tant qu'a faire n'en n'utiliser qu'un des deux ( pour la lisibilité du code)
tant que ligne courante <> derniere ligne
if fournisseur_actuel=fournisseur_ancien then
'tes inscriptions dans le fichier
else
ancien_fournisseur=fournisseur_actuel
' fermeture nacien fichier
' ouverture nouveau fichier'
'inscription de la premiere ligne uniquement : les autres lignes seront traité par le if
end if
fin tant que
/citation

quand tu dis ça, je vois pas trop comment tu veux faire au niveau code lui même
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
penchu Messages postés 167 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 janvier 2006
27 avril 2005 à 11:42
voila, je viens de faire qq modif, j'ai su arranger un petit problème, mais il en reste un important.

Maintenant, je fais ça :
dans mon bouton d'envoi de commande, je met ce code.

Dim j
As
Integer



'Adapter.Fill(Me.DtSet)



For j = 0
To DtSet.Tables(0).Rows.Count - 1


commande_auto(repertoire.Item(j, 3))



Next



et voici ma fonction de commande_auto


#
Region "Commande auto"



Sub commande_auto(
ByVal fournisseur
As
String)



Dim ligne, colonne
As
Single



Dim date_fichier
As
Date


date_fichier = System.DateTime.Now.ToShortDateString()



Dim nom_fichier
As
String


nom_fichier = nom_fichier + date_fichier


nom_fichier = nom_fichier.Replace("/", "_")



If
Not (Directory.Exists("c:" & fournisseur))
Then


Directory.CreateDirectory("c:" & fournisseur)



End
If



Dim sw_fournisseur
As
New StreamWriter("c:" & fournisseur & "" & nom_fichier & ".txt",
True)


sw_fournisseur.WriteLine("S.A. CARTONNAGES LAMMERANT N.V")


sw_fournisseur.WriteLine("Zoning du Vieux-Pont, 3")


sw_fournisseur.WriteLine("B-7900 Leuze-En-Hainaut")


sw_fournisseur.WriteLine("Tel. 069/672200" & vbCrLf & "Fax. 069/672209")


sw_fournisseur.WriteLine(vbCrLf & "Le " & Today & " " & "à " & TimeOfDay & vbCrLf)


sw_fournisseur.WriteLine(vbCrLf & vbCrLf & vbCrLf)



On
Error
GoTo fin



Dim test
As
String


test = repertoire.Item(ligne, colonne)



For colonne = 1
To DtSet.Tables(0).Columns.Count - 1



Select
Case colonne



Case 1


sw_fournisseur.WriteLine("Machine : " & repertoire.Item(ligne, colonne))



Case 2



If ((fournisseur = "martin")
Or (fournisseur = "Martin")
Or (fournisseur = "MARTIN"))
Then


sw_fournisseur.WriteLine("OM : " & repertoire.Item(ligne, colonne))



End
If



Case 4


sw_fournisseur.WriteLine("Référence : " & repertoire.Item(ligne, colonne))



Case 14


sw_fournisseur.WriteLine("Quantité : " & repertoire.Item(ligne, colonne) + 4)



End
Select



Next colonne


colonne = 0


ligne += 1


sw_fournisseur.WriteLine(ControlChars.Tab & "______________________" & vbCrLf)


fin:


sw_fournisseur.Close()



'comborecherche.Items.Add(DtSet.Tables(0).Columns(i).ToString())



End
Sub

avec ce code, un dossier dont le nom est le nom du fournisseur est bien créé pour chaque fournisseur.
Dans chaque dossier je retrouve bien un fichier dont le nom est la date du jour.
Mais le problème est là :
dans le fichier, je retrouve à chaque fois mon en-tête (ca c'est bon), mais je ne retrouve que le permier enregistrement de ma base de données. Et c'est le meme que je retrouve dans tous le fichiers. Dans certains fichiers, je le retrouve une seule fois, dans d'autres fichiers, je le retrouve plusieurs fois.

Voici le contenu d'un fichier (qui est donc le même ou a peu près dans tous les autres fichiers)

Mon entête avec l'adresse de l'usine
Tel. ............
Fax. ............


Le 27/04/2005 à 11:29:04








Machine : 1636
OM : 1234
Référence : 4659
Quantité : 8
______________________


Mon entête avec l'adresse de l'usine
Tel. ............
Fax. ............Le 27/04/2005 à 11:29:04








Machine : 1636
OM : 1234
Référence : 4659
Quantité : 8
______________________
0
Horfee Messages postés 188 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 10 août 2009
27 avril 2005 à 17:20
While ligne < dtset.tables().rows.count

For
colonne = 1
To DtSet.Tables(0).Columns.Count - 1



Select

Case colonne



Case
1



sw_fournisseur.WriteLine("Machine : " & repertoire.Item(ligne, colonne))



Case
2



If
((fournisseur = "martin")
Or (fournisseur = "Martin")
Or (fournisseur = "MARTIN"))
Then





sw_fournisseur.WriteLine("OM : " & repertoire.Item(ligne, colonne))



End

If





Case
4



sw_fournisseur.WriteLine("Référence : " & repertoire.Item(ligne, colonne))



Case
14



sw_fournisseur.WriteLine("Quantité : " & repertoire.Item(ligne, colonne) + 4)



End

Select





Next
colonne

end while
0
Horfee Messages postés 188 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 10 août 2009
27 avril 2005 à 17:28
et pour le code "francais " :



dim str_frs as string = ""



while ( ligne <> dtset.tables(0).rows.count-1)

if str_frs = dtset.tables(0).rows(ligne).item("fournisseur") then

































For
colonne = 1
To DtSet.Tables(0).Columns.Count - 1

Select
Case colonne

Case 1


sw_fournisseur.WriteLine("Machine : " &
repertoire.Item(ligne, colonne))

Case 2

If (fournisseur.tolower() = "martin")
Then


sw_fournisseur.WriteLine("OM : "
& repertoire.Item(ligne, colonne))

End
If

Case 4


sw_fournisseur.WriteLine("Référence : " &
repertoire.Item(ligne, colonne))

Case 14


sw_fournisseur.WriteLine("Quantité : " &
repertoire.Item(ligne, colonne) + 4)

End
Select

Next colonne


else

str_frs = dtset.tables(0).rows(ligne).item("fournisseur")

end if

ligne += 1

end while





ensuite evite de rajouter du code inutile ( :: dim test as string

test = repertoire...

)ensuite avec vb.net on evite les On error ... on prefere les
structures Try ... Catch .. Finally... End try c plus pro... meme si on
error marche bien !
0
penchu Messages postés 167 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 janvier 2006
27 avril 2005 à 19:32
je suis au regret de t'annoncer qu'aucun de ces 2 codes ne fonctionnent.
Le 1er crée un fichier texte (normalement) et met les enregistrements en boucle dedans => un fichier texte de 177 Mo ca fait drôle... (lol)

Ca m'embete fortement car je ne trouve pas de solution idéale.
Par contre, je viens de penser à un truc, je pourrais, mais je ne sais pas trop comment faire, appeler ma fonction connecter_recherche(byval fournisseur) et ce pour tous les fournisseurs présents dans ma db.

Donc un truc du genre :

connecter_recherche(le truc qu'il faut mettre pour que ça le fasse pour tous les fournisseurs).

Parce que quand je remplis mes fichiers textes en fonction de ce qu'il y a d'affiché dans ma datagrid, ...
Mais je sais pas comment faire?
0
Horfee Messages postés 188 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 10 août 2009
27 avril 2005 à 23:42
while ( ligne <> dtset.tables(0).rows.count-1)

if str_frs = dtset.tables(0).rows(ligne).item("fournisseur") then

































For
colonne = 1
To DtSet.Tables(0).Columns.Count - 1

Select
Case colonne

Case 1


sw_fournisseur.WriteLine("Machine : " &
repertoire.Item(ligne, colonne))

Case 2

If (fournisseur.tolower() = "martin")
Then


sw_fournisseur.WriteLine("OM : "
& repertoire.Item(ligne, colonne))

End
If

Case 4


sw_fournisseur.WriteLine("Référence : " &
repertoire.Item(ligne, colonne))

Case 14


sw_fournisseur.WriteLine("Quantité : " &
repertoire.Item(ligne, colonne) + 4)

End
Select

Next colonne


else

str_frs = dtset.tables(0).rows(ligne).item("fournisseur")

sw_fournisseur.close()

Dim
date_fichier
As
Date

date_fichier = System.DateTime.Now.ToShortDateString()


Dim
nom_fichier
As
String

nom_fichier = nom_fichier + date_fichier


nom_fichier = nom_fichier.Replace("/", "_")


If

Not (Directory.Exists("c:" & fournisseur))
Then

Directory.CreateDirectory("c:" & fournisseur)


End

If


sw_fournisseur
=
New StreamWriter("c:" & fournisseur & "" & nom_fichier & ".txt",
True)


sw_fournisseur.WriteLine("S.A. CARTONNAGES LAMMERANT N.V")


sw_fournisseur.WriteLine("Zoning du Vieux-Pont, 3")


sw_fournisseur.WriteLine("B-7900 Leuze-En-Hainaut")


sw_fournisseur.WriteLine("Tel. 069/672200" & vbCrLf & "Fax. 069/672209")



sw_fournisseur.WriteLine(vbCrLf & "Le " &
Today & " " & "à " & TimeOfDay & vbCrLf)


sw_fournisseur.WriteLine(vbCrLf & vbCrLf & vbCrLf)



end if

ligne += 1

end while



ca devrait etre mieux : en clair dans le deuxieme cas du if ( cas ou on
change de fournisseur )il faut ajouter le fait qu'on change de fichier
( je l'avais oublié). donc d'abord on ferme le fichier en cours, on
crée le rep et on cree le fichier ( copier-coller de ce que tu avais
fait) et on ajoute les premieres lignes

j'espere que ca resoud ton pb
0
penchu Messages postés 167 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 janvier 2006
28 avril 2005 à 10:44
je vais encore t'embêter parce que ça ne marche pas, j'ai toujours une exception :



Une exception non gérée du type 'System.IO.IOException' s'est produite dans mscorlib.dll



Informations supplémentaires : Le processus ne peut pas accéder au
fichier "c:\martin\28_04_2005.txt", car il est en cours d'utilisation
par un autre processus.



je ne comprend rien du tout à tout ça...

j'ai essayé de modifier qq lignes pour voir si je pouvais y changer qqch, mais toujours des erreurs....
0
Horfee Messages postés 188 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 10 août 2009
28 avril 2005 à 11:55
il aurait fallu que tu me dise ou exactement ca plantait... parce que là je ne vois pas trop...

peut etre que ca vient de là :


If

Not (Directory.Exists("c:" & fournisseur))
Then

Directory.CreateDirectory("c:" & fournisseur)


End

If



--> a remplacer : fournisseur par str_frs et dan l'entete de ta fonction ne plus passer de parametre (inutile mnt)

mais je c pas si ca vient de là...
0
penchu Messages postés 167 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 janvier 2006
28 avril 2005 à 12:03
c'est ici que ça plante



Dim sw_fournisseur
As
New StreamWriter("c:" & str_frs & "" & nom_fichier & ".txt",
True)

je met mon projet sur http://users.skynet.be/penchu/copie_de_rotomat.zip comme ça ça peut être plus clair pour toi.
0
Horfee Messages postés 188 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 10 août 2009
28 avril 2005 à 13:41
connecter_recherche("SELECT * FROM pieces ORDER BY fournisseur", "pieces")

Dim ligne, colonne As Single

Dim str_frs As String = ""

Dim date_fichier As Date

date_fichier = System.DateTime.Now.ToShortDateString()

Dim nom_fichier As String

Dim sw_fournisseur As StreamWriter



While (ligne <> DtSet.Tables(0).Rows.Count - 1)

If
str_frs = DtSet.Tables(0).Rows(ligne).Item("fournisseur") Then


For colonne = 1 To DtSet.Tables(0).Columns.Count - 1


Select Case colonne


Case 1


sw_fournisseur.WriteLine("Machine : " & repertoire.Item(ligne,
colonne))


Case 2


If (str_frs.ToLower() = "martin") Then


sw_fournisseur.WriteLine("OM : " & repertoire.Item(ligne, colonne))


End If


Case 4


sw_fournisseur.WriteLine("Référence : " & repertoire.Item(ligne,
colonne))


Case 14


sw_fournisseur.WriteLine("Quantité : " & repertoire.Item(ligne,
colonne) + 4)

End Select

Next colonne

Else


str_frs = DtSet.Tables(0).Rows(ligne).Item("fournisseur")

sw_fournisseur.Close()


If Not (Directory.Exists("c:" & str_frs)) Then


Directory.CreateDirectory("c:" & str_frs)

End If


nom_fichier = date_fichier & ".txt"


nom_fichier = nom_fichier.Replace("/", "_")


If Not (Directory.Exists("c:" & str_frs)) Then


Directory.CreateDirectory("c:" & str_frs)

End If


sw_fournisseur = New StreamWriter("c:" & str_frs & "" &
nom_fichier, True)


sw_fournisseur.WriteLine("S.A. CARTONNAGES LAMMERANT N.V")


sw_fournisseur.WriteLine("Zoning du Vieux-Pont, 3")


sw_fournisseur.WriteLine("B-7900 Leuze-En-Hainaut")


sw_fournisseur.WriteLine("Tel. 069/672200" & vbCrLf & "Fax.
069/672209")


sw_fournisseur.WriteLine(vbCrLf & "Le " & Today & " " &
"à " & TimeOfDay & vbCrLf)


sw_fournisseur.WriteLine(vbCrLf & vbCrLf & vbCrLf)

End If

ligne += 1

End While



je ne peu pas tester ton logiciel parce que j'ai pas ta bd... donc essaie ca et si ca marche pas ben...chais plus! lol

au pire envoie moi la structure de ta bd comme ca je pourrais tester
0
penchu Messages postés 167 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 janvier 2006
28 avril 2005 à 15:05
la base de données est dans le dossier bin.



Bon, je viens de tester ton code, mais ça marche toujours pas. J'ai une
erreur d'exception dès qu'il exécute le "sw_fournisseur.close( ) :

Une exception non gérée du type 'System.NullReferenceException' s'est produite dans Rotomat.exe

Informations supplémentaires : La référence d'objet n'est pas définie à une instance d'un objet.



Si je l'enlève, il me dit encore que le fichier ...... n'est pas accessible car utilisé par un autre process.
0
Rejoignez-nous