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

Lazarus Pascal Discussion :

Connexion MS Access [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 68
    Points : 69
    Points
    69
    Par défaut Connexion MS Access
    Bonjour,

    Je débute en Lazarus.

    Je voudrais pouvoir connecter une base ACCESS via Lazarus
    Je suis sous Seven 64 et Lazarus 1.04
    J'ai installé le redistribuable d'access 2010.

    Sur une fiche, je dépose le composant ODBC de l'onglet SQLDB.

    Quand je veux mettre la propriété de Connected à true, j'ai le message d'erreur suivant : Source de données introuvable et nom de pilote non spécifié.

    Que doit on mettre comme nom de pilote pour une base ACCESS ?
    Ou doit on mettre le chemin de la base ?

    Merci d'avance
    Jazz77

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Philippe.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 68
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    Merci Philippe


    En fait dans le composant ODBCConnection il faut uniquement renseigner
    le propriété FileDSN avec le chemin et le nom du fichier DSN
    et mettre la propriété connected=True

    dans mon cas c'est FileDNS = C:\Lazarus\compta.dsn

    Le contenu ce mon fichier DSN est le suivant :
    [ODBC]
    DRIVER=Microsoft Access Driver (*.mdb)
    UID=admin
    UserCommitSync=Yes
    Threads=3
    SafeTransactions=0
    PageTimeout=5
    MaxScanRows=8
    MaxBufferSize=2048
    FIL=MS Access
    DriverId=25
    DefaultDir=c:\Lazarus
    DBQ=Compta.mdb
    Cependant J'ai un problème d'accent
    Aucun caractère accentué ne s'affiche...

  4. #4
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bonjour

    C'est sans doute parce que le jeu de caractères utilisé dans le fichier Access n'est pas celui qu'attend Lazarus, qui est UTF-8 par défaut.

    Donc, il faut convertir en appelant pour chaque champ chaîne de caractère une fonction de conversion. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TFormImport.StringOnGetText(Sender: TField; var aText: string;   DisplayText: boolean);  
    begin
        aText := ISO_8859_1ToUTF8(Sender.AsString);
    end;
    Si c'est un MS-ACCESS récent, je suppose que le jeu de caractères est ISO-8859-1, sinon il faut utiliser une autre fonction de la même unité LConvEncoding.
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 68
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par tintinux Voir le message
    Bonjour

    C'est sans doute parce que le jeu de caractères utilisé dans le fichier Access n'est pas celui qu'attend Lazarus, qui est UTF-8 par défaut.

    Donc, il faut convertir en appelant pour chaque champ chaîne de caractère une fonction de conversion. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TFormImport.StringOnGetText(Sender: TField; var aText: string;   DisplayText: boolean);  
    begin
        aText := ISO_8859_1ToUTF8(Sender.AsString);
    end;
    Si c'est un MS-ACCESS récent, je suppose que le jeu de caractères est ISO-8859-1, sinon il faut utiliser une autre fonction de la même unité LConvEncoding.
    Merci tintinux

  6. #6
    Membre habitué

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Points : 195
    Points
    195
    Par défaut


    j'ai passé des heures à chercher comment afficher les caractères accentués d'une base ACCESS avant de plonger dans la LCL et de trouver la fonction OnGetText

    un petit tour par ici m'aurais permis de gagner pas loin de 6h dans mes dev ...

    donc j'ai trouvé comme un grand :
    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
     
    procedure TDM.QueryGetText(Sender: TField; var aText: string; DisplayText: Boolean);
    begin
      atext := AnsiToUTF8(Sender.AsString);
    end;
     
    procedure TDM.QueryAfterOpen(DataSet: TDataSet);
    var
        count: longint;
    begin
      count := 0;
      while count<DataSet.RecordCount do begin
    //    DataSet.FieldDefs[count].Name :=AnsiToUTF8(DataSet.FieldDefs[count].Name);
        DataSet.Fields[count].OnGetText:=@DM.QueryGetText;
        inc(count);
      end;
    end;
    (Je réécris afin d'être bien clair pour tout le monde)

    Vous remarquerez en commentaire la ligne où j'essaye de transformer les noms de champs ... la manip ne fonctionne pas. Lorsque je connecte via un DataSource la requête à un TDBGrid, les têtes de colonnes ont toujours les accents ACCESS (cad des ?) !

    N'ayant rien trouvé dans les recherches google avec les mots clé 'ACCESS charset encoding' et tout un tas d'autre combinaison, ni dans le wiki de lazarus, nous devrions peut-être rajouter cette astuce et dans la faq lazarus de developpez, et dans le wiki officiel ?

    @bientôt

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 68
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par mtournay Voir le message


    j'ai passé des heures à chercher comment afficher les caractères accentués d'une base ACCESS avant de plonger dans la LCL et de trouver la fonction OnGetText

    un petit tour par ici m'aurais permis de gagner pas loin de 6h dans mes dev ...

    donc j'ai trouvé comme un grand :
    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
     
    procedure TDM.QueryGetText(Sender: TField; var aText: string; DisplayText: Boolean);
    begin
      atext := AnsiToUTF8(Sender.AsString);
    end;
     
    procedure TDM.QueryAfterOpen(DataSet: TDataSet);
    var
        count: longint;
    begin
      count := 0;
      while count<DataSet.RecordCount do begin
    //    DataSet.FieldDefs[count].Name :=AnsiToUTF8(DataSet.FieldDefs[count].Name);
        DataSet.Fields[count].OnGetText:=@DM.QueryGetText;
        inc(count);
      end;
    end;
    (Je réécris afin d'être bien clair pour tout le monde)

    Vous remarquerez en commentaire la ligne où j'essaye de transformer les noms de champs ... la manip ne fonctionne pas. Lorsque je connecte via un DataSource la requête à un TDBGrid, les têtes de colonnes ont toujours les accents ACCESS (cad des ?) !

    N'ayant rien trouvé dans les recherches google avec les mots clé 'ACCESS charset encoding' et tout un tas d'autre combinaison, ni dans le wiki de lazarus, nous devrions peut-être rajouter cette astuce et dans la faq lazarus de developpez, et dans le wiki officiel ?

    @bientôt
    Merci Michel

    J'ai integer ton code dans mon programme et cela fonctionne de façon impeccable

    Merci à tous

  8. #8
    Membre habitué

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Points : 195
    Points
    195
    Par défaut
    De rien, c'est un plaisir d'aider quand je peux

  9. #9
    Membre habitué

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Points : 195
    Points
    195
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TDM.QueryAfterOpen(DataSet: TDataSet);
    var
        count: longint;
    begin
      count := 0;
      while count<DataSet.FieldDefs.Count do begin
        DataSet.Fields[count].OnGetText:=@QueryGetText;
        inc(count);
      end;
    end;
    Correction, la boucle se fait sur DataSet.FieldDefs.Count, par sur le dataset.recordcount, sinon dès que le nombre de ligne dépasse le nombre de colonne, patatra

  10. #10
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bonjour

    C'est un détail, mais pour parcourir le tableau DataSet.Fields, il me semble qu'il faut mieux tester DataSet.Fields.Count, plutôt que DataSet.FieldDefs.Count qui pourrait être différent dans certains cas.

    Mais surtout, pour le nom du champ, il faut je pense modifier la propriété Fields[count].DisplayName et non pas Name qui doit être un identificateur valide et ne supporte pas encore les caractères accentués.
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 68
    Points : 69
    Points
    69
    Par défaut
    Bonjour

    C'est un détail, mais pour parcourir le tableau DataSet.Fields, il me semble qu'il faut mieux tester DataSet.Fields.Count, plutôt que DataSet.FieldDefs.Count qui pourrait être différent dans certains cas.

    Mais surtout, pour le nom du champ, il faut je pense modifier la propriété Fields[count].DisplayName et non pas Name qui doit être un identificateur valide et ne supporte pas encore les caractères accentués.
    __________________
    Cordialement,
    Tintinux
    Merci Tintinux

    Cependant j'ai toujours un problème d'accents mais dans l'autre sens cette fois

    Quand je lis ma table Access tout va pour le mieux ...
    Quand je modifie un champ en ajoutant des caractères accentués, c'est patatra.
    Les caractères accentués qui viennent d'être ajoutés sont remplacés par des codes divers et variés.
    par exemple les é sont remplacés par des affreux é

    Le champs de la table en question s'appelle "Adresse"
    J'ai essayé le code suivant .... haaaaa .... pas bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    procedure TDM.SQLQuery1AdresseSetText(Sender: TField; const aText: string);
    Var
      MaChaine : String;
    begin
       MaChaine := DM.SQLQuery1.FieldByName('Adresse').AsString ;
       DM.SQLQuery1.FieldByName('Adresse').AsString:= UTF8ToAnsi(MaChaine);
     
    end;
    Je cherche mais la je sèche un peu...

    merci d'avance

    jazz

  12. #12
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bonjour

    Oui, il faut faire l'encodage réciproque, en appelant UTF8ToAnsi dans un événement OnSetText.

    Mais il faut donner à UTF8ToAnsi la valeur saisie (Editxxx.text), pas celle du champ qui a déjà été altérée par OnGetText.
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  13. #13
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 68
    Points : 69
    Points
    69
    Par défaut
    Citation Envoyé par tintinux Voir le message
    Bonjour

    Oui, il faut faire l'encodage réciproque, en appelant UTF8ToAnsi dans un événement OnSetText.

    Mais il faut donner à UTF8ToAnsi la valeur saisie (Editxxx.text), pas celle du champ qui a déjà été altérée par OnGetText.
    Merci tintinux, mais j'ai essayé avec OnSetText mais cela ne fonctionne pas.

    J'ai donc essayé le code suivant, mais sans résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    procedure TFormComptes.DBMemo1Exit(Sender: TObject);
    begin
     
      If DBMemo1.Modified then
           DM.SQLQuery1.FieldByName('Adresse').AsString:=UTF8ToAnsi(Dbmemo1.Text);
    end;

  14. #14
    Membre habitué

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Points : 195
    Points
    195
    Par défaut
    Ce code fonctionne très bien de mon coté, merci

    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
     
    procedure TDM.QueryGetText(Sender: TField; var aText: string; DisplayText: Boolean);
    begin
      atext := AnsiToUTF8(Sender.AsString);
    end;
     
    procedure TDM.QuerySetText(Sender: TField; const aText: string);
    begin
      Sender.AsString:=UTF8ToAnsi(aText);
    end;
     
    procedure TDM.QueryAfterOpen(DataSet: TDataSet);
    var
        count: longint;
    begin
      count := 0;
      while count<DataSet.Fields.Count do begin
    //    ShowMessage(DataSet.FieldDefs[count].Name);
    //    DataSet.Fields[count].DisplayName : =AnsiToUTF8(DataSet.Fields[count].DisplayName);
    //    ShowMessage(DataSet.FieldDefs.Items[count].Name);
        DataSet.Fields[count].OnGetText:=@QueryGetText;
        DataSet.Fields[count].OnSetText:=@QuerySetText;
        inc(count);
      end;
    end;
    @tintinux : très bonne idée sur laquelle je me suis jetée ... malheureusement la property DataSet.Fields[count].DisplayName n'a pas de write, juste un read, alors que DataSet.FieldDefs[count].DisplayName est write-able
    Par contre cela ne change pas mes entêtes de colonnes dans un DBGrid

  15. #15
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Citation Envoyé par Jazz77
    Merci tintinux, mais j'ai essayé avec OnSetText mais cela ne fonctionne pas.
    Qu'est-ce qui ne fonctionne pas ?

    Citation Envoyé par Jazz77
    J'ai donc essayé le code suivant, mais sans résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    procedure TFormComptes.DBMemo1Exit(Sender: TObject);
    begin
     
      If DBMemo1.Modified then
           DM.SQLQuery1.FieldByName('Adresse').AsString:=UTF8ToAnsi(Dbmemo1.Text);
    end;
    Ca c'est sûr que ça ne peut pas marcher.
    Si tu utilises un TDbMemo lié à une Query via un DataSet il ne faut pas assigner son contenu au champ. Lazarus le fait tout seul, en passant d'ailleurs par OnSetText. Si tu as gardé le OnSetText avec encodage, cela fait un double encodage.
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  16. #16
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 68
    Points : 69
    Points
    69
    Par défaut
    J'ai remarqué une chose intéressante.

    Que je visualise ma Fenêtre en mode conception, les caractères accentués du champs, donc les caractères "é" s'affichent correctement.

    Quand je désactive les méthodes onGetText et OnSetText du champs "Adresse", les caractères accentués s'affiche normalement.

    Bizarre .... Bizarre

  17. #17
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 68
    Points : 69
    Points
    69
    Par défaut
    J'ai trouvé

    J'ai affecté par erreur un string access à un TDBMemo sous lazarus.
    L'affichage ne fonctionne pas bien du tout dans ce cas

    Mélange de crayon assuré avec les problématiques utf-8

    J'ai redéfini dans Access mon Champs Adresse en champs Memo.

    Et la ca va bien mieux

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ACCESS] connexion base ACCESS sans VC++ ou BC++ ni wizard
    Par roce dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 18/03/2007, 23h13
  2. [JDBC] problème connexion à MS Access
    Par naz dans le forum JDBC
    Réponses: 7
    Dernier message: 03/10/2005, 10h06
  3. emuler des pages asp avec connexion a access
    Par laville dans le forum ASP
    Réponses: 2
    Dernier message: 01/06/2005, 18h44
  4. pb connexion asp/access
    Par cell dans le forum ASP
    Réponses: 5
    Dernier message: 21/04/2005, 17h31
  5. [ODBC] Connexion MS-Access sans DSN
    Par Chap$ dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 30/11/2004, 17h16

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