IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IHM Discussion :

Comment utilisé une clef primaire de type binaire dans un row source ?


Sujet :

IHM

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 1
    Points
    1
    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

  2. #2
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    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

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    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 Images attachées      

  4. #4
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    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

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    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

  6. #6
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    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

  8. #8
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 128
    Points : 12 185
    Points
    12 185
    Billets dans le blog
    5
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    oDB.Execute SQL, dbFailOnError
    où SQL représente la chaîne SQL de la clause INSERT avec les valeurs converties...

    Argy

Discussions similaires

  1. Comment faire une interface de ce type....
    Par SpiderAlpha dans le forum C++Builder
    Réponses: 6
    Dernier message: 30/04/2007, 14h50
  2. Réponses: 4
    Dernier message: 27/07/2005, 12h33
  3. Générer une clef primaire aleatoire?
    Par 12_darte_12 dans le forum Administration
    Réponses: 4
    Dernier message: 18/07/2005, 19h10
  4. Comment comment définir une clef primaire dans une table??
    Par nek_kro_kvlt dans le forum Bases de données
    Réponses: 4
    Dernier message: 07/02/2005, 22h06
  5. [Servlet] Comment utilisé une servlet plusieurs fois ?
    Par gandalf_le_blanc dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 03/06/2004, 15h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo