From 2246afb9ff34fa02a76821c8f5ac8a9e06d87f44 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Thu, 14 Mar 2019 01:34:07 +0100 Subject: [PATCH] IDEMPIERE-3916 Process to move client between databases / FHEG-599 / Additional process to migrate ID/UUID --- .../oracle/201903140056_IDEMPIERE-3916.sql | 227 ++++++++++++++ .../201903140056_IDEMPIERE-3916.sql | 224 ++++++++++++++ .../src/org/idempiere/process/MigraID.java | 278 ++++++++++++++++++ 3 files changed, 729 insertions(+) create mode 100644 migration/i6.2/oracle/201903140056_IDEMPIERE-3916.sql create mode 100644 migration/i6.2/postgresql/201903140056_IDEMPIERE-3916.sql create mode 100644 org.adempiere.base/src/org/idempiere/process/MigraID.java diff --git a/migration/i6.2/oracle/201903140056_IDEMPIERE-3916.sql b/migration/i6.2/oracle/201903140056_IDEMPIERE-3916.sql new file mode 100644 index 0000000000..81af840dca --- /dev/null +++ b/migration/i6.2/oracle/201903140056_IDEMPIERE-3916.sql @@ -0,0 +1,227 @@ +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- IDEMPIERE-3916 Process to migrate IDs +-- Mar 14, 2019 12:43:30 AM CET +INSERT INTO AD_Process (AD_Process_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,IsReport,Value,IsDirectPrint,Classname,AccessLevel,EntityType,Statistic_Count,Statistic_Seconds,IsBetaFunctionality,IsServerProcess,ShowHelp,CopyFromProcess,AD_Process_UU) VALUES (200111,0,0,'Y',TO_DATE('2019-03-14 00:43:29','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2019-03-14 00:43:29','YYYY-MM-DD HH24:MI:SS'),100,'Migrate ID','Process to migrate an ID or a UUID','N','MigrateID','N','org.idempiere.process.MigraID','4','D',0,0,'N','N','Y','N','81e52777-5d7b-4a5b-b5e2-c7a4a15c38d8') +; + +-- Mar 14, 2019 12:43:43 AM CET +INSERT INTO AD_Menu (AD_Menu_ID,Name,Description,Action,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,IsSummary,AD_Process_ID,IsSOTrx,IsReadOnly,EntityType,IsCentrallyMaintained,AD_Menu_UU) VALUES (200169,'Migrate ID','Process to migrate an ID or a UUID','P',0,0,'Y',TO_DATE('2019-03-14 00:43:43','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2019-03-14 00:43:43','YYYY-MM-DD HH24:MI:SS'),100,'N',200111,'Y','N','D','Y','f5af6aa0-8dfc-4274-a304-7a5c969b2ec8') +; + +-- Mar 14, 2019 12:43:43 AM CET +INSERT INTO AD_TreeNodeMM (AD_Client_ID,AD_Org_ID, IsActive,Created,CreatedBy,Updated,UpdatedBy, AD_Tree_ID, Node_ID, Parent_ID, SeqNo, AD_TreeNodeMM_UU) SELECT t.AD_Client_ID, 0, 'Y', SysDate, 100, SysDate, 100,t.AD_Tree_ID, 200169, 0, 999, Generate_UUID() FROM AD_Tree t WHERE t.AD_Client_ID=0 AND t.IsActive='Y' AND t.IsAllNodes='Y' AND t.TreeType='MM' AND NOT EXISTS (SELECT * FROM AD_TreeNodeMM e WHERE e.AD_Tree_ID=t.AD_Tree_ID AND Node_ID=200169) +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=0, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=218 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=1, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=153 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=2, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=263 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=3, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=166 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=4, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=203 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=5, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=53242 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=6, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=1000016 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=7, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=236 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=8, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=183 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=9, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=160 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=10, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=278 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=11, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=345 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=12, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=53296 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=13, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=53014 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=14, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=53108 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=15, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=1000036 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=16, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=1000095 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=17, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=1000091 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=0, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=161 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=1, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=367 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=2, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=456 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=3, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=501 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=4, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=326 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=5, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=566 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=6, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=392 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=7, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=113 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=8, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=220 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=9, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=351 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=10, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=289 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=11, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=302 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=12, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=200168 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=13, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=200169 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=14, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=303 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=15, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=200047 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=16, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=200048 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=17, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=321 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=18, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=461 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=19, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=53193 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=20, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=53322 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=21, Updated=SysDate WHERE AD_Tree_ID=10 AND Node_ID=383 +; + +-- Mar 14, 2019 12:47:49 AM CET +INSERT INTO AD_Reference (AD_Reference_ID,Name,ValidationType,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,EntityType,IsOrderByValue,AD_Reference_UU) VALUES (200165,'AD_Table with ID Column','T',0,0,'Y',TO_DATE('2019-03-14 00:47:48','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2019-03-14 00:47:48','YYYY-MM-DD HH24:MI:SS'),100,'D','N','5fc414bf-781e-4171-a543-6aa057de1a58') +; + +-- Mar 14, 2019 12:49:52 AM CET +INSERT INTO AD_Ref_Table (AD_Reference_ID,AD_Table_ID,AD_Key,AD_Display,WhereClause,OrderByClause,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,IsValueDisplayed,EntityType,AD_Ref_Table_UU) VALUES (200165,100,100,102,'AD_Table.IsView=''N'' AND AD_Table.IsActive=''Y'' AND EXISTS (SELECT 1 FROM AD_Column c WHERE c.AD_Table_ID=AD_Table.AD_Table_ID AND c.ColumnName=AD_Table.TableName||''_ID'' AND c.IsActive=''Y'')','AD_Table.TableName',0,0,'Y',TO_DATE('2019-03-14 00:49:52','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2019-03-14 00:49:52','YYYY-MM-DD HH24:MI:SS'),100,'N','D','62fe46c3-2b6f-4c6b-8f0d-fa05cae312c9') +; + +-- Mar 14, 2019 12:50:02 AM CET +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,AD_Reference_Value_ID,IsRange,FieldLength,IsMandatory,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,AD_Process_Para_UU,IsEncrypted) VALUES (200264,0,0,'Y',TO_DATE('2019-03-14 00:50:02','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2019-03-14 00:50:02','YYYY-MM-DD HH24:MI:SS'),100,'Table','Database Table information','The Database Table provides the information of the table definition',200111,10,30,200165,'N',22,'Y','AD_Table_ID','Y','D',126,'6411cc15-450e-43b5-886e-1d510552b951','N') +; + +-- Mar 14, 2019 12:51:17 AM CET +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,AD_Process_Para_UU,IsEncrypted) VALUES (200265,0,0,'Y',TO_DATE('2019-03-14 00:51:16','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2019-03-14 00:51:16','YYYY-MM-DD HH24:MI:SS'),100,'Record ID','Direct internal record ID','The Record ID is the internal unique identifier of a record. Please note that zooming to the record may not be successful for Orders, Invoices and Shipment/Receipts as sometimes the Sales Order type is not known.',200111,20,11,'N',22,'Y','Record_ID','Y','D',538,'e1d21139-e7d0-4501-a693-c448f4f10ae1','N') +; + +-- Mar 14, 2019 12:51:47 AM CET +INSERT INTO AD_Element (AD_Element_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,ColumnName,Name,Description,Help,PrintName,EntityType,AD_Element_UU) VALUES (203299,0,0,'Y',TO_DATE('2019-03-14 00:51:25','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2019-03-14 00:51:25','YYYY-MM-DD HH24:MI:SS'),100,'To_Record_ID','To Record ID',NULL,NULL,'To Record ID','D','355c16ed-7b65-4d77-9802-a308e6ac24f2') +; + +-- Mar 14, 2019 12:51:58 AM CET +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,AD_Process_Para_UU,IsEncrypted) VALUES (200266,0,0,'Y',TO_DATE('2019-03-14 00:51:57','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2019-03-14 00:51:57','YYYY-MM-DD HH24:MI:SS'),100,'To Record ID',200111,30,11,'N',22,'N','To_Record_ID','Y','D',203299,'5b115049-5cf3-4059-938e-9e9f26f05e37','N') +; + +-- Mar 14, 2019 12:54:00 AM CET +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,DefaultValue,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,AD_Process_Para_UU,IsEncrypted,MandatoryLogic) VALUES (200267,0,0,'Y',TO_DATE('2019-03-14 00:54:00','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2019-03-14 00:54:00','YYYY-MM-DD HH24:MI:SS'),100,'Source UUID','UUID from the source client',200111,40,10,'N',36,'N','@Record_ID:0@=0','Source_UUID','Y','D',202602,'cff91029-d160-4577-8192-6c2eef52be11','N','@Record_ID:0@=0') +; + +-- Mar 14, 2019 12:54:18 AM CET +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,DefaultValue,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,AD_Process_Para_UU,IsEncrypted,MandatoryLogic) VALUES (200268,0,0,'Y',TO_DATE('2019-03-14 00:54:17','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2019-03-14 00:54:17','YYYY-MM-DD HH24:MI:SS'),100,'Target UUID','New UUID created by the pack in client',200111,50,10,'N',36,'N','@Record_ID:0@=0','Target_UUID','Y','D',202603,'442badef-4200-45e3-9850-c62b4fdc6631','N',NULL) +; + +-- Mar 14, 2019 12:54:55 AM CET +UPDATE AD_Process_Para SET IsMandatory='N', DisplayLogic='@Source_UUID@=''''', MandatoryLogic='@Source_UUID@=''''',Updated=TO_DATE('2019-03-14 00:54:55','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=200265 +; + +-- Mar 14, 2019 12:55:03 AM CET +UPDATE AD_Process_Para SET DisplayLogic='@Source_UUID@=''''',Updated=TO_DATE('2019-03-14 00:55:03','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=200266 +; + +-- Mar 14, 2019 12:55:11 AM CET +UPDATE AD_Process_Para SET DefaultValue=NULL, DisplayLogic='@Record_ID:0@=0',Updated=TO_DATE('2019-03-14 00:55:11','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=200267 +; + +-- Mar 14, 2019 12:55:18 AM CET +UPDATE AD_Process_Para SET DefaultValue=NULL, DisplayLogic='@Record_ID:0@=0',Updated=TO_DATE('2019-03-14 00:55:18','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=200268 +; + +SELECT register_migration_script('201903140056_IDEMPIERE-3916.sql') FROM dual +; + diff --git a/migration/i6.2/postgresql/201903140056_IDEMPIERE-3916.sql b/migration/i6.2/postgresql/201903140056_IDEMPIERE-3916.sql new file mode 100644 index 0000000000..1c06819a24 --- /dev/null +++ b/migration/i6.2/postgresql/201903140056_IDEMPIERE-3916.sql @@ -0,0 +1,224 @@ +-- IDEMPIERE-3916 Process to migrate IDs +-- Mar 14, 2019 12:43:30 AM CET +INSERT INTO AD_Process (AD_Process_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,IsReport,Value,IsDirectPrint,Classname,AccessLevel,EntityType,Statistic_Count,Statistic_Seconds,IsBetaFunctionality,IsServerProcess,ShowHelp,CopyFromProcess,AD_Process_UU) VALUES (200111,0,0,'Y',TO_TIMESTAMP('2019-03-14 00:43:29','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2019-03-14 00:43:29','YYYY-MM-DD HH24:MI:SS'),100,'Migrate ID','Process to migrate an ID or a UUID','N','MigrateID','N','org.idempiere.process.MigraID','4','D',0,0,'N','N','Y','N','81e52777-5d7b-4a5b-b5e2-c7a4a15c38d8') +; + +-- Mar 14, 2019 12:43:43 AM CET +INSERT INTO AD_Menu (AD_Menu_ID,Name,Description,"action",AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,IsSummary,AD_Process_ID,IsSOTrx,IsReadOnly,EntityType,IsCentrallyMaintained,AD_Menu_UU) VALUES (200169,'Migrate ID','Process to migrate an ID or a UUID','P',0,0,'Y',TO_TIMESTAMP('2019-03-14 00:43:43','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2019-03-14 00:43:43','YYYY-MM-DD HH24:MI:SS'),100,'N',200111,'Y','N','D','Y','f5af6aa0-8dfc-4274-a304-7a5c969b2ec8') +; + +-- Mar 14, 2019 12:43:43 AM CET +INSERT INTO AD_TreeNodeMM (AD_Client_ID,AD_Org_ID, IsActive,Created,CreatedBy,Updated,UpdatedBy, AD_Tree_ID, Node_ID, Parent_ID, SeqNo, AD_TreeNodeMM_UU) SELECT t.AD_Client_ID, 0, 'Y', statement_timestamp(), 100, statement_timestamp(), 100,t.AD_Tree_ID, 200169, 0, 999, Generate_UUID() FROM AD_Tree t WHERE t.AD_Client_ID=0 AND t.IsActive='Y' AND t.IsAllNodes='Y' AND t.TreeType='MM' AND NOT EXISTS (SELECT * FROM AD_TreeNodeMM e WHERE e.AD_Tree_ID=t.AD_Tree_ID AND Node_ID=200169) +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=0, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=218 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=1, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=153 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=2, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=263 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=3, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=166 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=4, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=203 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=5, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=53242 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=6, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=1000016 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=7, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=236 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=8, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=183 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=9, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=160 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=10, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=278 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=11, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=345 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=12, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=53296 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=13, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=53014 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=14, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=53108 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=15, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=1000036 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=16, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=1000095 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=0, SeqNo=17, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=1000091 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=0, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=161 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=1, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=367 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=2, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=456 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=3, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=501 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=4, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=326 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=5, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=566 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=6, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=392 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=7, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=113 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=8, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=220 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=9, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=351 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=10, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=289 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=11, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=302 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=12, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=200168 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=13, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=200169 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=14, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=303 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=15, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=200047 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=16, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=200048 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=17, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=321 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=18, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=461 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=19, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=53193 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=20, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=53322 +; + +-- Mar 14, 2019 12:44:04 AM CET +UPDATE AD_TreeNodeMM SET Parent_ID=155, SeqNo=21, Updated=statement_timestamp() WHERE AD_Tree_ID=10 AND Node_ID=383 +; + +-- Mar 14, 2019 12:47:49 AM CET +INSERT INTO AD_Reference (AD_Reference_ID,Name,ValidationType,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,EntityType,IsOrderByValue,AD_Reference_UU) VALUES (200165,'AD_Table with ID Column','T',0,0,'Y',TO_TIMESTAMP('2019-03-14 00:47:48','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2019-03-14 00:47:48','YYYY-MM-DD HH24:MI:SS'),100,'D','N','5fc414bf-781e-4171-a543-6aa057de1a58') +; + +-- Mar 14, 2019 12:49:52 AM CET +INSERT INTO AD_Ref_Table (AD_Reference_ID,AD_Table_ID,AD_Key,AD_Display,WhereClause,OrderByClause,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,IsValueDisplayed,EntityType,AD_Ref_Table_UU) VALUES (200165,100,100,102,'AD_Table.IsView=''N'' AND AD_Table.IsActive=''Y'' AND EXISTS (SELECT 1 FROM AD_Column c WHERE c.AD_Table_ID=AD_Table.AD_Table_ID AND c.ColumnName=AD_Table.TableName||''_ID'' AND c.IsActive=''Y'')','AD_Table.TableName',0,0,'Y',TO_TIMESTAMP('2019-03-14 00:49:52','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2019-03-14 00:49:52','YYYY-MM-DD HH24:MI:SS'),100,'N','D','62fe46c3-2b6f-4c6b-8f0d-fa05cae312c9') +; + +-- Mar 14, 2019 12:50:02 AM CET +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,AD_Reference_Value_ID,IsRange,FieldLength,IsMandatory,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,AD_Process_Para_UU,IsEncrypted) VALUES (200264,0,0,'Y',TO_TIMESTAMP('2019-03-14 00:50:02','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2019-03-14 00:50:02','YYYY-MM-DD HH24:MI:SS'),100,'Table','Database Table information','The Database Table provides the information of the table definition',200111,10,30,200165,'N',22,'Y','AD_Table_ID','Y','D',126,'6411cc15-450e-43b5-886e-1d510552b951','N') +; + +-- Mar 14, 2019 12:51:17 AM CET +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,Help,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,AD_Process_Para_UU,IsEncrypted) VALUES (200265,0,0,'Y',TO_TIMESTAMP('2019-03-14 00:51:16','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2019-03-14 00:51:16','YYYY-MM-DD HH24:MI:SS'),100,'Record ID','Direct internal record ID','The Record ID is the internal unique identifier of a record. Please note that zooming to the record may not be successful for Orders, Invoices and Shipment/Receipts as sometimes the Sales Order type is not known.',200111,20,11,'N',22,'Y','Record_ID','Y','D',538,'e1d21139-e7d0-4501-a693-c448f4f10ae1','N') +; + +-- Mar 14, 2019 12:51:47 AM CET +INSERT INTO AD_Element (AD_Element_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,ColumnName,Name,Description,Help,PrintName,EntityType,AD_Element_UU) VALUES (203299,0,0,'Y',TO_TIMESTAMP('2019-03-14 00:51:25','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2019-03-14 00:51:25','YYYY-MM-DD HH24:MI:SS'),100,'To_Record_ID','To Record ID',NULL,NULL,'To Record ID','D','355c16ed-7b65-4d77-9802-a308e6ac24f2') +; + +-- Mar 14, 2019 12:51:58 AM CET +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,AD_Process_Para_UU,IsEncrypted) VALUES (200266,0,0,'Y',TO_TIMESTAMP('2019-03-14 00:51:57','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2019-03-14 00:51:57','YYYY-MM-DD HH24:MI:SS'),100,'To Record ID',200111,30,11,'N',22,'N','To_Record_ID','Y','D',203299,'5b115049-5cf3-4059-938e-9e9f26f05e37','N') +; + +-- Mar 14, 2019 12:54:00 AM CET +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,DefaultValue,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,AD_Process_Para_UU,IsEncrypted,MandatoryLogic) VALUES (200267,0,0,'Y',TO_TIMESTAMP('2019-03-14 00:54:00','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2019-03-14 00:54:00','YYYY-MM-DD HH24:MI:SS'),100,'Source UUID','UUID from the source client',200111,40,10,'N',36,'N','@Record_ID:0@=0','Source_UUID','Y','D',202602,'cff91029-d160-4577-8192-6c2eef52be11','N','@Record_ID:0@=0') +; + +-- Mar 14, 2019 12:54:18 AM CET +INSERT INTO AD_Process_Para (AD_Process_Para_ID,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,Name,Description,AD_Process_ID,SeqNo,AD_Reference_ID,IsRange,FieldLength,IsMandatory,DefaultValue,ColumnName,IsCentrallyMaintained,EntityType,AD_Element_ID,AD_Process_Para_UU,IsEncrypted,MandatoryLogic) VALUES (200268,0,0,'Y',TO_TIMESTAMP('2019-03-14 00:54:17','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2019-03-14 00:54:17','YYYY-MM-DD HH24:MI:SS'),100,'Target UUID','New UUID created by the pack in client',200111,50,10,'N',36,'N','@Record_ID:0@=0','Target_UUID','Y','D',202603,'442badef-4200-45e3-9850-c62b4fdc6631','N',NULL) +; + +-- Mar 14, 2019 12:54:55 AM CET +UPDATE AD_Process_Para SET IsMandatory='N', DisplayLogic='@Source_UUID@=''''', MandatoryLogic='@Source_UUID@=''''',Updated=TO_TIMESTAMP('2019-03-14 00:54:55','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=200265 +; + +-- Mar 14, 2019 12:55:03 AM CET +UPDATE AD_Process_Para SET DisplayLogic='@Source_UUID@=''''',Updated=TO_TIMESTAMP('2019-03-14 00:55:03','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=200266 +; + +-- Mar 14, 2019 12:55:11 AM CET +UPDATE AD_Process_Para SET DefaultValue=NULL, DisplayLogic='@Record_ID:0@=0',Updated=TO_TIMESTAMP('2019-03-14 00:55:11','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=200267 +; + +-- Mar 14, 2019 12:55:18 AM CET +UPDATE AD_Process_Para SET DefaultValue=NULL, DisplayLogic='@Record_ID:0@=0',Updated=TO_TIMESTAMP('2019-03-14 00:55:18','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Process_Para_ID=200268 +; + +SELECT register_migration_script('201903140056_IDEMPIERE-3916.sql') FROM dual +; + diff --git a/org.adempiere.base/src/org/idempiere/process/MigraID.java b/org.adempiere.base/src/org/idempiere/process/MigraID.java new file mode 100644 index 0000000000..be5c86ef37 --- /dev/null +++ b/org.adempiere.base/src/org/idempiere/process/MigraID.java @@ -0,0 +1,278 @@ +/*********************************************************************** + * This file is part of iDempiere ERP Open Source * + * http://www.idempiere.org * + * * + * Copyright (C) Contributors * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * + * MA 02110-1301, USA. * + * * + * Contributors: * + * - Carlos Ruiz - globalqss * + * Sponsored by FH * + **********************************************************************/ + +package org.idempiere.process; + +import java.util.List; +import java.util.UUID; +import java.util.logging.Level; + +import org.compiere.model.MSequence; +import org.compiere.model.MTable; +import org.compiere.model.Query; +import org.compiere.process.ProcessInfoParameter; +import org.compiere.process.SvrProcess; +import org.compiere.util.AdempiereUserError; +import org.compiere.util.DB; +import org.compiere.util.DisplayType; +import org.compiere.util.Util; + +public class MigraID extends SvrProcess { + + // Process to change the ID of a record in the whole database + + private int p_AD_Table_ID = -1; + private int p_ID_From = -1; + private int p_ID_To = -1; + private String p_UUID_From = null; + private String p_UUID_To = null; + + @Override + protected void prepare() { + // + for (ProcessInfoParameter para : getParameter()) { + String name = para.getParameterName(); + if ("AD_Table_ID".equals(name)) { + p_AD_Table_ID = para.getParameterAsInt(); + } else if ("Record_ID".equals(name)) { + p_ID_From = para.getParameterAsInt(); + } else if ("To_Record_ID".equals(name)) { + p_ID_To = para.getParameterAsInt(); + } else if ("Source_UUID".equals(name)) { + p_UUID_From = para.getParameterAsString(); + } else if ("Target_UUID".equals(name)) { + p_UUID_To = para.getParameterAsString(); + } else { + log.log(Level.SEVERE, "Unknown Parameter: " + name); + } + } + } + + @Override + protected String doIt() throws Exception { + if (p_ID_From <= 0 && Util.isEmpty(p_UUID_From)) { + throw new AdempiereUserError("Fill Record ID or UUID to convert"); + } + if (p_ID_From > 0 && ! Util.isEmpty(p_UUID_From)) { + throw new AdempiereUserError("Record ID and UUID are excluyent, just one can be converted at the same time"); + } + if (p_ID_From > 0 && p_ID_From == p_ID_To) { + throw new AdempiereUserError("Same ID"); + } + if (! Util.isEmpty(p_UUID_From) && p_UUID_From.equals(p_UUID_To)) { + throw new AdempiereUserError("Same UUID"); + } + MTable table = MTable.get(getCtx(), p_AD_Table_ID, get_TrxName()); + String tableName = table.getTableName(); + String msg = ""; + + if (! Util.isEmpty(p_UUID_From)) { + String uuidCol = MTable.getUUIDColumnName(tableName); + if (Util.isEmpty(p_UUID_To)) { + p_UUID_To = UUID.randomUUID().toString(); + } + // convert UUID + StringBuilder updUUIDSB = new StringBuilder() + .append("UPDATE ").append(tableName) + .append(" SET ").append(uuidCol).append("=?") + .append(" WHERE ").append(uuidCol).append("=?"); + int cnt = DB.executeUpdateEx(updUUIDSB.toString(), new Object[] {p_UUID_To, p_UUID_From}, get_TrxName()); + if (cnt <= 0) { + msg = "@Error@: UUID " + p_UUID_From + " not found on table " + tableName; + } else { + msg = "UUID changed on table " + tableName + " from " + p_UUID_From + " to " + p_UUID_To; + StringBuilder sqlSB = new StringBuilder() + .append("SELECT ").append(tableName).append("_ID") + .append(" FROM ").append(tableName) + .append(" WHERE ").append(uuidCol).append("=?"); + int id = DB.getSQLValueEx(get_TrxName(), sqlSB.toString(), p_UUID_To); + addBufferLog(id, null, null, msg, p_AD_Table_ID, id); + msg = "@OK@"; + } + } else { + String idCol = tableName + "_ID"; + if (p_ID_To <= 0) { + p_ID_To = DB.getNextID(getAD_Client_ID(), tableName, get_TrxName()); + } + // convert ID + int cnt = updID(tableName, idCol); + if (cnt <= 0) { + msg = "@Error@: ID " + p_ID_From + " not found on table " + tableName; + } else { + msg = "ID changed on table " + tableName + " from " + p_ID_From + " to " + p_ID_To; + addBufferLog(p_ID_From, null, null, msg, p_AD_Table_ID, p_ID_To); + msg = "@OK@"; + } + migrateReference(tableName); + migrateChildren(tableName); + migrateRecordID(); + migrateAD_Preference(idCol); + if ("C_DocType_ID".equals(idCol)) { + // special preference C_DocTypeTarget_ID + migrateAD_Preference("C_DocTypeTarget_ID"); + } + // TODO: implement migration for SingleSelectionGrid and MultipleSelectionGrid + if (p_ID_To > p_ID_From) { + MSequence seq = MSequence.get(getCtx(), tableName, get_TrxName()); + if (seq != null) { + seq.validateTableIDValue(); // ignore output messages + } + } + } + + return msg; + } + + private int updID(String tableName, String idCol) { + StringBuilder updIDSB = new StringBuilder() + .append("UPDATE ").append(tableName) + .append(" SET ").append(idCol).append("=?") + .append(" WHERE ").append(idCol).append("=?"); + int cnt = DB.executeUpdateEx(updIDSB.toString(), new Object[] {p_ID_To, p_ID_From}, get_TrxName()); + return cnt; + } + + private void migrateReference(String tableName) { + // Special cases with direct reference + int refID = -1; + switch (tableName) { + case "C_Location" : refID = DisplayType.Location; break; + case "C_ValidCombination" : refID = DisplayType.Account; break; + case "M_Locator" : refID = DisplayType.Locator; break; + case "M_AttributeSetInstance" : refID = DisplayType.PAttribute; break; + case "S_ResourceAssignment" : refID = DisplayType.Assignment; break; + case "AD_Image" : refID = DisplayType.Image; break; + case "AD_Color" : refID = DisplayType.Color; break; + case "AD_Chart" : refID = DisplayType.Chart; break; + } + if (refID > 0) { + final String selRef = "" + + "SELECT t.TableName, c.ColumnName " + + "FROM AD_Table t " + + "JOIN AD_Column c ON (t.AD_Table_ID=c.AD_Table_ID) " + + "WHERE t.IsView='N' AND t.IsActive='Y' AND c.IsActive='Y' AND c.ColumnSQL IS NULL AND c.AD_Reference_ID=? " + + "ORDER BY t.TableName, c.ColumnName"; + List> rows = DB.getSQLArrayObjectsEx(get_TrxName(), selRef, refID); + if (rows != null && rows.size() > 0) { + for (List row : rows) { + String tableRef = (String) row.get(0); + String columnRef = (String) row.get(1); + int cnt = updID(tableRef, columnRef); + if (cnt > 0) { + String msg = cnt + " reference records updated in " + tableRef + "." + columnRef; + addBufferLog(p_ID_From, null, null, msg, 0, 0); + } + } + } + } + + } + + private void migrateChildren(String tableName) { + final String sqlFK = "" + + "SELECT t.TableName, c.ColumnName " + + "FROM AD_Table t, AD_Column c, AD_Reference r " + + "WHERE t.AD_Table_ID = c.AD_Table_ID " + + " AND t.IsActive = 'Y' AND t.IsView = 'N' " + + " AND c.IsActive = 'Y' AND c.ColumnSql IS NULL " + + " AND c.AD_Reference_ID = r.AD_Reference_ID " + + " AND ( c.AD_Reference_ID IN ( 19/*Table Direct*/ ) " + + " OR ( c.AD_Reference_ID IN ( 30/*Search*/ ) " + + " AND c.AD_Reference_Value_ID IS NULL ) ) " + + " AND UPPER(c.ColumnName) = UPPER(? || '_ID') " + + "UNION " + + "SELECT t.TableName, c.ColumnName " + + "FROM AD_Table t, AD_Column c, AD_Reference r, AD_Ref_Table rt, AD_Table tr " + + "WHERE t.AD_Table_ID = c.AD_Table_ID " + + " AND t.IsActive = 'Y' AND t.IsView = 'N' " + + " AND c.IsActive = 'Y' AND c.ColumnSql IS NULL " + + " AND c.AD_Reference_ID = r.AD_Reference_ID " + + " AND ( c.AD_Reference_ID IN ( 18/*Table*/ ) " + + " OR ( c.AD_Reference_ID IN ( 30/*Search*/ ) " + + " AND c.AD_Reference_Value_ID IS NOT NULL ) ) " + + " AND c.AD_Reference_Value_ID = rt.AD_Reference_ID " + + " AND rt.AD_Table_ID = tr.AD_Table_ID " + + " AND UPPER(tr.TableName) = UPPER(?) " + + "ORDER BY 1, 2"; + List> rows = DB.getSQLArrayObjectsEx(get_TrxName(), sqlFK, tableName, tableName); + if (rows != null && rows.size() > 0) { + for (List row : rows) { + String tableRef = (String) row.get(0); + String columnRef = (String) row.get(1); + // Special cases EntityType and AD_Language + if ("EntityType".equals(columnRef) || "AD_Language".equals(columnRef)) { + continue; + } + int cnt = updID(tableRef, columnRef); + if (cnt > 0) { + String msg = cnt + " children records updated in " + tableRef + "." + columnRef; + addBufferLog(p_ID_From, null, null, msg, 0, 0); + } + } + } + // Special case for C_BPartner.AD_OrgBP_ID defined as Button in dictionary + if ("AD_Org".equalsIgnoreCase(tableName)) { + String tableRef = "C_BPartner"; + String columnRef = "AD_OrgBP_ID"; + int cnt = updID(tableRef, columnRef); + if (cnt > 0) { + String msg = cnt + " children records updated in " + tableRef + "." + columnRef; + addBufferLog(p_ID_From, null, null, msg, 0, 0); + } + } + } + + private void migrateRecordID() { + final String whereClause = "IsView='N' AND IsActive='Y'" + + " AND EXISTS (SELECT 1 FROM AD_Column ct WHERE ct.AD_Table_ID=AD_Table.AD_Table_ID AND ct.ColumnName='AD_Table_ID' AND ct.ColumnSQL IS NULL AND ct.IsActive='Y')" + + " AND EXISTS (SELECT 1 FROM AD_Column cr WHERE cr.AD_Table_ID=AD_Table.AD_Table_ID AND cr.ColumnName='Record_ID' AND cr.ColumnSQL IS NULL AND cr.IsActive='Y')"; + List tablesWithRecordID = new Query(getCtx(), "AD_Table", whereClause, get_TrxName()) + .setOrderBy("TableName") + .list(); + for (MTable table : tablesWithRecordID) { + String tableName = table.getTableName(); + StringBuilder updRISB = new StringBuilder() + .append("UPDATE ").append(tableName) + .append(" SET Record_ID=?") + .append(" WHERE Record_ID=? AND AD_Table_ID=?"); + int cnt = DB.executeUpdateEx(updRISB.toString(), new Object[] {p_ID_To, p_ID_From, p_AD_Table_ID}, get_TrxName()); + if (cnt > 0) { + String msg = cnt + " weak reference records updated in " + tableName; + addBufferLog(p_ID_From, null, null, msg, 0, 0); + } + } + } + + private void migrateAD_Preference(String columnName) { + final String updPref = "UPDATE AD_Preference SET Value=? WHERE Value=? AND Attribute=?"; + int cnt = DB.executeUpdateEx(updPref, new Object[] {String.valueOf(p_ID_To), String.valueOf(p_ID_From), columnName}, get_TrxName()); + if (cnt > 0) { + String msg = cnt + " preference records updated in AD_Preference for " + columnName; + addBufferLog(p_ID_From, null, null, msg, 0, 0); + } + } + +}