Ajouter un enregistrement

Résolu
patdan Messages postés 37 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 3 avril 2009 - 26 déc. 2007 à 16:46
patdan Messages postés 37 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 3 avril 2009 - 27 déc. 2007 à 21:31
Bonjour,


je débute en Visual studio 2005, langage VB Net et travaille avec une BDD Access 2002
J'ai cherché partout et je ne m'en sors tjrs pas
Voici une partie du code :




   
Sub Proprio(ByVal Choix)<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>






       
If Choix = "Ajout"Then






            strSql "SELECT count(*) as Resul FROM ASLProprio WHERE ProprioDatDep IS NULL AND ProprioNumLot '" & TxtPNLot.Text & "'"






            ObjetCommand = New OleDbCommand(strSql)






            ObjetDataAdapter = New OleDbDataAdapter(ObjetCommand)






            ObjetCommand.Connection() = ObjetConnection






            ObjetDataSet.Clear()







          ObjetDataAdapter.Fill(ObjetDataSet, "ASLProprio")
> Aucune valeur donnée pour un ou plusieurs des paramètres requis.




           

ObjetDataTable = ObjetDataSet.Tables("ASLProprio")






  
         

'Existe dans la base et tjrs présent ==> ne pas ajouter






           

If
ObjetDataTable.Rows.Count > 0 Then






                MsgBox("Proprio non parti")






               

Exit

Sub







           
End
If







           
'else ajouter : OK n'existe pas dans la base







           

ObjetDataRow = ObjetDataSet.Tables("ASLProprio").NewRow()






           

ChargerChamps()






            ObjetDataSet.Tables("ASLProprio").Rows.Add(ObjetDataRow)






           
'Pour modifier les valeurs changées dans le DataAdapter







           

ObjetCommandBuilder = New OleDbCommandBuilder(ObjetDataAdapter)






           
'MAJ







            ObjetDataAdapter.Update(ObjetDataSet, "ASLProprio")






           
'On vide le DataSet et on le 'recharge' de nouveau.







           

ObjetDataSet.Clear()






            ObjetDataAdapter.Fill(ObjetDataSet, "ASLProprio")






           

ObjetDataTable = ObjetDataSet.Tables("ASLProprio")






       
Else
'Modifier







           
' Extraire l'enregistrement courant







            ObjetDataRow = ObjetDataSet.Tables("ASLProprio").Rows(0)






         
  

'Modifier les valeurs des champs en  récupérant le contenu des TextBox






            ChargerChamps()






           
'Pour modifier les valeurs changées dans le DataAdapter







           

ObjetCommandBuilder = New OleDbCommandBuilder(ObjetDataAdapter)






          
 
'MAJ







            ObjetDataAdapter.Update(ObjetDataSet, "ASLProprio")






 







           

'On vide le DataSet et on le 'recharge' de nouveau.






           

ObjetDataSet.Clear()






            ObjetDataAdapter.Fill(ObjetDataSet, "ASLProprio")






            ObjetDataTable = ObjetDataSet.Tables("ASLProprio")






           
Dim Rang AsInteger






            Rang = LBProprio.SelectedIndex






            LBProprio.Items.RemoveAt(LBProprio.SelectedIndex)






            LBProprio.Items.Insert(Rang, TxtPNom.Text)






            ASLMain.Choix = ""






            LBProprio.Refresh()






       
End
If         






       

