Transférer une base ancienne dans une base v18

Bonjour

Je voudrais à partir d’une base crée depuis 15 ans l’importer dans une base en v18 crée vierge

Merci pour la piste

Très Cordialement

Bernard

PS = 115 méthodes projet 25 tables et 15 Formulaires Projet

Bon je crois que tout est là : https://doc.4d.com/4Dv18/4D/18/Conversion-en-4D-v18.100-4688867.fe.htmlConversion en 4D v18>

Merci Bertrand

cela je connais.

ce que je recherche c’est du code pour exporter ma vielle base dans une base vierge en v18

pour ne plus avoir les scories de ma vielle base

Très Cordialement

bernard

Dans des cas extremes , tu peux :

pour la structure des données : regarde la commande EXPORT STRUCTURE
il existe bien sur la commande inverse permettant d’importer le fichier créé dans une nouvelle base.

pour les données : regarde la commande SQL EXPORT DATABASE("")
Cela créé un dump SQL pour toutes les données de toutes les tables dans un dossier et sous-dossier par table.
Pour les re-importer par contre une simple petite methode est necessaire, au besoin je peux te la faire parvenir.

Mais avec tout cela tu ne conserves ni les methodes ni les formulaires. Donc sans doute du boulot à prévoir…

Merci Luc pour tes conseils

Je suis preneur de ta méthode pour re-importer les données

Bonne nuit

Très cordialement

Bernard

Voila, si ca peut t’aider.
Il faut juste selectionner le dossier créé avec la commande SQL d’export
Bonne soirée

<code 4D>
C_TEXT($dossier;$file)
ARRAY TEXT($tt_folders;0)

$dossier:=Select folder
FOLDER LIST($dossier;$tt_folders)

// Progress INIT
C_LONGINT($P)
C_REAL($r)
$P:=Progress New

For ($i;1;Size of array($tt_folders))

  // Progress SET
$r:=$i/Size of array($tt_folders)
Progress SET PROGRESS ($P;$r;"update Table "+String($i)+" : "+$tt_folders{$i})


ARRAY TEXT($tt_docs;0)
DOCUMENT LIST($tt_folders{$i};$tt_docs;Ignore invisible)

For ($j;1;Size of array($tt_docs))
	$file:=($dossier+$tt_folders{$i}+Folder separator+$tt_docs{$j})
	
	
	If (Test path name($file)=Is a document)
		SQL EXECUTE SCRIPT($file;SQL On error continue)
	End if 
	
End for 

End for
// Progress QUIT
Progress QUIT ($P)
</code 4D>

Euh, quel est l’intérêt de tout réimporter ?
Ma base est issue de la V3 d’il y a 32 ans et se porte bien ; il y a des branches mortes mais ça ne gêne guère.
Le problème spécifique V17/18 et futures est qu’il y a des nouveautés qui changent les BD en profondeur : l’objet, le langage orienté objet et ORDA.
Cela nécessite de tout changer, y compris la structure de la base, l’ergonomie,…
Cela me paraît impossible de le faire ex-nihilo ; il vaut mieux le faire progressivement dans la BD sur elle-même, ne serait-ce que pour apprendre.
Je n’ai l’expérience que d’une montée progressive mais si tu n’as pas de plugin Write View, Draw ou Graph, cela ne devrait pas poser de problème.

Faut pas avoir de champs objet, le SQL ne “connait” pas ce type.

Ce n’est plus vrai en v18 :< https://blog.4d.com/read-4d-object-fields-with-sql-engine/>

Salut Vincent,
oui, j’avais lu ce blog. Mais j’ai cru comprendre que le type objet n’est pas pris en charge “nativement” par SQL EXPORTER BASE/SELECTION, autrement dit qu’il faut écrire l’export des champs objet avec CAST soi-même.
Le truc qui marche avec tous les champs est ENVOYER/RECEVOIR ENREGISTREMENT, mais ça suppose d’avoir la même structure en réception qu’en émission.
Je trouve sécurisant de disposer du SQL dans la mesure où c’est peu de code, on peut intervenir sur le texte intermédiaire, on a peu de chances d’importer un enregistrement corrompu. Ça m’a vraiment tiré d’affaire une fois, un client qui avait explosé son data (sans sauvegarde, sinon c’était pas drôle).

