VBA-ACCESS-concatenation

Résolu/Fermé
Utilisateur anonyme - 29 nov. 2007 à 10:23
blux Messages postés 26681 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 février 2025 - 29 nov. 2007 à 15:11
Bonjour,
J'ai une base de donnée qui recupere une demande d'essai provenant d'une autre base, les données arrivant dans une table de la base la table DLHP et moi je veux mettre les données dans les bonnes tables.. Donc apres recuperation d'une demande d'essai, çà execute le code suivant:

Option Compare Database
Option Explicit


Private Sub annuler_Click()
DoCmd.Close
End Sub

Private Sub ok_Click()
Dim numDE As Long
Dim numessai As Long
Dim numIdDLDE As Long
Dim numact(1 To 20) As Long
Dim i As Long
Dim j As Integer
Dim k As Integer

Dim db As Database
Dim TblDE As Recordset
Dim TblRDE As Recordset
Dim TblACT As Recordset
Dim TblCOMP As Recordset
Dim Tblres As Recordset
Dim Tbl As Recordset
Dim Tbl2 As Recordset
Dim chsql As String
Dim res As String
Dim plan As Recordset
Dim nb As Long
Dim ref As Long

numIdDLDE = Me![num]

Set db = CurrentDb

' ** Remplissage de la table DE **
' ** Créé le 14/05/2002 par NB **
' ** Modifié le 14/05/2002 par NB **

Set TblDE = db.OpenRecordset("DE", dbOpenDynaset)

chsql = "SELECT DLHP.numero, DLHP.[N° DE], DLHP.[N° affaire], DLHP.[Ordre affaire], DLHP.Emetteur, DLHP.DateD, DLHP.butetude FROM DLHP WHERE ((DLHP.[numero])=" & numIdDLDE & ");"
Set TblRDE = db.OpenRecordset(chsql)

numDE = TblRDE![n° DE]


