Migration (Framework)

De Wiki1000

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.

<source lang='delphi'>SyncManager.UpdateModelDB('TTypeOperationCptBancaire',,sstUpdateModel);</source>

Enfin, voici un exemple d'un script réel de mise à jour.

<source lang='delphi'> //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;</source>