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

VBA Access Discussion :

Un oRst.Clone qui n'est pas indépendant de l'original


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 140
    Par défaut Un oRst.Clone qui n'est pas indépendant de l'original
    Bonsoir,

    Encore moi Je pêne un peu avec DAO

    J'ai cru comprendre qu'en clonant un Recordset, çà faisait une copie et que toutes modifications dans le clone ne modifie pas le Recordset initial.

    Voici mon code qui pose problème :

    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
    Dim oDb As DAO.Database
    Dim oRst As DAO.Recordset
    Dim sSQL As String
    Dim Source As String
     
    Set oDb = CurrentDb
     
    Source = Forms(FormPrincipalNomSTRp).Form(CadreDetailNomSTRp).Form.RecordSource
     
    If Left(Source, 6) = "SELECT" Then  'la source est une requête
       sSQL = "SELECT * FROM (" & Source & ") WHERE " & FormEnCoursChampcleSTRp & "= " & Chr(34) & Forms(FormPrincipalNomSTRp).Form(CadreDetailNomSTRp).Controls(FormEnCoursChampcleSTRp).Value & Chr(34) & ";"
    Else                                'la source est une table
       sSQL = "SELECT * FROM " & Source & " WHERE " & FormEnCoursChampcleSTRp & "= " & Chr(34) & Forms(FormPrincipalNomSTRp).Form(CadreDetailNomSTRp).Controls(FormEnCoursChampcleSTRp).Value & Chr(34) & ";"
    End If
     
    Set oRst = oDb.OpenRecordset(sSQL)
     
    Set oRecordsetRSTp = oRst.Clone
    Set Forms(FormPrincipalNomSTRp).Form(CadreSaisieNomSTRp).Form.Recordset = oRst.Clone
    J'ai un formulaire principal indépendant qui a 2 cadres avec chacun le même sous-formulaire. Le sous-formulaire de cadre 1 est en lecture seule et est liée à la table. Le sous-formulaire de cadre 2 est en écriture et n'est pas liée à la table.

    Le but est :
    - de copier dans le cadre 2 les données de l'enregistrement en cours (et uniquement celui-là) du cadre 1.
    - Je modifie manuellement les données via le sous-formulaire du cadre 2.
    - Puis lorsque je valide via un clic sur un bouton, les données du cadre 2 sont copiées sur le bon enregistrement du cadre 1.

    Problème :
    - Lorsque je saisie dans le sous-formulaire du cadre 2, les données du cadre 1 sont également modifiées en temps réel. Et çà, je ne le souhaite pas.

    Je n'ai pas dû comprendre le principe du DAO. Auriez vous une piste à mon problème ci-dessus SVP ?

    Bonne fin de week-end.

  2. #2
    Expert éminent

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Par défaut
    Bonjour,

    Si j'ai bien compris votre besoin, je ne vois pas pourquoi cela ne fonctionne pas chez vous :



    On voit ici que les données du sous formulaire de droite ne sont pas les mêmes que celles de gauche. A gauche, elles sont modifiées, à droite, elles ne le sont pas. Evidemment, si je rafraîchit le formulaire principal, les deux sous formulaires présenteront les mêmes données.

    Le code associé de mon bouton :

    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
    Private Sub Commande0_Click()
    Dim oDb As DAO.Database
    Dim oRst1 As DAO.Recordset: Dim oRst2 As DAO.Recordset
    Set oDb = CurrentDb
    Set oRst1 = oDb.OpenRecordset("SELECT * FROM TABLE1 WHERE " & BuildCriteria("ID", dbInteger, Me.txtListe))
    Set oRst2 = oRst1.Clone
     
     
    With Me.Sform1.Form
        Set .Recordset = oRst1
        .AllowEdits = False
    End With
     
    With Me.SForm2.Form
        Set .Recordset = oRst2
        .AllowEdits = True
    End With
    End Sub
    Images attachées Images attachées  

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 140
    Par défaut
    Merci Tofalu pour votre aide si précieuse sur ce forum


    Citation Envoyé par Tofalu Voir le message
    Evidemment, si je rafraîchit le formulaire principal, les deux sous formulaires présenteront les mêmes données.
    Et bien, le problème est bien là


    En fait, je souhaite utiliser mon SF_Saisie (indépendant de la table) dans différent cas, pas seulement en modification de l'enregistrement sélectionné, d'où le fait que je ne souhaite pas qu'il mette à jour automatiquement la table, même après actualisation.

    Ce SF_Saisie servirait :

    1) pour modifier : donc
    - copie de l'enregistrement ayant le focus, du SF_Lecture (dépendant de la table) vers SF_Saisie (indépendant de la table).
    - puis modification manuelle dans SF_Saisie.
    - puis copie du SF_Saisie vers SF_Lecture.

    2) pour ajouter : donc
    - modification manuelle dans SF_Saisie.
    - puis copie du SF_Saisie vers SF_Lecture dans nouvel enregistrement.

    3) pour copier un enregistrement, une ou plusieurs fois, dans un enregistrement existant ou un nouveau : donc
    - copie de l'enregistrement ayant le focus, du SF_Lecture vers SF_Saisie.
    - puis d'éventuelles modifications manuelles dans SF_Saisie.
    - puis copie du SF_Saisie vers SF_Lecture, une ou plusieurs fois, dans un enregistrement existant ou un nouveau, avec d'éventuelles modifications manuelles entre chaque copie.

    D'où l'intérêt que le SF_Saisie contienne la copie d'un enregistrement mais sans être lié à la table initiale.

    J'ai cru lire que ce n'était pas possible avec en faisant un oRst = form.recorset puis form.recorset = oRst (je simplifie ici)


    Je fais donc tenter autre chose

  4. #4
    Expert éminent

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Par défaut
    Un recordset est un jeu de données. Il s'agit de la représentation en mémoire des données issues d'une requête à un instant T. Suivant les spécifications, son rafraîchissement est automatique ou non, mais dans tous les cas la modification des données en mémoire se traduit par une modification sur le disque.

    Si Paul (recordset) regarde Jacques entrain de laver sa voiture (les données dans la table) et demande à sa Martine sa femme (recordsetclone = un autre recordset) ce qu'elle voit, elle lui répondra "Je vois Jacques laver sa voiture".

    Maintenant, Martine tourne la tête et Paul demande discrètement à Jacques de laver son portail. Si Paul demande à Martine ce qu'elle voyait, elle répondra :

    Jacques lavait sa voiture.
    Paul pourrait au même moment dire : Jacques lave le portail. Mais quand Martine regardera à nouveau, ils seront d'accord : Jacques lave bien le portail.

    Paul a modifier les données, Martine a encore les données précédentes mais quand elle les actualise, elle a bien le même contenu que Paul.

    D'ailleurs, si Paul annule son nouvel ordre auprès de Jacques avant que Martine n'actualise, elle ne saura même pas qu'à un instant, Jacques a brièvement lavé autre chose que sa voiture.

    Pour votre besoin, il faudrait passer par une table temporaire.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 140
    Par défaut
    Et ben, là, c'est parlant pour moi , même si je ne lave pas souvent ma voiture

    Merci beaucoup Tofalu. Je n'avais pas du tout compris les DAO comme çà. Je croyais que çà faisait un copie, qu'on pouvait modifier la copie, mais que l'original ne s’actualisait que si on refaisait une copie dans l'autre sens. J'avais tout faux

    Je pense avoir trouver une solution via le sql (insert, delete, select) pour ajouter, supprimer et copier des enregistrements entre les F_Saisie et F_Détail. Le nouvel enregistrement pourrait servir de table temporaire lors d'une copie d'un enregistrement sur un autre. Et s'il est temporaire, on le supprime après l'opération. Si je réussis, je viendrais en dire plus pour donner des idées à ceux que çà intéresse.

Discussions similaires

  1. [array] supprimer un élément qui n'est pas le dernier
    Par SpaceFrog dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 16/04/2008, 20h41
  2. meilleur messenger qui n'est pas msn
    Par ggnore dans le forum Messagerie instantanée
    Réponses: 24
    Dernier message: 15/02/2005, 17h00
  3. Réponses: 8
    Dernier message: 04/08/2004, 14h17
  4. LIKE de tout ce qui n'est pas compris entre a<-&
    Par DjinnS dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/07/2003, 13h09
  5. [VB6] générer un recordset qui n'est pas lier à un bdd
    Par damyrid dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 05/06/2003, 17h48

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