Rechercher : dans
Par :

Access et VB

Dernière réponse le 29 mai 2008 à 16:24:39 alkashee, le 16 oct 2007 à 09:43:38 
 Signaler ce message aux modérateurs

Bonjour,

Voila mon souci, je voudrais a partir d'une variable issue d'un formulaire faire une requete sur une table afin d'avoir un résultat qui sera soit un enregistrement soit rien. Voici le code que j'ai réussi a faire avec de l'aide:

##############

Dim echange As String

C_sous_reseau.Value = O1.Value & "." & O2.Value & "." & (Int(O3.Value / 4) * 4) & "." & "0"
echange = C_sous_reseau.Value


Dim rs As DAO.Recordset
Set rs = CurrentDb.Openrecordset("SELECT * FROM [T_Sous_réseaux COMETE] WHERE [T_Sous_réseaux COMETE].SSres =' & echange & '")

Do Until Not rs.EOF
MsgBox rs!Num & " et " & rs!SSres <----- Ca bloque ici
rs.MoveNext
Loop

###############

Il me retourne un message d'erreur en me disant qu'il n'y a aucun enregistrement. Pourtant j'ai fait en sorte de mettre quelque chose qui me retourne une valeur ^^
Une idée ?

Merci d'avance ;)

Configuration: Windows XP
Internet Explorer 6.0
Access 2000

1

Polux31, le 16 oct 2007 à 09:54:06

Bonjour,

D'un premier coup d'oeil, il me semble que la syntaxe de Openrecordset n'est pas correcte.

Set rs = CurrentDb.Openrecordset("SELECT * FROM [T_Sous_réseaux COMETE] WHERE [T_Sous_réseaux COMETE].SSres =' " & echange & " ' ")

teste ça.

;o)

Répondre à Polux31

2

alkashee, le 16 oct 2007 à 09:59:51

Ca a rien fait de neuf, il bloque toujours plus bas :/ Question bête; pourquoi je peux pas afficher le contenu de rs dans une msgBox ?
(je précise, je n'y connais absolument rien en VB)

Répondre à alkashee

3

Polux31, le 16 oct 2007 à 10:06:46

Je ne sais pas, je n'ai jamais fait comme ça ...

Essais de mettre le résultat du recordset dans des variables :

Dim strNum As Variant // je prends un type variant ne sachant pas le type
Dim strSSres As Variant

blablabla ...

Do Until Not rs.EOF
strNum = rs("Num").value
strSSres = rs("SSres").value
MsgBox strNum & " et " strSSres
rs.MoveNext
Loop

Répondre à Polux31

4

alkashee, le 16 oct 2007 à 10:26:34

Do Until Not rs.EOF
strNum = rs("Num").Value <----------- Cha bloque ici
strSSres = rs("SSres").Value
MsgBox strNum & " et "
rs.MoveNext
Loop

Comme je n'y connais rien en VB, je n'ai aucun contrôle ou idée de comment faire, ca m'enerve :@ Ca me parait un poilcompliqué en plus :/

Répondre à alkashee

5

Polux31, le 16 oct 2007 à 10:32:13

Tu codes en VBA sur Access ou avec VB6 ?

Répondre à Polux31

7

alkashee, le 16 oct 2007 à 10:33:53

Euh je pense VB 6.3, c'est ce que le "?" me dit

Répondre à alkashee

6

alkashee, le 16 oct 2007 à 10:32:18

Je suis peut être parti dans la mauvaise direction, je vais exprimer mon besoin:

J'ai un formulaire dans lequel les users mettent leur adresse IP, et duquel après un tour de passe-passe, me sors le sous réseau afférent dans une variable (echange). Apartir de cette donnée, je voudrais faire une requete sur une table contenant une liste de sous-réseaux afin de sortir celui qui correspond, et sortir ce résultat dans un bo formulaire ( ca je sais faire)

En gros ce qui me bloque actuellement c'est la requête a faire depuis la variable et de ressortir ca dans un formulaire.

J'espère avoir été plus clair^^

Répondre à alkashee

8

Polux31, le 16 oct 2007 à 10:41:04

As tu testé la connexion à ta base ? as-tu pensé à ajouter la bonne référence de driver ?

Répondre à Polux31

9

alkashee, le 16 oct 2007 à 10:50:00

Ma base est en local, sur le poste sur lequel je suis actuellement. Après pour les référence de drivers j'ai bien mis ADO et DAO (les deux dans le doute lol). Mon but final est d'en faire un outil distribuable dans mon service :)

Répondre à alkashee

10

Polux31, le 16 oct 2007 à 10:53:24

Ok, je regarde ça de plus près ...

Répondre à Polux31

11

alkashee, le 16 oct 2007 à 11:03:45

Miciiiiiiiii :)

Répondre à alkashee

12

Polux31, le 16 oct 2007 à 13:45:22

Voilà ce que j'ai fait.

Il faut créer un module et tu le nommes, par exemple : ModBdd et tu colles le codes ci dessous

