Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/06/2011, 10h46   #1
Invité de passage
 
Inscription : juin 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 4
Points : 0
Points : 0
Par défaut Comment utilisé une clef primaire de type binaire dans un row source ?

Bonjour,

J'ai un problème lors de l'utilisation d'une clef primaire avec un type binaire dans un formulaire.

Pour faire simple, je dois créer un formulaire Access qui utilise des tables venant d'une base Oracle (que je ne peux pas modifier).
La clef primaire et les clefs étrangères de chaque table sont du type RAW(16) soit un code binaire de 128 bits.

Access 2007 interprète le RAW(16) en type binaire.

Il n'y a aucun souci lors de la création d'une requête SQL et de son exécution.
Les données sont correctement liés.

Le problème se situe au niveau du formulaire où le row source ne semble pas être interprété et comparé correctement avec le champs correspondant du record source.

Avez vous déjà rencontrer ce type de problème ?
et si oui, comment l'avez vous résolu ?

Cordialement,
Sébastien
sfrade est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 11h47   #2
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 650
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 650
Points : 6 209
Points : 6 209
Envoyer un message via MSN à argyronet
Bonjour,

Non, je n'ai pas rencontré ce type de pb mais bon...

Citation:
Envoyé par sfrade Voir le message
Le problème se situe au niveau du formulaire où le row source ne semble pas être interprété et comparé correctement avec le champs correspondant du record source.
Peux-tu être plus explicite sur ce point ?
Comment est défini le RecordSource du formulaire ?

Argy
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 13h26   #3
Invité de passage
 
Inscription : juin 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 4
Points : 0
Points : 0
Le record source est une table qui contient une clef primaire binaire et une clef étrangère également binaire.

J'ai ajouté des copies d'écran pour illustrer le problème.

Sébastien
Images attachées
Type de fichier : jpg SEQUENCE_TYPE_ID_data.jpg (57,9 Ko, 4 affichages)
Type de fichier : jpg SEQUENCE_TYPE_ID_data_properties.jpg (23,1 Ko, 5 affichages)
Type de fichier : jpg SEQUENCE_TYPE_ID_format_properties.jpg (11,4 Ko, 4 affichages)
Type de fichier : jpg snap1.jpg (65,4 Ko, 4 affichages)
Type de fichier : jpg snap2.jpg (140,2 Ko, 5 affichages)
sfrade est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 14h57   #4
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 650
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 650
Points : 6 209
Points : 6 209
Envoyer un message via MSN à argyronet
Humm, tel que cela se présente, il semble que la table Oracle est liée.
Personnellement, je ne procéderais pas ainsi et je passerais plutôt par ADO en construisant dynamiquement la source via une procédure idoine qui effectuerait une conversion de la valeur. J'ose supposer que cette dernière est l'équivalent d'un GUID donc que l'on peut assimiler à type String et non un Binaire comme le fait Access...
Mais Access est un peu plus capricieux de ce coté là...

Argy
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 16h51   #5
Invité de passage
 
Inscription : juin 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 4
Points : 0
Points : 0
Citation:
Envoyé par argyronet
Personnellement, je ne procéderais pas ainsi et je passerais plutôt par ADO en construisant dynamiquement la source via une procédure idoine qui effectuerait une conversion de la valeur.
Je suis novice en programmation ADO. Auriez vous un exemple de contruction de source ?

Citation:
Envoyé par argyronet
J'ose supposer que cette dernière est l'équivalent d'un GUID donc que l'on peut assimiler à type String et non un Binaire comme le fait Access...
C'est exact. la encore, savez vous comment transformer la valeur binaire en GUID ?

