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 :

Problème avec gestion MSACCESS


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Par défaut Problème avec gestion MSACCESS
    Bonjour,

    J'ai besoin d'effectuer des enregistrements dans une boucle "for k:=0 to count-1 do".
    Je prend la précaution dans la procédure d'enregistrement de bien vérifier que l'ID de l'enregistrement (clé primaire) est incrémenté tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      ADOTable.Close;
      ADOTable.ConnectionString:= Format(_ConnString,[_UserName,_PassWord,MDBFile]);
      ADOTable.TableName:= 'MATABLE';
      ADOTable.Open;
      ADOTable.ReadOnly;
      ADOTable.Last;
      if ADOTable.FieldByName('SEGNOMINAL_NO').AsInteger=RecNo then inc(RecNo);
      ADOTable.Edit; //set to edit mode for insertion of data  //begin insert
      ADOTable.Insert;  //set values
    Recno est un paramètre initialisé avant l'appel de l'enregistrement par la fonction RecNo:= succ(CountFromTable( MATABLE))
    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
    function CountFromTable( const TableName: string ): Integer;
    var
      N: Integer;
    begin
      { Set up the connection string. }
      ADOConnection1.Close;
      qry.Close;
      ADOConnection1.ConnectionString := Format(_ConnString,[_UserName,_PassWord,MDBFile]);
      ADOConnection1.LoginPrompt := False;
      try
        ADOConnection1.Connected := True;
      except
        on e: EADOError do
        begin
          MessageDlg('Error while connecting', mtError,[mbOK], 0);
          Exit;
        end;
      end;
      qry.Connection := ADOConnection1;
      qry.SQL.Clear;
      qry.SQL.Add('SELECT * FROM '+TableName);
      qry.Prepared := true;
      try
        qry.Active := True;
      except
        on e: EADOError do
        begin
          MessageDlg('Error while doing query', mtError,[mbOK], 0);
          Exit;
        end;
      end;
      N:=0;
      with qry do
      begin
        First;
        while not EOF do
        begin
          inc(N);
          next;
        end;
      end;
      if N>0 then result:= N else result:=0;
     end;
    De fait Access semble plus lent que Delphi car la boucle s'interrompt avec le message "risque de doublon"

    Quelqu'un peut-il m'aider ?

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 093
    Par défaut
    A quoi sert cette ligne !
    ReadOnly est une propriété, tel que tu l'utilise tu en récupère la valeur mais sans la stocker ! Inutile !

    Pourquoi Edit ET Insert ? c'est soit l'un soit l'autre ! PAS LES DEUX !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if N>0 then result:= N else result:=0;
    N est initialisé à 0
    Ensuite il est incrémenté !
    C'est donc inutile, ceci suffit !
    Pire, tu as de Exit avec des Result pouvant avoir une valeur aléatoire !


    Pourquoi une Boucle pour CountFromTable ?
    Le SQL propose des fonctions optimisées pour cela !
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(*) FROM TABLE
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(NOM DE COLONNE) FROM TABLE

    RecNo ?
    Evite d'appeler une variable RecNo pour stocker ta clé Primaire, PrimaryID serait plus judicieux !
    RecNo est une propriété du TADOTable, sa valeur est trop volatile !
    Tu risques de les confondre un jour !
    Le résultat sera désastreux !

    Il faut utiliser le champ clé primaire, si possible un AUTO-INC !
    SEGNOMINAL_NO semble être cela !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Par défaut Ok ShaiLeTroll
    Bonjour,

    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      qry.Close;
      qry.Connection := ADOConnection1;
      qry.SQL.Clear;
      qry.SQL.Text:= 'SELECT COUNT(*) FROM '+TableName;
      qry.ExecSQL;
    Comment récupérer le résultat ?

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 093
    Par défaut
    Depuis le temps, tu devrais le savoir ou l'avoir lu !

    Tout SELECT s'utilise avec Open()
    Les autres SQL comme INSERT\UPDATE\DELETE...GRANT\CREATE\DROP... avec ExecSQL()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      qry.Close;
      qry.Connection := ADOConnection1;
      // qry.SQL.Text:= 'SELECT COUNT(*) FROM '+TableName;
      qry.SQL.Text:= 'SELECT COUNT(*) as CountValue FROM '+TableName;
      qry.Open();
      // Nombre := qry.FieldByName('COUNT(*)').AsInteger;
      Nombre := qry.FieldByName('CountValue').AsInteger;
      ...
    Je ne connais pas ACCESS, certaines DB fourni COUNT(*) comme nom du champ automatiquement, je préfère la valeur avec un Alias, plus prudente

    COUNT pour ce type de calcul n'est pas fiable, cela ne gère pas les suppressions, tu avoir inserer 1 à 10, effacer 5 à 8, il ne reste donc que 1,2,3,4,9 et 10 donc 6, l'indice suivant sera 7, cela passe car il a été supprimé, mais ensuite, c'est 8 puis 9, collision !
    MAX est plus lent mais aura une valeur plus fiable !

    Tout dépend si Suppression possible ou pas !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Par défaut Merci ShaiLeTroll
    Comme tu peux en juger les bases de données ne sont pas mon truc ! et surtout pas Acces vraiement peinible avec ses contrôles intempestifs !

    Le problème c'est que je suis obligé de gérer les données pour l'appli de traitement d'image que je développe... Le traitement d'image c'est plus mon truc.

    A propos, j'ai prévu des suppressions virtuelles, celà me parait plus simple avec ACCESS, dans tous les enregistrements j'ai placé un champ booléen qui est mis à false à la place de la suppréssion physique, et que je vérifie dans tous les appels pour prendre en compte la ligne de la table si ce champ est à true.

    Si tu y vois un inconvenient signale le moi.


    Merci et bonne journée

    Je coche résolu

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 093
    Par défaut
    Idem, la DB, c'est utile mais pénible !
    ACCESS c'est quand même une vrai merde !
    Une bonne DB embarqué comme MySQL avec un SQL puissant, c'est tout de même mieux !
    Pour les contrôles, et encore tu ne connais pas les Trigger, les Constraints et le bazard des vrais SGBD comme MySQL5, Oracle, SQL Server ...

    Pour la suppression par Flag, grand classique, dans certains logiciels c'est même obligatoire, à cause des loi, on peut supprimer un élément, souvent il passe en mode Archive, il n'est plus actif mais toujours là au besoin !
    Cela peut être poussé à l'extrème pour faire du versionning !

    Si ton volume de données n'augmente pas trop, ça tiendra !
    mais ACCESS cela reste ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

Discussions similaires

  1. [PHP 5.3] Problème avec gestion de session
    Par diblasio dans le forum Langage
    Réponses: 1
    Dernier message: 25/04/2011, 20h25
  2. [Upload] Problème pour gestion d'erreur avec class
    Par allserv dans le forum Langage
    Réponses: 2
    Dernier message: 27/12/2005, 13h00
  3. Problème de gestion de chaînes avec pointeur
    Par LorDjidane dans le forum C
    Réponses: 18
    Dernier message: 19/10/2005, 15h40
  4. Problème avec la gestion des événements
    Par CynO dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/10/2005, 10h07
  5. [TFrame] Problème de gestion du OnMouseDown avec une Frame
    Par xherault dans le forum Composants VCL
    Réponses: 5
    Dernier message: 23/05/2003, 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