Tronquage de string

Signaler
Messages postés
29
Date d'inscription
mardi 20 avril 2010
Statut
Membre
Dernière intervention
13 juillet 2010
-
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
-
Bonjour a tous, j'èspère que tout le monde va bien.

J'ai un petit problème que je n'arrive pas à réglé même après quelques recherche , alors je m'en remet a votre savoir.

voila ma situation, j'aimerai exécuter une banal requete SQL depuis une application que je développe en VB6. Je tien a présisé que mon application exécute pas mal de requete et que je n'ai jamais eu de problème. Cependant cette requete est un peut long et elle fini par etre tronquer lors de son exécution

requete select stockvolume, stockvaleur from (stockhyperfamily INNER JOIN hyperfamilystock on stockhyperfamily.numhyperfamily hyperfamilystock.numhyperfamily) INNER JOIN EconomicUnit ON StockHyperFamily.numeconomicunit = EconomicUnit.numeconomicunit where nomhyperfamily = 'PL15_SV_FI_UNC_GP' and nomeconomicunit = 'AU109_0000';

requete exécuter select stockvolume, stockvaleur from (stockhyperfamily INNER JOIN hyperfamilystock on stockhyperfamily.numhyperfamily hyperfamilystock.numhyperfamily) INNER JOIN EconomicUnit ON StockHyperFamily.numeconomicunit = EconomicUnit.numeconomicunit where nom

Si j'ai bien compri la limite ce siturai à 256 char mais je ne comprend pas pourquoi.
j'utilise jet4.0 comme provider ainsi qu'un objet recordset pour exécuter ma requete.

Je vous remerci d'avance, et a bientôt!
A voir également:

19 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Salut
Je n'ai jamais eu de soucis personnellement et je pense avoir construit des requètes surement aussi longue.
Maintenant, tout dépend de ta variable 'requete' : Comment est-elle définie ? As String ?
Comment soumets-tu cette requète ?
De quels types sont les objets Connection et RecordSet ? DAO ? ADODB ?

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)
Messages postés
29
Date d'inscription
mardi 20 avril 2010
Statut
Membre
Dernière intervention
13 juillet 2010

Dim requete as string
Dim macommand As Recordset
Dim maconnection As Connection

sinon j'ai une fonction exécuter requete qui prend en paramettre une string et qui l'exécute grace a macommand.

mais d'après le débugueur ma variable requete initial ne contient déja pas tout ( avant de paC requete en paramètre). Fin bref bizard!
Messages postés
29
Date d'inscription
mardi 20 avril 2010
Statut
Membre
Dernière intervention
13 juillet 2010

a oui sinon pour moi mes objets sont de type ADO parce que c'est sur sa que je m'était renseigné pour créé ces lignes de codes, par contre aujourd'hui je ne sais absolutment ou llé voir le type de mon recordset ou de ma connection...
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
10
Bonjour,

Pour aller voir le contenu de maconnection, etc..., tu as tout ça dans "Affichage/Variables Locales" en cours d'exécution.

Poste-nous le code de ta fonction qui exécute ta requête.

Autre essai, puisqu'apparemment ta BDD est sous Access, créés une nouvelle requete en mode SQL et fais un copier-coller de ta requete et exécute-là en passant son nom dans ta fonction perso'.


Calade
Messages postés
29
Date d'inscription
mardi 20 avril 2010
Statut
Membre
Dernière intervention
13 juillet 2010

voila le code ma fonction d'exécution de requete :
Sub requeteselect(ByVal requete As String, ByVal nbchamp As Integer)

Dim macommand As Recordset
Set macommand = New Recordset
Call bd.connectiondb

macommand.ActiveConnection = maconnection
macommand.Open requete, , adOpenKeyset, adLockOptimistic

Dim nblig As Integer
nblig = 0

'Dim nbcol As Integer
'nbcol = UBound(macommand.GetRows)
'MsgBox "nbcol : " & nbcol


' On teste que la requête n'est pas vide
If Not (macommand.BOF And macommand.EOF) Then
' On retourne la première ligne du rs.
macommand.MoveFirst

' On parcours le rs d'un bout à l'autre
Do While Not macommand.EOF
' Hop, on a trouvé une ligne
nblig = nblig + 1
macommand.MoveNext
Loop

' On retourne à la première ligne
macommand.MoveFirst
' maintenent que l'on a la taille du tableau résultat on alou le tableau res dynamiquement des tailles trouver
ReDim variable_global.res(0 To nblig, 0 To nbchamp)

Dim i, y As Integer
For i = 0 To nblig - 1
For y = 0 To nbchamp - 1
variable_global.res(i, y) = macommand(y)
Next y
macommand.MoveNext
Next i

Else
ReDim variable_global.res(0 To 0, 0 To 0)
variable_global.res(0, 0) = -1
End If
macommand.Close
Call bd.deconnectiondb

End Sub

voili voilou sinon petite info, avant l'appel de cette fonction j'ai fais un affichage de ma string requete et elle n'est pas tronqué.
Le tronquage ce fait donc soit dans le passage en paramètre soit au niveau de l'exécution
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
DAO est obsolète et certaines de ses fonctions ne marchent pas, comme le .Find
Mieux vaudrait utiliser ADO (ADODB) à jour en version 2.8 actuellement.
Ca t'obligerait à modifier la structure de tes méthodes de requète, mais ça vaudrait le coup.

S'il y a troncage de la chaine une fois installée dans ton Command, faudrait regarder dans l'aide si cette limite apparait dans cet objet, c'est possible.
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
10
Petit détail,

