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 :
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
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
    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
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 :
Column "NIDCLIENT" does not belong to table Table"
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 ?

Merci d'avance.

Griftou.