Sub
ChargerChamps()








           ObjetDataRow(
"ProprioNumLot"
) = TxtPNLot.Text








           ObjetDataRow(
"ProprioNom"
) = TxtPNom.Text








           ObjetDataRow(
"ProprioPrenom"
) = TxtPPrenom.Text








           ObjetDataRow(
"ProprioDatArrive"
) = MtbDatArriv.Text








           ObjetDataRow(
"ProprioTelAsl"
) = TxtPTelAsl.Text








           ObjetDataRow(
"ProprioTelMobile1"
) = TxtPTelMobile1.Text








           ObjetDataRow(
"ProprioTelMobile2"
) = TxtPTelMobile2.Text








           ObjetDataRow(
"ProprioTelAutre"
) = TxtPTelAutre.Text








           ObjetDataRow(
"ProprioAutreAdrRue"
) = TxtPAutreAdrRue.Text








           ObjetDataRow(
"ProprioAutreAdrCP"
) = TxtPAutreAdrCP.Text








           ObjetDataRow(
"ProprioAutreAdrVille"
) = TxtPAutreAdrVille.Text








       

End


Sub















   
End
Sub





*********************
L'erreur ci-dessus apparaît. Je crois que j'avais réussi à la faire disparaître (mais je ne sais plus comment),
Pourtant j'ai vu des exemples et j'ai l'impression que mon code est identique ??? !!!


