Migration (Framework)
Scripts before
C'est l'opportunité offerte au développeur de pouvoir intervenir sur le modèle existant AVANT sa synchronisation, ce qui permet d'accéder aux "anciens" attributs dans la table SQL.
En effet, il ne faut oublier que si le modèle n'est pas encore synchronisé, le nouveau métier est lui disponible.
Si l'on désire qu'une table soit actualisée, pour atteindre les nouveaux attributs, il est possible de demander une synchronisation en AJOUT pour cette table.
Ce qui permettra de disposer des nouveaux attributs (voire classes) que l'on pourra ensuite utiliser par le code métier, excepté l'extraction des données qui devra être faite en SQL par l'intermédiaire d'un curseur et d'une requête créée via le QueryBroker actuellement.
ATTENTION: On doit toujours spécifier la classe de base.
De ce fait, comme la classe est actualisée de tous les nouveaux attributs pour tous les éléments accessible du modèle comme les classes extensions, il faut impérativement vérifier dans ce cas qu'il n'est pas également nécessaire de synchroniser d'autres classes quitte à le conditionner par paquet ou par présence de la classe en question.
Exemple de synchronisation en ajout
La classe TTypeOperationCptBancaire, la classe de base elle même si elle n'existe pas, ou tous ses nouveaux attributs accessibles, seront ajoutés par cette commande unique.
SyncManager.UpdateModelDB('TTypeOperationCptBancaire','',sstUpdateModel);
Enfin, voici un exemple d'un script réel de mise à jour.
//Procedure MAJTypeOperationBancaireCompteBancaireBefore; //Cette méthode BEFORE transfère les anciennes données sur la nouvelle classe (7.00P - >7.10), pour ceux qui ont appliqué le patch. Var vTypeOperationCptBancaire : TTypeOperationCptBancaire; vCursor : TDBCursor; vSQL : String; vOldTable : String; vJrnTable : String; vJrnTable_SI : String; vTOPTable : String; begin vJrnTable := ClassManager.FindClassTableName('TJournal'); if ClassManager.ShareEnable then vJrnTable_SI := ClassManager.FindClassTableName('TJournal_SI'); vTOPTable := ClassManager.FindClassTableName('TTypeOperationBancaire'); vOldTable := 'TTYPEOPERATIOTBANQUE'; //Table inexistance : patch déjà appliqué ou patch 7.00P jamais appliqué if Pos('.',vJrnTable) > 0 then vOldTable := Copy(vJrnTable,1,Pos('.',vJrnTable)) + vOldTable; if Assigned(ModelManager.FindClass('TArreteCompte',True)) then SyncManager.UpdateModelDB('TArreteCompte','',sstUpdateModel); //Update SyncManager.UpdateModelDB('TCompteBancaire','',sstUpdateModel); //Update SyncManager.UpdateModelDB('TTypeOperationBancaire','',sstUpdateModel); //Update SyncManager.UpdateModelDB('TTypeOperationCptBancaire','',sstUpdateModel); //Create //D'abord traiter le cas des anciennes instances. Try vCursor := QueryBroker('','TTYPEOPERATIOTBANQUE',''); vCursor.Sql.Clear; if ClassManager.ShareEnable then begin vSQL := 'SELECT OP.oidCompteCharge,OP.oidCompteGeneralCollect,OP.oidCompteGeneralNonCollect,OP.oidJournal,OP.oidTypePiece,'+ 'OP.prendreComptePrivilegie,OP.oidTTypeOperationBancaire,JR_SI.oidcompteBancaireEts '+ 'FROM %s OP,%s JR, %s JR_SI WHERE (OP.oidJournal=JR.oid) AND (JR.natureJournal=%d) AND (JR_SI.oidOwner = JR.oid)'; vSQL := Format(vSQL,[vOldTable,vJrnTable,vJrnTable_SI,NatureJournal_Tresorerie]); end else begin vSQL := 'SELECT OP.oidCompteCharge,OP.oidCompteGeneralCollect,OP.oidCompteGeneralNonCollect,OP.oidJournal,OP.oidTypePiece,'+ 'OP.prendreComptePrivilegie,OP.oidTTypeOperationBancaire,JR.oidcompteBancaireEts '+ 'FROM %s OP,%s JR WHERE (OP.oidJournal=JR.oid) AND (JR.natureJournal=%d)'; vSQL := Format(vSQL,[vOldTable,vJrnTable,NatureJournal_Tresorerie]); end; vCursor.Sql.Add(vSQL); Try vCursor.Open; vCursor.First; while (not vCursor.Eof) do Begin vTypeOperationCptBancaire := TTypeOperationCptBancaire.Find('(oidTTypeOperationBancaire=%1) and (oidTCompteBancaire=%2)','',False,[vCursor.Fields[6].asVariant,vCursor.Fields[7].asVariant]); if (not Assigned(vTypeOperationCptBancaire))then Try WithP private transaction do Begin //Préparer la nouvelle instance vTypeOperationCptBancaire := TTypeOperationCptBancaire.Create; vTypeOperationCptBancaire.oidCompteCharge := vCursor.Fields[0].asVariant; vTypeOperationCptBancaire.oidCompteGeneralCollect := vCursor.Fields[1].asVariant; vTypeOperationCptBancaire.oidCompteGeneralNonCollect := vCursor.Fields[2].asVariant; vTypeOperationCptBancaire.oidJournal := vCursor.Fields[3].asVariant; vTypeOperationCptBancaire.oidTypePiece := vCursor.Fields[4].asVariant; vTypeOperationCptBancaire.prendreComptePrivilegie := vCursor.Fields[5].asVariant; vTypeOperationCptBancaire.oidTTypeOperationBancaire := vCursor.Fields[6].asVariant; vTypeOperationCptBancaire.oidTCompteBancaire := vCursor.Fields[7].asVariant; End; Except DbgMsg(Format('Profile %s',[Self.ObjectClassName]), E.message); End; vCursor.Next; End; Finally vCursor.Close; End; //Puis reporter les configurations par défaut si nécessaire vCursor := QueryBroker('','TTYPEOPERATIOTBANQUE',''); vCursor.Sql.Clear; if ClassManager.ShareEnable then begin vSQL := 'SELECT OB.oidCompteCharge,OB.oidCompteGeneralCollect,OB.oidCompteGeneralNonCollect,OB.oidJournal,OB.oidTypePiece,'+ 'OB.prendreComptePrivilegie,OP.oidTTypeOperationBancaire,JR_SI.oidcompteBancaireEts '+ 'FROM %s OP,%s JR,%s JR_SI, %s OB WHERE (OP.oidTTypeOperationBancaire=OB.oid) AND (OB.oidJournal=JR.oid) AND (JR.natureJournal=%d) AND (JR_SI.oidOwner = JR.oid)'; vSQL := Format(vSQL,[vOldTable,vJrnTable,vJrnTable_SI,vTOPTable,NatureJournal_Tresorerie]); end else begin vSQL := 'SELECT OB.oidCompteCharge,OB.oidCompteGeneralCollect,OB.oidCompteGeneralNonCollect,OB.oidJournal,OB.oidTypePiece,'+ 'OB.prendreComptePrivilegie,OP.oidTTypeOperationBancaire,JR.oidcompteBancaireEts '+ 'FROM %s OP,%s JR,%s OB WHERE (OP.oidTTypeOperationBancaire=OB.oid) AND (OB.oidJournal=JR.oid) AND (JR.natureJournal=%d)'; vSQL := Format(vSQL,[vOldTable,vJrnTable,vTOPTable,NatureJournal_Tresorerie]); end; vCursor.Sql.Add(vSQL); Try vCursor.Open; vCursor.First; while (not vCursor.Eof) do Begin vTypeOperationCptBancaire := TTypeOperationCptBancaire.Find('(oidTTypeOperationBancaire=%1) and (oidTCompteBancaire=%2)','',False,[vCursor.Fields[6].asVariant,vCursor.Fields[7].asVariant]); if (not Assigned(vTypeOperationCptBancaire))then Try WithP Private transaction do Begin //Préparer la nouvelle instance vTypeOperationCptBancaire := TTypeOperationCptBancaire.Create; vTypeOperationCptBancaire.oidCompteCharge := vCursor.Fields[0].asVariant; vTypeOperationCptBancaire.oidCompteGeneralCollect := vCursor.Fields[1].asVariant; vTypeOperationCptBancaire.oidCompteGeneralNonCollect := vCursor.Fields[2].asVariant; vTypeOperationCptBancaire.oidJournal := vCursor.Fields[3].asVariant; vTypeOperationCptBancaire.oidTypePiece := vCursor.Fields[4].asVariant; vTypeOperationCptBancaire.prendreComptePrivilegie := vCursor.Fields[5].asVariant; vTypeOperationCptBancaire.oidTTypeOperationBancaire := vCursor.Fields[6].asVariant; vTypeOperationCptBancaire.oidTCompteBancaire := vCursor.Fields[7].asVariant; End; Except DbgMsg(Format('Profile %s',[Self.ObjectClassName]), E.message); End; vCursor.Next; End; Finally vCursor.Close; End; Except End; //Puis annuler toutes les configurations par défaut dans le cas de l'ISO20022. ForeachP Var vTypeOperationBancaire:TTypeOperationBancaire in TTypeOperationBancaire.CreateCursorWhere('(oidJournal<>%1) and (TypeCodification.value=%2)','',True,['',TypeCodificationBancaire_ISO20022]) With Distinct transaction On Except Continue do Begin if (vTypeOperationBancaire.estComptaOption=True) and assigned(vTypeOperationBancaire.Journal) and (vTypeOperationBancaire.Journal.NatureJournal.value=NatureJournal_Tresorerie) then Begin vTypeOperationCptBancaire := TTypeOperationCptBancaire.Find('(oidTTypeOperationBancaire=%1) and (oidTCompteBancaire=%2)','',False,[vTypeOperationBancaire.instanceoid,vTypeOperationBancaire.Journal.oidcompteBancaireEts]); if not Assigned(vTypeOperationCptBancaire) then Begin //Préparer la nouvelle instance vTypeOperationCptBancaire := TTypeOperationCptBancaire.Create; vTypeOperationCptBancaire.oidCompteCharge := vTypeOperationBancaire.oidCompteCharge; vTypeOperationCptBancaire.oidCompteGeneralCollect := vTypeOperationBancaire.oidCompteGeneralCollect; vTypeOperationCptBancaire.oidCompteGeneralNonCollect := vTypeOperationBancaire.oidCompteGeneralNonCollect; vTypeOperationCptBancaire.oidJournal := vTypeOperationBancaire.oidJournal; vTypeOperationCptBancaire.oidTypePiece := vTypeOperationBancaire.oidTypePiece; vTypeOperationCptBancaire.prendreComptePrivilegie := vTypeOperationBancaire.prendreComptePrivilegie; vTypeOperationCptBancaire.oidTTypeOperationBancaire := vTypeOperationBancaire.instanceoid; vTypeOperationCptBancaire.oidTCompteBancaire := vTypeOperationBancaire.Journal.oidcompteBancaireEts; End; End; //Annuler le défaut vTypeOperationBancaire.oidJournal := ''; vTypeOperationBancaire.oidCompteCharge := ''; vTypeOperationBancaire.oidCompteCharge := ''; vTypeOperationBancaire.oidCompteGeneralNonCollect := ''; vTypeOperationBancaire.oidTypePiece := ''; vTypeOperationBancaire.prendreComptePrivilegie := False; End; end;