Passa al contenuto principale

Come convertire i report personalizzati da Fluentis 2015 a Fluentis 2021

Introduzione

In questa guida viene illustrato come convertire i report personalizzati dalla versione Fluentis2015 alla versione Fluentis2021. In una prima parte si lavorerà tramite query. Successivamente si andrà a modificare l'xml del report per rinominare le proprietà che sono cambiate.

Il metodo che segue è quello da utilizzare se ci sono molti report custom e implica una buona conoscenza di oggetti e report. Un altro modo è quello di aprire il report tramite il ribbon report designer, premere validate dalla parte di scripts e si avranno una serie di avvisi per campi calcolati, script in cui ci sono delle proprietà da rinominare. Per farlo basterà trascinare sulla label il campo corretto oppure scrivendo l'expression con la proprietà rinominata.

Consiglio utile

Tramite il metodo qui sotto possono sfuggire casi particolari di proprietà da rinominare. Una volta finita la procedura, lanciare in 2015 e in 2021 il report e confrontare che il risultato sia lo stesso. Se non lo fosse andare tramite il Ribbon a verificarne il problema.

Prerequisiti

Per poter effettuare le seguenti operazioni è necessario avere il database versione 2015 e il database appena convertito a 2021. Oltre a questo è necessario aver visto il corso di Xtrareport e avere una buona conoscenza della gestione degli oggetti in Fluentis.

Migrazione report

Per spostare i database copiare la seguente query e lanciarla sul database 2021. Modificando opportunamente i due nomi database alla fine della query.

INSERT INTO [Arm].[RPT_Reports]
([RPTR_Code]
,[RPTR_Name_DICTDE_Id]
,RPTR_CompressedDefinition
,[RPTR_BusinessObject_OBJBO_Id]
,[RPTR_ItemNature]
,[RPTR_Description]
,[RPTR_IsSubreport]
,[RPTR_Context]
,[RPTR_Country_GENC_Id]
,[RPTR_LastModified]
,[RPTR_Version]
,[RPTR_ArmObjectGuid]
,[RPTR_MaxRecords]
,[RPTR_MaxMinutes]
,[RPTR_Order])
select
[RPT_Code]
,[RPT_Name_DICT_Id]
,COMPRESS(Convert(nvarchar(MAX), rpt_definition))
,[RPT_OBJ_Id]
,[RPT_ItemNature]
,RPT_Description
,[RPT_IsSubreport]
,[RPT_Context]
,[RPT_CTRY_Id]
,[RPT_LastModified]
,[RPT_Version]
,[RPT_Guid]
,[RPT_MaxRecords]
,[RPT_MaxMinutes]
,[RPT_Order]
from nomeDatabase2015.arm.RPT_Reports
where RPT_ItemNature = 2 and RPT_OBJ_Id in (select t.OBJBO_Id from nomeDatabase2021.arm.OBJ_BusinessObjects as t)

Identificazione report in cui ci sono query sql da rinominare

Completata la prima query procedere a lanciare la query qui sotto sul database 2015. La query salva nel database 2015 una tabella (select * from Report_Result) con nomi tabella e nomi colonne e codice report che sono state eliminate e/o rinominate per poi cercare nella definizione del report se sono presenti delle query che contengono queste tabelle e colonne.

Attenzione

La query potrebbe metterci molto tempo in base al numero di report custom. Se si interrompe va rilanciata. Per farla riprendere da dove era arrivata, lanciare la query appena prima del while. Oppure eseguirla in transazione.

Sostituire Database2015 e Database2021 con i nomi dei database corretti

--Tabella dei risultati finali con la lista dei report da verificare e i riferimenti a tabelle e campi errati (inizialmente vuota viene popolata dal while)
--In caso di riesecuzione dello script Viene fatto il drop della tabella e viene ricreata da zero
IF OBJECT_ID (N'Report_Result', N'U') IS NOT NULL
drop table [Database2015].dbo.Report_Result