En fait, j'ai aussi un autre formulaire avec un ajout d'enregistrement, mais sur une table vide, je galère aussi (le champ n'existe pas ds la table ) : c'est clair , mais il EXISTE!!

Merci d'avance aux courageux qui me sortiront de là!!

patdan

10 réponses

patdan Messages postés 37 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 3 avril 2009
27 déc. 2007 à 21:31
Eh bien la réponse je me la donne :

A force de galérer, j'ai rajouté ces lignes au début de mon ajout :

strSql = "SELECT * FROM ASLProprio"
ObjetCommand = New OleDbCommand(strSql)
ObjetDataAdapter = New OleDbDataAdapter(ObjetCommand)
ObjetCommand.Connection() = ObjetConnection
ObjetDataSet.Clear()
ObjetDataAdapter.Fill(ObjetDataSet, "ASLProprio")
ObjetDataTable = ObjetDataSet.Tables("ASLProprio")
ObjetDataRow = ObjetDataSet.Tables("ASLProprio").NewRow
ChargerChamps()
ObjetDataSet.Tables("ASLProprio").Rows.Add(ObjetDataRow)
ObjetCommandBuilder = New OleDbCommandBuilder(ObjetDataAdapter)
ObjetDataAdapter.Update(ObjetDataSet, "ASLProprio")
ObjetDataSet.Clear()
ObjetDataAdapter.Fill(ObjetDataSet, "ASLProprio")
ObjetDataTable = ObjetDataSet.Tables("ASLProprio")

Et voilà cela marche à présent

Ce qui me chagrine c'est que j'ai l'impression que il faut sans cesse retaper des tas de lignes similaires c'est lourd ou il y a une autre soluce mais je démarre : je ne connais pas

patdan
3
PatriceVB Messages postés 562 Date d'inscription dimanche 16 décembre 2001 Statut Modérateur Dernière intervention 26 décembre 2007
26 déc. 2007 à 18:24
Bon ça fait 50 ans que j'ai pas fait d'Access mais si je me souvients bien le passage de paramètres se fait de la manière suivante :

Dim myconnection AsNew OleDbConnection("connectionstring")

Dim cmdGetProprios AsNew
OleDbCommand()
cmdGetProprios.CommandText =

"select count(*) from ASLProprio where ProprioDatDep is null and ProprioNumLot=?"
cmdGetProprios.Parameters.Add(

"NumLot", TxtPNLot.Text)
cmdGetProprios.CommandType = CommandType.Text

cmdGetProprios.Connection = myconnection

Dim myAD AsNew
OleDbDataAdapter(cmdGetProprios)

Dim myDS AsNew
DataSet
myAD.Fill(myDS)

++

Patrice
0
patdan Messages postés 37 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 3 avril 2009
26 déc. 2007 à 19:19
Merci de m'avoir répondu.
En fait, j'ai supprimé les lignes :

            ObjetDataAdapter.Fill(ObjetDataSet, "ASLProprio") ==>Aucune valeur donnée pour un ou plusieurs des paramètres requis.
            ObjetDataTable = ObjetDataSet.Tables("ASLProprio")

et je passe  maintenant directement sur :'else ajouter : OK n'existe pas dans la base<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

et  lorsque la sub ChargerChamps s'éxécute :

La colonne 'ProprioNumLot' n'appartient pas à la table ASLProprio

or ce champ APPARTIENT pourtant à la table ASLProprio et est orthographié de la même manière

Il doit manquer qque chose mais quoi et où??

Merci à tous

patdan
0
cs_djerbino Messages postés 56 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 2 novembre 2009
27 déc. 2007 à 12:36
"La colonne 'ProprioNumLot' n'appartient pas à la table ASLProprio"=>hé bien


c'est clair
verifie l'ortographe du champ

'ProprioNumLot'


dans ta base de données
si il le faut fai une copier coller de access vers ton code
bonne chance
0

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

Posez votre question
patdan Messages postés 37 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 3 avril 2009
27 déc. 2007 à 13:57
Salut,
Bien sûr que cela paraît clair , donc cela a été mon premier contrôle. Mais je persiste et signe :

ProprioNumLot APPARTIENT à la table ASLProprio et est orthographié de la même manière

Donc qque chose est mal programmé et provoque cette erreur , mais QUOI
That is the QUESTION ???
Et comme je démarre dans ce gros bazar où l'on passe son temps à réécrire sans cesse la même chose, je suis paumée noyée....A moins que l'on puisse faire + simple mais j'ai parcouru des tas de sites depuis des jours et je sature..
Peut-être aurais-je dû choisir un autre langage??? mais pour ce proj il est trop tard!!
 
Merci encore d'essayer de me sortir de là car "je n"ai plus 20 ans hélas..."

PS Je viens de retester, mais à force d'essayer des modifs, je plane : j'ai de nouveau le message du 1er post

patdan
0
cs_djerbino Messages postés 56 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 2 novembre 2009
27 déc. 2007 à 14:54
voici un code qui fonctionne correctement
sa devrai surement t'aider
il reste a modifier le nom de la base ,les tables et les champ

Imports

System
Imports

System.Data
Imports

System.Data.OleDb
Imports

Microsoft.VisualBasic
Public

Class Form2

'Déclaration de la variable pour la connection

Private cnx
As OleDbConnection

'Déclaration de la variable pour la commande

Private cmd
As OleDbCommand

'Déclaration de la variable pour le dataadapter

Private dta
As OleDbDataAdapter

'Déclaration de la variable pour le dataset

Private dts
As DataSet

'Déclaration de la variable pour la requête

Private sql
As
String

'Déclaration de la variable pour la datatable

Private dtt
As DataTable

'Déclaration de la variable pour le datarow

Private dtr
As DataRow

'Déclaration de la variable pour le Nº de l'enregistrement

Private rownum
As
Integer

'Déclaration de la variable pour la connectionstring

Private cnxstr
As
String

'Déclaration de la variable pour le commandbuilder

Private cmdb
As OleDbCommandBuilder 

Private
Sub Form2_Load(
ByVal sender
As
Object,
ByVal e
As System.EventArgs)
Handles
Me.Load
'ouverture de la connection(à partir du répertoire de l'application)sur la même lignecnxstr "provider microsoft.jet.oledb.4.0 ; data source = " & Application.StartupPath &
"\base.mdb;"cnx =
New OleDbConnectiondts New DataSetcnx.ConnectionString cnxstr

cnx.Open()

'Création de la requête sqlsql =

"select table.* from table" 

'Création de la commande et on l'instancie (sql) cmd =

New OleDbCommand(sql)

'Création du dataadapter (dta) et on l'instancie (cmd)dta =

New OleDbDataAdapter(cmd)

'On instancie la commande (cmd) à la connection (cnx) cmd.Connection() = cnx

