plutonblanc
Messages postés5Date d'inscriptiondimanche 14 avril 2013StatutMembreDernière intervention 1 août 2012
-
26 juil. 2012 à 14:19
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 2014
-
1 août 2012 à 12:14
Bonjour,
Il y a pas mal d'années, j'ai créé une base de données (Delphi BDE - Paradox) avec plusieurs tables et des centaines de champs. Je voudrais aujourd'hui migrer cette base vers Acces (avec ADO). Quel le meilleur moyen de récupérer la structure de ma table ? Est-il possible d'utiliser l'instruction LIKE dans une requête ? merci de ton aide
// Informer la taille des champs pour les Integers/floats (impossible de svoir via le TDataset):
try
TabProp := TFrmBDEDataset(FrmPrin.ActiveMDIChild).TbFile;
pFlds := AllocMem((TabProp.FieldCount + 1) * sizeof(FLDDesc));
FillChar(pFlds^, (TabProp.FieldCount + 1) * sizeof(FLDDesc), 0);
Check(DbiGetFieldDescs(TabProp.handle, pFlds));
for f := 0 to TabProp.FieldCount-1 do
begin
FieldIndex := cyDbxImportDataset1.Fields.FindFieldIndex(TabProp.Fields[f].FieldName);
if pFlds^.iFldType in [1, 5, 7] then
cyDbxImportDataset1.Fields[FieldIndex].FieldType.Size := pFlds^.iUnits1;
if pFlds^.iFldType = 7 then // Floats
begin
cyDbxImportDataset1.Fields[FieldIndex].FieldType.Precision := pFlds^.iUnits2;
// Convertir Float fields sans décimaux vers un Integer:
if cyDbxImportDataset1.Fields[FieldIndex].FieldType.Precision = 0 then
cyDbxImportDataset1.Fields[FieldIndex].FieldType.DataType := ftInteger;
end;
end;
finally
pFlds := Nil;
FreeMem(pFlds);
end;
// Creer la table :
cyDbxImportDataset1.CreateTable;
// Exporter enregistrements :
if CBExportRecords.Checked then
begin
Screen.Cursor := crHourGlass;
cyDbxImportDataset1.Dataset.DisableControls;
cyDbxImportDataset1.ImportRecords;
cyDbxImportDataset1.Dataset.EnableControls;
Screen.Cursor := crDefault;
end;
cs_cantador
Messages postés4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 27 juil. 2012 à 12:58
Bonjour,
Oui, c'est possible mais il te faut un outil
comme EMSImportFor, sinon gare aux soucis (pertes d'informations..)
et il te faudra établir une connexion ODBC.
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 27 juil. 2012 à 13:26
Salut,
je suis en train de créer mon propre compo qui permettra d' exporter n' importe quel TDataset (table DBase, Paradox etc .. ou informer les propriétés Fields directement) vers une table SQL (on pourra aussi récupérer le code SQL généré). Il inclus la fonctionnalité d' exportation des données.
Ce compo fera partie de la prochaine version de mes compos Cindy sachant que le code SQL pourrait varier légèrement entre MySQL et Access car le code SQL généré est pour une base de données MySQL.
plutonblanc
Messages postés5Date d'inscriptiondimanche 14 avril 2013StatutMembreDernière intervention 1 août 2012 27 juil. 2012 à 14:38
Merci à Cantador et Mauricio.
Cantador : je vais me renseigner pour EMSImportFor...
Mauricio : pour "cette belle chose", vivement que "bientôt" arrive !
Une précision : ce que je veux récupérer prioritairement, c'est les caractéristiques de chaque champ (nom, type, dimension). Pour le reste en effet, je saurai récupérer les données.
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 31 juil. 2012 à 11:25
Salut Cantador,
le compo se charge d' "exporter" les champs de type Memo vers le type MEDIUMTEXT.
Les champs de type Blob (image) sont exportés comme MEDIUMBLOB.
Note que l' on peut modifier le type détecté avant l' exportation en navigant la propriété TcyDBXImportDataset.Fields[].DataType.
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 31 juil. 2012 à 11:45
Tout à fait,
tu peux consulter/modifier les champs qui vont être exportés.
Tu peux aussi voir le code SQL qui va être généré en appelant GetCreateTableSQL; au lieu de créer la table.
plutonblanc
Messages postés5Date d'inscriptiondimanche 14 avril 2013StatutMembreDernière intervention 1 août 2012 31 juil. 2012 à 12:04
Bonjour Mauricio
Tu avais dit "début de semaine"... C'est ce qu'on appelle de la fiabilité.
Si ce n'est pas abuser de ta disponibilité, pourrais-tu me donner des précisions sur les formes que je dois créer (comme
"FrmBDEDataset"), sur les composants à installer (comme "EditExportToDbxTableName" - un composant tedit - ou "CBExportRecords" -?-) et sur les variable à déclarer (de quels types sont "TabProp ", "pFlds "... ?).
Si tu n'as pas le temps et je le comprendrai, j'attendrai le demo...
Je te remercie sincèrement
cs_MAURICIO
Messages postés2106Date d'inscriptionmardi 10 décembre 2002StatutModérateurDernière intervention15 décembre 20145 31 juil. 2012 à 12:09
C' est de ma faute, en voulant limiter le code, j' en ai oublié les variables :
f, FieldIndex: Integer;
pFlds: pFLDDesc; // Mettre BDE dans les uses!
TabProp: TTable;
EditExportToDbxTableName est un Tedit qui permet à l' utilisateur de saisir le nom de la table à créer.
CBExportRecords est un CheckBox qui permet de savoir si l' utilisateur veut aussi exporter les enregistrements
plutonblanc
Messages postés5Date d'inscriptiondimanche 14 avril 2013StatutMembreDernière intervention 1 août 2012 31 juil. 2012 à 13:27
Une ligne de code me pose encore problème.
"TabProp := TFrmBDEDataset(FrmPrin.ActiveMDIChild).TbFile;"
"Frmprin" est sans doute une forme qui a des enfants MDI ? et dans ce cas, qu'est-ce que "TBfile" ?
Merci