Export import entre bases

Bonjour
J’ai une question qui a déjà du faire débat sur ce forum,
Apres avoir chercher, je n’ai pas trouvé de façon simple de fusionner 2 bases

J’utilise 4d V14.6
Je cherche à fusionner 2 bases,
Pour faire simple, je vais prendre que 3 champs:

Base 1
REF (unique indexé)
ISBN
Image

Base 2
REF
ISBN

Sur la base 1, le champs REF est toujours renseigné, ISBN et image parfois
Sur la base 2, le champs REF est toujours renseigné, ISBN parfois
Base1_REF = Base2_REF
pas le même nombre d’enregistrements

Je cherche une méthode d’import très simple (ajouter ou remplacer ne fonctionnant pas dans ce cas)
-Pour importer de la base 2 vers la base 1 le champs ISBN quand il n’est pas déjà renseigné dans la base 1
-ou remplir le champs ISBN dans des enregistrements déjà existants

Je peux faire une sélection dans la base 2 que des fiches avec ISBN
Et une sélection dans la base 1 que des fiches sans ISBN

Si je passe par excel, je perds les photos.

je trouve dommage de ne pas avoir de fonction pour remplir un champs par import avec un autre champs de control.

Etant débutant, je vous remercie de votre aide, je pense que c’est un cas de figure déjà rencontré
Bonne journée
Jules

Tu peux le faire avec envoyer enregistrement.
Voici une méthode d’export. Puis une méthode d’import dans laquelle tu pourras mettre tes règles de stockage ou non de l’enregistrement importé ou modifié.
C’est certainement possible de les améliorer… mais elles fonctionnent et m’ont déjà rendu de précieux services :wink:

<code 4D>

// Méthode : Exporter_standard ("";->[Factures];->[Lignes_de_factures];->[Lignes_de_factures]No_de_facture)
// Description
// $1 contient le chemin d’accès et le nom du document à créer. S’il est vide “”, l’archive est créée dans le dossier de la base et
// s’appelle : "Archives "+nom de la table principale

// $1=Pointeur du fichier principal
// $2et n+2=Pointeur des sous fichiers
// $3 et n+3 = pointeur de rubrique retour
//
// Paramètres
// ----------------------------------------------------

C_ENTIER LONG($A;$i;$id_Progress)
C_ENTIER LONG($REF)
C_ENTIER LONG($NOMBRE)
C_TEXTE($TITRE)
C_TEXTE($1)

C_POINTEUR(${2})
C_POINTEUR($Pointeur)

$Pointeur:=$2
$titre:=$1

