OPEN ACCESS MDB

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 6 août 2008 à 10:32
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009 - 8 août 2008 à 10:20
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/47510-open-access-mdb

cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
8 août 2008 à 10:20
Je viens de download ta source, rien qu'à partir des commentaires je pense que ta source devrait pouvoir m'aider sur bien plus de choses concenant la taille des polices et problablement me permettre d'écrire un éditeur de recordset que je cherche depius sans succès sur le Net.

D'autres part je viens de me trouver une utilité de ma méthode CloneRecordset (en attendant de me repencher sur le problème de Clone en observant l'activité réseau), j'ai rajouté un paramètre variant qui permet à appelant d'avoir la taille maximale des champs.

J'ai pas eu au auparavant du succès avec les forums, c'est pourquoi mes questions sont maintenant plus ciblées, ils doivent se reconnaitre sur vbfrance que je sollicite assez souvent.

Merci encore PCPT et MALIKcpp
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
7 août 2008 à 20:50
asimengo -> par API je ne trouve rien...
va sans doute falloir boucler et mesurer. calcul par rapport à la font sans objet : http://www.vbfrance.com/code.aspx?ID=40299

mais regarde avant dans les sources, çà doit sans doute déjà exister...

sinon pour l'exemple MSDN, je pensais plus à l'ouverture de la source, pas de la destination :)

en revient que je ne vois pas le but, en quoi un clone va réduire ton traffic?

tout çà a tout de même peut-être plus sa place sur le forum que sur cette source non? quoi que ^^
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
7 août 2008 à 18:37
Merci PCPT j'ai noté l'info, mais malheureusement lorsque j'appelle la méthode ci-dessous, les opérations .MoveX, Sort, Filter ne sont plus possibles.

Public Function CloneRecordsetMSDN(ByVal poRstSource As ADODB.Recordset, ByRef poRstDestination As ADODB.Recordset) As Boolean
Set poRstDestination = New ADODB.Recordset
With poRstDestination
' .CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockBatchOptimistic
End With

Set poRstDestination = poRstSource.Clone
End Function

Merci pour ton aide, tu as une idée pour les constantes de resize avec le Datagrid?. Ce qui m'intéresse c'est de pouvoir dimensionner une colonne à la taille de la plus longue donnée, sans devoir passer par une boucle, ce qui implique de prendre en compte la taille des polices, ....
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
7 août 2008 à 18:01
pour le clone, la MDSN conseille ces paramètres :
.CursorType = adOpenStatic
.LockType = adLockBatchOptimistic
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
7 août 2008 à 17:42
Je ne sais pas si je me suis gouré, mais avec mes tests, j'ai constaté que la BD restait verouillée (cas avec Access), le but pour moi étant de minimiser le traffic réseau et d'accelérer les recherches sur les données. Lorsque j'imagine une dizaine de users en réseau sur une appli avec pleins de combo alors il vaudrait mieux minimiser le traffic réseau. En plus j'ai même la possibilité par propriété de définir la méthode de raffraichissement automatique ou manuel (bouton refresh disponible pour le user).
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
7 août 2008 à 17:35
euh....
un recordset possède une méthode '.Clone', elle ne te convient pas?
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
7 août 2008 à 17:32
en effet les constantes sont réservées à la listview (LVM_...)
va falloir mesurer la chaine du header ou de chaque items selon ce que tu souhaites faire
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
7 août 2008 à 17:30
Je vais quand même donner le code que j'utilise pour cloner un recordset, il y'a 2 méthodes soit de Recordset à Recordset, soit de Commande à Recordset

'Copie les enregistrements de poRstSource dans poRstDestination
Public Function CloneRecordset(ByVal poRstSource As ADODB.Recordset, ByRef poRstDestination As ADODB.Recordset) As Boolean
On Error GoTo Err_CloneRecordset
Dim oFld As ADODB.Field, vBookmark As Variant