CREATE TABLE [Database2015].[dbo].[Report_Result](
[RPTR_Id] [int] NULL,
[RPTR_Code] [nvarchar](255) NULL,
[Table_name] [nvarchar](max) NULL,
[Colum_name] [nvarchar](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]



--Tabella con la lista dei report custom da verificare che contegno '%using System.Data;%'
--In caso di riesecuzione dello script Viene fatto il drop della tabella e viene ricreata da zero
IF OBJECT_ID (N'Report_CustomList', N'U') IS NOT NULL
drop table [Database2015].dbo.Report_CustomList



SELECT RPTR_Id, RPTR_Code, RPTR_Definition = CONVERT(NVARCHAR(MAX), convert(xml, decompress(RPTR_CompressedDefinition ))) into [Database2015].dbo.Report_CustomList
FROM [Database2021].arm.RPT_Reports
where RPTR_ItemNature = 2 and CONVERT(NVARCHAR(MAX), convert(xml, decompress(RPTR_CompressedDefinition ))) like '%using System.Data;%'



-- Tabella contenente la lista di tabelle/colonne rinominate da 2015 a 2021
--In caso di riesecuzione dello script Viene fatto il drop della tabella e viene ricreata da zero
IF OBJECT_ID (N'Report_QueryRename', N'U') IS NOT NULL
drop table [Database2015].dbo.Report_QueryRename



select distinct DB2015.TABLE_NAME, DB2015.COLUMN_NAME into [Database2015].dbo.Report_QueryRename
from (
select distinct table_name, COLUMN_NAME
FROM [Database2015].INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG = 'Database2015'
AND TABLE_SCHEMA in ('Fluentis','DBO')
and table_name not like '\_%' escape '\'
and COLUMN_NAME not like '\_%' escape '\') DB2015
left join (select distinct table_name, COLUMN_NAME
from [Database2021].INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA in ('Fluentis','DBO')
and table_name not like '\_%' escape '\'
and COLUMN_NAME not like '\_%' escape '\') DB2021
on DB2015.TABLE_NAME = DB2021.TABLE_NAME and DB2015.COLUMN_NAME = DB2021.COLUMN_NAME
where DB2021.TABLE_NAME is null



-- Tabella di appoggio utilizzata nel cilo while per spostare i dati
declare @table1 as table(RPTR_Id int, RPTR_Code nvarchar(max), Table_name nvarchar(max), Colum_name nvarchar(max))



-- Ciclo che per ogni Report nella Report_CustomList va a verificare se nell xml dell RPTR_Definition sono presenti riferimenti a tabelle/proprietà che non esistono +
-- Per ongi report se viene trovata anomalia, il report viene aggiunto alla Report_Result
-- Al termine di ogni ciclo il report viene rimosso dalla Report_CustomList
while(select count(*) from Report_CustomList) > 0
begin



declare @RPTR_Id int = (select top 1 RPTR_Id from Report_CustomList)



--Verifica delle tabelle rinominate se il report risulta corrotto viene inserito nella tabella di appoggio
insert into @table1
SELECT distinct table1.RPTR_Id, table1.RPTR_Code, table2.TABLE_NAME, null
FROM (select top 1 * from Report_CustomList where RPTR_Id = @RPTR_Id) table1
INNER JOIN (select distinct TABLE_NAME from [Database2015].dbo.Report_QueryRename ) table2 ON table1.RPTR_Definition LIKE CONCAT('%', table2.TABLE_NAME, '%')


-- Se il report ha superato il primo controllo vengono verificate le colonne
if (select count(*) from @table1 where RPTR_Id = @RPTR_Id) = 0
begin
insert into @table1
SELECT distinct table1.RPTR_Id, table1.RPTR_Code, null, table2.COLUMN_NAME
FROM (select top 1 * from Report_CustomList where RPTR_Id = @RPTR_Id) table1
INNER JOIN (select distinct COLUMN_NAME from [Database2015].dbo.Report_QueryRename ) table2 ON table1.RPTR_Definition LIKE CONCAT('%', table2.COLUMN_NAME, '%')
end


--il risultato dei controlli viene inserito nella tabella dei risultati
insert into Report_Result
select * from @table1 where RPTR_Id = @RPTR_Id


--la lista dei deport da controllare viene aggiornata cancellando il report verificato
delete from Report_CustomList where RPTR_Id = @RPTR_Id


end

--le due tabelle di partenza e di destinazione
select * from Report_CustomList
select * from Report_Result

Terminata l'esecuzione della query eseguire la seguente select: select * from Report_Result e aprire uno alla volta i report e rinominare le query tramite il convertitore di Arm, come segue.

Come rinominare le query all'interno del report

Come prima cosa lanciare la query di select generale. Prendere il codice del primo report e incollarlo nella query sotto la quale ci darà come risultato tutte le possibili tabelle sql da rinominare (e di conseguenza i campi). Nella tabella ci sono codice del report e nome tabella sql da rinominare.

--Cercare codice report da rinominare
select * from Report_Result with(nolock)

--Selezionare tutti i record di quel report
select * from Report_Result with(nolock)
where RPTR_Code like 'reportCode'

Man mano che vengono sistemati i report si possono eliminare da tale tabella. Qui ognuno può adottare il metodo che preferisce per segnare quali report ha fatto e quali no (es. un file excel).

--Cancellare il report dalla tabella quando sono state rinominate tutte le proprietà di quel report
delete from Report_Result where RPTR_Code like 'reportCode'

Aprire in Ribbon Report Designer il report in modo da avere la query. Copiare la query. Aprire ARM 2021. Cliccare Home - Database (cliccare sull'immagine)

Cliccare il bottone convertire script

Incollare nella colonna sinistra la query da convertire e premere il pulsante con la freccia blu. Sulla colonna di destra ci sarà la query convertita da incollare nel report.

Identificazione report in cui ci sono proprietà di oggetti da rinominare

--Tabella dei risultati finali con la lista dei report da verificare e i riferimenti a tabelle e campi errati (inizialmente vuota viene popolata dal while)
--In caso di riesecuzione dello script Viene fatto il drop della tabella e viene ricreata da zero
IF OBJECT_ID (N'Report_Result', N'U') IS NOT NULL
IF OBJECT_ID (N'Report_PropertyResult', N'U') IS NOT NULL
drop table [Database2015].dbo.Report_PropertyResult



CREATE TABLE [Database2015].[dbo].[Report_PropertyResult](
[RPTR_Id] [int] NULL,
[RPTR_Code] [nvarchar](255) NULL,
[Property_Name] [nvarchar](max) NULL,
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]



--Tabella con la lista dei report custom da verificare
--In caso di riesecuzione dello script Viene fatto il drop della tabella e viene ricreata da zero
IF OBJECT_ID (N'Report_CustomPropertyList', N'U') IS NOT NULL
drop table [Database2015].dbo.Report_CustomPropertyList



SELECT RPTR_Id, RPTR_Code, RPTR_Definition = CONVERT(NVARCHAR(MAX), convert(xml, decompress(RPTR_CompressedDefinition ))) into [Database2015].dbo.Report_CustomPropertyList
FROM [Database2021].arm.RPT_Reports
where RPTR_ItemNature = 2




--Tabella contenente la lista di proprietà rinominate da 2015 a 2021 esclusi i casi già verificati come fake
--In caso di riesecuzione dello script Viene fatto il drop della tabella e viene ricreata da zero
IF OBJECT_ID (N'Report_PropertyRename', N'U') IS NOT NULL
drop table [Database2015].dbo.Report_PropertyRename



Select distinct p2015.OBJPROP_Code into [Database2015].dbo.Report_PropertyRename
from [Database2015].Arm.OBJ_BusinessObjectProperties p2015
left join (Select *
from [Database2021].Arm.OBJ_BusinessObjectProperties ) p2021
on p2015.OBJPROP_Code = OBJPROIP_Code
where p2021.OBJPROIP_Id is null and p2015.OBJPROP_Code not in ('Acc','PurchaseOrders','Sel','Val','Obj','PR','Print','Comp','DocRif','For','ISO','SalesInvoices','String','Arm','ABI','Bill','CAB','Cin','WIP','Web','ToDay','Stamp','SalesOrders','SalesDeliveryNotes'
,'Rig','Revenue','Reimbursement','QuantityDecimalsNo','PurchaseInvoices','PurchaseDestinationProv','Purchase','ProposedCost','Present','NumerotationType','HumanResource','Effective','Div','Controls','Gen','Set','Leg','Act','Product','Production','Cont','FromProductionOrder','Generic'
,'PayingIn','Summary','TotalDoc','Compulsory','Visible','DocType','Extern','Monthly','NonTaxableOperations','Vendor','Visible','Back','CalcCredit','CalcDebit','Fore','F_Ledger','Bold','Italic','ReportType','ViewTotal','Fixed','Subcontractor','Deduction','Flag','Of','Indirect','MaturityPayment'
,'Intra','CodIva','Min','Dic','Codice','ShowQuantity','Turnover','Qta','BOM','Pers','BirthProv','Split','Supplier','Sing','Mag','Interim','Additional','Load','Calculated','Assigned','Tipo','ShowDetails','Prezzo','Floor','Export','Pagamento',
'Analytic','PreviewedDate','PlannedOrder','CurrencyId','Nir','PrevYear','Delivered','Selected','F_Agents','CodeDescription','DocType','DataMember','SalesJobOrderItemId','SalesJobOrderId','Banca','Fiscale')
order by OBJPROP_Code



-- Tabella di appoggio utilizzata nel cilo while per spostare i dati
-- in caso di esecuzione parziale riparto da qui
declare @table1 as table(RPTR_Id int, RPTR_Code nvarchar(max), Property_name nvarchar(max))



while(select count(*) from Report_CustomPropertyList) > 0
begin



declare @RPTR_Id int = (select top 1 RPTR_Id from Report_CustomPropertyList)



--Verifica delle proprietà rinominate se il report risulta corrotto viene inserito nella tabella di appoggio
insert into @table1
SELECT distinct table1.RPTR_Id, table1.RPTR_Code, table2.OBJPROP_Code
FROM (select top 1 * from Report_CustomPropertyList where RPTR_Id = @RPTR_Id) table1
INNER JOIN (select distinct OBJPROP_Code from [Database2015].dbo.Report_PropertyRename ) table2
ON table1.RPTR_Definition LIKE CONCAT('%[(.)(")( )([)]', table2.OBJPROP_Code, '[(.)(")( )([)(;)(=)(!)(()(\])]%') escape '\'



--il risultato dei controlli viene inserito nella tabella dei risultati
insert into Report_PropertyResult
select * from @table1 where RPTR_Id = @RPTR_Id



--la lista dei deport da controllare viene aggiornata cancellando il report verificato
delete from Report_CustomPropertyList where RPTR_Id = @RPTR_Id

end

select count(*) from Report_CustomPropertyList with(nolock)
select * from Report_PropertyResult with(nolock)

Come rinominare le proprietà all'interno del report

Come prima cosa lanciare la query di select generale. Prendere il codice del primo report e incollarlo nella query sotto la quale ci darà come risultato tutte le possibili proprietà da rinominare.

--Cercare codice report da rinominare
select * from Report_PropertyResult with(nolock)

--Selezionare tutti i record di quel report
select * from Report_PropertyResult with(nolock)
where RPTR_Code like 'reportCode'

Man mano che vengono sistemati i report si possono eliminare da tale tabella. Qui ognuno può adottare il metodo che preferisce per segnare quali report ha fatto e quali no (es. un file excel).

--Cancellare il report dalla tabella quando sono state rinominate tutte le proprietà di quel report
delete from Report_PropertyResult where RPTR_Code like 'reportCode'

Andare nel navigatore oggetti e spuntare il quadratino "Rapporti", incollare e cercare il codice del report. Premere tasto destro e modifica per poter entrare nell'xml.

Cercare all'interno dell'xml la proprietà. Premere ctrl + F per aprire il finder e incollare all'interno la proprietà da rinominare. Valutare attentamente se tale stringa (quella che stiamo cercando all'interno del report) è una proprietà/oggetto/namespace da rinominare. Sostituire la stringa con la nuova proprietà trovandola nel file excel allegato. Salvare l'xml.

In questo caso "AbiCode" è un proprietà di "Bank". Aprire l'excel e cercare la proprietà, dovremmo trovarla nella colonna di 2015, copiare la corrispondente di 2021 ed incollarla nell'xml del report. Procedere cosi fino a terminare le proprietà del report e poi eliminarlo dalla lista e procedere con il successivo.

Il file è il seguente:

Questo è il link al file excel dove sono contenute le proprietà rinominate

Conclusioni

Dopo aver completato tutta la procedura sopra riportata, se si trovano altre proprietà man mano che si testano i report da rinominare si possono cercare anche direttamente se sono presenti negli altri report custom. Sostituire con "Recording" la proprietà interessata.

--Da eseguire per cercare se è rimasto qualcosa da rinominare o se si trovano altre proprietà
select RPTR_Code
from arm.RPT_Reports with (nolock)
where convert(nvarchar(max), DECOMPRESS(RPTR_CompressedDefinition)) like '%.Recording.%'
or convert(nvarchar(max), DECOMPRESS(RPTR_CompressedDefinition)) like 'Recording.%'
or convert(nvarchar(max), DECOMPRESS(RPTR_CompressedDefinition)) like '%.Recording%'
or convert(nvarchar(max), DECOMPRESS(RPTR_CompressedDefinition)) like ' Recording '
or convert(nvarchar(max), DECOMPRESS(RPTR_CompressedDefinition)) like '%"Recording"%'
or convert(nvarchar(max), DECOMPRESS(RPTR_CompressedDefinition)) like '%[Recording%'
and rptr_itemnature = 2