TblDE.AddNew
TblDE![n° DE] = numDE
TblDE![Emetteur DE] = TblRDE![Emetteur]
TblDE![Date d'émission] = TblRDE![DateD]
TblDE![Objet] = TblRDE![butetude]
TblDE![Affaire] = TblRDE![N° affaire] //la ligne à modifier
TblDE.Update


' ** Remplissage de la table ACTIVITE **
' ** Créé le 14/05/2002 par NB **
' ** Modifié le 21/05/2002 par NB **


chsql = "SELECT DLHP.[N° DE], TDEdetail.essaidemande, TDEdetail.nbessais FROM DLHP INNER JOIN TDEdetail ON DLHP.numero = TDEdetail.numDLDE WHERE (((DLHP.[N° DE])=cLng('" & numDE & "')));"
Set Tbl = db.OpenRecordset(chsql)
Set TblACT = db.OpenRecordset("ACTIVITE", dbOpenDynaset)

i = 1


While Tbl.EOF = False
If IsNull(Tbl![nbessais]) = True Then
nb = 1
Else
nb = Tbl![nbessais]
End If
k = 0
While k <> nb
TblACT.AddNew
TblACT![n° DE] = numDE
TblACT![Condition d'essai] = Tbl![essaidemande]
numact(i) = TblACT![n° activité]
TblACT.Update
k = k + 1
i = i + 1
Wend

Tbl.MoveNext

Wend


' ** Remplissage de la table COMPOSANT **
' ** Créé le 15/05/2002 par NB **
' ** Modifié le 21/05/2002 par NB **

chsql = "SELECT DLHP.[N° DE],TDEdetail.numDE, TDEdetail.nbessais, TDEdetail.refmeca, TDEdetail.reffriction, TDEdetail.refbutee, DLHP.delaiproto, DLHP.NumDLHP, TDEdetail.essaidemande FROM DLHP INNER JOIN TDEdetail ON DLHP.numero = TDEdetail.numDLDE WHERE (((DLHP.[N° DE])=cLng('" & numDE & "')));"
Set Tbl = db.OpenRecordset(chsql)
Set TblCOMP = db.OpenRecordset("COMPOSANT", dbOpenDynaset)

i = 1

While Tbl.EOF = False
If IsNull(Tbl![nbessais]) = True Then
nb = 1
Else
nb = Tbl![nbessais]
End If
numessai = Tbl![numDE]
k = 0

While k <> nb

chsql = "SELECT DLHP.[N° DE], TDEdetail.numDE, TDEdetail.essaidemande, 2 AS ordre, TDEdetail.refmeca FROM DLHP INNER JOIN TDEdetail ON DLHP.numero = TDEdetail.numDLDE WHERE (((DLHP.[N° DE])=cLng('" & numDE & "')) AND ((TDEdetail.numDE)=cLng('" & numessai & "')) AND ((TDEdetail.essaidemande)='" & Tbl![essaidemande] & "') AND ((TDEdetail.refmeca) Is Not Null)) ORDER BY 2 union SELECT DLHP.[N° DE], TDEdetail.numDE, TDEdetail.essaidemande, 3 AS ordre, TDEdetail.reffriction FROM DLHP INNER JOIN TDEdetail ON DLHP.numero = TDEdetail.numDLDE WHERE (((DLHP.[N° DE])=cLng('" & numDE & "')) AND ((TDEdetail.numDE)=cLng('" & numessai & "')) AND ((TDEdetail.essaidemande)='" & Tbl![essaidemande] & "') AND ((TDEdetail.reffriction) Is Not Null)) ORDER BY 2 " _
& "union SELECT DLHP.[N° DE], TDEdetail.numDE, TDEdetail.essaidemande, 1 AS ordre, TDEdetail.refbutee FROM DLHP INNER JOIN TDEdetail ON DLHP.numero = TDEdetail.numDLDE WHERE (((DLHP.[N° DE])=cLng('" & numDE & "')) AND ((TDEdetail.numDE)=cLng('" & numessai & "')) AND ((TDEdetail.essaidemande)='" & Tbl![essaidemande] & "') AND ((TDEdetail.refbutee) Is Not Null)) ORDER BY 2;"
'MsgBox (chsql)
Set Tbl2 = db.OpenRecordset(chsql)
j = 1

While Tbl2.EOF = False

TblCOMP.AddNew
TblCOMP![n° activité] = numact(i)
TblCOMP![Réf produit] = Tbl2![refmeca]
If j = 1 Then
TblCOMP![Type composant] = "Principal"
Else
TblCOMP![Type composant] = "Secondaire"
End If
If IsNull(Tbl![delaiproto]) = False Then
TblCOMP![Date réception] = Tbl![delaiproto]
Else
TblCOMP![Date réception] = Date
End If
If Tbl![NumDLHP] <> "" And IsNull(Tbl![NumDLHP]) = False Then
TblCOMP![n° DL] = Tbl![NumDLHP]
Else
TblCOMP![n° DL] = " "
End If
If Tbl![NumDLHP] = "" Then
TblCOMP![Origine] = " "
Else
TblCOMP![Origine] = "Protos"
End If

If Len(Tbl2![refmeca]) = 7 Then
ref = Right(Tbl2![refmeca], 5)
Else
ref = Tbl2![refmeca]
End If

Set plan = db.OpenRecordset("plan", dbOpenDynaset)

plan.FindFirst "[référence]='" & ref & "'"

'si trouver
If plan.NoMatch = False Then
TblCOMP![Définition produit] = plan![Désignation]
Else
TblCOMP![Définition produit] = " "
End If
TblCOMP.Update

Tbl2.MoveNext
j = j + 1

Wend
k = k + 1
i = i + 1
Wend

Tbl.MoveNext

Wend

' ** Mise à jour du flag Essai **
' ** Créé le 16/05/2002 par NB **
' ** Modifié le 16/05/2002 par NB **

res = "SELECT TDEdetail.numDLDE, TDEdetail.FlagEssai FROM TDEdetail WHERE (((TDEdetail.numDLDE)=cLng('" & numIdDLDE & "')));"
Set Tblres = db.OpenRecordset(res)

While Tblres.EOF = False
Tblres.Edit
Tblres![FlagEssai] = True
Tblres.Update
Tblres.MoveNext
Wend


If MsgBox("Voulez-vous imprimer la demande de lancement ?", vbYesNo, "Edition") = vbOK Then
DoCmd.OpenReport "E_DLDE"
End If

DoEvents
DoCmd.Close acForm, "F_De_Choix"

DoCmd.Close acForm, "Demande d'essai suite au formulaire"
DoEvents
DoCmd.OpenForm "Demande d'essai suite au formulaire"

DoCmd.GoToControl "[n° DE]"
DoCmd.FindRecord numDE, , True, , True


MsgBox "Récupération de la demande d'essai effectuée !", vbInformation


End Sub


Le premier truc que j'ai ajouté en gras c'est ce que j'ai rajouté..
Et moi je voudrais que le champs'affaire qui est de type texte contienne dorenavant le N° d'affaire concaténé avec l'ordre affaire.
Ex: N° affaire= PM-750 Ordre affaire= /08

Mon nouveau champ devrai contenir PM-750/08
Je pense que c'est la deuxieme ligne en gras que je dois modifier mais comment?
Merci de votre aide!!

7 réponses

blux Messages postés 26681 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 février 2025 3 327
29 nov. 2007 à 10:53
+ et & font la même chose quand il s'agit de chaines...

TblDE![Affaire] = TblRDE![N° affaire] & [ordre affaire]
2
blux Messages postés 26681 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 février 2025 3 327
29 nov. 2007 à 10:45
Salut,

je n'ai pas tout compris, mais la concaténation en VBA se fait avec & ou +

toto = pouet + "tata"
toto = pouet & "tata"

à toi de voir...
0
Utilisateur anonyme
29 nov. 2007 à 10:48
salut Blux, mais c quoi la difference entre + et &, il n'y a pas une histoire de pointeur ou d'adresse comme en C??
En gros je veux changer la ligne en gras pour qu'elle contienne les deux champs "N° affaire" et "ordre affaire"..
0
Utilisateur anonyme
29 nov. 2007 à 11:05
j'ai tenté ton expression et çà me sort un message d'erreur "impossible de trouver le champs ordre affaire......"
Est ce que le fait de rajouter "ordre affaire" dans la selection (en gras ) suffit normalement?
0
blux Messages postés 26681 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 février 2025 3 327
29 nov. 2007 à 11:21
TblDE![Affaire] = TblRDE![N° affaire] & TblRDE![ordre affaire] ?
0

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

Posez votre question
Utilisateur anonyme
29 nov. 2007 à 11:42
c'est le premier truc que j'ai tenté et il ne l'accepte pas!!! Est ce que quand j'ecris
SELECT DLHP.numero, DLHP.[N° DE], DLHP.[N° affaire], DLHP.[Ordre affaire], DLHP.Emetteur, DLHP.DateD, DLHP.butetude FROM DLHP WHERE ((DLHP.[numero])=" & numIdDLDE & ");" il crée automatiquement une requête que je trouve à coté des requêtes?
parce que j'ai trouvé une requête qui selectionne tous les champs dont j'ai besoin dans ce cas là, j'y ai rajouté le champs ordre affaire..mais çà fait rien quand j'execute le menu principal il plante sur la ligne que j'ai changé en haut!!
0
blux Messages postés 26681 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 février 2025 3 327
29 nov. 2007 à 13:06
Non, il ne crée pas une nouvelle requête, ça n'a rien à voir. Je te commente un peu le code :
Set TblDE = db.OpenRecordset("DE", dbOpenDynaset)
On crée un objet de type recordset nommé TblDE basé sur la table "DE" et permet les modifs sur celui-ci (dbopendynaset)

chsql = "SELECT DLHP.numero, DLHP.[N° DE], DLHP.[N° affaire], DLHP.[Ordre affaire], DLHP.Emetteur, DLHP.DateD, DLHP.butetude FROM DLHP WHERE ((DLHP.[numero])=" & numIdDLDE & ");"
Set TblRDE = db.OpenRecordset(chsql)
numDE = TblRDE![n° DE]
Créé un objet de type recordset basé sur la requête chsql et récupère la valeur de [N°DE] renvoyée par cette requête pour la mettre dans la variable numDE (on aurait pu le faire autrement de manière plus élégante avec dlookup, car là il faut être sûr que la requête ne renvoie qu'une ligne...)

TblDE.AddNew
TblDE![n° DE] = numDE
TblDE![Emetteur DE] = TblRDE![Emetteur]
TblDE![Date d'émission] = TblRDE![DateD]
TblDE![Objet] = TblRDE![butetude]
TblDE![Affaire] = TblRDE![N° affaire] //la ligne à modifier
TblDE.Update 
ajoute au recordset TblDE (donc à la table DE) une nouvelle ligne dont les champs prennent les valeurs respectives...

En conclusion : le SELECT n'a rien à voir avec la choucroute et je ne sais toujours pas d'où on sort la valeur [ordre affaire] pour la concaténer et créer une nouvelle ligne dans la table DE...
0
Utilisateur anonyme
29 nov. 2007 à 14:02
çà marche Blux!!!! Je péfèrte ne pas te dire pourquoi çà marchait pas sinon tu vas me taper!!! A moins que tu y tiennes vraiment!!!
Merci du fond du coeur Blux tu m'enlève une groose épine du pied!!!
--

Le plus bel endroit pour se balader? le manche de ma gratte..
0
blux Messages postés 26681 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 février 2025 3 327 > Utilisateur anonyme
29 nov. 2007 à 14:30
Ben si, justement, je voudrais bien savoir ce qui coinçait...
0
Utilisateur anonyme
29 nov. 2007 à 14:56
Tu me tape pas promis hein??
pour moi c'etait pas tblRDE mais tb1RDE!!! j'ai confondu le l et le 1!!! je savais pas que tbl c'etait pour table!!!!!mais euhhhh!!!!
Bref je te remercie encore une fois Blux..
0
blux Messages postés 26681 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 26 février 2025 3 327
29 nov. 2007 à 15:11
C'est un nom de variable comme un autre.

On aurait pu mettre chaussureRDE, si on avait voulu...
0