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

 Delphi Discussion :

Fonctionnalité non supportée pour un Locate !


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 48
    Points : 32
    Points
    32
    Par défaut Fonctionnalité non supportée pour un Locate !
    Bonjour à tous,
    Voila je veux ajouter l'authentification des utilisateurs dans l'application.
    J'utilise D 2009 avec FireBird/Interbase.
    Le code :
    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
    procedure TPasswordDlg.OKBtnClick(Sender: TObject);
    begin
      if
       Datamodule1.IBTablePWD.Locate('USERNAME',Edit1.Text,[locaseinsensitive]) then
         Begin
           if Datamodule1.IBTablePWD.FieldByName('USERPASSWORD').Text=EditPassword.Text then
              Begin
              if Datamodule1.IBTablePWD.FieldByName('POWER').Value='A' then
                   Begin
                   Form_main.Show;
                   Form_main.MainMenu1.Items[4].Items[0].Enabled:=True
                   End
                Else
                   Form_main.Show;
                   Form_main.MainMenu1.Items[4].Items[0].Enabled:=False
              End
           Else  ShowMessage('Mot de passe incorrect !');
         End
       Else  ShowMessage('Nom d''utilisateur inconnu !');
    End;
    Mais quand j'essaye il affiche pour la ligne où se trouve le 'Locate' : Le projet a déclenché la classe d'exception EIBClientError avec le message 'Fonctionnalité non supportée.'.

    Pouvez-vous m'aider ?
    Merci.
    Donc je ne voix pas où est le problème puisque ça semble juste.


    Edit : Pareil pour If Not ----- then ----

  2. #2
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 48
    Points : 32
    Points
    32
    Par défaut
    Je m'attendais à une réponse rapide ! vue le nombre de membres.
    À noter qu'avec une base Access, en ADO, j'ai pas eu ce problème.

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 046
    Points : 40 962
    Points
    40 962
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par teZone Voir le message
    Je m'attendais à une réponse rapide !
    pour pouvoir répondre , il faut déjà lire ! puis comprendre

    la base de données attaquée est Firebird ou InterBase ?
    Dans le cas 1 , je ne sais pas si les composants utilisés sont les mieux adaptés surtout si version 2.1.

    Ensuite le locate , personnellement lorsque je l'utilise , même ppour une seule 'clé' je l'utilise sous sa forme complète

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Datamodule1.IBTablePWD.Locate('USERNAME',VarArrayof([Edit1.Text]),[locaseinsensitive])
    et enfin dans ce cas , comme dans beaucoup d'autre , je préfère , et de loin utiliser une Query du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT USERPASSWORD,POWER FROM TABLESECURITE WHERE USERNAME=:nomutilisateur
    et utiliser le test Query.Fields[0]=null pour l'existance ou non de l'utilisateur demandé .

    POURQUOI ? et bien entre autre pour la quantité d'informations transitant sur le réseau
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 48
    Points : 32
    Points
    32
    Par défaut
    Merci pour la réponse,
    Est-ce possible de mieux détailler comment utiliser ce IBQuerry svp.

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 046
    Points : 40 962
    Points
    40 962
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par teZone Voir le message
    Est-ce possible de mieux détailler comment utiliser ce IBQuerry
    en simple :
    pose d'un TIBQuery dans le Datamodule1 par exemple
    et renseignement de la propriété connection (utilisant des ibtables tu dois savoir faire ) pour la suite je lui donne un nom : IBQ

    puis
    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 TPasswordDlg.OKBtnClick(Sender: TObject);
    begin
       with datamodule1.IBQ do
          begin 
              Close;
              SQL.Clear;
              SQL.Text:='SELECT USERPASSWORD,POWER FROM TABLESECURITE  WHERE USERNAME=:n'
               Params[0].asSTring:=Edit1.Text;
              // ou encore + directement  
              //SQL.Text:='SELECT USERPASSWORD,POWER FROM TABLESECURITE  WHERE USERNAME='+Quotedstr(edit1.text);
             Open;
             if Fields[0].isnull then ShowMessage('Nom d''utilisateur inconnu !')
             else begin
                  if  Fields[0].asString=EditPassword.Text 
                              then begin 
                                     Form_main.MainMenu1.Items[4].Items[0].Enabled:=(Fields[1].asString='A');
                                     Form_main.Show;
                                end  
                                Else  ShowMessage('Mot de passe incorrect !');  // fin test mot de passe
     
            end;  // fin test utilisateur
           Close;   
         End;     // Fin with 
    End;
    plus sophistiqué , faire une creation d'un objet IBQuery directement dans la procedure (mais ça ne change pas le principe)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TPasswordDlg.OKBtnClick(Sender: TObject);
    begin
       with TIBQuery.Create(nil) do
         begin
              Connection:=Datamodule1.IBConnection;
              // + peut être autres propriétés 
              // suite traitement
              // 
             Free;  //<- a ne pas oublier ou FreeAndNil 
         end;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 48
    Points : 32
    Points
    32
    Par défaut
    Je vous remercie beaucouuup !
    Voila ce que j'ai fait alors :
    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
       with IBQuery1 do
          begin
              Close;
              SQL.Clear;
              SQL.Text:='SELECT USERPASSWORD,POWER FROM PWD WHERE USERNAME=:n';
              Params[0].asSTring:=Edit1.Text;
              // ou encore + directement
              //SQL.Text:='SELECT USERPASSWORD,POWER FROM PWD  WHERE USERNAME='+Quotedstr(edit1.text);
              Open;
             if Fields[0].isnull then ShowMessage('Nom d''utilisateur inconnu !')
             else begin
                  if  Fields[0].asString=EditPassword.Text
                              then begin
                                     Form_main.MainMenu1.Items[4].Items[0].Enabled:=(Fields[0].asString='U');
                                     Form_main.MainMenu1.Items[4].Items[0].Enabled:=(Fields[1].asString='A');
                                     PasswordDlg.visible:=false;
                                     Form_main.show;
                                end
                                Else  ShowMessage('Mot de passe incorrect !');  // fin test mot de passe
     
            end;  // fin test utilisateur
           Close;
         End;     // Fin with
    Et ça marche très bien !
    J'espère que c'est correct !
    Merci encore.

    C'est la thèse de BTS donc ^^

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 48
    Points : 32
    Points
    32
    Par défaut
    Et voila le rendu en ajoutant le cryptage MD5 du mdp, et ça marche nikel :

    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
    procedure TPasswordDlg.OKBtnClick(Sender: TObject);
    var StACrypt,StCrypt:String;
    Digest:MD5Digest;
    begin
       with IBQuery1 do
          begin
              Close;
              SQL.Clear;
              SQL.Text:='SELECT USERPASSWORD,POWER FROM PWD WHERE USERNAME=:n';
              Params[0].asSTring:=Edit1.Text;
              // ou encore + directement
              //SQL.Text:='SELECT USERPASSWORD,POWER FROM PWD  WHERE USERNAME='+Quotedstr(edit1.text);
              Open;
             if Fields[0].isnull then ShowMessage('Nom d''utilisateur inconnu !')
             else begin
                     StACrypt:=EditPassword.Text; //Texte à crypter
                     Digest:=MD5String(StACrypt);
                     StCrypt:=MD5Print(Digest);
     
                  if  Fields[0].asString=StCrypt
                              then begin
                                     Form_main.MainMenu1.Items[4].Items[0].Enabled:=Fields[0].asString='Utilisateur';
                                     Form_main.MainMenu1.Items[4].Items[0].Enabled:=Fields[0].asString='utilisateur';
                                     Form_main.MainMenu1.Items[4].Items[0].Enabled:=Fields[1].asString='Administrateur';
                                     Form_main.MainMenu1.Items[4].Items[0].Enabled:=Fields[1].asString='administrateur';
                                     PasswordDlg.visible:=false;
                                     Form_main.show;
                                end
                                Else  ShowMessage('Mot de passe incorrect !');  // fin test mot de passe
     
            end;  // fin test utilisateur
           Close;
         End;     // Fin with
     
     
    end;
    En ajoutant l'unité MD5 au projet.

    Dites, comment ignorer la casse pour éviter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form_main.MainMenu1.Items[4].Items[0].Enabled:=Fields[0].asString='Utilisateur';                               Form_main.MainMenu1.Items[4].Items[0].Enabled:=Fields[0].asString='utilisateur';
    J'ai essayé ceci mais je croix que c'est pas comme ça qu'on l'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form_main.MainMenu1.Items[4].Items[0].Enabled:=Fields[0].asString=AnsiUpperCase('Utilisateur');
    Merci encore.

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 046
    Points : 40 962
    Points
    40 962
    Billets dans le blog
    62
    Par défaut
    il faut faire la conversion des deux cotés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AnsiUppercase(fields[0].asString)=AnsiUpperCase('Utilisateur');
    encore que , comme la partie droite semble fixe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AnsiUppercase(fields[0].asString)='UTILISATEUR';
    PS : Je ne savais pas que les BTS faisaient des "Thèses" , pour moi les thèses se limitent aux doctorants (bac +7) !
    mémoire ou rapport de fin d'étude me semble un terme beaucoup plus proche de la vérité
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 48
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    il faut faire la conversion des deux cotés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AnsiUppercase(fields[0].asString)=AnsiUpperCase('Utilisateur');
    encore que , comme la partie droite semble fixe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AnsiUppercase(fields[0].asString)='UTILISATEUR';
    PS : Je ne savais pas que les BTS faisaient des "Thèses" , pour moi les thèses se limitent aux doctorants (bac +7) !
    mémoire ou rapport de fin d'étude me semble un terme beaucoup plus proche de la vérité
    Je vais tester merci beaucoup.
    PS : oui, c'est un mémoire de fin d'étude, pas une thèse bien entendu (abus de langage ^^).

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

Discussions similaires

  1. Requête SQl: Fonctionnalité non supportée
    Par formula_one dans le forum Bases de données
    Réponses: 8
    Dernier message: 18/08/2012, 12h54
  2. Delphi6 & BDE + DBF "fonctionnalité non supportée"
    Par micoudic dans le forum Bases de données
    Réponses: 7
    Dernier message: 22/07/2011, 10h58
  3. [Borland DataPump] PDX -> Oracle : "Fonctionnalité non supportée"
    Par ShaiLeTroll dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/11/2007, 12h21
  4. EDBEngineError Paradox: "Fonctionnalité non supportée"
    Par forzaxelah dans le forum Bases de données
    Réponses: 1
    Dernier message: 11/05/2006, 17h32
  5. [CR8][Delphi6] erreur imprimante non supportée
    Par Sebastien L. dans le forum SDK
    Réponses: 3
    Dernier message: 12/09/2002, 15h42

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