Запрос Для Ftsearch

  • Автор темы Автор темы ezhov
  • Дата начала Дата начала
метод findByDepID1 где-то обращение к null
Объект базы, вьюхи, дока, что-то еще.
 
Вот код метода, получается что косяк в базе или вьюхе ?

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);
}
 
Похоже вот тут: <!--shcode--><pre><code class='java'>DocumentCollection dc =view1.getAllDocumentsByKey(depID);[/CODE]
view1 не виден, скорее всего он и null
 
попробуйте так:
Код:
 private lotus.domino.Document findByDepID1(String depID) throws NotesException, IOException {

if(depID==null || depID.equals("")){
log("findByDepID1: depID is Nothing or Empty");
return null;
}

if(view1==null){
log("findByDepID1: view1 is Nothing");
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;
}
}
}
 
Возникла непонятная проблема. Некоторые записи метод 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 Nothing or Empty");
return null;
}

if(view3==null){
log("findByTabNum1: view3 is Nothing");
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 Nothing or Empty");
return null;
}

if(view1==null){
log("findByDepID1: view1 is Nothing");
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 минут! ), но возникла эта проблема с дублированием записей, помогите плиз, какие есть варианты ? Если что то нужно(код, скрины, вью) запрашивайте, предоставлю
 
если находит больше, то возвращает null и похоже создает новую такую же запись, т.е. добавляет к уже существующим.
Это надо смотреть что происходит, если он ничего не нашел.
Что происходит после вызова 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 делает точный поиск, а не частичный.
Почему поиск ломается, если пробела нет.. даже не знаю.
Эта вьюха используется где-то еще?
если нет - удалить вторую,третью и четвертую колонки (узкие которые), там категоризация нам она не нужна.
 
Вот опять ничего не нашел по этой записи

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.ParserConfigurationException;

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.FileTransferClient;

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. Nothing 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. Nothing 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_local") + 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_local") );
}

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(parentDocIDValue)) {
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 Nothing");
return null;
}

log("getDocIDByParentID1: parentId = " + parentId +"*");
if (parentId == null || parentId.equals("") || parentId.equals("0")){
log("getDocIDByParentID1: parentId is Nothing 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 hasn't 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 wasn't save. Document = " + doc.generateXML());
//throw new RuntimeException("The document wasn't save. Document = " + doc.generateXML());
}
bindingByCatDocID(doc);
if ( !doc.save(true) ) {// сохраняем измененные данные в департаменте
log("The document wasn't save. Document = " + doc.generateXML());
//throw new RuntimeException("The document wasn't 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 wasn't save. Document = " + doc.generateXML());
//throw new RuntimeException("The document wasn't save. Document = " + doc.generateXML());
}
createIDsFields(doc);
if ( !doc.save(true) ) { // сохраняем измененные данные в департаменте
log("The document wasn't save. Document = " + doc.generateXML());
//throw new RuntimeException("The document wasn't 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 wasn't save. Document = " + doc.generateXML());
//throw new RuntimeException("The document wasn't save. Document = " + doc.generateXML());
}
bindingByCatDocID(doc);
if ( !doc.save(true) ) { // сохраняем измененные данные
log("The document wasn't save. Document = " + doc.generateXML());
//throw new RuntimeException("The document wasn't 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 wasn't save. Document = " + doc.generateXML());
//throw new RuntimeException("The document wasn't save. Document = " + doc.generateXML());
}
createIDsFields(doc);
if ( !doc.save(true) ) { // сохраняем измененные данные в департаменте
log("The document wasn't save. Document = " + doc.generateXML());
//throw new RuntimeException("The document wasn't 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 Nothing or Empty");
return null;
}

if(view3==null){
log("findByTabNum1: view3 is Nothing");
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 Nothing or Empty");
return null;
}

if(view1==null){
log("findByDepID1: view1 is Nothing");
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.getProperty("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]
 
Раз только для поиска, то: удалить колонки где категоризация нам она не нужна, только путает.
Можно оставить только 2 колонки, первая как есть, вторая Unid документа.
Что за проблема с поиском понять не могу... Первый раз такое вижу.
По поводу дубликатов: там в коде есть добавление сотрудника, если он не найден. Вот только он всегда не найден из-за ошибки поиска.
Лучше удалить лишние колонки, еще раз проверить поиск через UI руками и каким-нибудь агентом, который только ищет по ключу записи.
 
Раз только для поиска, то: удалить колонки где категоризация нам она не нужна, только путает.
Можно оставить только 2 колонки, первая как есть, вторая Unid документа.
Это руками просто удалить из настро1ки вьюхи ? Или формула отбора нужна другая?

По поводу дубликатов: там в коде есть добавление сотрудника, если он не найден. Вот только он всегда не найден из-за ошибки поиска.
Это да, после последнего обновления вот что получилось:
depID = 10000234 – задублировалось
tabNum = 00005489 – не задублировался (но дата последней модификации не сегодняшняя)
tabNum = 00004226 – не задублировался (но дата последней модификации не сегодняшняя)
 
Руками удалить, чтобы их совсем не было.
tabNum = 00005489 – не задублировался (но дата последней модификации не сегодняшняя)
Возможно его не было в XML, но тут я не помогу, по коду все верно. Да и ошибки сохранения в логах нет.
 
tabNum = 00005489 – не задублировался (но дата последней модификации не сегодняшняя)
Возможно его не было в XML, но тут я не помогу, по коду все верно. Да и ошибки сохранения в логах нет.

tabNum = 00005489 и все остальные id берутся именно из xml и исчутся по вьюхе, т.е. если tabNum = 00005489 попал уже в код и в лог, то он попал туда из xml. больше не откудого

Попробую удалить лишние колонки сейчас
 
да, но лучше совсем категории убери, последнюю колонку тоже, оставь только номер
 
они у тебя во второй колонке, удали колонку, должны пропасть
 
они у тебя во второй колонке, удали колонку, должны пропасть
Удалили колонки и вроде как корректно нашло. Теперь такой вопрос, можно ли создать view, в которой формула отбора выводит дублированные записи из форм Department, Subdivision и Person, что бы почистить от повторных записей базу
 
Удалили колонки и вроде как корректно нашло.
Логи без ошибок?

Дубликаты:
Добавь в этот же вид, по которому ищите колонку (НЕ категоризировать и НЕ сортировать): название депаратмента или полное ФИО сотрудника и руками удаляйте.
Можно еще добавить колонку с датой создания: @Text(@Created;"S0")
 
Дубликаты:
Добавь в этот же вид, по которому ищите колонку (НЕ категоризировать и НЕ сортировать): название депаратмента или полное ФИО сотрудника и руками удаляйте.
Можно еще добавить колонку с датой создания: @Text(@Created;"S0")

Лог без ошибок.
На счет дубликатов, я думал просто можно вывести все дублированые записи разом, и сразу видеть всю картину, а так придется смотреть по логу, когда находит по id болше 1 записи, искать в базе по этому id и удалять лишнее, а база не маленькая, время уйдет очень много.
Может можно именно сразу все дублированные записи вывести?
 
Возникла еще одна проблемка, при поиске по сотрудникам(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 Nothing or Empty");
return null;
}

if(view3==null){
log("findByTabNum1: view3 is Nothing");
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

Подскажите , почему происходит зависание, вроде такого не было раньше. с циклом что то не так ?
 
continue;

и итерирование коллекции не происходит
к тому же - в java надо делать recycle неиспользуемым объектам нотуса (это для избежания мемориликов)

Добавлено:
Подскажите , почему происходит зависание, вроде такого не было раньше. с циклом что то не так ?
раньше не попадало в if
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!