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 :

Compactage de tables Paradox avec auto-incrément


Sujet :

Bases de données Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2002
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Compactage de tables Paradox avec auto-incrément
    Bonjour,

    J'ai un problème suite aux compactages de tables Paradox (v.7)
    UNIQUEMENT avec les tables employant un auto-incrément...

    Le compactage s'effectue bien, que ce soit avec ou sans réindexation, mais lorsque plus tard, je tente d'ajouter un nouvel enregistrement,
    c'est comme si l'auto-incrément ne fonctionnait plus, et j'obtiens un "duplicate key" sur la méthode Append de la table concernée...

    Peut-être est-ce un des champs de TblDesc à remplir d'une certaine manière ??? Si quelqu'un a un éclaircissement ou une piste, je suis preneur. Merci d'avance.

    Voici le code utilisé :
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    function PackTable(aNomDeLaTable : String; aReindexer : Boolean) : Boolean;
    var
       Tbl     : TTable;
       cProps  : CURProps;
       hDb     : hDBIDb;
       TblDesc : CRTblDesc;
    begin
         Result := False;
         Tbl := TTable.Create(nil);
         try
            with Tbl do
            begin
                 Active := False;
                 // Le chemin d'accès de la table
                 DatabaseName := ExtractFilePath(aNomDeLaTable);
                 // Le nom de la table paradox
                 TableName := ExtractFileName(aNomDeLaTable);
                 // Ouverture en mode exclusif
                 Exclusive := True;
                 Open;
            end;
            // Le chemin courant est utilisé de façon temporaire pour le pack
            SetCurrentDir(ExtractFilePath(aNomDeLaTable));
            // Il faut être sûr que la table soit ouverte (et de manière exclusive)
            if not tbl.Active then
            begin
                 // La fonction renverra false
                 // raise EDatabaseError.Create('La table doit être ouverte pour la compacter');
                 Exit;
            end;
            if not tbl.Exclusive then
            begin
                 // La fonction renverra false
                 // raise EDatabaseError.Create('La table doit être ouverte de manière exclusive pour la compacter');
                 Exit;
            end;
            // Recherche les propriétés de la table pour déterminer son type
            // Check(DbiGetCursorProps(tbl.Handle, cProps));
            if DbiGetCursorProps(tbl.Handle, cProps) <> DBIERR_NONE then
            begin
                 // La fonction renverra false
                 Exit;
            end;
            // Si la table est une table Paradox, on la compacte
            if (cProps.szTableType = szPARADOX) then
            begin
                 // Préparation d'une structure vide...
                 FillChar(TblDesc, SizeOf(TblDesc), 0);
                 // Obtient le handle de la table
                 // Check(DbiGetObjFromObj(hDBIObj(tbl.Handle), objDATABASE, hDBIObj(hDb)));
                 if (DbiGetObjFromObj(hDBIObj(tbl.Handle), objDATABASE, hDBIObj(hDb)) <> DBIERR_NONE) then
                 begin
                      // La fonction renverra false
                      Exit;
                 end;
                 // On remplit le nom de la table dans la description de table...
                 StrPCopy(TblDesc.szTblName, tbl.TableName);
                 // On remplit le type de la table dans la description de table...
                 StrPCopy(TblDesc.szTblType, cProps.szTableType);
                 // Coche l'option de compactage dans la description de table...
                 TblDesc.bPack := True;
                 // Ferme la table pour que la restructuration soit effective...
                 Tbl.Close;
                 // Appel de DbiDoRestructure qui effectue le compactage demandé...
                 // Check(DbiDoRestructure(hDb, 1, @TblDesc, nil, nil, nil, aReindexer));
                 Result := (DbiDoRestructure(hDb, 1, @TblDesc, nil, nil, nil, aReindexer) = DBIERR_NONE);
            end
            else
                // Compactage de table Paradox uniquement
                Result := False; // raise EDatabaseError.Create('Compactage de table paradox uniquement !');
     
         finally
                if Tbl.Active then
                   Tbl.Close;
                Tbl.Free;
         end;
    end;

  2. #2
    Membre habitué
    Inscrit en
    Mai 2002
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 275
    Points : 185
    Points
    185
    Par défaut
    Salut Unusual_FL,

    Je viens de faire un test avec la méthode Pack d'InfoPower sur un champ auto-incrémenté.
    L'ajout ne pose pas de problème après le compactage.
    Je vais regardé leur code pour voir la différence avec le tiens.

    A+
    Cyril

  3. #3
    Membre habitué
    Inscrit en
    Mai 2002
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 275
    Points : 185
    Points
    185
    Par défaut
    Re,

    Je viens de tester ton code dans les mêmes conditions.
    Il fonctionne très bien.

Discussions similaires

  1. [AC-2007] Requête avec auto incrémentation
    Par benoit85 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 31/05/2009, 11h13
  2. Problème Accès table Paradox avec composant ADO
    Par QAYS dans le forum Bases de données
    Réponses: 0
    Dernier message: 24/09/2008, 12h38
  3. creation d'une table paradox avec talend
    Par amouna83 dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 26/08/2008, 09h34
  4. [TQuery] Créer une table Paradox avec mots de passe
    Par bsdocuments dans le forum Bases de données
    Réponses: 4
    Dernier message: 06/03/2007, 15h46
  5. mise a jour d'une table paradox avec une autre table sous delphi
    Par bobo2005 dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/01/2007, 21h07

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