Bonjour,
Avant de rentrer dans le vif du sujet avec le code, une brève explication. Je suis en train de créer une application pour faire du CRM sur des commandes de chèques cadeau. J'ai créé un module de gestion de la DB en m'inspirant sur le cours de Philippe Laserre.
J'ai, pour le cas qui m'occupe ici, une table "commande" dont les champs sont :
- NIDCOMM (numeric) : id commande
- NIDCLIENT (numeric) : id client
- DDATE (date) : date commande
- CMODECOMM (char) : mode de commande
- CCONTACT (char) : personne de contact
- NACOMM (numeric) : montant total de la commande
- CCOMMENT (char) : commentaires
- CADRLIVR (char) : adresse de livraison
- CZIPLIVR (char) : code postal
- CLOCLIVR (char) : localité
- DDATECR (date) : date de création du record
- DDATEMD (date) : date de modification du record
- CUSERCR (char) : user qui crée le record
- CUSERMD (char) : user qui modifie le record
Et une table "cheque" dont les champs sont :
- NIDCOMM (numeric) : id commnade
- NMONTANT (numeric) : montant du/des chèques
- NNOMBRE (numeric) : nombre de chèques
- DDATECR, DDATEMD, CUSERCR, CUSERMD : idem que table précédente
Voici le code que j'ai produit...
Mon module de gestion de la DB :
La procedure qui est enregistre la commande et les chèques qui vont avec :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178 Module dm Dim conn As New Advantage.Data.Provider.AdsConnection Dim cmd As New Advantage.Data.Provider.AdsCommand Dim da As New Advantage.Data.Provider.AdsDataAdapter Dim ds As New DataSet Dim cb As Advantage.Data.Provider.AdsCommandBuilder Public Sub DoConnect() conn.ConnectionString = "Data Source = C:\.NET Projet\CRM\DBF\; TableType = CDX; ServerType = LOCAL" If conn.State = ConnectionState.Closed Then conn.Open() End If cmd.Connection = conn End Sub Public Sub DoDisconnect() If conn.State = ConnectionState.Open Then conn.Close() End If End Sub Public Function DoSelect(ByVal table As ArrayList, ByVal fields As ArrayList, ByVal criterias As ArrayList, ByVal distinct As Boolean, ByVal order As ArrayList) As DataSet 'each item of fields must be structured like "tableName.fieldName" 'criterias must be structured like this : <key,value> where key is the fieldname and the operator 'example : < "client.NIDCLIENT" = ; 0 > or < "contact.CNOM" = ; "arnaud" > Dim sql As String Try If distinct Then sql = "select distinct " Else sql = "select " End If If Not (fields Is Nothing) Then For Each elem As String In fields sql = sql + elem + ", " Next Else sql = sql + "* " End If sql = sql.TrimEnd(", ".ToCharArray) + " from " For Each elem As String In table sql = sql + elem + ", " Next sql = sql.TrimEnd(", ".ToCharArray) + " where " If Not (criterias Is Nothing) Then For Each elem As String In criterias sql = sql + elem + " and " Next If sql.EndsWith(" and ") Then sql = sql.Substring(0, sql.Length - 5) End If End If If sql.EndsWith(" where ") Then sql = sql.Substring(0, sql.Length - 7) End If If Not (order Is Nothing) Then sql = sql + " order by " For Each elem As String In order sql = sql + elem + "," Next sql = sql.TrimEnd(",") If sql.EndsWith(" order by ") Then sql = sql.Substring(0, sql.Length - 10) End If End If cmd.CommandText = sql da.SelectCommand = cmd ds.Reset() da.Fill(ds) Catch ex As Exception MsgBox(ex.Message) End Try Return ds End Function Public Function DoDelete(ByVal ds As DataSet) As Boolean Try For Each row As DataRow In ds.Tables(0).Rows row.Delete() Next cb = New Advantage.Data.Provider.AdsCommandBuilder(da) cb.RequirePrimaryKey = False da.Update(ds) ds.Reset() da.Fill(ds) cb.Dispose() Return True Catch ex As Exception MsgBox(ex.Message) Return False End Try End Function Public Function DoAdd(ByVal values As Hashtable, ByVal table As String) As Boolean Dim newrow As DataRow Dim keys As IEnumerator 'Dim retour As New Hashtable Try Dim tables As New ArrayList tables.Add(table) ds.Reset() ds = DoSelect(tables, Nothing, Nothing, False, Nothing) tables.Clear() newrow = ds.Tables(0).NewRow keys = values.Keys.GetEnumerator While keys.MoveNext newrow.Item(keys.Current) = values(keys.Current) End While values.Clear() ds.Tables(0).Rows.Add(newrow) cb = New Advantage.Data.Provider.AdsCommandBuilder(da) cb.RequirePrimaryKey = False da.Update(ds) ds.Reset() da.Fill(ds) cb.Dispose() Return True Catch ex As Exception MsgBox(ex.Message) Return False End Try End Function Public Function DoFastUpdate(ByRef ds As DataSet) As DataSet 'pour des updates en éditant directement dans la datagrid Try cb = New Advantage.Data.Provider.AdsCommandBuilder(da) cb.RequirePrimaryKey = False da.Update(ds) ds.Reset() da.Fill(ds) cb.Dispose() Catch ex As Exception MsgBox(ex.Message) End Try Return ds End Function Public Function DoUpdate(ByVal values As Hashtable, ByVal table As String, ByVal criterias As ArrayList) As Boolean Dim currRow As DataRow Dim keys As IEnumerator Dim tables As New ArrayList Try tables.Add(table) ds.Reset() ds = DoSelect(tables, Nothing, criterias, False, Nothing) tables.Clear() currRow = ds.Tables(0).Rows(0) keys = values.Keys.GetEnumerator While keys.MoveNext currRow.Item(keys.Current) = values(keys.Current) End While values.Clear() cb = New Advantage.Data.Provider.AdsCommandBuilder(da) cb.RequirePrimaryKey = False da.Update(ds.Tables(0)) ds.Reset() da.Fill(ds) cb.Dispose() Return True Catch ex As Exception MsgBox(ex.Message) Return False End Try End Function End Module
Mon problème se situe lors d'ajout d'enregistrement dans la table "cheque". La commande s'enregistre sans aucun problème mais lorsque vient le moment d'ajouter un chèque, la ligne "da.Update(ds)" dans la fonction DoAdd dans mon module de gestion génère une exception dont le message est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 Private Sub btnRec_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRec.Click Dim bOk As Boolean = True For Each control As Control In Me.Controls If TypeOf (control) Is ComboBox And control.Text = "" Then bOk = False End If If TypeOf (control) Is TextBox And control.Text = "" And (control.Name <> "tbComment" And control.Name <> "tbCheque" And control.Name <> "tbMontant") Then bOk = False End If Next If lvCheque.Items.Count = 0 Then bOk = False End If If bOk Then values.Add("nidcomm", tbIdComm.Text) values.Add("nidclient", cbIdClient.Text) values.Add("ddate", dtpDate.Value.ToString) values.Add("cmodecomm", cbModeComm.Text) values.Add("ccontact", cbContact.Text) values.Add("nacomm", tbTotal.Text) values.Add("cadrlivr", tbAdrLivr.Text) values.Add("cziplivr", tbZipLivr.Text) values.Add("cloclivr", tbLoclivr.Text) values.Add("ccomment", tbComment.Text) If bNew Then values.Add("ddatecr", Today.Date) values.Add("ddatemd", DBNull.Value) values.Add("cusercr", Environment.UserName) values.Add("cusermd", DBNull.Value) If dm.DoAdd(values, "commande") Then values.Clear() For Each elem As ListViewItem In lvCheque.Items values.Add("nidcomm", tbIdComm.Text) values.Add("nmontant", elem.SubItems(0).Text) values.Add("nnombre", elem.SubItems(1).Text) values.Add("ddatecr", Today.Date) values.Add("ddatemd", DBNull.Value) values.Add("cusercr", Environment.UserName) values.Add("cusermd", DBNull.Value) dm.DoAdd(values, "cheque") values.Clear() Next End If Else values.Add("ddatecr", currRow.Item("ddatecr")) values.Add("ddatemd", Today.Date) values.Add("cusercr", currRow.Item("cusercr")) values.Add("cusermd", Environment.UserName) criterias.Add("nidcomm = " + idComm.ToString) If dm.DoUpdate(values, "commande", criterias) Then criterias.Clear() values.Clear() tables.Add("cheque") criterias.Add("nidcomm = " + idComm.ToString) ds.Reset() ds = dm.DoSelect(tables, Nothing, criterias, False, Nothing) criterias.Clear() If dm.DoDelete(ds) Then For Each elem As ListViewItem In lvCheque.Items values.Add("nidcomm", tbIdComm.Text) values.Add("nmontant", elem.SubItems(0).Text) values.Add("nnombre", elem.SubItems(1).Text) values.Add("ddatecr", currRow.Item("ddatecr")) values.Add("ddatemd", Today.Date) values.Add("cusercr", currRow.Item("cusercr")) values.Add("cusermd", Environment.UserName) ds.Reset() dm.DoAdd(values, "cheque") values.Clear() Next End If Else criterias.Clear() values.Clear() End If End If Else MsgBox("Tous les champs de ce formulaire, à l'exception des commentaires, sont obligatoires." + Chr(13) + "Veuillez les compléter", MsgBoxStyle.OKOnly, "Erreur") End If End Sub
J'ai déjà vérifié ma variable newRow et elle ne contient pas de champs nommé NIDCLIENT. Cela doit être un reste de la requête d'ajout précédente mais comment faire pour m'en débarrasser ?Column "NIDCLIENT" does not belong to table Table"
Merci d'avance.
Griftou.
Partager