|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Candidat au titre de Membre du Club
![]() |
Bonjour,
Je cherche a exporter des données d'une base 4D afin de les importer dans un nouveau logiciel. J'ai reussi a exporter les tables en utilisant la commande EXPORTER DONNEES de 4D , et le resultat est satisfaisant. Seulement en fouillant d'un peu plus pres la structure de la base, je me suis apercu que certaines tables n'apparaissaient pas dans la liste des tables de la fenetre EXPORTER DONNEES. Ce sont des tables qui sont reliées à d'autres par "un trait grisé" (dont on ne peut pas editer les propriétés) alors que les liaisons habituelles entre tables sont avec "un trait noir" (dont on peut editer les propriétés). Les tables reliées ainsi n'apparaissent pas dans la liste des tables en utilisant l explorateur de table, mais en cherchant un peu plus, je me suis apercu que ce sont en fait des sous tables (je ne vois pas bien l'interet). Comment puis-je simplement exporter les données de ces sous-tables ? dois je ecrire des lignes de code, je ne connais pas du tout 4D, je n'ai meme pas trouvé comment faire pour ecrire dans un fichier texte. Si quelqu'un connait la solution, d'avance merci |
|
|
00
|
|
|
#2 |
|
Membre confirmé
![]() |
A priori, les sous table sont restées dans 4D pour assurer une compatibilité entre les versions. Pour ma part, je ne les utilise plus.
je pense que c'était un moyen facile de faire une table liée sans se casser la tête. Pour l'export, à ma connaissance, il n'existe que le code 4D. Le code vite fait: $mondoc:=creer document("";"TXT") Si(ok=1) $tab:=caractere(9) $Fin:=caractere(13) TOUT SELECTIONNER([Table]) Boucle ($i;1;Enregistrements trouves([Table])) $Toto:=[Table]identifiant TOUS LES SOUS ENREGISTREMENTS([Table]Type_Materiel) Boucle ($j;1;Sous enregistrements trouves([Table]SousTable) $Texte:=$Toto+$tab+[Table]SousTable'Champ1+$tab+[Table]SousTable'Champ2+$fin ENVOYER PAQUET($Mondoc;Mac vers Windows($Texte)) SOUS ENREGISTREMENT SUIVANT([Table]SousTable) fin de boucle LIBERER ENREGISTREMENT([Table]) ENREGISTREMENT SUIVANT([Table]) Fin de boucle FERMER DOCUMENT($Mondoc) fin de si Voila uin truc rapide qui marche. Attention, si les informations exportées sont du type numérique, il faut penser à ajouter (chaine([Table]SousTable'Champ1)) Voilà en espérant que cela t'aideras. A + |
|
|
00
|
|
|
#3 |
|
Candidat au titre de Membre du Club
![]() |
Je vais tester ca, je te remercie beaucoup en tout cas pour cette réponse claire et rapide
|
|
|
00
|
|
|
#4 |
|
Candidat au titre de Membre du Club
![]() |
Effectivement, ca marche. La seule difficulté est de devoir créer la variable texte avec tous les champs de cette sous table, et il y en a beaucoup :p
Merci encore |
|
|
00
|
|
|
#5 |
|
Candidat au titre de Membre du Club
![]() |
Bonjour,
j'ai à nouveau une question. Afin de rendre le processus un peu plus automatique, et pour eviter d'écrire du code statique pour exporter les données de 2 bases de données 4D de 60 tables avec une 30aine de champ chacune, j'aimerai pouvoir effectuer la chose suivante : Lister toutes les tables. Pour chaque table, lister tous les champs afin d exporter chaque ligne avec tous les champs. Pour chaque table lister les sous tables. Pour chaque sous-table , lister tous les champs. Il ne me manque que les fonctions Lister les tables, lister les sous-tables, et lister les champs. Est ce que de telles fonctions existent ? Dans ce cas, ca me permettrait d'écrire un code assez générique qui me permettrait d exporter l'ensemble de la base. Merci d'avance |
|
|
00
|
|
|
#6 |
|
Membre confirmé
![]() |
Si cela peut t'aider, voici un exemple pour exporter au format 'Excel' la structure. Je n'ai rien trouvé concernant les sous table. Si je trouve quelque chose, je le posterais ici.
****************Début méthode ****************** **` Description : Permet de mettre sous forme XLS **` le descriptif de la structure **` Num Table - Nom Table - Num Champ - Nom Champ **` ---------------------------------------------------- C_HEURE($mondoc) C_TEXTE($tab;$fin;$texte;$NumTable;$NomTable;$Type;$Long) C_ENTIER LONG($i;$j;$champType;$champLong) $mondoc:=Creer document("";"XLS") $tab:=Caractere(9) $fin:=Caractere(13) $texte:="Num Table"+$tab+"Nom Table"+$tab+"Num Champ"+$tab+"Nom Champ"+$tab+"Type"+$tab+"Val"+$fin ENVOYER PAQUET($mondoc;$texte) Boucle ($i;1;Nombre de tables) $NumTable:=Chaine($i) $NomTable:=Nom de la table($i) Boucle ($j;1;Nombre de champs($i)) LIRE PROPRIETES CHAMP($i;$j;$champType;$champLong) Au cas ou : ($champType=Est un champ alpha ) $Type:="Alpha" $Long:=Chaine($champLong) : ($champType=Est un texte ) $Type:="Texte" $Long:="" : ($champType=Est un numérique ) $Type:="Réel" $Long:="" : (($champType=Est un entier )*|*($champType=Est un entier long )) $Type:="Entier" $Long:="" : ($champType=Est une date ) $Type:="Date" $Long:="" : ($champType=Est une heure ) $Type:="Heure" $Long:="" : ($champType=Est un booléen ) $Type:="Booleen" $Long:="" : ($champType=Est une image ) $Type:="Image" $Long:="" : ($champType=Est une sous table ) $Type:="Sous table" $Long:="" : ($champType=Est un BLOB ) $Type:="Blob" $Long:="" Fin de cas $texte:=$NumTable+$tab+$NomTable+$tab+Chaine($j)+$tab+Nom du champ($i;$j)+$tab+$Type+$tab+$Long+$fin ENVOYER PAQUET($mondoc;$texte) Fin de boucle Fin de boucle FERMER DOCUMENT($mondoc) ALERTE("fin") ****************Fin méthode ****************** |
|
|
00
|
|
|
#7 | |
![]() ![]() Inscription : mai 2006 Messages : 356 ![]() |
Citation:
voir également la doc des commandes Nombre de tables et Nombre de champs qui permettent de parser tous les champs de toutes les tables dans une boucle telle que par exemple : Boucle ($table;1;Nombre de tables) Boucle ($champ;1;Nombre de champs($table)) $p_champ:=Champ($table;$champ) `insérer traitement Fin de boucle Fin de boucle |
|
|
|
00
|
|
|
#8 |
|
Membre du Club
![]() Inscription : juin 2006 Messages : 48 ![]() |
Bonjour,
j'ai écrit il y a quelques années pour mes propres besoins une méthode qui exporte la structure d'une base 4D au format SQL. N'utilisant pas les sous-tables, je n'ai pas pris en compte leur gestion. Avec une petite adaptation, tu pourras facilement t'en sortir. Voici le bout de code : Bon courage Denis `méthode d'export de la base (structure) au format SQL `ATTENTION à l'ordre de création des liens, car s'ils pointent vers une table non `encore créée Insider (ou autre) risque de générer une erreur. C_ENTIER LONG($I;$J;$last;$TableDest;$ChampDest) `compteur de "tables; Champs" C_TEXTE($ligne;$Index_Primaire;$Liens;$Autre_Index) `C_BOOLEEN($creation) $message:="Créer un fichier SQL de description de la base ?"+(2**cr) CONFIRMER($message;"Créer le fichier SQL";"Ne pas le créer") Si (OK=1) `si on a confirmé la création V_Doc:=Creer document("";"TEXT") Creer fenetre(100;100;400;500;4;"suivi") Boucle ($i;1;Nombre de tables) `pour chaque table ($I = n° table) $nomfic:=Nom de la table($i) `nom de la table $nomfic:=Remplacer chaine($nomfic;" ";"_") `Nettoyage du nom de la table $ligne:=(2**cr)+"CREATE TABLE "+$nomfic+*cr+"("+*cr `ligne de création de table $liens:="" `remise à "zéro" de la variable de liens $Autre_Index:="" `remise à "zéro" de la variable des autres index Boucle ($j;1;Nombre de champs($i)) `pour chaque champ de la table courante LIRE PROPRIETES CHAMP($i;$j;$type;$long;$index) `etat du champ $nomchamp:=Majusc(Nom du champ($i;$j)) `recupération de son nom `"Nettoyage" des noms de champs en fonction de la norme SQL $nomchamp:=Remplacer chaine($nomchamp;" ";"_") $nomchamp:=Remplacer chaine($nomchamp;"/";"_") $nomchamp:=Remplacer chaine($nomchamp;"-";"_") $nomchamp:=Remplacer chaine($nomchamp;".";"_") $nomchamp:=Remplacer chaine($nomchamp;";";"_") $nomchamp:=Remplacer chaine($nomchamp;",";"_") `typage du champ en fonction des correspondances avec SQL Au cas ou : ($type=0) `ALPHA $TypeSQL:="CHAR("+Chaine($long)+")" : ($type=2) `TEXTE $TypeSQL:="LONG VARCHAR" : ($type=1) `NUMERIQUE $TypeSQL:="NUMERIC" : ($type=8) `ENTIER $TypeSQL:="SMALLINT" : ($type=9) `ENTIER LONG $TypeSQL:="INTEGER" : ($type=6) `BOOLEEN $TypeSQL:="BIT" : ($type=4) `DATE $TypeSQL:="DATE" : ($type=11) `HEURE $TypeSQL:="TIME" : ($type=30) `BLOB $TypeSQL:="LONG VARBINARY" : ($type=7) `Sous-table $TypeSQL:="SOUS_TABLE_NON_GEREE" : ($type=3) `Image $TypeSQL:="IMAGE_NON_GEREE" Fin de cas $ligne:=$ligne+$nomchamp+" "+$TypeSQL+","+*cr `Ligne de création de champ `test sur l'existence d'un lien "partant" LIRE PROPRIETES LIEN($i;$j;$TableDest;$ChampDest) Si ($TableDest#0) `il existe un lien $liens:=$liens+"FOREIGN KEY ("+$nomchamp+") REFERENCES "+Nom de la table($TableDest)+" ("+Nom du champ($TableDest;$ChampDest)+"),"+*cr Fin de si Si ($index) `Le champ est indexé => ligne de commande correspondante $Autre_Index:=$Autre_Index+"CREATE INDEX "+$nomchamp+" ON "+$nomfic+" ("+$nomchamp+");"+*cr Fin de si Fin de boucle `création de l'index primaire `on a a priori pas la possibilité de savoir qu'un champ est indexé et UNIQUE $ligne:=$ligne+$Index_Primaire `création des liens (Foreign key) $ligne:=$ligne+$Liens $last:=Longueur($ligne) `longueur de la chaine $ligne Si ($ligne[[$last-1]]=",") `si l'avant dernier caractère est une virgule ` attention, le dernier est un RETOUR CHARIOT $ligne[[$last-1]]:=" " `suppression de la dernière virgule Fin de si `voir s'il est nécessaire de refaire le test une fois de plus ? $ligne:=$ligne+");"+*cr `fin de définition de table `création des autres index $ligne:=$ligne+$Autre_Index ENVOYER PAQUET(V_DOC;$ligne) Fin de boucle EFFACER FENETRE FERMER DOCUMENT(V_DOC) Fin de si |
|
|
00
|
|
|
#9 |
|
Candidat au titre de Membre du Club
![]() |
Merci beaucoup pour vos réponses, je vais tester ca dès aujourd'hui
|
|
|
00
|
|
|
#10 |
|
Candidat au titre de Membre du Club
![]() |
Je viens de tester les différents codes que vous m'avez donnés.
Ca marche très bien, mais je suis bloqué sur un point supplémentaire. En effet, pour acceder a un champ de table il suffit d'écrire dans lecode : [Table]Champ , ou [Table]Sous table'champ Mais comment faire ca en dynamique ? par exemple , j'essaie de faire : [nom de la table($table)]nom du champ($table;$champ) Mais ca ne fonctionne pas. |
|
|
00
|
|
|
#11 |
|
Membre confirmé
![]() |
Comme les sous table sont appelées un jour ou l'autre à disparaitre, je ne crois pas que l'on puisse dynamiquement récupérer le nom (comme cela est faisable pour les tables et les champs).
A mon avis, on est obligé de se les taper toutes à la main. Donc, je réitère mon conseil. Si vous faites des nouvelles structures, n'utilisez surtout pas les sous table. Désolé. |
|
|
00
|
|
|
#12 |
|
Invité de passage
![]() Inscription : novembre 2006 Messages : 2 ![]() |
bonjour, je débute sous 4D et j'ai un problème d'exportation de données.
j'ai 2 tables liées et je cherche à récupérer les données de ces 2 tables sur un même document au format SLK. quand j'ouvre la base et que je lance le programme d'export depuis le menu créé ça marche, mais dès que je commence à faire des actions de recherche (toujours dans le menu créé) et que je souhaite exporter une partie des données, seules les données d'une des 2 tables sont exportées. Dès lors que je quitte le menu créé et que je reviens en mode utilisation, ça remarche. quelqu'un peut -il m'expliquer ce qui se passe et comment résoudre ce problème ? d'avance merci |
|
|
00
|
|
|
#13 | |
|
Membre habitué
![]() |
Citation:
Documentation complète : http://doc.4d.com/4D-Langage-12.2/SQ...643433.fr.html Si ça peut aider ! |
|
|
00
|
|
|
#14 |
|
Membre confirmé
![]() |
Salut,
Si il y a des sous tables, je pense qu'il n'est ni en V12, ni en V11. Donc, il va avoir du mal avec les commandes SQL. Par contre si pas de sous table et V11 ou V12, c'est bien ces commandes qu'il faut priviligier. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com