'
' Module générique d'une connexion
' à une base de données Access
'
' Renseigner la constante privée myPathBd
' Renseigner la constante privée mybd (nom de la base)
'
'@ Author : Polux31 - 2007
'

Option Explicit

Dim cnnADO As New ADODB.Connection ' Pour la connection à la base de données
Dim cmdAdo As New ADODB.Command ' Pour la commande à la base de données
Dim RScnx As New ADODB.Recordset ' Pour recevoir le résultat de la commande
Dim NbEnr As Integer ' Pour recevoir le nombre d'enregistrement du recordset
Dim Connect As String ' pour recevoir le nom de la connection

Private Const myPathBd = "c:\MonRepertoireTest\" ' Chemin d'accès au répertoire la base de données
Private Const mybd = "bd\mabaseTest.mdb" ' nom du dossier et de la base

Public Function getConnect() As String
getConnect = Connect
End Function

Public Sub setNbEnr(ByVal str As Integer)
NbEnr = str
End Sub

Public Function getNbEnr() As Integer
getNbEnr = NbEnr
End Function

Public Function InitBdd() ' ouverture de la base donnée
Dim CnxStrg As String ' Variable qui reçois la chaine de connection

If cnnADO.State = adStateOpen Then
cnnADO.Close
End If

CnxStrg = "Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source=" & myPathBd & mybd

cnnADO.ConnectionString = CnxStrg
cnnADO.CursorLocation = adUseClient

On Error Resume Next
cnnADO.Open

If Err <> 0 Then
' MsgBox "Erreur de connection : [" & CnxStrg & "]"
Connect = "Erreur de connection : \\" & mybd
Exit Function
Else
Connect = "Connection à la base : \\" & mybd
End If

End Function

' Fonction générique pour le passage d'une requête à la base de données, reçois la requete et le recordset, retourne un booléen
Public Function OpenRecordset(ByVal requete As String, ByRef RS As ADODB.Recordset) As Boolean

Call setNbEnr(0) 'initialise le nb d'enregistrement
If RS.State = adStateOpen Then ' test le statut de la base
RS.Close
End If

On Error Resume Next
RS.Open requete, ModBdd.cnnADO, , , adCmdText 'Envoi du recordset
Call setNbEnr(RS.RecordCount) ' Nombre de record

If Err.Number <> 0 Then
OuvrirRecordset = False 'La transaction n'est pas réalisée, retourne False
Exit Function
End If

RS.MoveFirst ' Positionnement sur le premier enregistrement du RecordSet
OuvrirRecordset = True ' La transaction a été réalisée, retourne True

End Function

'Fonction qui déplace le curseur vers l'enregistrement précédent
Public Function RSLirePrecedent(ByRef RS As ADODB.Recordset) As Boolean

On Error Resume Next
RS.MovePrevious 'l'occurence précédente
If RS.BOF Then 'vérifie si l'on est pas déjà sur le premier enregistrement
RSLirePrecedent = False
Exit Function 'si on est sur le premier on sort de la fonction
End If

If Err <> 0 Then
RSLirePrecedent = False
Exit Function
End If

RSLirePrecedent = True

End Function

'Fonction qui déplace le curseur vers l'enregistrement suivant
Public Function RSLireSuivant(ByRef RS As ADODB.Recordset) As Boolean

On Error Resume Next
RS.MoveNext 'l'occurence suivante
If RS.EOF Then 'vérifie si l'on est pas déjà sur le dernier enregistrement
RSLireSuivant = False
Exit Function 'si oui on sort
End If

If Err <> 0 Then
RSLireSuivant = False
Exit Function
End If

RSLireSuivant = True

End Function

'Fonction qui déplace le curseur sur le premier enregistrement
Public Function RSLirePremier(ByRef RS As ADODB.Recordset) As Boolean

On Error Resume Next
RS.MoveFirst 'première occurence
If Err <> 0 Then
RSLirePremier = False
Exit Function
End If

RSLirePremier = True

End Function

'Fonction qui déplace le curseur sur le dernier enregistrement
Public Function RSLireDernier(ByRef RS As ADODB.Recordset) As Boolean

On Error Resume Next
RS.MoveLast 'dernière occurence
If Err <> 0 Then
RSLireDernier = False
Exit Function
End If

RSLireDernier = True

End Function

'====\\========

Ensuite pour pouvoir utiliser ces fonctions depuis un formulaire ou d'un module:

Public Sub OuvrirRequete()
Dim vrai As Boolean
Dim Query As String
Dim Rs As ADOBC.RecordSet
Dim echange As String
Dim strNum As Variant
Dim strSSres As Variant

With FrmTest
echange = .O1.Value & "." & .O2.Value & "." & (Int(.O3.Value / 4) * 4) & "." & "0"
End With

On Error Resume Next
Query = "SELECT Num, SSres FROM T_Sous_réseaux COMETE WHERE SSres =' " & echange & " ' "
Set Rs = New ADODB.RecordSet