'On charge le dataset (dts) grace à la propriété fill du dataadapter (dta)dta.Fill(dts,

"table")

'On charge la datatable (dtt) grace à la propriété tables du dataset (dts) dtt = dts.Tables(

"table") 

End
Sub 

 

Private
Sub enregistrer_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles enregistrer.Click 

 

'crátion d'une nouvelle ligne avec les données des textboxdtr = dts.Tables(

"table").NewRow 

dtr(

"champ1") =
Me.texbox1.Textdtr(

"champ2") =
Me.textbox2.Text

'ajout de la ligne dans le DataSetdts.Tables(

"table").Rows.Add(dtr)

'création et exécution du commandbuilder pour mettre à jour le DataAdaptercmdb =

New OleDbCommandBuilder(dta)

'mise à jour des données du dataadapter(dta)à partir du commandbuilder (cmdb)dta.Update(dts,

"table")

'on vide le dataset pour le recréer avec les nouvelles données dts.Clear()

dta.Fill(dts,

"table")dtt = dts.Tables(

"table")

End
SubEnd

Class
0
cs_djerbino Messages postés 56 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 2 novembre 2009
27 déc. 2007 à 14:56
les retours en ligne sont inexplicables
rq: tu doit mettre ta base de donné dans le dossier debug de ton application   

Imports



System


Imports



System.Data


Imports



System.Data.OleDb


Imports



Microsoft.VisualBasic


Public






Class
Form2


'Déclaration de la variable pour la connection






Private
cnx

As
OleDbConnection


'Déclaration de la variable pour la commande






Private
cmd

As
OleDbCommand


'Déclaration de la variable pour le dataadapter






Private
dta

As
OleDbDataAdapter


'Déclaration de la variable pour le dataset






Private
dts

As
DataSet


'Déclaration de la variable pour la requête






Private
sql

As



String






'Déclaration de la variable pour la datatable






Private
dtt

As
DataTable


'Déclaration de la variable pour le datarow






Private
dtr

As
DataRow


'Déclaration de la variable pour le Nº de l'enregistrement






Private
rownum

As



Integer






'Déclaration de la variable pour la connectionstring






Private
cnxstr

As



String






'Déclaration de la variable pour le commandbuilder






Private
cmdb

As
OleDbCommandBuilder 


Private



Sub
Form2_Load(

ByVal
sender

As



Object
,

ByVal
e

As
System.EventArgs)

Handles



Me
.Load


'ouverture de la connection(à partir du répertoire de l'application)sur la même ligne

cnxstr "provider microsoft.jet.oledb.4.0 ; data source = "
& Application.StartupPath &

"\base.mdb;"

cnx =




New
OleDbConnectiondts =


New
DataSetcnx.ConnectionString = cnxstr

cnx.Open()


'Création de la requête sql

sql =




"select table.* from table" 








'Création de la commande et on l'instancie (sql)

cmd =




New
OleDbCommand(sql)


'Création du dataadapter (dta) et on l'instancie (cmd)

dta =




New
OleDbDataAdapter(cmd)


'On instancie la commande (cmd) à la connection (cnx)

cmd.Connection() = cnx







'On charge le dataset (dts) grace à la propriété fill du dataadapter (dta)

dta.Fill(dts,




"table"
)


'On charge la datatable (dtt) grace à la propriété tables du dataset (dts)