Si (Longueur($titre)=0) //Chemin par défaut est vide
$i:=0
Repeter
$titre:=<>Chemin+“Archives “+Nom de la table($2)+”_”+Chaîne($i)
$i:=$i+1
Jusque (Tester chemin acces($titre)#Est un document)

Sinon

Si (Tester chemin acces($titre)=Est un document) // Le document passer en parametre existe déjà. Il faut incrémenter son nom.
$i:=0
Repeter
$titre:=$1+"_"+Chaîne($i)
$i:=$i+1
Jusque (Tester chemin acces($titre)#Est un document)
Fin de si

Fin de si

RÉGLER SÉRIE(12;$titre)
Si (OK=1)

Boucle ($a;2;Nombre de paramètres) //attention le premier paramètre est le chemin où sera enregistré l’archives.
$Pointeur:=${$a}

Si (Nombre de paramètres>3) & ($a>2)
UTILISER ENSEMBLE(“UserSet”)
$a:=$a+1
SÉLECTION RETOUR(${$a}->)
Fin de si
$Nombre:=Enregistrements trouvés($Pointeur->)
$titre:="Archives “+Nom de la table($Pointeur)
DÉBUT SELECTION($Pointeur->)
ENVOYER VARIABLE($titre)
ENVOYER VARIABLE($Nombre)
Si ($Nombre>0)
$id_Progress:=Progress_init (“Export de “+Chaîne($Nombre)+” enregistrements.”)
$i:=0
Repeter
$i:=$i+1
Progress SET PROGRESS ($id_Progress;$i/Enregistrements trouvés($Pointeur->);” J’exporte “+Chaîne($Nombre)+” enregistrements de la table "+Nom de la table($Pointeur);Vrai)

$Ref:=Numéro enregistrement($Pointeur->)
ENVOYER VARIABLE($Ref)
ENVOYER ENREGISTREMENT($Pointeur->)
ENREGISTREMENT SUIVANT($Pointeur->)

$Nombre:=$Nombre-1
Jusque (Fin de sélection($Pointeur->))
Progress QUIT ($id_Progress)
Fin de si
$Ref:=-10
ENVOYER VARIABLE($Ref)
Fin de boucle
Fin de si
RÉGLER SÉRIE(11)

</code 4D>

enfin la méthode d’import

<code 4D>
//$1=No de fiche unique à importer ou 0 si on souhaite importer ou traiter l’intégralité de l’archive
//$2 =Pointeur du fichier principal puis des fichiers liés
//Importer_standard (0;->[Factures];->[Factures]Numéro_facture;->[Lignes_de_factures];->[Factures]Numéro_facture)

C_ENTIER LONG($A)
C_ENTIER LONG($REF)
C_ENTIER LONG($NOMBRE;$Compteur;$Postion)
C_TEXTE($TITRE)
C_TEXTE($NOM)
C_TEXTE($AncienChemin;$Nouveau_chemin)
C_POINTEUR(${2})
C_POINTEUR($0)
C_ENTIER LONG($1)
C_POINTEUR($2)
C_BOOLÉEN($Importer)
C_POINTEUR($PtrChampID)

$nom:="Archives "+Nom de la table($2)
TABLEAU ENTIER LONG($TabAncienNoOuvrage;0)
TABLEAU ENTIER LONG($TabNouveauNoOuvrage;0)
BEEP
$Importer:=Vrai
ALERTE(“Attention ouvrez: “+$nom)
RÉGLER SÉRIE(13;””)
Si (OK=1)
RECEVOIR VARIABLE($titre)
Si ($nom#$titre)
RÉGLER SÉRIE(11)
BEEP
ALERTE(“Ce document n’est pas une : “+$nom)
Sinon
FenetreStandard (250;20;3;“Le message”;””)
Boucle ($a;2;Nombre de paramètres)
// récupération d’un pointeur sur le champ unique ID
$PtrChampID:=Champ(Table(${$a});No_Champ_ID (${$a}))

Si ($a>2)
RECEVOIR VARIABLE($titre)
Fin de si
RECEVOIR VARIABLE($Nombre)
Si ($Nombre>0)

Repeter
MESSAGE(" J’importe “+Chaîne($Nombre)+” fiches "+Nom de la table(${$a}))
RECEVOIR VARIABLE($Ref)
Si (OK=1) & ($Ref#-10)
RECEVOIR ENREGISTREMENT(${$a}->)

// Traitements particulier pour les tables [ma_table_à_bidouiller] & [Mon_autre_table_a_bidouiller] sinon on importe sans se poser de question
Au cas ou

: (Table(${$a})=Table(->[ma_table_à_bidouiller]))
//
Si (Trouver dans champ($PtrChampID->;$PtrChampID->)#-1) //L’enregistrement existe déjà.
// L’enregistrement est déjà présent. Il ne faut pas l’importer.
$Importer:=Faux
Fin de si

: (Table(${$a})=Table(->[Mon_autre_table_a_bidouiller]))
Si (Trouver dans champ([Mon_autre_table_a_bidouiller]IBSN;[Mon_autre_table_a_bidouiller]IBSN)#-1) //Depuis la suppression un ouvrage a eu ce n°. On va le changer
AJOUTER À TABLEAU($TabAncienNoOuvrage;[Mon_autre_table_a_bidouiller]IBSN)
MAMETHODE_Pour_FAIRE CE QUE JE SOUHAITE (->[Mon_autre_table_a_bidouiller]IBSN)
$Compteur:=-1
Repeter
$Compteur:=$Compteur+1
[Mon_autre_table_a_bidouiller]IBSN:=[Mon_autre_table_a_bidouiller]IBSN+$Compteur
Jusque (Trouver dans champ([Mon_autre_table_a_bidouiller]IBSN;[Mon_autre_table_a_bidouiller]IBSN)=-1)
AJOUTER À TABLEAU($TabNouveauNoOuvrage;[Mon_autre_table_a_bidouiller]IBSN)
Fin de si

Fin de cas

Si ($1#0)
Si (${$a+1}->=$1)
STOCKER ENREGISTREMENT(${$a}->)
Fin de si
Sinon
Si ($Importer)
STOCKER ENREGISTREMENT(${$a}->)

Fin de si
Fin de si
$Importer:=Vrai

Fin de si
EFFACER FENÊTRE
$Nombre:=$Nombre-1
Jusque (OK=0) | ($Ref=-10)
Sinon
RECEVOIR VARIABLE($Ref)
Fin de si
$a:=$a+1
Fin de boucle
FERMER FENÊTRE
RÉGLER SÉRIE(11)

Fin de si
Fin de si

</code 4D>

et enfin la méthode pour la fenetre d’information

<code 4D>
// Méthode : FenetreStandard (250;20;3;“Le message”;"")
// Description
//
//
// Paramètres
// ----------------------------------------------------

// $1 – Largeur de la fenêtre
// $2 – Hauteur de la fenêtre
// $3 – Type de la fenêtre (optionnel)
// $4 – Titre de la fenêtre (optionnel)

C_ENTIER LONG($1)
C_ENTIER LONG($2)
C_ENTIER LONG($3)
C_TEXTE($4)
C_TEXTE($5)
C_TEXTE($6)

C_ENTIER LONG($machine;$platform;$SH;$SW;$system;$WH;$winType;$WW)
C_TEXTE($winTitle)

Si (Faux)
C_ENTIER LONG(FenetreStandard ;$1)
C_ENTIER LONG(FenetreStandard ;$2)
C_ENTIER LONG(FenetreStandard ;$3)
C_TEXTE(FenetreStandard ;$4)
C_TEXTE(FenetreStandard ;$5)
C_TEXTE(FenetreStandard ;$6)
Fin de si

$winType:=$3
$winTitle:=$4
$SW:=Largeur écran/2
$SH:=(Hauteur écran/2)-10
$WW:=$1/2
$WH:=$2/2

PROPRIÉTÉS PLATE FORME($platform;$system;$machine)
Si ($platform=Windows)
Si ($winType=1)
$winType:=Form dialogue modal déplaçable
Si (Longueur($winTitle)=0)
$winTitle:=Fichier application
Fin de si
Fin de si
Fin de si
$winTitle:=Sous chaîne($winTitle;1;80)
Au cas ou
: (Nombre de paramètres=2)
Créer fenêtre($SW-$WW;$SH-$WH;$SW+$WW;$SH+$WH)
: (Nombre de paramètres=3)
Créer fenêtre($SW-$WW;$SH-$WH;$SW+$WW;$SH+$WH;$winType)
: (Nombre de paramètres=4)
Créer fenêtre($SW-$WW;$SH-$WH;$SW+$WW;$SH+$WH;$winType;$winTitle)
: (Nombre de paramètres=5)
Créer fenêtre($SW-$WW;$SH-$WH;$SW+$WW;$SH+$WH;$winType;$winTitle;$5)
: (Nombre de paramètres=6)
CHANGER COORDONNÉES FENÊTRE($SW-$WW;$SH-$WH;$SW+$WW;$SH+$WH)
Fin de cas

</code 4D>

voilà

Pour faire simple, je ferais:

Créer une table B temporaire et y importer le contenu d’une des deux bases.
Boucler sur cette table B et chercher dans l table A à compléter.
On trouve : on met à jour
On ne trouve pas : on crée

Merci Xavier pour ta méthode
étant débutant, c’est un peu en dehors de mes competences
mais je vais essayer sur une copie

je trouve dommage qu’il n’y ait pas une fonction de “mise à jour d’enregistrements” directement dans 4D.

une question liée à l’import - export,
à part le format d’export propre à 4D, quel formet me permet d’exporter/importer y compris avec des images ?
merci de votre aide

Xavier
ça commence mal, car je pense ne pas executer la méthode où il faut
peux tu me dire où créer cette méthode
(pour le moment, je l’ai créée dans une “méthode projet”
et j’ai une erreur dès le début,
$Pointeur:=$2 : arguments ne sont pas compatibles

une autre idée plus simple, mais je n’arrive pas à ecrire la méthode

j’exporte la base2 vers une nouvelle table dans la base 1

la méthode :

si ref(table1)=ref(table2)
//pour le champs isbn (par exemple)
valeur de isbn(table1):=isbn(table2)
sinon passer à l’enregistrement suivant

je cherche à faire un controle pour etre sûr que c’est bien le même article
je n’ai pas le même nombre d’enregistrements entre les deux base (pas le même nombre de ref)

plus je cherche et plus je trouve dommage que en import il n’y ait que ajouter ou remplacer,
il faudrait une commande en import pour mettre à jour un champs d’une fiche existante avec un control sur un autre champs

Tu créé une méthode projet. :Exporter_mes_données

Dans laquelle tu créé la selection des enregistrements de la table [IBSN] que tu souhaites exporter
dans cette même méthode tu va appeler la méthode précedente comme si elle était une commande

Exporter_Standard($le_chemin_du_document_D_Export";->[IBSN];{Et les pointeurs sur les éventuels enregistrements qui sont liés à l’enregistrement courant})

Donc ta méthode Exporter_mes_données si tu souhaites exporter tous les données de tatable [IBSN] sur ton bureau

Tout selectionner ([IBSN])
Exporter_Standard(Dossier systeme(Bureau)+“Mes_donnees.txt”;->[IBSN])

merci de ton aide
je vais passer le WE dessus