Je doute fort qu’une base utilisée avec une version de 4D datée de 15 ans contienne des champs objets… :lol:

Bernard, chaque cas peut être spécifique…

J’ai aussi de très vielles bases que je viens de passer en v18… sans problème.

J’ai aussi eu ce type de problème sur base créée en v13 pour la passer en v17, mais je crois que c’est plus lié au contenu lui-même et en particulier aux données saisies (dans ce cas des textes copiés en brut de XPress) par les utilisateurs.

Quand toutes les méthodes de recouvrement de données 4D ne fonctionnent plus, parfois vaut mieux repartir sur de nouvelles bases, quitte à avoir un peu plus de boulot sur l’instant, mais au moins on repart sur des bases “propres”.

: Luc STELL

Je doute fort qu’une base utilisée avec une version de 4D datée de 15
ans contienne des champs objets… :lol:
Certes :oops:
Un truc amusant remarqué récemment, il fallait que je rapatrie une table v15 vers une v13 : copier coller de la table, le champ source de type objet en v15 devient blob en cible.

Bravo pour cette feature request devenue réalité.
Il en reste quelques-unes à traiter :

  • champ et variable timestamp sur lesquels on puisse appliquer toutes les fonctions de calcul de dates et de durée
  • entier très long,
    en espérant que ça viendra plus vite que les pointeurs sur les variables locales !

Bonjour aux Contributeurs

J’ai donc créé une base vierge en v18

j’ai importé 4 tables en cochant à chaque fois créer une table

j’ai renommé chaque table et chaque champ

j’ai crée les ID de chaque table (il faut redémarrer la base pour les activer)

j’ai recréer les Form input et output pour chaque table

J’ai copier coller les méthodes

Tout marche bien

seul soucis pour la table principale ou je me sers de ID pour suivre les ajouts d’enregistrement

les n° ID partent de 24876 à 42061 pour les enregistrements importés

et redémarre à 16781 pour les nouveaux enregistrements

cela me pose un gros problème car je ne sais pas comment repartir de 42062

et que va t il se passer quand on ID va atteinte 24876

peut on remettre ce compteur à zéro ou repartir de 42062

Merci pour vos conseils

Bernard DORET

: Bernard DORET

peut on remettre ce compteur à zéro ou repartir de 42062
Pour mémoire, 4D maintient un “compteur” par table qui stocke la valeur du dernier numéro “délivré”.
Dans ton cas, repartir de zéro impliquerait de renuméroter des tas d’enregistrements, les clés primaires de cette table mais aussi toutes les clés reportées : c’est délicat et ça ne sert à rien, tout ce qu’on demande à une clé est d’être unique.
Donc la “bonne” solution de régler le compteur sur le numéro le plus élevé :
<code 4D>
tout sélectionner([maTable])
$compteur:=max([maTable]ID)
fixer parametre base([maTable];numero automatique table,$max)
</code 4D>

Merci Arnaud pour tes conseils.

j’ai mis ce code dans le bouton ‘Ajouter’ de maTable et cela fonctionne comme je le souhaitais

avec la correction suivante numéro automatique table ; $compteur ( hihihi)

encore merci

belle journée

Bernard

: Bernard DORET

j’ai mis ce code dans le bouton ‘Ajouter’ de maTable et cela
fonctionne comme je le souhaitais

Je ne pense pas qu’il soit necessaire d’appeler ce code à chaque fois: 1 fois suffit

Merci Bertrand

J’ai enlevé le code du bouton ‘ajouter’ et je l’ai mis dans ma méthode ‘sur ouverture’

et tout fonctionne bien

Cordialement

Bernard