dtt = dts.Tables(




"table"



End



Sub 

 








Private



Sub
enregistrer_Click(

ByVal
sender

As
System.Object,

ByVal
e

As
System.EventArgs)

Handles
enregistrer.Click 

 


'crátion d'une nouvelle ligne avec les données des textbox

dtr = dts.Tables(




"table"
).NewRow 

dtr(


"champ1"
) =

Me
.texbox1.Textdtr(


"champ2"
) =

Me
.textbox2.Text


'ajout de la ligne dans le DataSet

dts.Tables(




"table"
).Rows.Add(dtr)


'création et exécution du commandbuilder pour mettre à jour le DataAdapter

cmdb =




New
OleDbCommandBuilder(dta)


'mise à jour des données du dataadapter(dta)à partir du commandbuilder (cmdb)

dta.Update(dts,




"table"
)


'on vide le dataset pour le recréer avec les nouvelles données

dts.Clear()


dta.Fill(dts,




"table"
)dtt = dts.Tables(


"table"
)


End



SubEnd





Class
0
patdan Messages postés 37 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 3 avril 2009
27 déc. 2007 à 17:52
Merci

Mais hélas mon code correspond à cela : j'ai bien contrôlé
La seule erreur qui me reste maintenant est :
La colonne 'ProprioNumLot' n'appartient pas à la table ASLProprio

Ce champ est le 1er que je charge, mais pr les autres c'est pareil

Sub ChargerChamps()
ObjetDataRow(
"ProprioNumLot") = TxtPNLot.Text
ObjetDataRow(
"ProprioNom") = TxtPNom.Text
ObjetDataRow(
"ProprioPrenom") = TxtPPrenom.Text
ObjetDataRow(
"ProprioDatArrive") = MtbDatArriv.Text
ObjetDataRow(
"ProprioTelAsl") = TxtPTelAsl.Text
ObjetDataRow(
"ProprioTelMobile1") = TxtPTelMobile1.Text
ObjetDataRow(
"ProprioTelMobile2") = TxtPTelMobile2.Text
ObjetDataRow(
"ProprioTelAutre") = TxtPTelAutre.Text*
ObjetDataRow(
"ProprioAutreAdrRue") = TxtPAutreAdrRue.Text
ObjetDataRow(
"ProprioAutreAdrCP") = TxtPAutreAdrCP.Text
ObjetDataRow(
"ProprioAutreAdrVille") = TxtPAutreAdrVille.Text

End
Sub

ChargerChamps est appelé dans ma sub d'ajout :
ObjetDataRow = ObjetDataSet.Tables(

"ASLProprio").NewRow
ChargerChamps()
ObjetDataSet.Tables(
"ASLProprio").Rows.Add(ObjetDataRow)

'Pour modifier les valeurs changées dans le DataAdapter
ObjetCommandBuilder =
New OleDbCommandBuilder(ObjetDataAdapter)

'MAJ
ObjetDataAdapter.Update(ObjetDataSet,
"ASLProprio")

'On vide le DataSet et on le 'recharge' de nouveau.
ObjetDataSet.Clear()
ObjetDataAdapter.Fill(ObjetDataSet,
"ASLProprio")
ObjetDataTable = ObjetDataSet.Tables(
"ASLProprio")

Donc, je galère tjrs. Il doit manquer peut_être qque chose comme un lien...Allez donc savoir, surtout que dans la même SUB, j'ai la modif qui elle fonctionne

If Ajout.......
else
Modif..... OK

patdan
0
cs_djerbino Messages postés 56 Date d'inscription mercredi 5 décembre 2007 Statut Membre Dernière intervention 2 novembre 2009
27 déc. 2007 à 18:18
bon change ProprioNumLot en une clé primaire et met la auto-increment et efface la ligne si elle doit pas etre forcement saisie
sinon sa doit aller la ton code est correct sauf verifie encore une foi le syntaxe de la table ProprioNumLot dans ta db
0
patdan Messages postés 37 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 3 avril 2009
27 déc. 2007 à 18:50
Merci djerbino de suivre mon pb, mais hélas ce champ est obligatoire et son nom est bon.
Par sécurité, je l'ai même retapé. De toute façon les autres champs ne sont pas reconnus non plus

Donc il manque qque chose qque part pour que ces champs soient reconnus MAIS ?????
 ........si je savais quoi , je ne serai pas là

Merci je cherche tjrs de mon côté

A bientôt une réponse j'espère

patdan
0
Rejoignez-nous