OVH Cloud OVH Cloud

Findfirst

6 réponses
Avatar
Bonjour,

j'utilise findfirst pour rechercher si un enregistrement existe déjà dans un
table. Mon prbl c que je fais une recherche avec un ( ' ) et du coup ça
provoque une erreur.

voici le cas :

cod = "VALVE D'EAU"

TProduit.FindFirst "code = '" & cod & "'"

If TProduit.NoMatch Then

else

end if

Il me semblait qu'il y avait un moyen de dire dans la requete que cod est
un critère, un peu comme les [ ] pour les nom de tables avec des espaces.

Si vous pouvez m'aider, merci d'avance.

Damien

6 réponses

Avatar
Jean-marc
<util> a écrit dans le message de news:

Bonjour,

j'utilise findfirst pour rechercher si un enregistrement existe déjà dans
un table. Mon prbl c que je fais une recherche avec un ( ' ) et du coup ça
provoque une erreur.

voici le cas :

cod = "VALVE D'EAU"

TProduit.FindFirst "code = '" & cod & "'"

If TProduit.NoMatch Then

else

end if

Il me semblait qu'il y avait un moyen de dire dans la requete que cod est
un critère, un peu comme les [ ] pour les nom de tables avec des espaces.

Si vous pouvez m'aider, merci d'avance.



Hello,

il suffit de doubler les ( ' ), systématiquement.
On fait donc:


MY_cod = replace(cod, "'", "''")



TProduit.FindFirst "code = '" & MY_cod & "'"

If TProduit.NoMatch Then

else

end if



et voila :-)


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
andre.araste
Bonjour

Avec VB6 vous pouvez utiliser l'instruction Replace sinon il faut laisser
l'erreur se produire et recomposer la chaîne en remplaçant l'apostrophe par
un CHR$(39)

Si vous ne trouvez pas de réponse satisfaisante, revenez vers moi et je vous
enverrai une démo issue de mon cours de programmation.
--
Bonne réception.

http://perso.orange.fr/andre.araste/
Membre du Club Win's: http://www.clubwins.org
Avertissement: Je ne vends rien.

<util> a écrit dans le message de news:

Bonjour,

j'utilise findfirst pour rechercher si un enregistrement existe déjà dans
un table. Mon prbl c que je fais une recherche avec un ( ' ) et du coup ça
provoque une erreur.

voici le cas :

cod = "VALVE D'EAU"

TProduit.FindFirst "code = '" & cod & "'"

If TProduit.NoMatch Then

else

end if

Il me semblait qu'il y avait un moyen de dire dans la requete que cod est
un critère, un peu comme les [ ] pour les nom de tables avec des espaces.

Si vous pouvez m'aider, merci d'avance.

Damien



Avatar
Merci pour vos réponses.

Le prbl c que je ne peux pas replacer ( ' ) par autre chose, il s'agit d'un
code indentifiant unique, j'ai essayé de remplacer ( ' ) par CHR$(39) mais
j'ai toujours l'erreur :

pos = InStr(cod, "'")

If pos > 0 Then

gauche = Left(cod, pos - 1)

droite = Right(cod, (Len(cod) - pos))

TProduit.FindFirst "code = '" & gauche & Chr$(39) & droite &
"'"

end if

Merci de votre aide.

Damien
Avatar
Jean-marc
<util> a écrit dans le message de news:

Merci pour vos réponses.

Le prbl c que je ne peux pas replacer ( ' ) par autre chose, il s'agit
d'un code indentifiant unique, j'ai essayé de remplacer ( ' ) par CHR$(39)
mais j'ai toujours l'erreur :



C'est évident. Chr$(39) est la même chose que le caractère quote (')

Tu n'as pas lu mon exemple, ou alors tu ne l'as pas
compris :-((

On crée une variable de plus, qu'on appelle my_cod

dedans on écrit cod, mais en doublant tous les caractères quote:

' on déclare
Dim My_cod as String

' juste avant la requete, on fait ceci:

MY_cod = replace(cod, "'", "''")

puis on fait la recherche avec My_cod :

TProduit.FindFirst "code = '" & MY_cod & "'"

Et ça marche, bien sur!

C'est la façon classique de procéder en SQL.

Le "doublage" des quote est purement syntaxique pour SQL,
ta variable cod n'est même pas touchée.

exemple dans ma base de données livres

livre = "L'ile au trésor"
recherche = replace(livre, "'", "''")
rs.openrecordset"SELECT * FROM ouvrages where titre ='" & recherche & "'"

Espérant que c'est plus clair cette fois :-)

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
andre.araste
Bonjour

Essayez cette syntaxe qui n'utilise pas Replace:

Private Sub DBCombo1_DblClick(Area As Integer)
On Error GoTo Erreur
Dim Car1 As String
Dim Car2 As String
Dim Pos As Byte
10 Data1.Recordset.FindFirst "Nom = ( ' " & DBCombo1.BoundText & " ' )"
Exit Sub
Erreur:
20 ' Présence détectée d'un apostrophe.
21 Pos = InStr(DBCombo1.BoundText, " ' " )
22 Car1 = Left(DBCombo1.BoundText, Pos - 1)
23 Car2 = Right(DBCombo1.BoundText, Len(DBCombo1.BoundText) - Pos)
24 Data1.Recordset.FindFirst "Nom = ( ' " & Car1 & " ' + CHR$(39) + ' " &
Car2 & " ' ) "
End Sub

Ligne 10 on veut rechercher dans un champ Nom une donnée se trouvant dans
une liste.

Si une apostrophe est détectée une erreur se produit et renvoie à la ligne
20

Ligne 21 on recherche la position de l'apostrophe
Ligne 22 on isole la partie gauche de la chaîne
Ligne 23 on isole la partie droite
Ligne 24 on renouvelle la requête en concaténant les 3 éléments,
l'apostrophe étant remplacée par un Chr$(39)

La syntaxe est assez pointue mais ça marche. Attention, il ne faut pas
d'espace entre les (''") comme pourrait le laisser supposer l'affichage
ci-dessus.
--
Bonne réception.

http://perso.orange.fr/andre.araste/
Membre du Club Win's: http://www.clubwins.org
Avertissement: Je ne vends rien.

<util> a écrit dans le message de news:

Merci pour vos réponses.

Le prbl c que je ne peux pas replacer ( ' ) par autre chose, il s'agit
d'un code indentifiant unique, j'ai essayé de remplacer ( ' ) par CHR$(39)
mais j'ai toujours l'erreur :

pos = InStr(cod, "'")

If pos > 0 Then

gauche = Left(cod, pos - 1)

droite = Right(cod, (Len(cod) - pos))

TProduit.FindFirst "code = '" & gauche & Chr$(39) & droite
& "'"

end if

Merci de votre aide.

Damien



Avatar
Merci pour votre aide, en effet la double ( ' ) fonctionne.

Damien