Bonjour
Maintenant que j’ai transféré ma base de 2006 dans une base neuve V18 je voudrai transformer cette méthode qui à beaucoup de contrainte par une méthode en utilisant ORDA
merci pour vos conseils

// ----------------------------------------------------
// Methode Projet : aProc_Edit_ComptExploit
// Crée par Bernard Doret, le 24/01/06
// avec l’aide de Peter VanVliet
// Modifiée le 12/9/2009
// ----------------------------------------------------
LECTURE ÉCRITURE([TempPrintTime])
TOUT SÉLECTIONNER([TempPrintTime])
SUPPRIMER SÉLECTION([TempPrintTime])
C_TEXTE(libref1;libref2;libref3;libref4;libref5;libref6;libref7;libref8;libref9;libref10;libref11;libref12)
C_RÉEL(vst1;vst2;vst3;vst4;vst5;vst6;vst7;vst8;vst9;vst10;vst11;vst12)
C_RÉEL(vTT1;vTT2;vTT3;vTT4;vTT5;vTT6;vTT7;vTT8;vTT9;vTT10;vTT11;vTT12)
C_RÉEL(vR1;vR2;vR3;vR4;vR5;vR6;vR7;vR8;vR9;vR10;vR11;vR12)
C_RÉEL($lig;$i)
C_POINTEUR($p;$p1;$p2)
TABLEAU RÉEL(TabMois;0)
aProc_Centrer_Fenetre (350;200;1;1;“Recherche Date”;Faux)
<>Page:=0
vRechDate:=“Edition Compte d’Exploitation”
DIALOGUE(“RechDate”)
FERMER FENÊTRE
vRechDate:=""
vTT:=0
vTbudget:=0
vPCT:=0
Si (bVal=1)
<>Page:=1 //Initiatise la N° auto des pages
CHERCHER([COMPTA];[COMPTA]dateAchat>=vDeb;)
CHERCHER([COMPTA]; & ;[COMPTA]dateAchat<=vFin;
)
CHERCHER([COMPTA];#;[COMPTA]imputation=“Investissement”;) //On exclue
CHERCHER([COMPTA];#;[COMPTA]imputation=“Divers”;
) //On exclue
CHERCHER([COMPTA];#;[COMPTA]imputation=“Revenus”) //On exclue
VALEURS DISTINCTES([COMPTA]MoisAchat;TabMois)
TRIER TABLEAU(TabMois;>) // ne plus y toucher jusqu’à la fin de la proc
TRIER([COMPTA];[COMPTA]designation;>)
Tant que (Non(Fin de sélection([COMPTA])))
CHERCHER([TempPrintTime];[TempPrintTime]Designation=[COMPTA]designation)
Si (Enregistrements trouvés([TempPrintTime])=0)
Si ([COMPTA]designation#"")
CRÉER ENREGISTREMENT([TempPrintTime])
[TempPrintTime]Designation:=[COMPTA]designation
[TempPrintTime]Imputation:=[COMPTA]imputation
STOCKER ENREGISTREMENT([TempPrintTime])
CHERCHER([TempPrintTime];[TempPrintTime]Designation=[COMPTA]designation)
Fin de si
Fin de si
$lig:=Chercher dans tableau(TabMois;[COMPTA]MoisAchat)
Si ($lig=-1)
ALERTE("Le mois recherché est "+Chaîne([COMPTA]MoisAchat))
Fin de si
Si ($lig>0)
Champ(24;$lig+3)->:=Champ(24;$lig+3)->+[COMPTA]credit-[COMPTA]debit //Champ(n° de Table;N° de Champ)
Sinon
TRACE
// il y a une erreur interne dans 4d…ou bien on a plus de 20 référents distincts
Fin de si
STOCKER ENREGISTREMENT([TempPrintTime])
LIBÉRER ENREGISTREMENT([TempPrintTime])
LIBÉRER ENREGISTREMENT([COMPTA])
ENREGISTREMENT SUIVANT([COMPTA])
Fin tant que
//--------------------------------------------------------Calcul du Total par Ligne
TOUT SÉLECTIONNER([TempPrintTime])
Tant que (Non(Fin de sélection([TempPrintTime])))
[TempPrintTime]Total:=0
Boucle ($i;1;Taille tableau(TabMois))
[TempPrintTime]Total:=[TempPrintTime]Total+Champ(24;$i+3)->
Fin de boucle
STOCKER ENREGISTREMENT([TempPrintTime])
LIBÉRER ENREGISTREMENT([TempPrintTime])
ENREGISTREMENT SUIVANT([TempPrintTime])
Fin tant que
//--------------------------------------------------------Calcul du Total Général
TOUT SÉLECTIONNER([TempPrintTime])
Boucle ($i;1;Taille tableau(TabMois))
$p:=Pointeur vers(“vt”+Chaîne($i))
$p->:=Somme(Champ(24;3+$i)->)
Fin de boucle
//--------------------------------------------------------Mise en Place des Libéllés des Colonnes
TOUT SÉLECTIONNER([TempPrintTime])
TRIER([TempPrintTime];[TempPrintTime]Imputation;>)
CUMULER SUR([TempPrintTime]Tps1;[TempPrintTime]Tps2;[TempPrintTime]Tps3;[TempPrintTime]Tps4;[TempPrintTime]Tps5;[TempPrintTime]Tps6;[TempPrintTime]Tps7;[TempPrintTime]Tps8;[TempPrintTime]Tps9;[TempPrintTime]Tps10;[TempPrintTime]Tps11;[TempPrintTime]Tps12;[TempPrintTime]Total;[TempPrintTime]Budget)
NIVEAUX DE RUPTURES(1)
Boucle ($i;1;Taille tableau(TabMois))
$p1:=Pointeur vers(“LibRef”+Chaîne($i))
Au cas ou
: (TabMois{$i}=1)
$p1->:=“Janvier”
: (TabMois{$i}=2)
$p1->:=“Février”
: (TabMois{$i}=3)
$p1->:=“Mars”
: (TabMois{$i}=4)
$p1->:=“Avril”
: (TabMois{$i}=5)
$p1->:=“Mai”
: (TabMois{$i}=6)
$p1->:=“Juin”
: (TabMois{$i}=7)
$p1->:=“Juillet”
: (TabMois{$i}=8)
$p1->:=“Août”
: (TabMois{$i}=9)
$p1->:=“Septembre”
: (TabMois{$i}=10)
$p1->:=“Octobre”
: (TabMois{$i}=11)
$p1->:=“Novembre”
: (TabMois{$i}=12)
$p1->:=“Décembre”
Fin de cas
Fin de boucle
LibEntete:=“Compte d’Exploitation du “+Chaîne(vDeb;Interne date long)+” au “+Chaîne(vFin;Interne date long)
vAn:=Année de(vDeb) //Date du budget
CHERCHER([Budget];[Budget]ImputBudget=“Revenus”;*)
CHERCHER([Budget]; & ;[Budget]An=vAn) //On Recherche les Revenus de l’année
vRevenu:=Somme([Budget]Credit_Budget)
FIXER OPTION IMPRESSION(2;2;73)
FORM FIXER SORTIE([TempPrintTime];“Etat_Sortie”)
FIXER OPTION IMPRESSION(Option échelle;77) // 77%
FIXER OPTION IMPRESSION(Option orientation;2) // Paysage
IMPRIMER SÉLECTION([TempPrintTime])
//---------------------------------------------------------------------------Remise à Zéro des variables
Boucle ($i;1;Taille tableau(TabMois))
$p1:=Pointeur vers(“libref”+Chaîne($i))
$p1->:=””
$p:=Pointeur vers(“vst”+Chaîne($i))
$p->:=0
$p2:=Pointeur vers(“vt”+Chaîne($i))
$p2->:=0
Fin de boucle
Fin de si
//----------------------------------------------------------------------------------