Migration (Framework)

De Wiki1000
Version du 14 juin 2016 à 10:32 par Tdymon (discuter | contributions)
(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)

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;
Outils personnels