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 :

Comment Copier une table Access dans une autre Base Access Avec OleAdo


Sujet :

C++Builder

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut Comment Copier une table Access dans une autre Base Access Avec OleAdo
    L'objectif étant par exemple de pouvoir archiver certaine tables dans une base archive (ces tables étant supposée à structure dynamique donc non connue à l'avance...)

    Pour ma problématique j'ai fait un bout de code qui marche mais long et pas très satisfaisant avec une requête, d'ou ma question...:

    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
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
     
    ...//Création de la nouvelle table avec les champs nécessaires
     
    StarDataModule->LocalQuery->SQL->Clear(); // efface existant
    StarDataModule->LocalQuery->SQL->Add("CREATE TABLE " + TableName + " (");
     
    Memo = "CREATE TABLE " + TableName + " (";
     
    StarDataModule->OutilStoredProc->GetFieldNames(ListeChamps); //Remplit avec liste de Champs
    for(int i = 0; i < ListeChamps->Count ; i++)
    	{
    	DefChamps = StarDataModule->OutilStoredProc->FieldDefList->FieldDefs[i]->DataType;
    	LongChamps = StarDataModule->OutilStoredProc->FieldDefList->FieldDefs[i]->Size;
    	CompoChamps = ListeChamps->Strings[i];
    	switch (DefChamps) {
    		case ftString:
    		case ftFixedChar:
    		case ftWideString:
    			CompoChamps += " CHAR("+ IntToStr(LongChamps) + ")";
    			break;
     
    		case ftSmallint:
    		case ftWord:
    			CompoChamps += " SMALLINT";
    			break;
     
    		case ftBoolean:
    			CompoChamps += " LOGICAL";
    			break;
     
    		case ftCurrency:
    			CompoChamps += " CURRENCY";
    			break;
     
     
    		case ftInteger:
    			CompoChamps += " INTEGER";
    			break;
     
    		case ftFloat:
    			CompoChamps += " FLOAT";
    			break;
     
    		case ftBCD:
    		case ftFMTBcd:
    			//CompoChamps += " NUMERIC";  // Normalement c'est Numéric mais dans ce cas n'affiche pas les décimales
    			CompoChamps += " CURRENCY";
    			break;
     
    		case ftDate:
    			CompoChamps += " DATE";
    			break;
     
    		case ftTime:
    			CompoChamps += " TIME";
    			break;
     
    		case ftDateTime:
    		case ftTimeStamp:
    			CompoChamps += " DATETIME";
    			break;
     
    		case ftBytes:
    			CompoChamps += " BYTE";
    			break;
     
    		case ftMemo:
    		case ftFmtMemo:
    			CompoChamps += " MEMO";
    			break;
     
    		case ftGraphic:
    			CompoChamps += " IMAGE";
    			break;
     
    		case ftTypedBinary:
    			CompoChamps += " BINARY";
    			break;
     
    		case ftLargeint:
    			CompoChamps += " DOUBLE";
    			break;
     
    		default:
    			CompoChamps += " DOUBLE";
    			break;
     
    		}
     
    	if(i != ListeChamps->Count -1)
    		{
    		CompoChamps += ",";                    // entre les champs
    		StarDataModule->LocalQuery->SQL->Add(CompoChamps);
    		}
    	else
    		{
    		CompoChamps += ")";                  // en fin de création
    		StarDataModule->LocalQuery->SQL->Add(CompoChamps);
    		}
    	Memo +=  CompoChamps;      // nes sert qu'en débug pour voir et copier dans requête Access et tester en cas de PB
    	}
     
    StarDataModule->LocalQuery->ExecSQL(); // Création de la table
     
    // Recopie les enregistrtements dans la table Tampon afin de lancer ensuite la seconde procédure
     
    StarDataModule->LocalQuery->SQL->Clear(); // efface existant
    StarDataModule->LocalQuery->SQL->Add("SELECT * FROM " + TableName);  //Sélectionne la table destination
    StarDataModule->LocalQuery->Active = true; // Active le dataset
     
    StarDataModule->OutilStoredProc->First();
    											// Recopie tous les records
    for(int i = 0; i < StarDataModule->OutilStoredProc->RecordCount ; i++)
    	{
    	StarDataModule->LocalQuery->Append();
    	for(int u = 0; u < StarDataModule->OutilStoredProc->FieldCount; u++)  // tous les champs
    		{
    		StarDataModule->LocalQuery->Fields->Fields[u]->Value = StarDataModule->OutilStoredProc->Fields->Fields[u]->Value;
    		}
    	StarDataModule->LocalQuery->Post();
    	StarDataModule->OutilStoredProc->Next();
    	}
     
    StarDataModule->LocalQuery->Requery();     // permet de bien forcer la mise à jour des enregistrements!!! sinon pas à jour pour la suite
    StarDataModule->LocalQuery->Active = false;
    delete ListeChamps;
     
    }

  2. #2
    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
    Points : 3 766
    Points
    3 766
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    Merci Blondel, mais rien de bien neuf sur le sujet puisque dans les cas traités soit la structure de la table destination était connue et existante soit c'était une copie dans la même base.

    Seule la commande BDE CopyTable pourrait le faire, mais en ODBC, dommage.

    Je vais voir si je trouve QQ chose dans les Tutos Ado.
    Merci

  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
    Points : 3 766
    Points
    3 766
    Par défaut
    Tout d'abord excuse moi d'avoir tarde a poster mais une coupure d'electricite a la fermeture de Window ma fait perdre l'integralite de mon disque dur.
    J'ai vu que tu utilise SQL, et dans ma doc j'ai trouve que l'on pouvait sur une requette faire une copie d'une table dans une autre, voir meme que certaines colonnes.
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    Citation Envoyé par blondelle
    Tout d'abord excuse moi d'avoir tarde a poster mais une coupure d'electricite a la fermeture de Window ma fait perdre l'integralite de mon disque dur.
    J'ai vu que tu utilise SQL, et dans ma doc j'ai trouve que l'on pouvait sur une requette faire une copie d'une table dans une autre, voir meme que certaines colonnes.
    Merci Blondel, ça je savais déja , le PB c'est que cette table destination (a créer avec les données) est dans une autre base de donnée.

    Hors à ma connaissance les Query ou Dataset sont affectés à une AdoConnexion (pour faire la requête) donc pas d'accès à l'autre base de destination, d'ou ma question.

  7. #7
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut Fbartolo:
    J'ai vu sous Access que l'on pouvait ajouter une Table dans une base existante ca doit donc etre possible avec ADO ou SQL je pense
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  8. #8
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    Citation Envoyé par blondelle
    Salut Fbartolo:
    J'ai vu sous Access que l'on pouvait ajouter une Table dans une base existante ca doit donc etre possible avec ADO ou SQL je pense
    C'est ce que j'ai fait dans mon exemple qui fonctionne mais je cherche QQ chose de mieux.

    Je pense que cette piste est bonne:
    http://www.devhood.com/tutorials/tut...utorial_id=697

  9. #9
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    Alors pour cela tu a l'instruction SQL CREATE TABLE
    CREATE TABLE NOM_NOUVELLE_TABLE AS
    SELECT [*|COLONNE1? COLONNE2]
    FROM NOM_TABLE
    [WHERE]
    Un lien sur le site
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  10. #10
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    Sur ce coup on ne se comprend pas , tout cela fonctionne si tu es dans la même base de données *.mdb.

    Dans mon cas je souhaite copier cette table de DataBase1.mdb vers DataBase2.mdb.

    Comme un Query n'as pas la visibilité de deux bases *.mdb simultanément

    Je dois d'abord Créer la table dans DataBase2 (que je fais en composant une requête) et ensuite j'y place les données champs par champs.

    Je pensais (dans mes espérences les plus folles) que quelque chose du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AdoDataConnexion1->Table1->Copy(AdoDataConnexion2);
    existait...

  11. #11
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    J'ai peu etre une solution en utilisant OleAccess et en executant des macro VBAccess dans la base source et la base destination en passant par Excel si la solution t'interresse dit le je suis en cour de teste par code, en manuel ca marche.
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  12. #12
    Membre confirmé

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    531
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 531
    Points : 537
    Points
    537
    Par défaut
    Merci Blondel, mais pour mon cas je garde mon code qui malgré tout fonctionne bien.

    L'ordinateur cible ne possède ni Access, ni Excel, ni autre logiciel en dehors de Windows.

    et en général moins il y a d'interfaces mieux cela fonctionne.

    J'en reste là et je ne met pas ce post en résolu car peut être que quelqu'un un jour aura une solution. plus simple

Discussions similaires

  1. Ajouter des observations d'une table SAS dans une table ACCESS
    Par michail_arkov dans le forum Outils BI
    Réponses: 4
    Dernier message: 12/11/2013, 16h25
  2. Réponses: 2
    Dernier message: 16/01/2010, 16h24
  3. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  4. Réponses: 1
    Dernier message: 11/06/2008, 13h33

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