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

C++Builder Discussion :

ADO et valeur par default dans access [Base de donnée]


Sujet :

C++Builder

Vue hybride

chpog ADO et valeur par default... 15/11/2011, 15h46
ShaiLeTroll Tu devrais regarder ce que... 16/11/2011, 10h36
chpog Merci beaucoup pour ces infos... 16/11/2011, 17h06
blondelle Si tu utilise les composants... 16/11/2011, 20h15
chpog Tout bêtement parce que les ... 17/11/2011, 08h43
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 63
    Par défaut ADO et valeur par default dans access
    Bonjour,

    Alors je crée une table access via des requêtes SQL et des TADOCOmmand.
    Seulement je voudrais aussi quand je crée mes champs leur affecter une valeur par défaut.
    J'ai vu que Access n'acceptait pas le mot clef default dans les requête SQL.
    Je cherche donc un moyen de le faire via ADO mais je ne trouve pas.
    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 071
    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 071
    Par défaut
    Tu devrais regarder ce que propose ADOX.Catalog, Tables, Fields ou Columns pour arriver enfin à Property.Value

    le tout en OLEVariant, c'est pénible à écrire avec OlePropertyGet et OlePropertySet

    ça doit ressembler à
    [code purement théorique]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      Variant ADOXCatalog = Variant::CreateObject("ADOX.Catalog");
      ADOXCatalog.OlePropertySet("ActiveConnection", ADOConnection); // un TADOConnection
     
      Variant TablesCollection  = ADOXCatalog.OlePropertyGet("Tables");
      Variant TableItem         = TablesCollection.OlePropertyGet("Item",TableName.c_str()); // TableName est un String
      Variant ColumnsCollection = TableItem.OlePropertyGet("Columns");
      Variant ColumnItem        = ColumnsCollection.OlePropertyGet("Item",Field.Name.c_str()); // Field est un TField
      Variant Properties        = ColumnItem.OlePropertyGet("Properties");
      Variant PropertyItem      = Properties.OlePropertyGet("Item", "Value");
      ShowMessage(PropertyItem); // si le Variant l'autorise, cela converti la valeur en chaine et l'affiche
      Properties.OlePropertySet("Item", NewValue); // NewValue un variant contenant la nouvelle valeur
    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 confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 63
    Par défaut
    Merci beaucoup pour ces infos et oui effectivement j'ai chois de passer par ADOX. En fait j'ai importé le "package ADOX" et donc C++ Xe m'a génére des classe de wrappers pour pouvoir utilisé ADOX.
    Seulement j'ai un souci le code fonctionne seulement à la fin quand je regarde dans ma base sous access les tables que j'ai voulu ajouter n'existe pas!!
    Du code simplifié ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #define PROVIDER_SOURCE "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
    UnicodeString Provider  = PROVIDER_SOURCE + Filename; 
    Olevariant Prov = Provider;
      TADOXCatalog *Catalog = new TADOXCatalog(NULL);
      Catalog->set_ActiveConnection(Prov);
      Catalog->Connect();
     
      Catalog->Tables->Append((OleVariant)"TOTO");
      Catalog->InitServerData();
      Catalog->Disconnect();
    Je ne comprends pas pourquoi il doit me manquer quelque chose genre un Catalog->Save mais cette fonction n'existe pas !!!

  4. #4
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Si tu utilise les composants ADO pour quoi ne pas faire comme ceci
    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
     
    vADO.OleFunction("create", provider.c_str());
    // on connecte avec ADOConnection
            Form1->ADOConnection1->ConnectionString = provider;
            Form1->ADOConnection1->LoginPrompt = false;
            Form1->ADOCommand1->Connection = Form1->ADOConnection1;
    // on cree une Table vide au nom de DossierSociete
            Form1->ADOCommand1->CommandText = "CREATE TABLE DossierSociete";
            Form1->ADOCommand1->Execute();
    // on cree le champ ID_Ste defini comme compteur
            Form1->ADOCommand1->CommandText = "ALTER TABLE DossierSociete ADD ID_Ste COUNTER";
            Form1->ADOCommand1->Execute();
    // on defini le champ compteur ID_Ste en clef primaire
            Form1->ADOCommand1->CommandText = "CREATE UNIQUE INDEX idxPrimary ON DossierSociete (ID_Ste) WITH PRIMARY";
            Form1->ADOCommand1->Execute();
    AnsiString ChampSte;
    // on defini un champ texte TEXT(NB caracteres)
            ChampSte = "ALTER TABLE DossierSociete ADD NomRaison TEXT(50),";
            Form1->ADOCommand1->CommandText = ChampSte;
            Form1->ADOCommand1->Execute();
    // on defini un champ int
            ChampSte = "ALTER TABLE DossierSociete ADD NoClass INTEGER,";
            Form1->ADOCommand1->CommandText = ChampSte;
            Form1->ADOCommand1->Execute();
    // on defini un champ bool
            ChampSte = "ALTER TABLE DossierSociete ADD Instance YESNO,";
            Form1->ADOCommand1->CommandText = ChampSte;
            Form1->ADOCommand1->Execute();

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 63
    Par défaut
    Tout bêtement parce que les composants ADO ne permettent d’accéder aux propriétés des tables comme la valeur par défaut par ex.
    Et Access n'accepte pas le mot clef DEFAULT en SQL. Donc si je veux définir une valeur par défaut je n'ai pas le choix je dois passer par ADOX.
    Sinon pour enregistrer la table dans mon catalogue ADOX j'ai aussi essayé le code qui suit mais cela n'as pas l'air de marcher beaucoup mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      OleVariant TableOle = (IDispatch*) TableToAdd->GetDefaultInterface();
      Catalog->Tables->Append(TableOle);
      Catalog->Disconnect();
    Mais ça ne marche pas non plus aucune table n'est ajouté à la base qui pourtant est bien crée.

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 071
    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 071
    Par défaut
    as-tu essayé ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      TADOXCatalog *Catalog = new TADOXCatalog(NULL);
      Catalog->ActiveConnection = ADOConnection1; // un TADOConnection
     
    Catalog->Tables->Item[TableName]->Columns ...
    Car la propriété ActiveConnection accete un objet Connection et non une chaine !

    Pour l'import de ADOX, as-tu suivi cette méthode de http://delphi.about.com

    To use ADOX in Delphi, you should establish a reference to the ADOX type library.
    1. Select Project | Import Type Library
    2. Choose "Microsoft ADO Ext 2.x for DDL and Security (Version 2.x)"
    3a. Change "TTable" to "TADOXTable"
    3b. Change "TColumn" to "TADOXColumn"
    3c. Change "TIndex" to "TADOXIndex"
    3d. Change "TKey" to "TADOXKey"
    3e. Change "TGroup" to "TADOXGroup"
    3f. Change "TUser" to "TADOXUser"
    3g. Change "TCatalog" to "TADOXCatalog"
    4. Press Install button (rebuilding packages)
    5. Press OK once and Yes twice
    6. File | Close All | Yes
    Sinon Append réclame comme paramètre une interface Table, il faut utiliser un TADOXTable et l'instancier avec Create et non un simple OleVariant casté !
    Tu dois en théorie pouvoir écrire


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      TADOXTable TableOle = new TADOXTable();
      TableOle->Columns->Append( "Column1", adInteger);
      Catalog->Tables->Append(TableOle);
      Catalog->Disconnect();
    voir le neccessité d'un delete TableOle ou l'utilisation de DelphiInterface
    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. [CakePHP] [CakePHP] Valeur par default dans un champ d'un formulaire
    Par rooma dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 20/10/2009, 21h46
  2. Recuperer une "valeur par default" dans une table
    Par Conico113 dans le forum IHM
    Réponses: 7
    Dernier message: 05/03/2008, 14h13
  3. valeur par défaut dans ACCESS
    Par RogerCls dans le forum Access
    Réponses: 4
    Dernier message: 19/09/2007, 15h05
  4. Valeur par default dans ma JComboBox
    Par iutcien dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 13/04/2006, 16h19
  5. Valeur par default dans un input file ?
    Par alainme dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 11/02/2005, 14h31

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