1 14 package org.compiere.apps.form; 15 16 import java.awt.BorderLayout ; 17 import java.awt.Cursor ; 18 import java.awt.Font ; 19 import java.awt.GridLayout ; 20 import java.awt.event.ActionEvent ; 21 import java.awt.event.ActionListener ; 22 import java.sql.Connection ; 23 import java.sql.PreparedStatement ; 24 import java.sql.ResultSet ; 25 import java.sql.SQLException ; 26 import java.sql.Savepoint ; 27 import java.sql.Statement ; 28 29 import javax.swing.JLabel ; 30 import javax.swing.JPanel ; 31 32 import org.compiere.apps.ADialog; 33 import org.compiere.apps.ConfirmPanel; 34 import org.compiere.grid.ed.VLookup; 35 import org.compiere.model.MLookupFactory; 36 import org.compiere.swing.CLabel; 37 import org.compiere.util.DB; 38 import org.compiere.util.DisplayType; 39 import org.compiere.util.Env; 40 import org.compiere.util.Log; 41 import org.compiere.util.Msg; 42 43 50 public class VMerge extends JPanel implements FormPanel, ActionListener 51 { 52 55 public VMerge () 56 { 57 } 59 60 private int m_WindowNo = 0; 61 62 private FormFrame m_frame; 63 64 private int m_totalCount = 0; 65 66 private StringBuffer m_errorLog = new StringBuffer (); 67 68 private Connection m_con = null; 69 70 static private String AD_ORG_ID = "AD_Org_ID"; 71 static private String C_BPARTNER_ID = "C_BPartner_ID"; 72 static private String AD_USER_ID = "AD_User_ID"; 73 static private String M_PRODUCT_ID = "M_Product_ID"; 74 75 76 static private String [] s_delete_Org = new String [] 77 {"AD_OrgInfo"}; 78 79 static private String [] s_delete_User = new String [] 80 {"AD_User_Roles"}; 81 82 static private String [] s_delete_BPartner = new String [] 83 {"C_BP_Employee_Acct", "C_BP_Vendor_Acct", "C_BP_Customer_Acct"}; 84 85 static private String [] s_delete_Product = new String [] 86 {"M_Product_PO", "M_Replenish", "M_ProductPrice", "M_Product_Costing", 87 "M_Product_Trl", "M_Product_Acct"}; 89 private String [] m_columnName = null; 90 private CLabel[] m_label = null; 91 private VLookup[] m_from = null; 92 private VLookup[] m_to = null; 93 private String [] m_deleteTables = null; 94 95 96 private BorderLayout mainLayout = new BorderLayout (); 97 private JPanel CenterPanel = new JPanel (); 98 private GridLayout centerLayout = new GridLayout (); 99 private JLabel mergeFromLabel = new JLabel (); 100 private JLabel mergeToLabel = new JLabel (); 101 private ConfirmPanel confirmPanel = new ConfirmPanel(true); 102 103 108 public void init (int WindowNo, FormFrame frame) 109 { 110 m_WindowNo = WindowNo; 111 m_frame = frame; 112 Log.trace(Log.l1_User, "VMerge.init - WinNo=" + m_WindowNo); 113 try 114 { 115 preInit(); 116 jbInit (); 117 frame.getContentPane().add(this, BorderLayout.CENTER); 118 } 120 catch (Exception ex) 121 { 122 Log.error("VMerge.init", ex); 123 } 124 } 126 129 private void preInit() 130 { 131 int count = 4; m_columnName = new String [count]; 133 m_label = new CLabel[count]; 134 m_from = new VLookup[count]; 135 m_to = new VLookup[count]; 136 137 preInit (0, 2163, DisplayType.TableDir, AD_ORG_ID); preInit (1, 2762, DisplayType.Search, C_BPARTNER_ID); preInit (2, 971, DisplayType.Search, AD_USER_ID); preInit (3, 2221, DisplayType.Search, M_PRODUCT_ID); } 144 151 private void preInit (int index, int AD_Column_ID, int displayType, String ColumnName) 152 { 153 m_columnName[index] = ColumnName; 154 String what = Msg.translate(Env.getCtx(), ColumnName); 155 m_label[index] = new CLabel(what); 156 m_from[index] = new VLookup (ColumnName, false, false, true, 157 MLookupFactory.get (Env.getCtx(), m_WindowNo, 0, AD_Column_ID, displayType), 158 displayType, m_WindowNo); 159 m_to[index] = new VLookup (ColumnName, false, false, true, 160 MLookupFactory.get (Env.getCtx(), m_WindowNo, 0, AD_Column_ID, displayType), 161 displayType, m_WindowNo); 162 } 164 168 void jbInit () throws Exception 169 { 170 this.setLayout (mainLayout); 171 mainLayout.setHgap (5); 172 mainLayout.setVgap (5); 173 this.add (confirmPanel, BorderLayout.SOUTH); 175 confirmPanel.addActionListener(this); 176 centerLayout.setHgap (5); 178 centerLayout.setVgap (5); 179 centerLayout.setColumns (3); 180 centerLayout.setRows (m_label.length+1); 181 CenterPanel.setLayout (centerLayout); 183 this.add (CenterPanel, BorderLayout.CENTER); 184 CenterPanel.add (new CLabel(), null); 185 CenterPanel.add (mergeFromLabel, null); 186 CenterPanel.add (mergeToLabel, null); 187 Font heading = mergeFromLabel.getFont(); 189 heading = new Font (heading.getName(), Font.BOLD, heading.getSize()); 190 mergeFromLabel.setFont (heading); 191 mergeFromLabel.setRequestFocusEnabled (false); 192 mergeFromLabel.setText (Msg.getMsg(Env.getCtx(), "MergeFrom")); 193 mergeToLabel.setFont (heading); 194 mergeToLabel.setText (Msg.getMsg(Env.getCtx(), "MergeTo")); 195 for (int i = 0; i < m_label.length; i++) 197 { 198 CenterPanel.add (m_label[i], null); 199 CenterPanel.add (m_from[i], null); 200 CenterPanel.add (m_to[i], null); 201 } 202 } 204 207 public void dispose() 208 { 209 m_frame.dispose(); 210 } 212 216 public void actionPerformed (ActionEvent e) 217 { 218 if (e.getActionCommand().equals(ConfirmPanel.A_CANCEL)) 219 { 220 dispose(); 221 return; 222 } 223 String columnName = null; 225 String from_Info = null; 226 String to_Info = null; 227 int from_ID = 0; 228 int to_ID = 0; 229 for (int i = 0; (i < m_columnName.length && from_ID == 0 && to_ID == 0); i++) 231 { 232 Object value = m_from[i].getValue(); 233 if (value != null) 234 { 235 if (value instanceof Integer ) 236 from_ID = ((Integer )value).intValue(); 237 else 238 continue; 239 value = m_to[i].getValue(); 240 if (value != null && value instanceof Integer ) 241 to_ID = ((Integer )value).intValue(); 242 else 243 from_ID = 0; 244 if (from_ID != 0) 245 { 246 columnName = m_columnName[i]; 247 from_Info = m_from[i].getDisplay (); 248 to_Info = m_to[i].getDisplay (); 249 } 250 } 251 } 253 if (from_ID == 0 || from_ID == to_ID) 254 return; 255 256 String msg = Msg.getMsg(Env.getCtx(), "MergeFrom") + " = " + from_Info 257 + "\n" + Msg.getMsg(Env.getCtx(), "MergeTo") + " = " + to_Info; 258 if (!ADialog.ask(m_WindowNo, this, "MergeQuestion", msg)) 259 return; 260 261 if (columnName.equals(AD_ORG_ID)) 263 m_deleteTables = s_delete_Org; 264 else if (columnName.equals(AD_USER_ID)) 265 m_deleteTables = s_delete_User; 266 else if (columnName.equals(C_BPARTNER_ID)) 267 m_deleteTables = s_delete_BPartner; 268 else if (columnName.equals(M_PRODUCT_ID)) 269 m_deleteTables = s_delete_Product; 270 271 setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 272 confirmPanel.getOKButton().setEnabled(false); 273 boolean success = merge (columnName, from_ID, to_ID); 275 confirmPanel.getOKButton().setEnabled(true); 277 setCursor(Cursor.getDefaultCursor()); 278 if (success) 280 { 281 ADialog.info (m_WindowNo, this, "MergeSuccess", msg + " #" + m_totalCount); 282 } 283 else 284 { 285 ADialog.error (m_WindowNo, this, "MergeError", m_errorLog.toString()); 286 return; 287 } 288 dispose(); 289 } 291 292 299 private boolean merge (String ColumnName, int from_ID, int to_ID) 300 { 301 String TableName = ColumnName.substring(0, ColumnName.length()-3); 302 Log.trace(Log.l4_Data, "VMerge.merge", ColumnName 303 + " - From=" + from_ID + ",To=" + to_ID); 304 305 boolean success = true; 306 m_totalCount = 0; 307 m_errorLog = new StringBuffer (); 308 String sql = "SELECT TableName " 309 + "FROM AD_Table t WHERE t.IsView='N'" 310 + " AND EXISTS (SELECT * FROM AD_Column c WHERE t.AD_Table_ID=c.AD_Table_ID" 311 + " AND c.ColumnName=?) " 312 + "ORDER BY t.LoadSeq DESC"; 313 PreparedStatement pstmt = null; 314 Savepoint sp = null; 315 try 316 { 317 m_con = DB.createConnection(false, Connection.TRANSACTION_SERIALIZABLE); 318 sp = m_con.setSavepoint("merge"); 319 pstmt = DB.prepareStatement(sql); 321 pstmt.setString(1, ColumnName); 322 ResultSet rs = pstmt.executeQuery(); 323 while (rs.next()) 324 { 325 String name = rs.getString(1); 326 if (!TableName.equals(name)) 327 { 328 int count = mergeTable (name, ColumnName, from_ID, to_ID); 329 if (count < 0) 330 success = false; 331 else 332 m_totalCount += count; 333 } 334 } 335 rs.close(); 336 pstmt.close(); 337 pstmt = null; 338 if (success) 340 { 341 sql = "DELETE " + TableName + " WHERE " + ColumnName + "=" + from_ID; 342 Statement stmt = m_con.createStatement(); 343 int count = 0; 344 try 345 { 346 count = stmt.executeUpdate (sql); 347 if (count != 1) 348 { 349 m_errorLog.append(Env.NL).append("DELETE ").append(TableName) 350 .append(" - Count=").append(count); 351 success = false; 352 } 353 } 354 catch (SQLException ex1) 355 { 356 m_errorLog.append(Env.NL).append("DELETE ").append(TableName) 357 .append(" - ").append(ex1.toString()); 358 success = false; 359 } 360 stmt.close(); 361 stmt = null; 362 } 363 if (success) 365 m_con.commit(); 366 else 367 m_con.rollback(sp); 368 m_con.close(); 369 m_con = null; 370 } 371 catch (Exception ex) 372 { 373 Log.error("VMerge.merge", ex); 374 } 375 try 377 { 378 if (pstmt != null) 379 pstmt.close(); 380 if (m_con != null) 381 m_con.close(); 382 } 383 catch (Exception ex) 384 { 385 } 386 pstmt = null; 387 m_con = null; 388 return success; 390 } 392 393 401 private int mergeTable (String TableName, String ColumnName, int from_ID, int to_ID) 402 { 403 String sql = "UPDATE " + TableName 406 + " SET " + ColumnName + "=" + to_ID 407 + " WHERE " + ColumnName + "=" + from_ID; 408 boolean delete = false; 409 for (int i = 0; i < m_deleteTables.length; i++) 410 { 411 if (m_deleteTables[i].equals(TableName)) 412 { 413 delete = true; 414 sql = "DELETE " + TableName + " WHERE " + ColumnName + "=" + from_ID; 415 } 416 } 417 418 int count = -1; 419 420 try 421 { 422 Statement stmt = m_con.createStatement (); 423 try 424 { 425 count = stmt.executeUpdate (sql); 426 Log.trace(Log.l5_DData, "VMerge.mergeTable", count 427 + (delete ? " -Delete- " : " -Update- ") + TableName); 428 } 429 catch (SQLException ex1) 430 { 431 count = -1; 432 m_errorLog.append(Env.NL).append(delete ? "DELETE " : "UPDATE ") 433 .append(TableName).append(" - ").append(ex1.toString()); 434 } 435 stmt.close(); 436 stmt = null; 437 } 438 catch (SQLException ex) 439 { 440 count = -1; 441 m_errorLog.append(Env.NL).append(delete ? "DELETE " : "UPDATE ") 442 .append(TableName).append(" - ").append(ex.toString()); 443 } 444 return count; 445 } 447 } | Popular Tags |