Sébastien
sfrade est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 13h35   #6
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 650
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 650
Points : 6 209
Points : 6 209
Envoyer un message via MSN à argyronet
Humm, je n'ai aucun moyen de me mettre dans un contexte Oracle...
Je te fournis donc cette exemple de procédure écrite sur le pouce (que j'effacerai après ).
Les champs et nom de table sont à adapter et les paramètres de connexion à stipuler.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
Sub ReadOracleTable()
'Démo : prévoir une connexion dans une procédure dédiée
'Pour lancer, appuyer sur F5
Dim oCnct                                                   As ADODB.Connection
Dim oRS                                                     As ADODB.Recordset
Dim strConnectionString                                     As String
Dim strUID                                                  As String
Dim strPwd                                                  As String
 
    'définition du serveur, du MDP et du LOGIN
    On Error GoTo L_ErrImportOracleTable
 
    strOracleServer = ""
    strPwd = ""
    strUID = ""
    If Len(strOracleServer) < 1 Or Len(strPwd) < 1 Or Len(strUID) < 1 Then
        Err.Raise 13, "Paramètre manquant", "Un ou plusieurs éléments de connexion est manquant ou incorrect !"
    End If
    'construction de la chaîne de connexion
    strConnectionString = "UID=" & strUID & ";PWD=" & strPwd & ";driver=" & "{Microsoft ODBC for Oracle};SERVER=" & strOracleServer & ";"
    'ouverture de la connexion
    Set oCnct = New ADODB.Connection
    With oCnct
        .ConnectionString = strConnectionString
        .CursorLocation = adUseClient
        .Open
        'on attend un ti peu que ça se connecte...
        Do While .State = adStateConnecting
            DoEvents
        Loop
    End With
    'ouverture du jeu d'enregistrements (en lecture seule)
    Set oRS = New ADODB.Recordset
    With oRS
        .CursorType = adOpenStatic
        .LockType = adLockReadOnly
        .Source = "SELECT SEQUENCE_TYPE_ID, CHAR(SEQUENCE_TYPE_ID) SEQTYPEID, PARENT_SEQUENCE_TYPE_ID, SEQUENCE_TYPE_NAME FROM DB_HISTORY_OWNER_SEQ8DB"
        .Open
        'parcours des lignes
        Do While Not .EOF
            Debug.Print "Valeur de SEQUENCE_TYPE_ID = " & .Fields(0).Value & " et Valeur convertie = " & StringFromGUID(.Fields(0))
            Debug.Print "Valeur de SEQTYPEID = " & .Fields(1).Value
            .MoveNext
        Loop
        .Close
    End With
    'fermeture de la connexion
    If oCnct.State = adStateOpen Then oCnct.Close
 
    On Error GoTo 0
L_ExImportOracleTable:
    Set oRS = Nothing
    Set oCnct = Nothing
    Exit Sub
 
L_ErrImportOracleTable:
    MsgBox Err.Description, 48, Err.Source
    Resume L_ExImportOracleTable
End Sub
Argy
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/06/2011, 16h04   #7
Invité de passage
 
Inscription : juin 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 4
Points : 0
Points : 0
Merci Argy de ton aide pour m'avoir fait connaitre la fonction stringFromGUID.

Encore une dernière question:
Comment créer des tables (liées à Oracle pour les données) pour lesquelles les champs binaires sont transformés en champ string (effectuant la conversion vers GUID)?

Seb
sfrade est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 16h51   #8
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 650
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 650
Points : 6 209
Points : 6 209
Envoyer un message via MSN à argyronet
Si elle sont transformée en String, il suffit de créer manuellement la table avec le bon type de champ. On procède alors à un éventuel DELETE via la méthode Execute de l'objet Database représentant CurrentDB() puis à un INSERT INTO qui puiserait les données dans le Recordset.
On peut encore procéder à un SELECT INTO selon la nécessité de créer à chaque fois la table.
Pour créer la table via VBA, on peut écrire une fonction, soit par exemple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Function CreateOracleSeqTable() As Boolean
Dim oDB                                                     As DAO.Database
Dim oRS                                                     As DAO.Recordset
Dim oTDF                                                    As DAO.TableDef
Dim SQL                                                     As String
Dim blnAlreadyExists As Boolean
 
    Set oDB = CurrentDb()
    SQL = "SELECT * FROM tblHistoryOwnerSeqDB"
    On Error Resume Next
    Set oRS = oDB.OpenRecordset(SQL, 2)
    If Err = 0 Then
        oRS.Close
    Else
        Err.Clear
        On Error GoTo L_ErrCreateOracleSeqTable
        Set oTDF = oDB.CreateTableDef("tblHistoryOwnerSeqDB")
        With oTDF
            .Fields.Append .CreateField("SequenceTypeID", dbText, 32)
            .Fields.Append .CreateField("ParentSequenceTypeID", dbText, 32)
            .Fields.Append .CreateField("SequenceTypeName", dbText, 255)
            oDB.TableDefs.Append oTDF
        End With
        oDB.Close
    End If
    blnAlreadyExists = True
    On Error GoTo 0
L_ExCreateOracleSeqTable:
    Set oRS = Nothing
    Set oDB = Nothing
    CreateOracleSeqTable = blnAlreadyExists
    Exit Function
 
L_ErrCreateOracleSeqTable:
    blnAlreadyExists = False
    Resume L_ExCreateOracleSeqTable
End Function
Pour remplir la table, on peut dans la boucle citée en premier faire quelque chose comme :
Code :
oDB.Execute SQL, dbFailOnError
où SQL représente la chaîne SQL de la clause INSERT avec les valeurs converties...

Argy
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h54.


 
 
 
 
Partenaires

Hébergement Web