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 :

[Delphi 2] Alter Table


Sujet :

Bases de données Delphi

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 6
    Points : 1
    Points
    1
    Par défaut [Delphi 2] Alter Table
    Bonjour,
    je n'y connais strictement rien à Delphi et mon boss m'a demandé un truc:

    il a une table C_HAUTEUR qui est un float (10,3) et il voudrai la passer en float (10,6)

    en SQL j'aurais fait: ALTER TABLE `BASE` CHANGE `C_HAUTEUR` `C_HAUTEUR` FLOAT( 10, 6 )

    pouvez vous me dire comment faire en Delphi 2 (j'ai bien mis la version 2)

  2. #2
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Points : 17
    Points
    17
    Par défaut
    Bonjour,
    Tu utises quelle base de données :

  3. #3
    Inactif
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 97
    Points : 84
    Points
    84
    Par défaut
    Delphi n'est pas un langage de Bdd (...bien qu'il puisse se connecter à une base...).

    En d'autres termes, il suffit d'envoyer la présente commande SQL, par Delphi, au serveur de Bdd et le tour est joué...

    Vous avez quoi comme SGBD ?

    [Edition1]
    Ah ben tiens, on a posé la même question déjà
    [/Edition1]

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    La base est une Dbase au format dbf

    apparement, le soft ne connais pas la commande MODIFY

  5. #5
    Membre régulier Avatar de fs999
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 99
    Points : 111
    Points
    111
    Par défaut
    Tu peux modifer la structure avec db32 (Database Desktop). car le SQL local (BDE) ne supporte pas MODIFY, seulement ADD eet DROP.

    Sinon il faut utiliser une routine compliquée accédent aux primitives BDE.

    Si tu en a besoin, je peux te le fournir.

    A+
    On ne me la fait pas à moi !

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Mon sauveur

    je suis prenneur pour la routine compliquée permettant d'acceder aux primitives BDE

  7. #7
    Membre régulier Avatar de fs999
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 99
    Points : 111
    Points
    111
    Par défaut
    Alors voici :
    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    uses Bde;
     
    type
      ChangeRec = packed record
        szName: DBINAME;
        iType: Word;
        iSubType: Word;
        iLength: Word;
        iPrecision: Byte;
      end;
     
    procedure ChangeField(Table: TTable; Field: TField; Rec: ChangeRec);
    var
      Props: CURProps;
      hDb: hDBIDb;
      TableDesc: CRTblDesc;
      pFields: pFLDDesc;
      pOp: pCROpType;
      B: Word;
    begin
      // Initialise les pointeurs...
      pFields := nil;
      pOp := nil;
      // Être sûr que la table est ouverte exclusivement, pour récupérer le Handle...
      if not Table.Active then
        raise EDatabaseError.Create('Table must be opened to restructure');
      if not Table.Exclusive then
        raise EDatabaseError.Create('Table must be opened exclusively to restructure');
     
      Check(DbiSetProp(hDBIObj(Table.Handle), curxltMODE, Integer(xltNONE)));
     
      // Reçoit les propriétés pour déterminer le type...
      Check(DbiGetCursorProps(Table.Handle, Props));
     
      // Paradox ou dBASE...
      if (Props.szTableType <> szPARADOX) and (Props.szTableType <> szDBASE) then
        raise EDatabaseError.Create('Field altering can only occur on Paradox or dBASE tables');
     
      pFields := AllocMem(Table.FieldCount * sizeof(FLDDesc));
      pOp := AllocMem(Table.FieldCount * sizeof(CROpType));
     
      try
        // Mettre crMODIFY dans le pointeur d'opération du champ à modifier
        Inc(pOp, Field.Index);
        pOp^ := crMODIFY;
        Dec(pOp, Field.Index);
     
        //  Reçoit les informations du champ...
        Check(DbiGetFieldDescs(Table.Handle, pFields));
     
        // Attribuer les changements dans le champ...
        Inc(pFields, Field.Index);
        // Nom du champ
        if (Length(Rec.szName) > 0) then pFields^.szName := Rec.szName;
        // Type de champ
        if (Rec.iType > 0) then pFields^.iFldType := Rec.iType;
        // Sous-type de champ
        if (Rec.iSubType > 0) then pFields^.iSubType := Rec.iSubType;
        // Longueur du champ
        if (Rec.iLength > 0) then
        begin
          pFields^.iUnits1 := Rec.iLength;
          pFields^.iLen := Rec.iLength;
        end;
        // Precision
        if (Rec.iPrecision > 0) then pFields^.iUnits2 := Rec.iPrecision;
     
        Dec(pFields, Field.Index);
     
        // Mettre à jour les numéros des champs
        for B := 1 to Table.FieldCount do
        begin
          pFields^.iFldNum := B;
          Inc(pFields, 1);
        end;
        Dec(pFields, Table.FieldCount);
     
        // Description de la table...
        FillChar(TableDesc, sizeof(TableDesc), #0);
        // Trouver le Handle de la database à partir du cursor de la table...
        Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb)));
     
        // Assigner le nom de la table...
        StrPCopy(TableDesc.szTblName, Table.TableName);
        // Assigner le type de la table...
        StrPCopy(TableDesc.szTblType, Props.szTableType);
        // Nombre de champs dans la table
        TableDesc.iFldCount := Table.FieldCount;
        // Opération à faire...
        TableDesc.pecrFldOp := pOp;
        // Définition des champs...
        TableDesc.pFldDesc := pFields;
        // Fermer la table...
        hDb := Table.Database.Handle;
        Table.Database.KeepConnection := True;
        Table.Close;
        // Restructurer la table...
        Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, False));
      finally
        if (pFields <> nil) then FreeMem(pFields);
        if (pOp <> nil) then FreeMem(pOp);
        Table.Open;
        Table.Database.KeepConnection := False;
      end;
    end;
    Pour l'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var
      MyChangeRec: ChangeRec;
    begin
      Fillchar(MyChangeRec, sizeof(MyChangeRec), 0);
      StrPCopy(MyChangeRec.szName, 'C_HAUTEUR');
      // Change le nombre de décimale à 6
      MyChangeRec.iPrecision := 6;
      ChangeField(Table1, Table1.FieldByName('C_HAUTEUR'), MyChangeRec);
    end;
    Voila c'est tout.
    On ne me la fait pas à moi !

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Re
    Pas de problème à l'exécution, la fonction s'est bien implentée, par contre lorsque je lance la procédure, ca me dit :

    Champ C_HAUTEUR non trouvé alors qu'il existe bien dans ma table, c'est sur et j'ai revérifié trois fois si j'été bien dans la bonne table



    Est-ce que ca arrive dans certain cas.

    [/code]

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Si tu veux je peux t'envoyer un petit projet avec la table.

  10. #10
    Membre régulier Avatar de fs999
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 99
    Points : 111
    Points
    111
    Par défaut
    Ach, j'ai oublié de te dire d'ouvrir la table en esclusif avant d'appeler la procédure.

    Excuse
    On ne me la fait pas à moi !

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Pareil, table1.exclusive = true
    Champ C_HAUTEUR non trouvé
    C'est bizarre, je pense kil manque pas grand chose
    J'ai fait un petit projet à part avec 1 form, 1 bouton, 1 table, puis je te l'envoyer pour constater

  12. #12
    Membre régulier Avatar de fs999
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 99
    Points : 111
    Points
    111
    Par défaut
    Je t'ai envoyé un MP...
    On ne me la fait pas à moi !

Discussions similaires

  1. Enregistrement trop long dans ACCESS (ALTER TABLE)
    Par Arrown dans le forum Bases de données
    Réponses: 2
    Dernier message: 29/07/2004, 20h20
  2. Renommer une colonne avec ALTER TABLE...
    Par David.V dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/07/2004, 10h33
  3. [débutant] conseils sur contraintes et alter table
    Par maysa dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 26/05/2004, 09h03
  4. Probleme 'ALTER TABLE' et 'FOREIGN KEY'
    Par maahta dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 30/09/2003, 14h25
  5. Alter table qui ne passe...
    Par Gential dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 04/06/2003, 17h48

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