vrai = ModBdd.OpenRecordset(Query, Rs)
If vrai = False then
MsgBox "Erreur: la requête [" & Query & "] n'a pas abouti",,"Message Application"
Exit Sub
Else
strNum = Rs.Fields(0).value
strSSres = Rs.Fields(1).value
MsgBox strNum & " et " & strSSres
End If

End Sub
==//====

J'ai testé ça rapidement avec VB6 et une base Access, ça marche.

Bon courage

:o)

Répondre à Polux31

13

alkashee, le 16 oct 2007 à 15:14:04

Ca bloque dès le début en surlignant ca : Dim Rs As ADOBC.Recordset et en disant "type défini par l'utilisateur non défini" :'(:'(:'(

Et quelle est la différence entre les deux constante du début, je pige pas, sachant que la base est sur mon disque dans un dossier :/

Répondre à alkashee

14

Polux31, le 16 oct 2007 à 16:18:16

La première constante définie le répertoire, la deuxième le nom de ma base. En principe je ne fais pas comme ça, j'ai fait ça un peu à l'arrache, je passe le chemin et le nom en paramètre à la fonction. Dans mon exemple ma base se trouve : " C:\MonRepertoireTest\bd\mabaseTest.mdb.

Pour le message d'erreur, il y a une coquille : c'est Dim Rs As ADODB.RecordSet
dsl

Répondre à Polux31

15

simo, le 26 mar 2008 à 20:06:13

B soir
j vex voir commnt fait la rlation entre le vb 6 et un base d donnée

Répondre à simo

16

 sourire45, le 29 mai 2008 à 16:24:39

Bonjour


Voila mon soucis :

G une base Access créer sous 97 et je dois l utiliser avec VBA 6.3

Je voudrais savoir comment faire la connection a la base de données car mon fichier plante :

Voila mon code :

Sub COdispatcher()

Dim colCOd As Integer 'N° de la colonne pour la feuille COdispatcher
Dim ligdmh As Integer 'N° de la colonne pour la feuille FamilleCO
Dim i As Integer
Dim a As String

colCOd = 3
While (Not (IsEmpty(Worksheets("COdispatcher").Cells(8, colCOd))))
'Entrée des heures + Msg si la famille existe pas
i = 8
While (Not (IsEmpty(Worksheets("COdispatcher").Cells(i, colCOd))))
Worksheets("COdispatcher").Cells(i, colCOd + 1).ClearContents
ligdmh = 7
While (Not (IsEmpty(Worksheets("familleRequete").Cells(ligdmh, 3))) And Worksheets("familleRequete").Cells(ligdmh, 3) <> Worksheets("COdispatcher").Cells(i, colCOd))
ligdmh = ligdmh + 1
Wend
If (Not (IsEmpty(Worksheets("familleRequete").Cells(ligdmh, 3)))) Then
Worksheets("COdispatcher").Cells(i, colCOd + 1) = Worksheets("familleRequete").Cells(ligdmh, 4)
Else
MsgBox ("ATTENTION La famille " & Worksheets("COdispatcher").Cells(i, colCOd) & " n'existe pas")
End If
i = i + 1
Wend

'Requete pour le CO

a = "select sum(" & Range("Parametre!E11") & ") from " & Range("Parametre!D7") & " where " & Range("Parametre!D11") & " like '" & Worksheets("COdispatcher").Cells(7, colCOd) & "';"

Sheets("COdispatcher").Select

With ActiveSheet.QueryTables.Add(Connection:= _
"ODBC;DSN=MS Access 97 Database;DBQ=" & Range("Parametre!D6") & ";DefaultDir="chemin";DriverId=281;FIL", _
Destination:=Worksheets("COdispatcher").Cells(7, colCOd + 2), Sql:=a) 'emplacement du resultat

.Sql = a
.FieldNames = False 'Nom des champs de la BD
.RefreshStyle = xldeleteEntireRows ' Pour l insertion des nouvelles données
.RowNumbers = False
.FillAdjacentFormulas = False
.RefreshOnFileOpen = False
.HasAutoFormat = False 'surement a laisser
.BackgroundQuery = True
.TablesOnlyFromHTML = True
.Refresh BackgroundQuery:=False
.SavePassword = True
.SaveData = True
End With

'Calcul de la somme
Worksheets("COdispatcher").Cells(7, colCOd + 1) = "=SUM(R[1]C:R[65000]C)"

'Calcul des Heures / Famille
i = 8
While (Not (IsEmpty(Worksheets("COdispatcher").Cells(i, colCOd))))
Worksheets("Codispatcher").Cells(i, colCOd + 2) = "=R[-" & i - 8 + 1 & "]C* RC[-1]/R[-" & i - 8 + 1 & "]C[-1]"
i = i + 1
Wend
colCOd = colCOd + 3
Wend
End Sub




Est ce que l appel de la connection a la base de données se fait de cette façon???
j en peu plus ca fait une semaine que je cherche!!!!!

Merci pour tout

Répondre à sourire45
Collection CommentÇaMarche.net