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

Bases de données Delphi Discussion :

Conseil de fonctionnement


Sujet :

Bases de données Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut Conseil de fonctionnement
    Bonjour à toutes et à tous,

    Dans mon programme, j'ai besoin d'alimenter une Table Client (interne) qui fait partie de ma base principal avec un autre table client (externe) faisant parti d'un autre logiciel.

    - les champs entre les tables sont identique en terme de structure

    Admettons que ma table client (interne) est remplie et que je souhaite lancer une intégration de mon autre table client (externe) sachant que si le code est identique je ne fait rien et je passe à l'enregistrement suivant.

    Les Bases clients sont sous Access97
    et je travail exclusivement avec ADO

    J4ai plusieur possibilité :

    1) je parcours ma table interne client et j'enregistre chaque code dans une variable (ici codeclient) séparé par une virgule puis je fais cette requette :

    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
     
    // ...
    // requete qui prends que les clients différent de la base interne
    // ...
          With ModuleDeDonneeSecondaire.ADOQueryClientBatigest Do
          Begin
            Try
              Try
                SQL.Clear;
                SQL.Add('Select * FROM Client');
                SQL.Add('Where Code = :xCodeClient');
                Parameters.ParamByName('xCodeClient').Value := CodeClient;
                Open;
    //
    // Insertion de chaque client nouveau dans ma base client interne
    // 
                With ModuleDeDonneeSecondaire.ADOQuery do
                Begin
                  Try
                    Try
                      SQL.Clear;
                      SQL.Add('Insert into Client (CodeClt,NomClt,CiviliteClt,InterlocClt,AdresseClt,SuiteAdresseClt,CpClt,VilleClt,TelClt,FaxClt,PortableClt,EMailClt)');;
                      SQL.add('values (:C0,:C1,:C2,:C3,:C4,:C5,:C6,:C7,:C9,:C10,:C11,:C12)');
                      Parameters.ParamByName('C0').Value := ModuleDeDonneeSecondaire.ADOQueryClientBatigest.FieldByName('Code').AsString;
                      Parameters.ParamByName('C1').Value := ModuleDeDonneeSecondaire.ADOQueryClientBatigest.FieldByName('Nom').AsString;
                      Parameters.ParamByName('C2').Value := ModuleDeDonneeSecondaire.ADOQueryClientBatigest.FieldByName('Civilite').AsString;
                      Parameters.ParamByName('C3').Value := ModuleDeDonneeSecondaire.ADOQueryClientBatigest.FieldByName('Interloc').AsString;
                      Parameters.ParamByName('C4').Value := ModuleDeDonneeSecondaire.ADOQueryClientBatigest.FieldByName('Adr').AsString;
                      Parameters.ParamByName('C5').Value := ModuleDeDonneeSecondaire.ADOQueryClientBatigest.FieldByName('SuiteAdr').AsString;
                      Parameters.ParamByName('C6').Value := ModuleDeDonneeSecondaire.ADOQueryClientBatigest.FieldByName('CP').AsString;
                      Parameters.ParamByName('C7').Value := ModuleDeDonneeSecondaire.ADOQueryClientBatigest.FieldByName('Ville').AsString;
                      Parameters.ParamByName('C9').Value := ModuleDeDonneeSecondaire.ADOQueryClientBatigest.FieldByName('Tel').AsString;
                      Parameters.ParamByName('C10').Value := ModuleDeDonneeSecondaire.ADOQueryClientBatigest.FieldByName('Fax').AsString;
                      Parameters.ParamByName('C11').Value := ModuleDeDonneeSecondaire.ADOQueryClientBatigest.FieldByName('Portable').AsString;
                      Parameters.ParamByName('C12').Value := ModuleDeDonneeSecondaire.ADOQueryClientBatigest.FieldByName('EMail').AsString;
                      ExecSQL;
                    Except
                      on E : Exception do
                      Begin
                        ShowMessage(E.ClassName+' erreur soulevée, avec le message : '+E.Message+#13+#10+
                        'Impossible d''intégrer un Client ' +#13+#10+
                        'Planning va fermer l''intégration.' +#13+#10+
                        'Si le problème persiste, merci de contacter votre revendeur');
                      end;
                    end;
                  Finally
                    Close;
                  end;
                end;
    // ...
    2) Je parcours la table externe, enregistrement par enregistrement et je regarde si le codeclient existe dans ma base client interne si oui je pass si non je continue

    3) J'ai également pensé à faire un insert into complet de la base client (externe) sur la base client (interne) étant donné que "Code" est un champs primaire il ne peux pas créer 2 fois le même enregistrement, sauf que je tombe inévitablement sur une erreur de type doublon que je ne sais pas éviter (erase ?). Avec un autre RAD en faisant cette technique cela copiais que les clients elligiblent et ne me remontais pas l'erreur de doublons.

    Ma question :
    Existe-t-il une méthode plus simple ou/et plus rapide que cela ? ou comment integrer uniquement les codes différent d'une table à l'autre.

  2. #2
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Salut;

    Pour le second point; celui des doublons j'avais le même problème et je l'ai résolu par cette façon :

    try
    // traitement ordinaire
    except
    on EDBEngineError do
    begin
    MessageBox(handle, 'Enregistrement en double', 'Violation de clé', 0);
    Table1.Cancel;
    Table1.Edit;
    Continue;
    end;
    end
    Tout l'intérêt est dans les lignes entre begin end. Mais à mon grand étonnement, et je ne sais jusqu'à présent, quel est l'utilité du Edit ? d'ailleurs j'ai essayer sans et ça n'a pas marché.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut just

    Dans ta proposition tu envoi une fenêtre apparement pour avertir l'utilisateur.

    J'aimerais éviter ce message.

    Gérer dans l'exception cela me va bien, mais comment être sur que l'exception est de type Doublon et pas d'un autre problème.
    Comment être sur de continuer le traitement quand il y a un doublon et envoyer un message dans le cas contraire ?

    Si on peut gérer de la sorte, cela règle mon problème. Actuellement j'ai choisi de parcourir ma Table n°1 mémorisé dans un String tous les code (expl : '23,3,45,6,32,54,...) puis je fait une requete sur ma Table n°2 avec Not IN (mon String).

    MErci

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Re;

    Bonne lecture du code, je crois qu'il faut voir avec EDBEngineError il doit proposer une liste des messages, une fois tu l'auras alors le tour est joué, je n'y avais pas cherché car dans mon cas j'ai enregistré les doublons dans un fichier pour être sûr que c'est des doublons et éviter des surprises.

    Si tu arrives à avoir le message d'erreur adéquat fais moi signe, merci.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  5. #5
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Bon j'ai trouvé enfin je pense.

    Moi j'utilise ADO lié à une base Access, donc pour éviter le message sur l'erreur de doublon j'ai cela.
    J'ai testé une autre erreur pour voir et cela fonctionne.

    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
    Try
    // ...
    Except
      on E: Exception do
      Begin
        if E is EOleException then
        begin
          if EOleException(E).ErrorCode <> -2147467259 then // Erreur de doublon
          Begin
            ShowMessage(E.ClassName + ' erreur soulevée : '+#13+#10+
            'Message : '  + E.Message       +#13+#10+
            'Unit : '     + Self.ClassName  +#13+#10+
            'Procedure : '+ 'TFormAutreBase.CopieDeClients'      +#13+#10+
            'Table : '    + '<Néant>' +#13+#10+
            'Requete : '  +  SQL.Text +#13+#10+
            '-----------------------------------------------------------------------'+#13+#10+
            'Impossible d''intégrer un Client.'+#13+#10+
            'Si le problème persiste, avertissez votre revendeur de ce message.');
          end;
        end;
      end;
    end;
    
    // ...
    Voilà donc l'erreur de doublon est égal à -2147467259.

    L'astuce étant : EOleException(E).ErrorCode qui retourne un numéro d'erreur différent par type erreur correspondant à ceux d'Access.

    J'ai résolu mon problème comme cela.

    Merci.

  6. #6
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Re;

    mais qui aurait penser que -2147467259 veut dire doublon ?
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  7. #7
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Just-Soft Voir le message
    Re;

    mais qui aurait penser que -2147467259 veut dire doublon ?
    Tu verrais les autre numéros pour les erreurs c'est pareil...

    De toute façon à chaque fois que ta une erreur OLE tu as ce genre de numéro d'erreur. (enfin avec Access).

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 21/09/2007, 17h29
  2. [patterns] conseil sur le fonctionnement de mon programme
    Par lichman dans le forum Design Patterns
    Réponses: 4
    Dernier message: 13/09/2007, 09h32
  3. [Turbo Pascal] TP7 fonctionne en QWERTY
    Par callahan dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 08/02/2003, 21h49
  4. [web] Cherche un conseil pour un livre perl-tk
    Par Anonymous dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 29/04/2002, 15h35

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