VBA-ACCESS-concatenation
Résolu
Utilisateur anonyme
-
blux Messages postés 27813 Statut Modérateur -
blux Messages postés 27813 Statut Modérateur -
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!!
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!!
A voir également:
- VBA-ACCESS-concatenation
- Acer quick access - Forum logiciel systeme
- L'indice n'appartient pas à la sélection vba - Forum VB / VBA
- Désinstaller ACER QUICK ACCESS - Forum Logiciels
- Access appdata - Guide
- Excel compter cellule couleur sans vba - Guide
7 réponses
+ et & font la même chose quand il s'agit de chaines...
TblDE![Affaire] = TblRDE![N° affaire] & [ordre affaire]
TblDE![Affaire] = TblRDE![N° affaire] & [ordre affaire]
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...
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...
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?
Est ce que le fait de rajouter "ordre affaire" dans la selection (en gras ) suffit normalement?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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!!
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!!
Non, il ne crée pas une nouvelle requête, ça n'a rien à voir. Je te commente un peu le code :
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...
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.Updateajoute 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...