As-tu vérifié la version d'ADO que tu utilises. Comme le dit Jack, la dernière en date est la 2.8 or par défaut, Access utilises la 2.1 qui a pas mal de problèmes.

On ne sait jamais.


Calade
Messages postés
29
Date d'inscription
mardi 20 avril 2010
Statut
Membre
Dernière intervention
13 juillet 2010

Alors dans les références de mon projet j'ai ActiveX Data Objects 2.8 et ActiveX Data Objects Recordset 2.8

Je suppose que sa doit etre bon ^^
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
10
Je ne connais pas cette 2ème DLL, qu'est ce que ça donne avec uniquement la 1ère (ActiveX Data Objects 2.8 ).


Calade
Messages postés
29
Date d'inscription
mardi 20 avril 2010
Statut
Membre
Dernière intervention
13 juillet 2010

Bon et bien la limite ne ce citue pas au niveau du passage de paramètre. C'est donc l'objet qui doit etre limité...

J'ai quoi comme autre objet pour exécuter une requete et récupéré le résultat en ADO?
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
10
J'imagine que tu as essayé avec une seule DLL (la 1ère).

As-tu essayé ce que je t'ai suggéré dans mon 1er Post (ta requête SQL intégrée dans une requête Access.


Calade
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Quand tu ajoutes des références à ton projet, cela ne veut pas dire que tu l'utilises :
Tu as bien mis le ADO 2.8 mais si tu n'utilises pas les objets ADODB, c'est que tu utilises toujours DAO et tu peux enlever la référence à ADO.
Messages postés
29
Date d'inscription
mardi 20 avril 2010
Statut
Membre
Dernière intervention
13 juillet 2010

@ jack : il faut donc que je modifie la déclaration de mes varaibles?
Dim maconnection As ADODB.Connection
Dim macommand As ADODB.Recordset

@ calade : intégré une requete sql dans une requete ACCESS...
je suis désolé mais je ne vois pas ce que je dois faire
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
10
Dans Access, tu fais Création d'une nouvelle requête, dans le designer tu ne choisis aucune table.

Dans la barre d'icones, tu cliques sur celle intitulée "SQL" et là tu colles ta requête.

Pour l'exécuter, au lien de donner ta requête entière tu ne donnes que le nom de la requête Access que tu viens de créer (et que tu auras sauvegardé avec un nom quelconque (sans accent) de préférence).


Calade
Messages postés
29
Date d'inscription
mardi 20 avril 2010
Statut
Membre
Dernière intervention
13 juillet 2010

J'avais déjà essayer cette solution, malheureusement la requete ne me retournais rien mais je n'avais pas d'erreur.
Par contre si je cré ma requete de cette manière, je ne peux pas faire varier les différents pramètres de ma clause where.

Je vais refaire une série de teste en ne mettant qu'une seul dll et je vous tien au courant si j'ai du nouveau.

Après une nouvelle série de recherche j'ai trouver quelques solutions bidouille qui passait toute par l'exécution d'un script VBA. Je pense que se serais la solution la plus simple, mais je ne sais pas comment exécuter le script depuis VB6. J'ai entendu parlé de la commande run, je vais me renseigné dessu. Je vous tien au courant.
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
10
Attention à ne pas tout mélanger.

Tu postes en VB6, dans ton dernier post tu parles d'un script VBA puis d'une commande Run sous VB6.

1) Run n'existe pas sous VB6.
2) Un script stricto sensu n'existe qu'en VBS et à ma connaissance tu ne peux accéder à une base de données en VBS (à vérifier).

De 2 choses l'une, soit ton code EST dans ton fichier .MDB alors tu codes en VBA et tu oublies VB6.
Soit tu codes dans un Projet (extension .VBP) alors tu es en VB6 et tu attaques une BD Access. Dans ce dernier cas, la commande Run n'existe pas, sinon cela rique d'être RunCmd.xxx (voir l'Intellisense et l'aide en ligne pour les différentes valeurs que peu prendre xxx).

Le plus simple est de vérifier l'extension du fichier que tu ouvres pour avoir accès (entre autre ?) à ton code.

Calade
Messages postés
29
Date d'inscription
mardi 20 avril 2010
Statut
Membre
Dernière intervention
13 juillet 2010

Je code en VB6 il n'y a pas de doute ladessu. Cependant je peux quant meme réalisé du code VBA dans access sous la forme d'une macro. Je pensais juste que je pouvais activer cette macro depuis VB6 a tor aperement. Quant a l'utilisation du mot script pour désigné les macros VBA, je suis désolé, c'était un abu de langage
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
10
Pas de problème, c'était pour fixer les choses.
Quant à ton problème, j'avoue que je ne voie pas trop d'où ça vient.
Je réfléchis et te recontacte.


Calade
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Denver : Oui, tu peux changer les déclarations, mais les méthodes changent un peu, il faut donc aussi changer les syntaxes (qui se ressemblent)
Jette un oeil dans l'aide si tu y arrives (perso, j'ai un mal de chien à trouver l'aide des objets ADODB sous VB6 comme sur le site MSDN)
Tape "access adodb" dans la recherche de codes sauf .Net et tu auras des exemples de :
- Connexion (identique)
- soumission d'une requète par un RecordSet
- récupération des enregistrements présents dans le RecordSet
- soumission de commande directe comme "Insert Into" ou "Delete" par la métode .Exectute directement sur l'objet de connexion

Derniers mots :
Que tu t'adresses à une base de donnée Access, SQL Server ou autre, la syntaxe reste la même, seule la chaine de connexion ConnectionString de l'objet change.