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 :

Aide pour la vérification des doublons de codes-barres dans Delphi 7 avec MS Access


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Février 2018
    Messages : 481
    Par défaut Aide pour la vérification des doublons de codes-barres dans Delphi 7 avec MS Access
    Bonjour à tous,

    Je travaille actuellement sur un projet en Delphi 7 avec une base de données MS Access. Ma table "PRODUIT" contient huit colonnes CB1 à CB8, chacune stockant un code-barres associé à un produit (par exemple, un aliment avec plusieurs goûts).

    Je souhaite mettre en place une vérification lors de la saisie d'un nouveau code-barres pour m'assurer qu'il n'est pas déjà présent dans l'une des colonnes CB1 à CB8 de la table "PRODUIT". Si le code-barres est déjà associé à un produit, je voudrais afficher un message d'erreur.

    J'utilise Delphi 7 pour le développement et MS Access comme base de données. Comment puis-je implémenter cette vérification efficacement dans mon programme Delphi ?

    Merci d'avance pour toute aide ou suggestion que vous pourriez fournir !

    Environnement de développement : Delphi 7, MS Access

  2. #2
    Membre chevronné Avatar de licardentaistor
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2021
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2021
    Messages : 346
    Par défaut
    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
     
    uses
      ADODB, Dialogs, SysUtils;
     
    function CodeBarresExiste(ADOConnection: TADOConnection; const CodeBarres: string): Boolean;
    var
      Query: TADOQuery;
    begin
      Result := False;
      Query := TADOQuery.Create(nil);
      try
        Query.Connection := ADOConnection;
        Query.SQL.Text := 'SELECT COUNT(*) AS Cnt FROM PRODUIT ' +
                          'WHERE CB1 = :CodeBarres OR CB2 = :CodeBarres OR ' +
                          'CB3 = :CodeBarres OR CB4 = :CodeBarres OR ' +
                          'CB5 = :CodeBarres OR CB6 = :CodeBarres OR ' +
                          'CB7 = :CodeBarres OR CB8 = :CodeBarres';
        Query.Parameters.ParamByName('CodeBarres').Value := CodeBarres;
        Query.Open;
        Result := Query.FieldByName('Cnt').AsInteger > 0;
      finally
        Query.Free;
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      CodeBarresASaisir: string;
    begin
      // Ici, obtenez le code-barres à vérifier. Par exemple, d'une boîte de texte.
      CodeBarresASaisir := Edit1.Text; // Remplacez Edit1 par le nom de votre composant de saisie
     
      if CodeBarresExiste(YourADOConnection, CodeBarresASaisir) then
        ShowMessage('Le code-barres est déjà associé à un produit.')
      else
        ShowMessage('Le code-barres est unique.');
    end;

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Février 2018
    Messages : 481
    Par défaut
    Citation Envoyé par licardentaistor Voir le message
    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
     
    uses
      ADODB, Dialogs, SysUtils;
     
    function CodeBarresExiste(ADOConnection: TADOConnection; const CodeBarres: string): Boolean;
    var
      Query: TADOQuery;
    begin
      Result := False;
      Query := TADOQuery.Create(nil);
      try
        Query.Connection := ADOConnection;
        Query.SQL.Text := 'SELECT COUNT(*) AS Cnt FROM PRODUIT ' +
                          'WHERE CB1 = :CodeBarres OR CB2 = :CodeBarres OR ' +
                          'CB3 = :CodeBarres OR CB4 = :CodeBarres OR ' +
                          'CB5 = :CodeBarres OR CB6 = :CodeBarres OR ' +
                          'CB7 = :CodeBarres OR CB8 = :CodeBarres';
        Query.Parameters.ParamByName('CodeBarres').Value := CodeBarres;
        Query.Open;
        Result := Query.FieldByName('Cnt').AsInteger > 0;
      finally
        Query.Free;
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      CodeBarresASaisir: string;
    begin
      // Ici, obtenez le code-barres à vérifier. Par exemple, d'une boîte de texte.
      CodeBarresASaisir := Edit1.Text; // Remplacez Edit1 par le nom de votre composant de saisie
     
      if CodeBarresExiste(YourADOConnection, CodeBarresASaisir) then
        ShowMessage('Le code-barres est déjà associé à un produit.')
      else
        ShowMessage('Le code-barres est unique.');
    end;

    je vous remercie infiniement pour votre réponse
    cependant comment adapté le code à des DBEDIT allant de 1 jsuqua 7 comme le montre la pièce jointe

    merci
    Images attachées Images attachées  

  4. #4
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Février 2018
    Messages : 481
    Par défaut
    Citation Envoyé par licardentaistor Voir le message
    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
     
    uses
      ADODB, Dialogs, SysUtils;
     
    function CodeBarresExiste(ADOConnection: TADOConnection; const CodeBarres: string): Boolean;
    var
      Query: TADOQuery;
    begin
      Result := False;
      Query := TADOQuery.Create(nil);
      try
        Query.Connection := ADOConnection;
        Query.SQL.Text := 'SELECT COUNT(*) AS Cnt FROM PRODUIT ' +
                          'WHERE CB1 = :CodeBarres OR CB2 = :CodeBarres OR ' +
                          'CB3 = :CodeBarres OR CB4 = :CodeBarres OR ' +
                          'CB5 = :CodeBarres OR CB6 = :CodeBarres OR ' +
                          'CB7 = :CodeBarres OR CB8 = :CodeBarres';
        Query.Parameters.ParamByName('CodeBarres').Value := CodeBarres;
        Query.Open;
        Result := Query.FieldByName('Cnt').AsInteger > 0;
      finally
        Query.Free;
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      CodeBarresASaisir: string;
    begin
      // Ici, obtenez le code-barres à vérifier. Par exemple, d'une boîte de texte.
      CodeBarresASaisir := Edit1.Text; // Remplacez Edit1 par le nom de votre composant de saisie
     
      if CodeBarresExiste(YourADOConnection, CodeBarresASaisir) then
        ShowMessage('Le code-barres est déjà associé à un produit.')
      else
        ShowMessage('Le code-barres est unique.');
    end;
    voici mon code que je l'utilsie dans la recherche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Adoquery1.SQL.Clear;
    ADOQuery1.SQL.Text := 'SELECT C_b FROM Produits WHERE C_b = ' + QuotedStr(Ed_CB.Text) +' or  C_b1 = ' + QuotedStr(Ed_CB.Text)+' or  C_b2 = ' + QuotedStr(Ed_CB.Text)+' or  C_b3 = ' + QuotedStr(Ed_CB.Text)+' or  C_b4 = ' + QuotedStr(Ed_CB.Text)+' or  C_b5 = ' + QuotedStr(Ed_CB.Text)+' or  C_b6 = ' + QuotedStr(Ed_CB.Text)+' or  C_b7 = ' + QuotedStr(Ed_CB.Text) ;
    ADOQuery1.Open;

    Est-ce optimal en termes de recherche par rapport au nombre de produits saisis ?

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Février 2018
    Messages : 481
    Par défaut
    Citation Envoyé par LandGreen Voir le message
    voici mon code que je l'utilsie dans la recherche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Adoquery1.SQL.Clear;
    ADOQuery1.SQL.Text := 'SELECT C_b FROM Produits WHERE C_b = ' + QuotedStr(Ed_CB.Text) +' or  C_b1 = ' + QuotedStr(Ed_CB.Text)+' or  C_b2 = ' + QuotedStr(Ed_CB.Text)+' or  C_b3 = ' + QuotedStr(Ed_CB.Text)+' or  C_b4 = ' + QuotedStr(Ed_CB.Text)+' or  C_b5 = ' + QuotedStr(Ed_CB.Text)+' or  C_b6 = ' + QuotedStr(Ed_CB.Text)+' or  C_b7 = ' + QuotedStr(Ed_CB.Text) ;
    ADOQuery1.Open;

    Est-ce optimal en termes de recherche par rapport au nombre de produits saisis ?
    additivement,

    si je rajoute des indexes de type UNIQUE dans chaque colonne de C_B...C_B7 est ce que ça rend plus performant la recherche ? (voir PJ)
    Images attachées Images attachées  

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2016
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2016
    Messages : 9
    Par défaut Structure de la base de données
    Si je devais réaliser cette application et s'il est encore temps
    Je modifierai la structure de la base de données ainsi :
    Table Produit
    #ID : identifiant
    nom produit
    etc ...
    Table CodeBarresProduit
    ID_Produit : Clé étrangère
    No : Position
    CB : Code barre Unique

    ensuite c'est la base de données qui fait le travail.

    NB : de plus si un jour il y a plus de code barres, pas besoin de modifier les tables.

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 604
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par LandGreen Voir le message
    Est-ce optimal en termes de recherche par rapport au nombre de produits saisis ?
    Ce qui est loin d'être optimal, c'est la non-utilisation d'une requête paramétrée comme l'avait montré licardentaistor
    Citation Envoyé par Bardoire37
    Si je devais réaliser cette application et s'il est encore temps
    Je modifierai la structure de la base de données
    Moi, c'est le SGBD que je changerai , MS_ACCESS franchement c'est pas vraiment ce que j'utiliserai

  8. #8
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Février 2018
    Messages : 481
    Par défaut
    Citation Envoyé par licardentaistor Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ...
    procedure TForm1.Button1Click(Sender: TObject);
    var
      CodeBarresASaisir: string;
    begin
      // Ici, obtenez le code-barres à vérifier. Par exemple, d'une boîte de texte.
      CodeBarresASaisir := Edit1.Text; // Remplacez Edit1 par le nom de votre composant de saisie
     
      if CodeBarresExiste(YourADOConnection, CodeBarresASaisir) then
        ShowMessage('Le code-barres est déjà associé à un produit.')
      else
        ShowMessage('Le code-barres est unique.');
    end;
    en exécutant ce code écri dans un boutton j'ai le message d'erreur de : Acces violation....
    avec cette erreur :[Hint] UMAJ_Prod.pas(179): Value assigned to 'CodeBarresExiste' never used

    y'a t'il une siolution à ça ?
    Images attachées Images attachées  

  9. #9
    Membre émérite Avatar de sergio_is_back
    Homme Profil pro
    Consultant informatique industrielle, développeur tout-terrain
    Inscrit en
    Juin 2004
    Messages
    1 188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant informatique industrielle, développeur tout-terrain
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 188
    Par défaut
    Citation Envoyé par LandGreen Voir le message
    en exécutant ce code écri dans un boutton j'ai le message d'erreur de : Acces violation....
    avec cette erreur :[Hint] UMAJ_Prod.pas(179): Value assigned to 'CodeBarresExiste' never used

    y'a t'il une siolution à ça ?
    Oui il y a une solution : Passer la bonne instance ton ADOConnection : dans la procédure ADC1 est déclaré mais pas instancié !

    Pour CodeBarresExiste c'est juste un warning

  10. #10
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Février 2018
    Messages : 481
    Par défaut
    Citation Envoyé par sergio_is_back Voir le message
    Oui il y a une solution : Passer la bonne instance ton ADOConnection : dans la procédure ADC1 est déclaré mais pas instancié !

    Pour CodeBarresExiste c'est juste un warning

    Bonjour sergio_is_back,

    Je vous remercie sincèrement pour votre réponse rapide et utile. Cela a certainement clarifié quelques points pour moi.
    Cependant, je suis toujours en train de travailler sur ce projet et je me demandais si vous pourriez fournir plus de détails ou des conseils supplémentaires sur (Passer la bonne instance ton ADOConnection) . Votre expertise serait d'une grande valeur pour moi.



    Merci encore pour votre assistance précieuse.

  11. #11
    Membre émérite Avatar de sergio_is_back
    Homme Profil pro
    Consultant informatique industrielle, développeur tout-terrain
    Inscrit en
    Juin 2004
    Messages
    1 188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant informatique industrielle, développeur tout-terrain
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 188
    Par défaut
    Citation Envoyé par LandGreen Voir le message
    Bonjour sergio_is_back,

    Je vous remercie sincèrement pour votre réponse rapide et utile. Cela a certainement clarifié quelques points pour moi.
    Cependant, je suis toujours en train de travailler sur ce projet et je me demandais si vous pourriez fournir plus de détails ou des conseils supplémentaires sur (Passer la bonne instance ton ADOConnection) . Votre expertise serait d'une grande valeur pour moi.



    Merci encore pour votre assistance précieuse.
    Le bonne instance de ADOConnection c'est sans doute elle sur ta fiche, non ? Le composant grâce auquel tu établi la connexion au fichier MSACCESS
    A moins que tu n'utilise un DataModule, mais à mon avis non ?

    Donc sur ta fiche tu dois avoir un composant TADOConnection quelque part et c'est son nom qu'il faut passer à la place de "ADC1"

    Après si tu passe que des petits extraits de code c'est dur de savoir ce que tu fait vraiment

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/09/2021, 11h18
  2. Réponses: 5
    Dernier message: 18/02/2017, 22h58
  3. aide pour la gestion des journaux d'évènements
    Par to_toy dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 22/02/2007, 14h20
  4. Besoin d'aide pour un MCD des tables de la BDD
    Par nicaud dans le forum Schéma
    Réponses: 3
    Dernier message: 23/04/2006, 10h34
  5. Code barre dans des fichiers QuiReport 3.62 pour delphi 7
    Par yanis97 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 07/03/2006, 14h25

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