Voici l'endroit précis du plantage (voir fichier joint)
De plus, ce plantage est aléatoire !
Version imprimable
Voici l'endroit précis du plantage (voir fichier joint)
De plus, ce plantage est aléatoire !
Non, ce n'est pas à l'endroit précis... 8O
Tu aurais du écrire :
Donc en conclusion, tu as un NULL dans ta chaîne SQL INSERT...Code:
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 If Not (oRsAccess.BOF And oRsAccess.EOF) Then 'Ajouter un record dans GIPAFG StrSql = "INSERT INTO MEURAM.GIPAFG ( ENR , MAJ, FLM, CONNAT, CONTYP, CONNUM, SER, AFFB, CLSC, GEO, PAY, CLCLI, CLUSI, NOM, TAX, REV, ACT, NATB, TYPB, DAC, DAP, DAM, CLSD, PLAN, REP )" & _ " VALUES(" & "'005', " & _ "'" & Format(Val(Day(oRsAccess!oedatenvoicde)), "00") & Format(Val(Month(oRsAccess!oedatenvoicde)), "00") & Val(Year(oRsAccess!oedatenvoicde)) & "', " & _ "'1', " & _ "'1'" & ", " & "'7'" & ", " & "'" & oRsAccess!oenaff & "', " & _ "'730', " & "'" & oRsAccess!oenumero & "', " & _ "'W', " & "'" & Mid(oRsAccess!oenumcli, 1, 1) & "', " & _ "'" & oRsAccess!oecodpays & "', " & _ "'" & Mid(oRsAccess!oenumcli, 1, 5) & "', " & _ "'" & Mid(oRsAccess!oenumcli, 6, 2) & "', " & _ "'" & oRsAccess!oenomaff & "', " & _ "'H.T', " & "'F', " & "'8', " & "'8', " & "'1', " & _ "'" & Format(Val(Day(oRsAccess!oedatconfcde)), "00") & Format(Val(Month(oRsAccess!oedatconfcde)), "00") & Val(Year(oRsAccess!oedatconfcde)) & "', " & _ "'12" & Val(Year(oRsAccess!oedatenvoicde)) & "', " & _ "'" & Format(Val(Month(oRsAccess!oedatliv)), "00") & Val(Year(oRsAccess!oedatliv)) & "', " & _ "'" & Format(Val(Day(oRsAccess!oedatconfcde)), "00") & Format(Val(Month(oRsAccess!oedatconfcde)), "00") & Val(Year(oRsAccess!oedatconfcde)) & "', " & _ "'" & Mid(oRsAccess!oeplan, 1, 2) & "', " & _ "'" & oRsAccess!oeresp & "'" & ")" 'MsgBox StrSql oCnAS400.Execute StrSql Le programme se plante ici !!!
A toi de trouver où et d'utiliser la fonction Nz()
Et donc comme l'a (RE)souligné PapyFrenchie51, prend le StrSql et colle-le dans le QBE pour voir quel champ est Null.
Pour le côté aléatoire, cela s'explique par le fait que le(s) champ(s) NULL en question ne l'est (le sont) pas toujours.
Argy
Argy,
J'ai ajouté avant StrSql= un msgbox de tous les champs que j'utilise pour initialiser StrSql
Le programme se plante avant de m'afficher le premier msgbox (voir fichier joint) alors que oRsAccess!oedatenvoicde n'est pas Null !
La seule différence que j'ai identifiée est le champ oedatenvoicde qui est initialisé à l'ouverture du formulaireCode:Me.oedatenvoicde = Now()
Oui, c'est bien ce que j'ai dit : il plante à la constitution de la chaîne SQL.
Un objet Recorset inscrit :
plante si Fieldname est NULL.Code:oRS!Fieldname
Tu dois alors écrire :
ouCode:Nz(oRS!Fieldname, "")
ouCode:Nz(oRS!Fieldname, 0)
selon la valeur attendue.Code:Nz(oRS!Fieldname, False)
Et pour ne pas être lourd, enfin, si, un peu quand même :
ArgyCitation:
Envoyé par PapyFrenchie51 et moi
Désolé mais je ne comprends pas ce que vous souhaitez que je fasse
Vous voulez que je copie mon instruction INSERT dans le QBE ?
Argy,
Il y a autre chose et je ne comprends vraiment pas ce qui se passe
J'ai le résultat de StrSql en pièce jointe. Tous les fieldnames utilisés retournent bien une valeur
Et pourtant, le programme se plante
Humm, il y a automatiquement une explication...
Suit les instructions de ce bloc et recommence.
Dis nous où le Resume t'emmène au niveau du Stop.
ArgyCode:
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 Sub AS400() Dim oCnAS400 As ADODB.Connection Dim oCnAccess As ADODB.Connection Dim oRsAccess As ADODB.Recordset Dim oRsChange As ADODB.Recordset Dim blnDebug As Boolean On Error GoTo L_ErrAS400 blnDebug = True Set oCnAS400 = New ADODB.Connection Set oCnAccess = New ADODB.Connection Set oRsAccess = New ADODB.Recordset Set oRsChange = New ADODB.Recordset '--------------------------------------------------------- 'Copie/Colle ton bloc de code ici sans les déclarations '--------------------------------------------------------- On Error GoTo 0 L_ExAS400: If Not oRsAccess Is Nothing Then oRsAccess.Close If Not oRsChange Is Nothing Then oRsChange.Close If Not oCnAccess Is Nothing Then oCnAccess.Close If Not oCnAS400 Is Nothing Then oCnAS400.Close Set oRsChange = Nothing Set oRsChange = Nothing Set oCnAccess = Nothing Set oCnAS400 = Nothing Exit Sub L_ErrAS400: If blnDebug Then MsgBox err.Description, 48, err.source Stop: Resume Else Resume L_ExAS400 End If End Sub
Argy,
Voici ce que ça donne !
Ooops, oui, mais il te fallait appuyer sur F8 pour voir la ligne en erreur...
Aller, on va y arriver.
Argy
Désolé, je ne suis pas familier du mode debug :-/
Humm, c'est bien ce que je te disais : tu as un NULL dans un des champs et l'INSERT ne peut être construit.
Je te suggère (comme déjà dit) de prendre ta chaîne et de la coller dans le QBE.
Cela t'emmènera très certainement sur la colonne fautive.
Sinon, comme déjà suggéré, pose des Nz() là où tu supposes qu'il peut y avoir un NULL.
Parce que ce n'est pas l'INSERT qui plante mais bel et bien ta chaîne StrSql de type String qui n'accepte pas un NULL provoqué par l'objet RecordSet!NomDuChamp.
Argy
Il ne peut y avoir de nul dans mon insert, donc je ne peux pas utiliser le Nz()
Par contre, je ne comprends pas la manip de coller ma chaine dans le QBE.
Juste un petit rappel sur le fonctionnement de ma procédure.
J'affiche un formulaire qui s'appuie sur la table TblOffreEnt
Je complète certains champs de ce formulaire et je confirme
C'est ici que je lance ma procédure
J'utilise un 1er recordset qui lie l'enregistrement concerné (oRsAccess)
Je construis mon INSERT
Si je colle "bêtement" ma chaîne INSERT, ça ne peut pas fonctionner ?
Access n'invente pas les erreurs.
Dans le bloc de gestion d'erreur, si tu prends Err.Number tu auras un 94.
Donc il y en a bien une quelque part.
Tu mets
?StrSql
dans la fenêtre de Bebug et tu récupère la requête.
Tu la colles dans une nouvelle requête et tu vois si tu peux l'exécuter ; en toute apparence on pourra supposer que oui, puisque tu nous dis qu'il n'y a pas de NULL.
Bah, si, c'est ainsi qu'on teste, entre autre...
Argy
Oui Argy, je suppose bien qu'il y a un Nul dans ma chaine mais je disais juste que je ne pouvais pas en avoir. J'ai besoin d'une info dans chaque champ
J'essaie de tester cette manip cet après-midi
Merci pour ton aide, en tout cas !
Bonjour Argy,
Voici mes 2 définitions de StrSql
Je ne vois toujours pas de champ NullCode:
1
2
3
4 ?StrSql SELECT * FROM TblOffreEnt WHERE TblOffreEnt.oenumero =3001 ?StrSql INSERT INTO MEURAM.GIPAFG ( ENR , MAJ, FLM, CONNAT, CONTYP, CONNUM, SER, AFFB, CLSC, GEO, PAY, CLCLI, CLUSI, NOM, TAX, REV, ACT, NATB, TYPB, DAC, DAP, DAM, CLSD, PLAN, REP ) VALUES('005', '24032016', '1', '1', '7', '7755', '730', '3001', 'W', '2', '508', '21422', '00', 'Kaiser Jacarei', 'H.T', 'F', '8', '8', '1', '24032016', '122016', '032016', '24032016', '24', 'CBA')
Oui, j'ai bien vu...
Modifie ton code comme suit (pas très élégant mais...) :
et dans le gestionnaire d'erreur, comme ceci :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 10 StrSql = "INSERT INTO MEURAM.GIPAFG ( ENR , MAJ, FLM, CONNAT, CONTYP, CONNUM, SER, AFFB, CLSC, GEO, PAY, CLCLI, CLUSI, NOM, TAX, REV, ACT, NATB, TYPB, DAC, DAP, DAM, CLSD, PLAN, REP ) " 20 StrSql = StrSql & "VALUES(" & "'005', " 30 StrSql = StrSql & "'" & Format(Val(Day(oRsAccess!oedatenvoicde)), "00") & Format(Val(Month(oRsAccess!oedatenvoicde)), "00") & Val(Year(oRsAccess!oedatenvoicde)) & "', " 40 StrSql = StrSql & "'1', " & "'1'" & ", " & "'7'" & ", " & "'" 50 StrSql = StrSql & oRsAccess!oenaff & "', " 60 StrSql = StrSql & "'730', " 70 StrSql = StrSql & "'" & oRsAccess!oenumero & "', " 80 StrSql = StrSql & "'W', " & "'" & Mid(oRsAccess!oenumcli, 1, 1) & "', " 90 StrSql = StrSql & "'" & oRsAccess!oecodpays & "', " 100 StrSql = StrSql & "'" & Mid(oRsAccess!oenumcli, 1, 5) & "', " 110 StrSql = StrSql & "'" & Mid(oRsAccess!oenumcli, 6, 2) & "', " 120 StrSql = StrSql & "'" & oRsAccess!oenomaff & "', " 130 StrSql = StrSql & "'H.T', " & "'F', " & "'8', " & "'8', " & "'1', " 140 StrSql = StrSql & "'" & Format(Val(Day(oRsAccess!oedatconfcde)), "00") & Format(Val(Month(oRsAccess!oedatconfcde)), "00") & Val(Year(oRsAccess!oedatconfcde)) & "', " 150 StrSql = StrSql & "'12" & Val(Year(oRsAccess!oedatenvoicde)) & "', " 160 StrSql = StrSql & "'" & Format(Val(Month(oRsAccess!oedatliv)), "00") & Val(Year(oRsAccess!oedatliv)) & "', " 170 StrSql = StrSql & "'" & Format(Val(Day(oRsAccess!oedatconfcde)), "00") & Format(Val(Month(oRsAccess!oedatconfcde)), "00") & Val(Year(oRsAccess!oedatconfcde)) & "', " 180 StrSql = StrSql & "'" & Mid(oRsAccess!oeplan, 1, 2) & "', " 190 StrSql = StrSql & "'" & oRsAccess!oeresp & "'" & ")" 200 MsgBox StrSql
Qu'est ce que ça donne (appuie sur F8 à partir du moment où l'exécution est sur Stop).Code:
1
2
3
4
5
6 If blnDebug Then MsgBox err.Description, 48, "Plantage à la ligne : " & erl Stop: Resume Else Resume L_ExAS400 End If
Argy
Il se plante à la ligne 30
J'ai fait un 2ème essai. J'ai interverti la ligne 30 et la ligne 50
Il se plante à la ligne 50 ! donc sur oedatenvoicde
Eh bien voilà, tu as la réponse à ton erreur 94...
Suggestion :
Met ces valeurs dans des variables et affecte les à ta chaîne après avoir contrôlé leur acceptabilité pour ta clause INSERT.
D'alleurs, tu devrais faire cela pour toute ta procédure car pour déboguer un Recordset!Fields en concaténation comme tu l'as écrit, c'est pas simple !
A toi de jouer et reviens avec de bonnes nouvelles.
Argy
Oui mais si tu regardes bien le dernier pdf envoyé, orsaccess!oedatenvoicde contient bien une date !!! donc n'est pas nul