|
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 38
|
|
Запрос Для Ftsearch27.02.2013, 01:56. Показов 66029. Ответов 87
Метки нет (Все метки)
Товарищи, возникла необходимость оптимизации работы агента, долго выполняется обновление,при анализе кода было выявлено что большая часть времени тратится на операции поиска
DocumentCollection dc = database.search( "Form =\"Person\" & met!=\"1\" & @IsUnavailable($Conflict) & TabNum= \"" + tabNum + "\""); DocumentCollection dc = database.search( "(Form =\"Department\" | Form =\"Subdivision\") & @IsUnavailable($Conflict) & met!=\"1\"& ID= \"" + depID + "\""); DocumentCollection dc = database.search ("(Form =\"Department\" | Form = \"Subdivision\" )& ID=\""+parentId+"\" & met!=\"1\""); Если верить интернетам метод FTSearch работает быстрее, но вот любой из этих запросов уже не работает если его вставить в FTSearch: DocumentCollection dc = database.FTSearch( "Form =\"Person\" & met!=\"1\" & @IsUnavailable($Conflict) & TabNum= \"" + tabNum + "\""); DocumentCollection dc = database.FTSearch( "(Form =\"Department\" | Form =\"Subdivision\") & @IsUnavailable($Conflict) & met!=\"1\"& ID= \"" + depID + "\""); DocumentCollection dc = database.FTSearch("(Form =\"Department\" | Form = \"Subdivision\" )& ID=\""+parentId+"\" & met!=\"1\""); эти варианты выдают ошибку типа error message: NotesException: Notes error: Query is not understandable ((Form ="Department" Form ="Subdivision") & @IsUnavailable($Conflict) & met!="1"& ID= "1000 Подскажите как правильно написать эти запросы для метода FTSearch или может какие нибудь еще варианты есть поиска ?
0
|
|
| 27.02.2013, 01:56 | |
|
Ответы с готовыми решениями:
87
запрос для Ftsearch: подскажите как выкрутиться & @isavailable($conflict) для Ftsearch Ftsearch |
|
0 / 0 / 0
Регистрация: 27.10.2011
Сообщений: 2,124
|
|
| 06.04.2013, 14:55 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 38
|
|
| 07.04.2013, 13:44 | |
|
Вот код метода, получается что косяк в базе или вьюхе ?
Код (C++): private lotus.domino.Document findByDepID1(String depID) throws NotesException, IOException { log("findByDepID1 depID = "+depID); DocumentCollection dc =view1.getAllDocumentsByKey(depID); lotus.domino.Document tmpdoc = null; lotus.domino.Document doc = dc.getFirstDocument(); log("findByDepID1 return doc="+doc.toString()); int notNull = 0; if(dc.getCount() == 0) { log("findByDepID1 dc is empty !"); return null; } if (dc.getCount() == 1) { log("findByDepID1 doc="+doc); return dc.getFirstDocument(); } else if (dc.getCount() > 1) { while (doc != null) { log("findByDepID1 doc(>1)="+doc); if (!doc.isDeleted()) { tmpdoc = doc; notNull++; continue; } doc = dc.getNextDocument(); } } if(notNull==1) { return tmpdoc; } else { throw new RuntimeException( "Error. There are more than one departament in DB with id = " + depID); }
0
|
|
|
0 / 0 / 0
Регистрация: 27.10.2011
Сообщений: 2,124
|
|
| 07.04.2013, 13:59 | |
|
Похоже вот тут: <!--shcode--><pre><code class=java>DocumentCollection dc =view1.getAllDocumentsByKey(depID);[/CODE]
view1 не виден, скорее всего он и null
0
|
|
|
0 / 0 / 0
Регистрация: 09.12.2012
Сообщений: 101
|
||||||
| 07.04.2013, 14:22 | ||||||
|
попробуйте так:
0
|
||||||
|
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 38
|
|
| 09.04.2013, 18:08 | |
|
Возникла непонятная проблема. Некоторые записи метод getAllDocumentsByKey() не хочет находить
Вот что есть во View: Вот что в логе: SAP_log: 09.04.2013 15:21:26: CALL method findByTabNum1 SAP_log: 09.04.2013 15:21:26: findByTabNum1: tabNum = 00004226 SAP_log: 09.04.2013 15:21:26: findByTabNum1 doc = null SAP_log: 09.04.2013 15:21:26: findByTabNum dc is empty ! SAP_log: 09.04.2013 15:21:26: findByTabNum1 return doc1 = null SAP_log: 09.04.2013 15:21:26: COMPLETE method findByTabNum1 0 msec(total time). Дальше по аналогии, view лог: SAP_log: 09.04.2013 15:21:26: CALL method findByTabNum1 SAP_log: 09.04.2013 15:21:26: findByTabNum1: tabNum = 00005489 SAP_log: 09.04.2013 15:21:26: findByTabNum1 doc = null SAP_log: 09.04.2013 15:21:26: findByTabNum dc is empty ! SAP_log: 09.04.2013 15:21:26: findByTabNum1 return doc1 = null SAP_log: 09.04.2013 15:21:26: COMPLETE method findByTabNum1 16 msec(total time). START - CALL method findByDepID1 in parseContent SAP_log: 09.04.2013 15:21:26: findByDepID1: depID = 10000234 SAP_log: 09.04.2013 15:21:26: findByDepID1: Collection <dc> by key depID is empty ! SAP_log: 09.04.2013 15:21:26: docLotus1 = null SAP_log: 09.04.2013 15:21:26: FINISH - COMPLETE method findByDepID1 in parseContent 0 msec(total time). А вот эти нормально находит: START - CALL method findByDepID1 in parseContent SAP_log: 09.04.2013 15:21:26: findByDepID1: depID = 10000235 SAP_log: 09.04.2013 15:21:26: docLotus1 = 32EB97C8B5A1D37F442579FF007065B3 SAP_log: 09.04.2013 15:21:26: FINISH - COMPLETE method findByDepID1 in parseContent 16 msec(total time). SAP_log: 09.04.2013 15:21:26: CALL method findByTabNum1 SAP_log: 09.04.2013 15:21:26: findByTabNum1: tabNum = 00001724 SAP_log: 09.04.2013 15:21:26: findByTabNum1 doc = A5D019278A8440B4C325786F005FC8C9 SAP_log: 09.04.2013 15:21:26: findByTabNum1 return doc1 = A5D019278A8440B4C325786F005FC8C9 SAP_log: 09.04.2013 15:21:26: COMPLETE method findByTabNum1 31 msec(total time). SAP_log: 09.04.2013 15:21:26: CALL method findByTabNum1 SAP_log: 09.04.2013 15:21:26: findByTabNum1: tabNum = 00001725 SAP_log: 09.04.2013 15:21:26: findByTabNum1 doc = E93482DCB267D962C32572B90042FE41 SAP_log: 09.04.2013 15:21:26: findByTabNum1 return doc1 = E93482DCB267D962C32572B90042FE41 SAP_log: 09.04.2013 15:21:26: COMPLETE method findByTabNum1 31 msec(total time). Прилагаю сами методы: Код (C++): private lotus.domino.Document findByTabNum1(String tabNum) throws NotesException, IOException { if(tabNum==null || tabNum.equals("")){ log("findByTabNum1: tabNum is Nothyng or Empty"); return null; } if(view3==null){ log("findByTabNum1: view3 is Nothyng"); return null; } log("findByTabNum1: tabNum = " + tabNum); DocumentCollection dc = view3.getAllDocumentsByKey(tabNum); lotus.domino.Document tmpdoc = null; lotus.domino.Document doc = dc.getFirstDocument(); log("findByTabNum1 doc = "+doc); if(dc.getCount() == 0) { log("findByTabNum dc is empty !"); return null; } boolean isMoreThanOne = false; while (doc!=null) { if (!doc.isDeleted()) { if (tmpdoc==null){ tmpdoc = doc; }else{ isMoreThanOne = false; break; } } doc = dc.getNextDocument(doc); } if (isMoreThanOne) { if (tmpdoc!=null) tmpdoc.recycle(); if (doc!=null) doc.recycle(); if (dc!=null) dc.recycle(); log("findByTabNum1: There are more than one emploees in DB with id = " + tabNum); throw new RuntimeException("Error. There are more than one emploees in DB with id = " + tabNum); }else{ if (tmpdoc==null){ if (doc!=null) doc.recycle(); if (dc!=null) dc.recycle(); log("findByTabNum1: There is no available(not conflict) doc with id = " + tabNum); return null; }else{ if (dc!=null) dc.recycle(); return tmpdoc; } } } Код (C++): private lotus.domino.Document findByDepID1(String depID) throws NotesException, IOException { if(depID==null || depID.equals("")){ log("findByDepID1: depID is Nothyng or Empty"); return null; } if(view1==null){ log("findByDepID1: view1 is Nothyng"); return null; } log("findByDepID1: depID = " + depID); DocumentCollection dc = view1.getAllDocumentsByKey(depID); if(dc.getCount()==0) { log("findByDepID1: Collection <dc> by key depID is empty !"); dc.recycle(); return null; } boolean isMoreThanOne = false; lotus.domino.Document tmpdoc = null; lotus.domino.Document doc = dc.getFirstDocument(); while (doc!=null) { if (!doc.isDeleted()) { if (tmpdoc==null){ tmpdoc = doc; }else{ isMoreThanOne = false; break; } } doc = dc.getNextDocument(doc); } if (isMoreThanOne) { if (tmpdoc!=null) tmpdoc.recycle(); if (doc!=null) doc.recycle(); if (dc!=null) dc.recycle(); log("findByDepID1: There are more than one departament in DB with id = " + depID); throw new RuntimeException("Error. There are more than one departament in DB with id = " + depID); }else{ if (tmpdoc==null){ if (doc!=null) doc.recycle(); if (dc!=null) dc.recycle(); log("findByDepID1: There is no available(not conflict) doc with id = " + depID); return null; }else{ if (dc!=null) dc.recycle(); return tmpdoc; } } } Мне еще интересно почему на каждый id во вью получается как бы по 2 записи минимум. И получается если находит такой вариант, то возвращает нормально 1 документ, если находит больше, то возвращает null и похоже создает новую такую же запись, т.е. добавляет к уже существующим. Вообще сейчас обновление справочника проходит очень быстро(раньше это было часов 10-12, сейчас 5 минут! ), но возникла эта проблема с дублированием записей, помогите плиз, какие есть варианты ? Если что то нужно(код, скрины, вью) запрашивайте, предоставлю
0
|
|
|
0 / 0 / 0
Регистрация: 27.10.2011
Сообщений: 2,124
|
||
| 09.04.2013, 18:30 | ||
Что происходит после вызова findByDepID1 и findByTabNum1 если они возвращают null. по поводу: SAP_log: 09.04.2013 15:21:26: findByDepID1: depID = 10000234 SAP_log: 09.04.2013 15:21:26: findByDepID1: Collection <dc> by key depID is empty ! Уже крыша едет... может все же пробел какой из xml приходит в конце? вот такой подход покажет, есть ли там пробел, в обе функции добавить надо. <!--shcode--><pre><code class=java>log("findByDepID1: depID = " + depID + "*");[/CODE] и лучше использовать в функциях: Код (C++): view1.getAllDocumentsByKey(depID, true) true делает точный поиск, а не частичный. Почему поиск ломается, если пробела нет.. даже не знаю. Эта вьюха используется где-то еще? если нет - удалить вторую,третью и четвертую колонки (узкие которые), там категоризация нам она не нужна.
0
|
||
|
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 38
|
|
| 10.04.2013, 11:21 | |
|
Вот опять ничего не нашел по этой записи
SAP_log: 11.04.2013 10:16:25: START - CALL method findByDepID1 in parseContent SAP_log: 11.04.2013 10:16:25: findByDepID1: depID = 10000234* SAP_log: 11.04.2013 10:16:25: findByDepID1: Collection <dc> by key depID is empty ! SAP_log: 11.04.2013 10:16:25: docLotus1 = null SAP_log: 11.04.2013 10:16:25: FINISH - COMPLETE method findByDepID1 in parseContent 15 msec(total time). SAP_log: 11.04.2013 10:16:25: *Before operation* For department [ID] = 10000234. [Parent_ID]: 10000233. [docIDValue]: . [catDocIDValue]: SAP_log: 11.04.2013 10:16:25: CALL method getDocIDByParentID1 SAP_log: 11.04.2013 10:16:25: getDocIDByParentID1: parentId = 10000233* SAP_log: 11.04.2013 10:16:25: DocumentCollection doc in getDocIDByParentID1 = 04CE48E05B8BACA2442579FF0070655F SAP_log: 11.04.2013 10:16:25: parentDocIDValue1 = 04CE48E05B8BACA2442579FF0070655F SAP_log: 11.04.2013 10:16:25: COMPLETE method getDocIDByParentID1 16 msec(total time). SAP_log: 11.04.2013 10:16:25: *After operation* For department [ID] = 10000234. [Parent_ID]: 10000233. [docIDValue]: AB14BDDEFC59243F44257B4A0022767A. [catDocIDValue]: 04CE48E05B8BACA2442579FF0070655F SAP_log: 11.04.2013 10:16:25: CALL method findByTabNum1 SAP_log: 11.04.2013 10:16:25: findByTabNum1: tabNum = 00001723* SAP_log: 11.04.2013 10:16:25: findByTabNum1 doc = null SAP_log: 11.04.2013 10:16:25: findByTabNum dc is empty ! SAP_log: 11.04.2013 10:16:25: findByTabNum1 return doc1 = null SAP_log: 11.04.2013 10:16:25: COMPLETE method findByTabNum1 0 msec(total time). SAP_log: 11.04.2013 10:16:25: getDocIDByParentID1: parentId = 10000234* SAP_log: 11.04.2013 10:16:25: findByDepID1: Collection <dc> by key depID is empty ! SAP_log: 11.04.2013 10:16:25: DocIDValue1 in bindingByCatDocID = null SAP_log: 11.04.2013 10:16:25: *Before start*For employee [TabNum]: 00001723. [divIDValue]: 10000234. [catDocIDValue]: [DocIDValue]: null SAP_log: 11.04.2013 10:16:25: *After start* For employee [TabNum]: 00001723. [divIDValue]: 10000234. [catDocIDValue]: [DocIDValue]: null SAP_log: 11.04.2013 10:16:25: CALL method findByTabNum1 SAP_log: 11.04.2013 10:16:25: findByTabNum1: tabNum = 00004226* SAP_log: 11.04.2013 10:16:25: findByTabNum1 doc = null SAP_log: 11.04.2013 10:16:25: findByTabNum dc is empty ! SAP_log: 11.04.2013 10:16:25: findByTabNum1 return doc1 = null SAP_log: 11.04.2013 10:16:25: COMPLETE method findByTabNum1 0 msec(total time). SAP_log: 11.04.2013 10:16:25: getDocIDByParentID1: parentId = 10000234* SAP_log: 11.04.2013 10:16:25: findByDepID1: Collection <dc> by key depID is empty ! SAP_log: 11.04.2013 10:16:25: DocIDValue1 in bindingByCatDocID = null SAP_log: 11.04.2013 10:16:25: *Before start*For employee [TabNum]: 00004226. [divIDValue]: 10000234. [catDocIDValue]: [DocIDValue]: null SAP_log: 11.04.2013 10:16:25: *After start* For employee [TabNum]: 00004226. [divIDValue]: 10000234. [catDocIDValue]: [DocIDValue]: null SAP_log: 11.04.2013 10:16:25: CALL method findByTabNum1 SAP_log: 11.04.2013 10:16:25: findByTabNum1: tabNum = 00004611* SAP_log: 11.04.2013 10:16:25: findByTabNum1 doc = null SAP_log: 11.04.2013 10:16:25: findByTabNum dc is empty ! SAP_log: 11.04.2013 10:16:25: findByTabNum1 return doc1 = null SAP_log: 11.04.2013 10:16:25: COMPLETE method findByTabNum1 0 msec(total time). SAP_log: 11.04.2013 10:16:25: getDocIDByParentID1: parentId = 10000234* SAP_log: 11.04.2013 10:16:25: findByDepID1: Collection <dc> by key depID is empty ! SAP_log: 11.04.2013 10:16:25: DocIDValue1 in bindingByCatDocID = null SAP_log: 11.04.2013 10:16:25: *Before start*For employee [TabNum]: 00004611. [divIDValue]: 10000234. [catDocIDValue]: [DocIDValue]: null SAP_log: 11.04.2013 10:16:25: *After start* For employee [TabNum]: 00004611. [divIDValue]: 10000234. [catDocIDValue]: [DocIDValue]: null SAP_log: 11.04.2013 10:16:25: CALL method findByTabNum1 SAP_log: 11.04.2013 10:16:25: findByTabNum1: tabNum = 00005489* SAP_log: 11.04.2013 10:16:25: findByTabNum1 doc = null SAP_log: 11.04.2013 10:16:25: findByTabNum dc is empty ! SAP_log: 11.04.2013 10:16:25: findByTabNum1 return doc1 = null SAP_log: 11.04.2013 10:16:25: COMPLETE method findByTabNum1 16 msec(total time). SAP_log: 11.04.2013 10:16:26: getDocIDByParentID1: parentId = 10000234* SAP_log: 11.04.2013 10:16:26: findByDepID1: Collection <dc> by key depID is empty ! SAP_log: 11.04.2013 10:16:26: DocIDValue1 in bindingByCatDocID = null SAP_log: 11.04.2013 10:16:26: *Before start*For employee [TabNum]: 00005489. [divIDValue]: 10000234. [catDocIDValue]: [DocIDValue]: null SAP_log: 11.04.2013 10:16:26: *After start* For employee [TabNum]: 00005489. [divIDValue]: 10000234. [catDocIDValue]: [DocIDValue]: null Пробелов в id нету. Вьюха используется только для данного метода поиска. Может нужно формулу отбора вьюхи переделать ? что бы она выводила только одну запись на конкретный id или еще как. Вот предоставляю весь код самого агента: <!--shcode--><pre><code class=java>import java.io.DataOutputStream; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.io.Writer; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Properties; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory ; import javax.xml.parsers.ParserConfigurationExc eption; import lotus.domino.AgentBase; import lotus.domino.Database; import lotus.domino.DbDirectory; import lotus.domino.DocumentCollection; import lotus.domino.Log; import lotus.domino.View; import lotus.domino.NotesException; import lotus.domino.Session; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import com.enterprisedt.net.ftp.FTPException; import com.enterprisedt.net.ftp.FTPFile; import com.enterprisedt.net.ftp.FileTransferCli ent; public class SAPToLotus extends AgentBase { private static String PROPERTIES_FILE_ADDR = "propertiesSAPLotusAgent.ini"; private static String LOG_FILE_ADDR ="SAPAgentLog.txt"; private static DateFormat DF = new SimpleDateFormat ("dd.MM.yyyy HH:mm:ss"); private DataOutputStream outputStream = null; private Properties properties = new Properties(); private Database database; private Session session; private Log logger; //private View view; private View view1; private View view2; private View view3; private int depIns = 0, depUpd=0, empIns=0, empUpd=0; private void loadProperties() throws IOException, NotesException { FileInputStream in = new FileInputStream(PROPERTIES_FILE_ADDR); logger.logAction("File with properties was found"); properties.load(in); in.close(); logger.logAction("Properties are loaded"); log("Properties are loaded"); } private void parseXMLFile() throws Exception, SAXException, IOException, NotesException, ParseException, FTPException { String filePath = loadFile(); if (filePath == null){ log("parseXMLFile is null. Nothyng to do."); return;// файл не был загружен } else{ log("Data from file: " + filePath + " will be inserted in Lotus Database"); } File file = null; try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); file = new File(filePath); Document doc = db.parse(file); doc.getDocumentElement().normalize(); log("SAP xml file is read"); log("Start parsing SAP xml file"); parseContent(doc); } catch (Exception e) { log("Error process file " + filePath); throw e; } file.renameTo( new File(file.getAbsoluteFile()+".stage") ); } private String loadFile() throws IOException, FTPException, ParseException { String ftpName = properties.getProperty("ftp"); String ftpDirectory = properties.getProperty("ftp_directory"); if ( ftpName != null ) { // в настроках указан ftp => загружаем с ftp FileTransferClient ftp = new FileTransferClient(); ftp.setRemoteHost( ftpName ); ftp.setUserName( properties.getProperty("login") ); ftp.setPassword( properties.getProperty("password") ); ftp.connect(); log("Connected to FTP " + ftpName); log("Start working with FTP Directory "+ ftpDirectory); FTPFile[] files = ftp.directoryList( ftpDirectory ); log("Directory " + ftpDirectory + "has " + files.length); LotusFileFilter filter = new LotusFileFilter(properties); int numFiles = 0; FTPFile ftpFile = null; for (int i = 0; i < files.length; i++) { log("Found file: " + files.getName()); if ( filter.accept( files.getName() ) ) { numFiles ++; ftpFile = files; } } // for if (ftpFile == null){ log("There is no files to process. Nothyng to do. "); return null; } if ( !isCorrectFileNumber( numFiles ) ){ log("Error. There are more than one file. "); } String ftpFileAdr = ftpFile.getPath() +/+ ftpFile.getName(); log("Full FTP file address: "+ftpFileAdr); log("Rename "+ftpFileAdr+" into "+ ftpFileAdr+".stage"); ftp.rename(ftpFileAdr, ftpFileAdr+".stage"); // загружаем локально файл log("Start download "+ ftpFileAdr+".stage into "+properties.getProperty("ftp_directory_ local")+ " with name " + ftpFile.getName()); String localFileName = ftpFile.getName(); String localFileAbsolutePath = properties.getProperty("ftp_directory_lo cal") + localFileName; ftp.downloadFile( localFileAbsolutePath, ftpFileAdr+".stage"); log ("File " + ftpFileAdr + ".stage" + " was downloaded from FTP into " + localFileAbsolutePath); log("Deleting FTP file " + ftpFileAdr+ ".stage"); ftp.deleteFile(ftpFileAdr+ ".stage"); log("FTP File deleted: "+ ftpFileAdr+ ".stage"); log("Start disconnect from FTP"); ftp.disconnect(); log("Connection was disconnected"); return localFileAbsolutePath; // return loadLocalFile( properties.getProperty("ftp_directory_lo cal") ); } return null; } private File loadLocalFile(String directoryName) throws IOException { File dir = new File(directoryName); log("Get list of files from " + directoryName); File[] files = dir.listFiles( new LotusFileFilter(properties) ); log("Directory " + directoryName + " has " + files.length + " files"); if ( !isCorrectFileNumber( files.length ) ) return null; return files[0]; } private boolean isCorrectFileNumber(int number) throws IOException { if (number == 0) { log("There are no files to load in Lotus"); return false; } if (number > 1) { log("There are more than one xml file to load in Lotus"); return false; } return true; } private void parseContent(Document doc) throws NotesException, ParseException, IOException { NodeList departments = doc.getElementsByTagName("dep"); // получили все департаменты for (int i=0; i<departments.getLength(); i++) { // обходим все департаменты Element dep = (Element)departments.item(i); String depID = getTextContent( dep.getElementsByTagName("ID").item(0) ); //long timer = System.currentTimeMillis(); //log("CALL method findByDepID"); //lotus.domino.Document docLotus = findByDepID(depID); //log("docLotus = "+docLotus); //log("COMPLETE method findByDepID "+new Long(System.currentTimeMillis()-timer).toString()+" msec(total time)."); long timer1 = System.currentTimeMillis(); log("START - CALL method findByDepID1 in parseContent"); lotus.domino.Document docLotus = findByDepID1(depID); log("docLotus1 = "+docLotus); log("FINISH - COMPLETE method findByDepID1 in parseContent "+new Long(System.currentTimeMillis()-timer1).toString()+" msec(total time)."); if (docLotus != null) { // нашли департамент updateDepartment(docLotus, dep); depUpd++; } else { // департамента нет insertNewDepartment(dep); depIns++; } NodeList employees = dep.getElementsByTagName("employees"); updateEmployees(depID, employees); } // for log("----------------------------------------"); log("Departments was updated = " + depUpd); log("Departments was inserted = " + depIns); log("Employees was updates = " + empUpd); log("Employees was inserted = " + empIns); } //method only for Departments private void createIDsFields(lotus.domino.Document lotusDoc) throws NotesException, IOException{ String universalID = lotusDoc.getUniversalID(); String docIDValue = lotusDoc.getItemValueString("DocID"); String parentIDValue = lotusDoc.getItemValueString("Parent_id") ; boolean catDocIDHasItem = lotusDoc.hasItem("CatDocID"); String catDocIDValue = lotusDoc.getItemValueString("CatDocID"); log("*Before operation* For department [ID] = "+lotusDoc.getItemValueString("ID")+ ". [Parent_ID]: "+parentIDValue+". [docIDValue]: "+docIDValue+". [catDocIDValue]: "+catDocIDValue); if (docIDValue == null || docIDValue.equals("")){ lotusDoc.appendItemValue("DocID", universalID); } else { lotusDoc.replaceItemValue("DocID", universalID); } if(!catDocIDHasItem){ //long timer = System.currentTimeMillis(); //log("CALL method getDocIDByParentID"); //String parentDocIDValue = getDocIDByParentID(parentIDValue); //log("parentDocIDValue = "+parentDocIDValue); //log("COMPLETE method getDocIDByParentID "+new Long(System.currentTimeMillis()-timer).toString()+" msec(total time)."); long timer1 = System.currentTimeMillis(); log("CALL method getDocIDByParentID1"); String parentDocIDValue = getDocIDByParentID1(parentIDValue); log("parentDocIDValue1 = "+parentDocIDValue); log("COMPLETE method getDocIDByParentID1 "+new Long(System.currentTimeMillis()-timer1).toString()+" msec(total time)."); if(parentDocIDValue != null) { lotusDoc.appendItemValue("CatDocID", parentDocIDValue); } } else { //long timer = System.currentTimeMillis(); //log("CALL method getDocIDByParentID"); //String parentDocIDValue = getDocIDByParentID(parentIDValue); //log("parentDocIDValue = "+parentDocIDValue); //log("COMPLETE method getDocIDByParentID "+new Long(System.currentTimeMillis()-timer).toString()+" msec(total time)."); long timer1 = System.currentTimeMillis(); log("CALL method getDocIDByParentID1"); String parentDocIDValue = getDocIDByParentID1(parentIDValue); log("parentDocIDValue1 = "+parentDocIDValue); log("COMPLETE method getDocIDByParentID1 "+new Long(System.currentTimeMillis()-timer1).toString()+" msec(total time)."); if(parentDocIDValue != null) { if(!catDocIDValue.equals(parentDocIDValu e)) { log("CatDocID and Parent DocID not equals. Will be changed"); lotusDoc.replaceItemValue("CatDocID", parentDocIDValue); } } } //for logging docIDValue = lotusDoc.getItemValueString("DocID"); parentIDValue = lotusDoc.getItemValueString("Parent_id") ; catDocIDValue = lotusDoc.getItemValueString("CatDocID"); log("*After operation* For department [ID] = "+lotusDoc.getItemValueString("ID")+ ". [Parent_ID]: "+parentIDValue+". [docIDValue]: "+docIDValue+". [catDocIDValue]: "+catDocIDValue); } private String getDocIDByParentID(String parentId) throws NotesException, IOException{ log("parentId in getDocIDByParentID = "+parentId); if (parentId == null || parentId.equals("") || parentId.equals("0")){ return null; } DocumentCollection dc = database.search ("(Form =\"Department\" | Form = \"Subdivision\" )& ID=\""+parentId+"\" & met!=\"1\""); lotus.domino.Document doc = dc.getFirstDocument(); log("DocumentCollection doc in getDocIDByParentID = "+doc); int count = dc.getCount(); log("dc.getCount()long = "+new Long(count).toString()+" dc.getCount()int = "+count); if(dc.getCount() == 1){ String docID = dc.getFirstDocument().getItemValueString ("DocID"); log("docID in getDocIDByParentID(dc.getCount() == 1) = "+docID); return dc.getFirstDocument().getItemValueString ("DocID"); } else { String docID = dc.getFirstDocument().getItemValueString ("DocID"); log("BEFORE EXOPTION, docID in getDocIDByParentID = "+docID); throw new RuntimeException("Children has more one parent"); } } private String getDocIDByParentID1(String parentId) throws NotesException, IOException{ if(view2==null){ log("getDocIDByParentID1: view2 is Nothyng"); return null; } log("getDocIDByParentID1: parentId = " + parentId +"*"); if (parentId == null || parentId.equals("") || parentId.equals("0")){ log("getDocIDByParentID1: parentId is Nothyng or Empty"); return null; } DocumentCollection dc = view2.getAllDocumentsByKey(parentId,true ); if(dc.getCount()==0) { log("findByDepID1: Collection <dc> by key depID is empty !"); dc.recycle(); return null; } lotus.domino.Document doc = dc.getFirstDocument(); log("DocumentCollection doc in getDocIDByParentID1 = "+doc); lotus.domino.Document tmpdoc = null; boolean isMoreThanOne = false; while (doc!=null) { if (!doc.isDeleted()) { if (tmpdoc==null){ tmpdoc = doc; }else{ isMoreThanOne = false; break; } } doc = dc.getNextDocument(doc); } if (isMoreThanOne) { if (tmpdoc!=null) tmpdoc.recycle(); if (doc!=null) doc.recycle(); if (dc!=null) dc.recycle(); log("getDocIDByParentID1: There are more than one departament in DB with id = " + parentId); throw new RuntimeException("Error. There are more than one departament in DB with id = " + parentId); }else{ if (tmpdoc==null){ if (doc!=null) doc.recycle(); if (dc!=null) dc.recycle(); log("getDocIDByParentID1: There is no available(not conflict) doc with id = " + parentId); return null; }else{ if (dc!=null) dc.recycle(); return tmpdoc.toString(); } } } //method only for employees private void bindingByCatDocID(lotus.domino.Document employeeDoc) throws NotesException, IOException{ String divIDValue = employeeDoc.getItemValueString("DIV_ID") ; //if doc hasnt Item with name CatDocID method getItemValueString("CatDocID") return // null or ""(empty) need use for checking Item hasItem, which return boolean true if item //exists or false if not. String catDocIDValue = employeeDoc.getItemValueString("CatDocID "); boolean catDocIDHasItem = employeeDoc.hasItem("CatDocID"); //CatDocID for binding with parent must contain DocID parent department //String DocIDValue = getDocIDByParentID(divIDValue); //log("DocIDValue in bindingByCatDocID = "+DocIDValue); String DocIDValue = getDocIDByParentID1(divIDValue); log("DocIDValue1 in bindingByCatDocID = "+DocIDValue); String tabNum = employeeDoc.getItemValueString("TabNum") ; log("*Before start*For employee [TabNum]: "+tabNum+". [divIDValue]: "+divIDValue+". [catDocIDValue]: "+catDocIDValue+"[DocIDValue]: "+DocIDValue); if(DocIDValue !=null && !DocIDValue.equals("")){ if(!catDocIDHasItem){ employeeDoc.appendItemValue("CatDocID", DocIDValue); } else { if(!catDocIDValue.equals(DocIDValue)) { log("CatDocID and Parent DocID not equals. Will be changed"); employeeDoc.replaceItemValue("CatDocID", DocIDValue); } } } //for logging divIDValue = employeeDoc.getItemValueString("DIV_ID") ; catDocIDValue = employeeDoc.getItemValueString("CatDocID "); log("*After start* For employee [TabNum]: "+tabNum+". [divIDValue]: "+divIDValue+". [catDocIDValue]: "+catDocIDValue+"[DocIDValue]: "+DocIDValue); } private void updateEmployees(String depID, NodeList employeesList) throws NotesException, ParseException,IOException { Element employeesNode = null; if (employeesList.getLength() > 0) // в XML есть элкементы <employees> employeesNode = (Element)employeesList.item(0); else // нет return; NodeList empList = employeesNode.getElementsByTagName("emp" ); // получили всех работников for (int i=0; i < empList.getLength(); i++) { // обходим всех работников Element emp = (Element)empList.item(i); String tabNum = getTextContent( emp.getElementsByTagName("TabNum").item( 0) ); //long timer = System.currentTimeMillis(); //log("CALL method findByTabNum"); //lotus.domino.Document doc = findByTabNum(tabNum); //log("findByTabNum return doc = "+doc); //log("COMPLETE method findByTabNum "+new Long(System.currentTimeMillis()-timer).toString()+" msec(total time)."); long timer1 = System.currentTimeMillis(); log("CALL method findByTabNum1"); lotus.domino.Document doc = findByTabNum1(tabNum); log("findByTabNum1 return doc1 = "+doc); log("COMPLETE method findByTabNum1 "+new Long(System.currentTimeMillis()-timer1).toString()+" msec(total time)."); if (doc != null) { // нашли работника updateEmp(doc, emp); empUpd ++; } else { // работника нет insertNewEmp(emp); empIns++; } }// for } private void insertNewEmp(Element emp) throws NotesException, ParseException, IOException { lotus.domino.Document doc = database.createDocument(); NodeList params = emp.getChildNodes(); for (int x = 0; x < params.getLength(); x++) { Node param = params.item(x); String nodeName = param.getNodeName(); if ( !nodeName.equalsIgnoreCase("#text") ) { // элемент не пустышка String value = getTextContent( param ); if (nodeName.equalsIgnoreCase("BDate") || nodeName.equalsIgnoreCase("JobDate") || nodeName.equalsIgnoreCase("Date_Pr") || nodeName.equalsIgnoreCase("Startday") ) { insertDateItem(doc, nodeName, value); if(nodeName.equalsIgnoreCase("BDate")) { insertDateItem(doc, "BDate_1", value); } } else if (nodeName.equalsIgnoreCase("Index")){ if(value != null && value !="") { doc.appendItemValue(nodeName, new Integer(value) ); } } else {// все остальные типы doc.appendItemValue(nodeName, value); } } } if ( !doc.save(true) ) {// сохраняем измененные данные в департаменте log("The document wasnt save. Document = " + doc.generateXML()); //throw new RuntimeException("The document wasnt save. Document = " + doc.generateXML()); } bindingByCatDocID(doc); if ( !doc.save(true) ) {// сохраняем измененные данные в департаменте log("The document wasnt save. Document = " + doc.generateXML()); //throw new RuntimeException("The document wasnt save. Document = " + doc.generateXML()); } doc.recycle(); } private void insertNewDepartment(Element dep) throws NotesException, ParseException,IOException { lotus.domino.Document doc = database.createDocument(); NodeList params = dep.getChildNodes(); for (int x = 0; x < params.getLength(); x++) { Node param = params.item(x); String nodeName = param.getNodeName(); if ( nodeName.equalsIgnoreCase("employees") ) // эти данные будем отдельно вставлять continue; if ( !nodeName.equalsIgnoreCase("#text") ) { // элемент не пустышка String value = getTextContent( param ); if (nodeName.equalsIgnoreCase("move_date")) { insertDateItem(doc, nodeName, value); } else if (nodeName.equalsIgnoreCase("Index")) { if(value != null && value !="") { doc.appendItemValue(nodeName, new Integer(value) ); } } else { doc.appendItemValue(nodeName, value); } } } if ( !doc.save(true) ) { // сохраняем измененные данные в департаменте log("The document wasnt save. Document = " + doc.generateXML()); //throw new RuntimeException("The document wasnt save. Document = " + doc.generateXML()); } createIDsFields(doc); if ( !doc.save(true) ) { // сохраняем измененные данные в департаменте log("The document wasnt save. Document = " + doc.generateXML()); //throw new RuntimeException("The document wasnt save. Document = " + doc.generateXML()); } doc.recycle(); } private void updateEmp(lotus.domino.Document doc, Element emp) throws NotesException, ParseException, IOException { NodeList params = emp.getChildNodes(); for (int x = 0; x < params.getLength(); x++) { Node param = params.item(x); String nodeName = param.getNodeName(); if ( nodeName.equalsIgnoreCase("TabNum") ) continue; if ( !nodeName.equalsIgnoreCase("#text") ) { // элемент не пустышка String value = getTextContent( param ); if (nodeName.equalsIgnoreCase("BDate") || nodeName.equalsIgnoreCase("JobDate") || nodeName.equalsIgnoreCase("Date_Pr") || nodeName.equalsIgnoreCase("Startday") ) { updateDateItem(doc, nodeName, value); if(nodeName.equalsIgnoreCase("BDate")) { updateDateItem(doc, "BDate_1", value); } } else if (nodeName.equalsIgnoreCase("Index")) { if(value != null && value !="") { doc.replaceItemValue(nodeName, new Integer(value) ); } } else {// все остальные типы doc.replaceItemValue(nodeName, value); } } } if ( !doc.save(true) ) { // сохраняем измененные данные log("The document wasnt save. Document = " + doc.generateXML()); //throw new RuntimeException("The document wasnt save. Document = " + doc.generateXML()); } bindingByCatDocID(doc); if ( !doc.save(true) ) { // сохраняем измененные данные log("The document wasnt save. Document = " + doc.generateXML()); //throw new RuntimeException("The document wasnt save. Document = " + doc.generateXML()); } doc.recycle(); } private void updateDepartment(lotus.domino.Document doc, Element dep) throws NotesException, ParseException,IOException { NodeList params = dep.getChildNodes(); for (int x = 0; x < params.getLength(); x++) { Node param = params.item(x); String nodeName = param.getNodeName(); if ( nodeName.equalsIgnoreCase("ID") || nodeName.equalsIgnoreCase("employees") ) continue; if ( !nodeName.equalsIgnoreCase("#text") ) { // элемент не пустышка String value = getTextContent( param ); if (nodeName.equalsIgnoreCase("move_date")) { updateDateItem(doc, nodeName, value); } else if (nodeName.equalsIgnoreCase("Index")) { if(value != null && value !="") { doc.appendItemValue(nodeName, new Integer(value) ); } } else {// все остальные типы doc.replaceItemValue(nodeName, value); } } } if ( !doc.save(true) ) { // сохраняем измененные данные в департаменте log("The document wasnt save. Document = " + doc.generateXML()); //throw new RuntimeException("The document wasnt save. Document = " + doc.generateXML()); } createIDsFields(doc); if ( !doc.save(true) ) { // сохраняем измененные данные в департаменте log("The document wasnt save. Document = " + doc.generateXML()); //throw new RuntimeException("The document wasnt save. Document = " + doc.generateXML()); } doc.recycle(); } private lotus.domino.Document findByTabNum(String tabNum) throws NotesException, IOException { log("findByTabNum1 tabNum = "+tabNum); DocumentCollection dc = database.search( "Form =\"Person\" & met!=\"1\" & @IsUnavailable($Conflict) & TabNum= \"" + tabNum + "\""); lotus.domino.Document tmpdoc = null; lotus.domino.Document doc = dc.getFirstDocument(); int notNull = 0; if(dc.getCount() == 0) { log("findByTabNum dc is empty !"); return null; } if (dc.getCount() == 1) { log("findByTabNum doc="+doc); return doc; } else if (dc.getCount() > 1) { while (doc != null) { log("findByTabNum doc(>1)="+doc); if (!doc.isDeleted()) { tmpdoc = doc; notNull++; continue; } doc = dc.getNextDocument(); } } if(notNull==1) { return tmpdoc; } else { throw new RuntimeException( "Error. There are more than one employee in DB with TabNum = " + tabNum + "and they have \"isDeleted=true\" flag"); } } private lotus.domino.Document findByTabNum1(String tabNum) throws NotesException, IOException { if(tabNum==null || tabNum.equals("")){ log("findByTabNum1: tabNum is Nothyng or Empty"); return null; } if(view3==null){ log("findByTabNum1: view3 is Nothyng"); return null; } log("findByTabNum1: tabNum = " + tabNum +"*"); DocumentCollection dc = view3.getAllDocumentsByKey(tabNum,true); lotus.domino.Document tmpdoc = null; lotus.domino.Document doc = dc.getFirstDocument(); log("findByTabNum1 doc = "+doc); if(dc.getCount() == 0) { log("findByTabNum dc is empty !"); return null; } boolean isMoreThanOne = false; while (doc!=null) { if (!doc.isDeleted()) { if (tmpdoc==null){ tmpdoc = doc; }else{ isMoreThanOne = false; break; } } doc = dc.getNextDocument(doc); } if (isMoreThanOne) { if (tmpdoc!=null) tmpdoc.recycle(); if (doc!=null) doc.recycle(); if (dc!=null) dc.recycle(); log("findByTabNum1: There are more than one emploees in DB with id = " + tabNum); throw new RuntimeException("Error. There are more than one emploees in DB with id = " + tabNum); }else{ if (tmpdoc==null){ if (doc!=null) doc.recycle(); if (dc!=null) dc.recycle(); log("findByTabNum1: There is no available(not conflict) doc with id = " + tabNum); return null; }else{ if (dc!=null) dc.recycle(); return tmpdoc; } } } private lotus.domino.Document findByDepID(String depID) throws NotesException, IOException { log("findByDepID depID = "+depID); DocumentCollection dc =database.search("(Form =\"Department\" | Form =\"Subdivision\") & @IsUnavailable($Conflict) & met!=\"1\"& ID= \"" + depID + "\""); for(int i=0;i<dc.getCount();i++){ log("DocumentCollection dc in findByDepID = "+dc.getNextDocument()); } lotus.domino.Document tmpdoc = null; lotus.domino.Document doc = dc.getFirstDocument(); int notNull = 0; if(dc.getCount() == 0) { log("findByDepID dc is empty !"); return null; } if (dc.getCount() == 1) { log("findByDepID doc="+doc); return dc.getFirstDocument(); } else if (dc.getCount() > 1) { while (doc != null) { log("findByDepID doc(>1)="+doc); if (!doc.isDeleted()) { tmpdoc = doc; notNull++; continue; } doc = dc.getNextDocument(); } } if(notNull==1) { return tmpdoc; } else { throw new RuntimeException( "Error. There are more than one departament in DB with id = " + depID); } } private lotus.domino.Document findByDepID1(String depID) throws NotesException, IOException { if(depID==null || depID.equals("")){ log("findByDepID1: depID is Nothyng or Empty"); return null; } if(view1==null){ log("findByDepID1: view1 is Nothyng"); return null; } log("findByDepID1: depID = " + depID + "*"); DocumentCollection dc = view1.getAllDocumentsByKey(depID,true); if(dc.getCount()==0) { log("findByDepID1: Collection <dc> by key depID is empty !"); dc.recycle(); return null; } boolean isMoreThanOne = false; lotus.domino.Document tmpdoc = null; lotus.domino.Document doc = dc.getFirstDocument(); while (doc!=null) { if (!doc.isDeleted()) { if (tmpdoc==null){ tmpdoc = doc; }else{ isMoreThanOne = false; break; } } doc = dc.getNextDocument(doc); } if (isMoreThanOne) { if (tmpdoc!=null) tmpdoc.recycle(); if (doc!=null) doc.recycle(); if (dc!=null) dc.recycle(); log("findByDepID1: There are more than one departament in DB with id = " + depID); throw new RuntimeException("Error. There are more than one departament in DB with id = " + depID); }else{ if (tmpdoc==null){ if (doc!=null) doc.recycle(); if (dc!=null) dc.recycle(); log("findByDepID1: There is no available(not conflict) doc with id = " + depID); return null; }else{ if (dc!=null) dc.recycle(); return tmpdoc; } } } // MM/DD/YYYY private void insertDateItem(lotus.domino.Document doc, String nodeName, String value) throws NotesException { doc.appendItemValue( nodeName, session.createDateTime(value) ); } private void updateDateItem(lotus.domino.Document doc, String nodeName, String value) throws NotesException { doc.replaceItemValue( nodeName, session.createDateTime(value) ); } private String getTextContent(Node node) { Node child = node.getFirstChild(); if (child == null) return ""; else return child.getNodeValue(); } private void initLog() throws IOException { outputStream = new DataOutputStream(new FileOutputStream(LOG_FILE_ADDR, true)); log("\n================================= ==========================="); } private void closeLog() { if (outputStream != null) try { outputStream.close(); } catch (IOException e) {e.printStackTrace();} } private void log(String text) throws IOException { logSimple(text); System.out.println(text); if (logger != null) try { logger.logAction(text); } catch (NotesException e) { throw new IOException(stackTraceToStr(e)); } } private void logSimple(String text) throws IOException { if (outputStream == null) return; String date = DF.format( new Date(System.currentTimeMillis()) ); outputStream.writeBytes("\n" + date + " : " + text); } private String stackTraceToStr(Throwable throwable) { final Writer result = new StringWriter(); final PrintWriter printWriter = new PrintWriter(result); throwable.printStackTrace(printWriter); return result.toString(); } public void NotesMain() { try { initLog(); logSimple("START"); session = getSession(); logger = session.createLog("SAP_log"); logger.openFileLog("SAPAgentLog.txt" ); logger.logAction("START"); File dir1 = new File ("."); File dir2 = new File (".."); log ("Current dir : " + dir1.getCanonicalPath()); log ("Parent dir : " + dir2.getCanonicalPath()); loadProperties(); DbDirectory dir = session.getDbDirectory(properties.getPro perty("db_directory")); database = dir.openDatabase( properties.getProperty("db_adr") ); //view = database.getView("SAP Test"); view1 = database.getView("SAPDepID"); view2 = database.getView("SAPParentID"); view3 = database.getView("SAPTabNum"); //log("view SAP Test FirstDocument = "+view.getFirstDocument()); //log("viewDepId FirstDocument = "+view1.getFirstDocument()); //log("viewParentId FirstDocument = "+view2.getFirstDocument()); //log("viewTabNum FirstDocument = "+view3.getFirstDocument()); parseXMLFile(); logger.logAction("END"); log("END"); } catch(Exception e) { try { logger.logAction(stackTraceToStr(e)); } catch (NotesException e1) { e1.printStackTrace(); } try {log(stackTraceToStr(e));} catch (IOException e1) {e1.printStackTrace();} e.printStackTrace(); } finally { try { logger.close(); } catch (NotesException e) { e.printStackTrace(); } closeLog(); } } } class LotusFileFilter implements FileFilter { private Properties properties; public LotusFileFilter(Properties prop) { properties = prop; } public boolean accept(File file) { String name = file.getName(); return accept(name); } public boolean accept(String fileName) { String prefix = properties.getProperty("file_name_prefix "); String extension= properties.getProperty("extension"); if ( fileName.startsWith(prefix) && fileName.endsWith(extension) ) return true; return false; } }[/CODE]
0
|
|
|
0 / 0 / 0
Регистрация: 27.10.2011
Сообщений: 2,124
|
|
| 10.04.2013, 11:53 | |
|
Раз только для поиска, то: удалить колонки где категоризация нам она не нужна, только путает.
Можно оставить только 2 колонки, первая как есть, вторая Unid документа. Что за проблема с поиском понять не могу... Первый раз такое вижу. По поводу дубликатов: там в коде есть добавление сотрудника, если он не найден. Вот только он всегда не найден из-за ошибки поиска. Лучше удалить лишние колонки, еще раз проверить поиск через UI руками и каким-нибудь агентом, который только ищет по ключу записи.
0
|
|
|
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 38
|
|||
| 10.04.2013, 12:13 | |||
depID = 10000234 – задублировалось tabNum = 00005489 – не задублировался (но дата последней модификации не сегодняшняя) tabNum = 00004226 – не задублировался (но дата последней модификации не сегодняшняя)
0
|
|||
|
0 / 0 / 0
Регистрация: 27.10.2011
Сообщений: 2,124
|
|
| 10.04.2013, 12:27 | |
|
Руками удалить, чтобы их совсем не было.
tabNum = 00005489 – не задублировался (но дата последней модификации не сегодняшняя) Возможно его не было в XML, но тут я не помогу, по коду все верно. Да и ошибки сохранения в логах нет.
0
|
|
|
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 38
|
||
| 10.04.2013, 12:34 | ||
Попробую удалить лишние колонки сейчас
0
|
||
|
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 38
|
|
| 10.04.2013, 17:51 | |
|
Должно же получиться как то так ?
0
|
|
|
0 / 0 / 0
Регистрация: 27.10.2011
Сообщений: 2,124
|
|
| 10.04.2013, 18:00 | |
|
да, но лучше совсем категории убери, последнюю колонку тоже, оставь только номер
0
|
|
|
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 38
|
||
| 10.04.2013, 18:21 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 27.10.2011
Сообщений: 2,124
|
|
| 11.04.2013, 09:42 | |
|
они у тебя во второй колонке, удали колонку, должны пропасть
0
|
|
|
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 38
|
||
| 11.04.2013, 14:58 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 27.10.2011
Сообщений: 2,124
|
||
| 11.04.2013, 16:19 | ||
Дубликаты: Добавь в этот же вид, по которому ищите колонку (НЕ категоризировать и НЕ сортировать): название депаратмента или полное ФИО сотрудника и руками удаляйте. Можно еще добавить колонку с датой создания: @Text(@Created;"S0")
0
|
||
|
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 38
|
||
| 12.04.2013, 02:09 | ||
На счет дубликатов, я думал просто можно вывести все дублированые записи разом, и сразу видеть всю картину, а так придется смотреть по логу, когда находит по id болше 1 записи, искать в базе по этому id и удалять лишнее, а база не маленькая, время уйдет очень много. Может можно именно сразу все дублированные записи вывести?
0
|
||
|
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 38
|
|
| 15.04.2013, 15:58 | |
|
Возникла еще одна проблемка, при поиске по сотрудникам(findByTabNum1) может находить 2 записи, т.к. сотрудник может занимать 2 должности, в этом месте происходит зависание. Вот код и лог:
<!--shcode--><pre><code class=java>private lotus.domino.Document findByTabNum1(String tabNum) throws NotesException, IOException { if(tabNum==null || tabNum.equals("")){ log("findByTabNum1: tabNum is Nothyng or Empty"); return null; } if(view3==null){ log("findByTabNum1: view3 is Nothyng"); return null; } log("findByTabNum1: tabNum = " + tabNum +"*"); DocumentCollection dc = view3.getAllDocumentsByKey(tabNum,true); lotus.domino.Document tmpdoc = null; lotus.domino.Document doc = dc.getFirstDocument(); int notNull = 0; if(dc.getCount() == 0) { return null; } if (dc.getCount() == 1) return dc.getFirstDocument(); else if (dc.getCount() > 1) { log("findByTabNum1: dc.getCount() = " + dc.getCount()); while (doc != null) { if (!doc.isDeleted()) { tmpdoc = doc; log("findByTabNum1: !doc.isDeleted(), tmpdoc = doc = "+tmpdoc); notNull++; continue; } doc = dc.getNextDocument(); log("findByTabNum1: doc = dc.getNextDocument() = "+doc); } } if(notNull==1) { log("findByTabNum1: notNull==1, return tmpdoc = "+tmpdoc); return tmpdoc; } else { throw new RuntimeException( "Error. There are more than one employee in DB with TabNum = " + tabNum + "and they have \"isDeleted=true\" flag"); } }[/CODE] SAP_log: 16.04.2013 15:11:06: findByTabNum1: tabNum = 00002087* SAP_log: 16.04.2013 15:11:06: findByTabNum1: dc.getCount() = 2 SAP_log: 16.04.2013 15:11:06: findByTabNum1: !doc.isDeleted(), tmpdoc = doc = D9B2C8AA3E3D9D24C325768200641DB0 SAP_log: 16.04.2013 15:11:06: findByTabNum1: !doc.isDeleted(), tmpdoc = doc = D9B2C8AA3E3D9D24C325768200641DB0 SAP_log: 16.04.2013 15:11:06: findByTabNum1: !doc.isDeleted(), tmpdoc = doc = D9B2C8AA3E3D9D24C325768200641DB0 SAP_log: 16.04.2013 15:11:06: findByTabNum1: !doc.isDeleted(), tmpdoc = doc = D9B2C8AA3E3D9D24C325768200641DB0 Подскажите , почему происходит зависание, вроде такого не было раньше. с циклом что то не так ?
0
|
|
|
0 / 0 / 0
Регистрация: 23.08.2008
Сообщений: 6,252
|
||
| 15.04.2013, 16:08 | ||
|
continue;
http://sernam.ru/book_java.php?id=25 и итерирование коллекции не происходит к тому же - в java надо делать recycle неиспользуемым объектам нотуса (это для избежания мемориликов) Добавлено:
0
|
||
| 15.04.2013, 16:08 | |
|
Ftsearch Ftsearch Ftsearch Ftsearch и ковычки Коллекция. Ftsearch Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
По какой причине рабочий алгоритм может называться бредом?
Hrethgir 05.08.2026
3 мая мной была сделана публикация на Хабре авторского алгоритма итеративного обхода дерева "эстафета хвоста". Удаление публикации видимо произошло из-за отзывов об алгоритме такого рода
Ну, я тебе. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов.
Логика кажется понятной:
1. Находим ключевые слова.
2. Добавляем их на. . .
|