Set poRstDestination = New ADODB.Recordset
With poRstDestination
.CursorLocation = adUseClient
.CursorType = adOpenDynamic
.LockType = adLockPessimistic
'Initialisation de la liste des champs
For Each oFld In poRstSource.Fields
.Fields.Append oFld.Name, oFld.Type, oFld.DefinedSize, oFld.Attributes
Next oFld
'Ouverture du recordset pour remplissage
.Open
End With

'Remplissage du recordset
'On peut
With poRstSource
'On peut aussi faire With poRstSource.Clone(adLockReadOnly), ainsi on ne s'embetera plus avec la gestion des bookmarks.
'Mais je me suis demandé si ce n'était pas du temps perdu cette méthode, temps de Clone.
'je ne me suis pas penché dessus pour voir les différences de vitesse.
If .RecordCount <> 0 Then
vBookmark = .Bookmark
.MoveFirst
Do While Not .EOF
poRstDestination.AddNew
For Each oFld In .Fields
poRstDestination.Fields(oFld.Name).Value = oFld.Value
Next oFld
poRstDestination.Update
.MoveNext
Loop
.Bookmark = vBookmark
poRstDestination.MoveFirst
End If
End With

CloneRecordset = True

Exit_CloneRecordset:
Exit Function

Err_CloneRecordset:
MsgBox Err.Description
Resume Exit_CloneRecordset
End Function

Public Function CloneCommandRecordset(ByVal psCommandText As String, ByVal puConnection, ByRef poRstDestination As ADODB.Recordset) As Boolean
On Error GoTo Err_CloneCommandRecordset
Dim oCnx As ADODB.Connection, oRst As ADODB.Recordset, bCloseConnection As Boolean

If IsObject(puConnection) Then
Set oCnx = puConnection
Else
Set oCnx = New ADODB.Connection
oCnx.Open puConnection
bCloseConnection = True
End If

Set oRst = New ADODB.Recordset
With oRst
.CursorLocation = adUseClient
.CursorType = adOpenDynamic
.LockType = adLockPessimistic

.Open psCommandText, oCnx, adOpenStatic
'Clone le recordset oRst et met le contenu dans poRstDestination
Call CloneRecordset(oRst, poRstDestination)
'Ferme le recordset
.Close
End With
CloneCommandRecordset = True

Exit_CloneCommandRecordset:
Set oRst = Nothing
If bCloseConnection Then oCnx.Close
Set oCnx = Nothing
Exit Function

Err_CloneCommandRecordset:
MsgBox Err.Description
Resume Exit_CloneCommandRecordset
End Function
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
7 août 2008 à 17:23
@PCPT : J'ai regardé ta source ADO HELPER, c'est bien, je passe forcement par là avec les différents DLL que j'utilise pour mes applis qui permettent d'implementer une table d'un provider quelconque.

Je me suis par contre interesser à ta méthode Public Sub LV_ResizeColumns(Lv As ListView) que j'ai essayé de réecrire pour le DataGrid comme suit mais aucun résultat et aucune erreur declenché.

' *- REDIMENTIONNE UNE LISTVIEW SELON SON CONTENU -*
' http://www.codyx.org/snippet_redimensionner-colonnes-listview-fonction-leur-contenu_320.aspx
Public Sub DataGrid_ResizeColumns(poDataGrid As DataGrid)
Dim i As Long

If poDataGrid.Columns.Count > 0 Then
Call LockWindowUpdate(poDataGrid.hwnd)
For i = 0 To poDataGrid.Columns.Count - 1
Call SendMessage(poDataGrid.hwnd, LVM_SETCOLUMNWIDTH, i, LVSCW_AUTOSIZE_USEHEADER)
Next i
Call LockWindowUpdate(0&)
End If
DoEvents
End Sub

