Tout petit problème SQL sous VB6 ADO

cs_Squallou Messages postés 249 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 15 juillet 2006 - 19 févr. 2006 à 10:43
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 - 20 févr. 2006 à 13:22
Hello tout le monde

J'ai un tout petit pb avec une requête SQL sous VB6/ADO.

Admettons que j'ai la table Client qui contient des numéros de clients dans sa colonne 'NumCli'.

Je voudrais afficher une erreur si l'utilisateur saisit un code qui n'existe pas (du genre code 4 alors que ça s'arrête à 3). Mais je ne trouve pas comment faire...

Quelqu'un aurait-il la solution ?

Merci d'avance...
A voir également:

15 réponses

econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
19 févr. 2006 à 10:59
Quand tu executes ta requête SQL, tu reçois un objet de type Recordset en retour, avec la réponse à ta requête SQL.

Si la base de données n'a pas trouvé d'enregistrement répondant à ta
requête, la propriété RecordCount de ton recordset de retour vaut 0.


Manu
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
19 févr. 2006 à 11:04
Salut
"Colonne" ... colonne de quoi ?
Pour cela, une fois que la saisie est terminée et que la personne a validé (ou sort de la zone de saisie), il faut questionner la DB avec un RecordSet.
Je suppose que tu as une connexion à ta DB : maConn
Dim monRS As RecordSet
Set monRS = New RecordSetsSQL "Select NoClient From maTable Where NoClient " & monNoSaisi ' la valeur dans colonne NumCli
monRS.Open sSQL, maConn, adOpenStatic, adLockReadOnly
If monRS.RecordCount = 0 Then
' Le n° n'existe pas
Else
' Le n° existe
End If

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
0
cs_Squallou Messages postés 249 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 15 juillet 2006
19 févr. 2006 à 11:05
J'avais déjà essayé...

j'ai fait :

If Result.RecordCount <> 0 Then
'instructions si résultats
else
'instructions si pas de résultats
end if

Lorsqu'il trouve un résultat il effectue bien ce qu'il y a dans le IF
mais s'il ne trouve pas il n'effectue pas le ELSE :(

je vois pas pourquoi...
0
cs_Squallou Messages postés 249 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 15 juillet 2006
19 févr. 2006 à 11:16
Je dirais même qu'il effectue toujours le IF et jamais le ELSE.
Qu'il trouve ou non le NumCli...
0

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

Posez votre question
cs_Squallou Messages postés 249 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 15 juillet 2006
19 févr. 2006 à 11:18
Je viens de tester la valeur de RecordCount.
Qu'il trouve ou non mon NumCli il est toujours à -1.

:?(
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
19 févr. 2006 à 11:53
Pas normal.
Il doit y avoir un problème avec ton code.
S'il n'exécute pas le Else, c'est que la structure d'un For-Next, Do-Loop ou un autre If est incomplète.
Vérifie bien.
Eventuellement, colle ici ton code qu'on y jette un oeil.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
0
cs_Squallou Messages postés 249 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 15 juillet 2006
19 févr. 2006 à 12:05
Voici mon code :

Public Sub RECH_LOC(client As Integer)
Set RS_L = New Recordset

'procédure de connexion à la base
Call CONNECT_BASE

RS_L.Open "SELECT ClientNom FROM client WHERE ClientCode='" & client & "'", connexion, adOpenStatic, adLockReadOnly

Form1.List1.Clear

If RS_L.RecordCount <> 0 Then
Form1.Label1.Caption = RS_L("ClientCode")
Else
MsgBox "Ce code client n'existe pas.", vbCritical, "Erreur"
End If

connexion.Close
End Sub
0
cs_Squallou Messages postés 249 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 15 juillet 2006
19 févr. 2006 à 12:08
pardon petite erreur : je corrige


Public Sub RECH_LOC(client As Integer)
Set RS_L = New Recordset

'procédure de connexion à la base
Call CONNECT_BASE

RS_L.Open "SELECT ClientNom FROM client WHERE ClientCode='" & client & "'", connexion, adOpenStatic, adLockReadOnly

Form1.List1.Clear

If RS_L.RecordCount <> 0 Then
Form1.Label1.Caption = RS_L("ClientNom")
Else
MsgBox "Ce code client n'existe pas.", vbCritical, "Erreur"
End If

connexion.Close
End Sub
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
19 févr. 2006 à 12:21
Ah bah voilà :
Le numéro client est un chiffre.
Je suppose que le champ ClientCode dans ta DB a aussi été déclaré comme numérique.
Dans une requète SQL, il ne faut pas encadrer les chiffres avec les '
Par contre, ta variable client en VB est un chiffre et tu l'insères dans une chaine : Il est préférable (mais pas obligatoire) de la convertir en String :
"SELECT ClientNom FROM client WHERE ClientCode=" & CStr(client)

Donc, c'était normal qu'il ne trouve jamais ton numéro.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
0
cs_Squallou Messages postés 249 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 15 juillet 2006
19 févr. 2006 à 12:28
Ha oui en effet.

Malheureusement c'est toujours pareil chez moi même sans les '...

Il fait toujours comme s'il trouvait qqchose même avec un code inexistant.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
19 févr. 2006 à 12:36
Tu disais que le RecordCount renvoyait -1 : Bizarre
Teste donc si le RecordCount > 0
Est-ce que ta DB est bien ouverte ?
Est-ce que tu as mis des "On Error Resume Next" qui te masqueraient le problème ?
Est-ce que ta variable "client" contient bien quelques chose dans ta Sub ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
0
cs_Squallou Messages postés 249 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 15 juillet 2006
19 févr. 2006 à 12:45
Oui il n'y a aucun pb, en ne mettant pas le IF et si je saisis un nombre existant j'ai bien le nom correspondant. En cas de numéro valide le résultat est nickel donc.

Mais en effet mon RecordCount est toujours égal à -1 que ça soit en cas de numéro valide ou non.

Il n'y a pas de On error, la base est bien ouverte (puisque la requête est bien exécutée de toute manière...), la variable client est bonne (idem)

Vraiment bizarre
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
20 févr. 2006 à 10:51
Salut,

Et avec :

If Not RS_L.Eof Then
Form1.Label1.Caption = RS_L("ClientNom")
Else
MsgBox "Ce code client n'existe pas.", vbCritical, "Erreur"
End If

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
cs_Squallou Messages postés 249 Date d'inscription mardi 5 août 2003 Statut Membre Dernière intervention 15 juillet 2006
20 févr. 2006 à 12:45
En effet ça peut marcher comme ça.

J'ai essayé mon code sur un autre PC et ça marche... bizarre ça doit etre mon PC qui va mal.

Merci pour votre aide à tous.
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
20 févr. 2006 à 13:22
Faut dire que la propriété RecordCount se comporte bizarrement.
Avec DAO, pour être sùr du résultat, il fallait faire un rs.movelast avant le rs.recordcount.
En ADO, j'ai aussi rencontré le même problème.
Donc, perso, si je n'ai besoin que de savoir si la requête a remonté des enregistrements ou non je teste le EOF, c'est plus sùr.

Autre chose, j'ai remarqué qu'en ADO, il y avait moins de problèmes en utilisant le paramètre adOpenKeyset plutôt que adOpenDynamic ou adOpenStatic.

Pour connaître le nombre exact d'enregs correspondants à mes critères, je fais plus confiance à une requête "select count(*) ....". C'est peut-être inutile mais au moins, je n'ai jamais eu de mauvaise surprise avec.

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
Rejoignez-nous