Ai-je manquer quelque chose?, ou alors ce n'est pas valable pour le Datagrid. Pour mes listes je préfère mieux le DataGrid parceque je peux lui affecter directement un recordset. Mais l'utilisation du Form qui contient le DataGrid passe par une classe ce qui ressemble bien à ton Public Function FillListViewFromAdoCnx(ByRef CnxAdo As ADODB.Connection, MyLv As ListView, ByVal sSql As String, Optional ByVal bHeader As Boolean True, Optional ByVal lFirstRow As Long 1, Optional ByVal lLastRow As Long = 0) As Boolean
A la seule différence que la classe clone le recordset qui sera en mémoire avant d'appeler le form qui a le datagrid. Après je suis tous les mouvements de la lsite à partir du Datagrid, j'utilise les evenements du datagrid pour savoir quand on a clique sur une entête. Le tri est quasic basic juste recordset.sort ..., le filtre sur un champ quasi basik egalement recordset.filter=...
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
7 août 2008 à 12:58
Patrice99 -> VB6 n'est pas trop l'ami de Linux, le nom du dossier en est souriant oui :)

asimengo -> pas vérifié mais me semble que IN de toute façon n'est pas connu d'Access (enfin tu me mets le doute maintenant ^^)
quant à filter en général on évite de l'utiliser en parallèle d'une requête déjà restrictive. habitude ou obligation...
je testerai à l'occas.
regarde ADO HELPER dans mes sources, çà peut peut-être te donner quelques pistes
++
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
7 août 2008 à 11:11
Merci PCPT, ceci m'aidera à generaliser mon utilitaire qui recree la structure des bases de données pour mes logiciels. Car avec une instruction du genre call classX.Implement (<Nom Table>), tu as la liste, ajouter/modifier/supprimer/Imprimer, gratoch.

J'avais effectivement comme MalikCPP fait un truc avec DAO et pour des bases autre que Jet je devais migrer sur Access pour lire la structure, mais bien sur après c'est ADO.

Juste une autre question sur ADO, est-ce possible d'utiliser la clause IN avec la propriété Filter d'un ADODB.Recordset. Je me suis crée une syntaxe pour le filtre a..b signifie entre a et b, {a | b | c} signifie IN (a,b,c) mais la clause IN ne marche pas avec filter, il faut passer par SELECT ... Where ...
Je pense que Between ne marche pas aussi avec Filter, je passe pas >= et <=

Espérant une réponse.
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
7 août 2008 à 10:13
Et VB6 ça tourne sous Linux ? curieux de voir ça !
Par contre DotNet devrait tourner sous Linux via Mono, voir par exemple :
ODBCDotNet : Extraire des requêtes ODBC dans un tableau de tableaux de String
www.vbfrance.com/code.aspx?ID=34701
Mais le problème, c'est de trouver un pilote ODBC pour Access sous Linux : dans tous les cas de figure, cela ne sera pas évident de lire une base Access sous Linux.
Utilisateur anonyme
6 août 2008 à 13:08
Merci, pour ton aide, je n'avait pas trouvé cette méthode qui me permet donc de n'utilisé qu'ADO. Encore merci PCPT.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
6 août 2008 à 10:57
beh c'est pas bien ^^

ajoute ADOX : msadox.dll (Microsoft ADO Ext. 2.7 for DLL and Security)

Dim oCat As New ADOX.Catalog
Dim oTab As New ADOX.Table

oCat.ActiveConnection = mCnx 'nom de ta connexion ADO

For Each oTab In oCat.Tables
If oTab.Type = "TABLE" Then Debug.Print oTab.Name
Next oTab

Set oTab = Nothing
Set oCat = Nothing
Utilisateur anonyme
6 août 2008 à 10:38
Bonjour, >> PCPT

En fait vu que je n'avait pas trouvé de solution pour lister les tables en ADO j'ai utilisé DAO et seulement pour cela sinon les requêtes s'execute en ADO.

Donc je n'ai pas uniquement choisi le DAO mais aussi l'ADO donc c'est un mélange des deux.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
6 août 2008 à 10:32
salut,

pourquoi avoir choisi DAO?
ADO est plus approprié et ne nécessite pas non plus d'avoir Access sur sa machine, juste le MDAC
Rejoignez-nous