Надеюсь, я правильно понимаю ваш вопрос, но я просто смутился с этим. Наша настройка на моей работе - это Windows Server 2008 R2 с IIS 7.
У нас есть сервер печати, также установленный в том же поле (не уверен, имеет ли это значение, поскольку это не моя область эксперта).
В принципе, просмотр установленных принтеров с помощью PrinterSettings.InstalledPrinters
я смог увидеть все имена принтеров, установленные на сервере.
Я прикладываю отладчик к процессу приложения для отладки, и я могу просто использовать отладчик, чтобы увидеть это, иначе вам придется запустить цикл для печати через них. Если вы запустите это локально, вы увидите только принтеры, установленные на вашем компьютере. Если это сетевые принтеры, то будет показан полный путь. Поэтому определите путь / имя, на котором сервер будет распознавать принтер, а затем задайте это имя принтера явно, используя свойство
PrinterSettings.PrinterName
класса PrintDocument. Это сработало для меня. Кроме того, для моего идентификатора пула приложений установлено значение NetworkService
.
Сначала я неправильно понял вопрос, и я думаю, что подход @ Уве - это путь. В своем первом ответе я использовал data.table
, чтобы идентифицировать группы (и сколько строк в группе) последовательных дат на id
, очевидно, не то, что вы ищете.
Вот также короткий фрагмент sqldf
, дополняющий подход @ Uwe (хотя и не такой адекватный, так как здесь порядок строк не сохраняется - это потребует некоторой дополнительной обработки):
library(sqldf)
df <- sqldf('SELECT id, start, end, COUNT(*) as overlappingRows FROM (SELECT df.* FROM df
LEFT OUTER JOIN df AS df2
ON df.id = df2.id AND df.start <= df2.end AND df.end >= df2.start) as origdf
GROUP BY id, start, end')
Вывод:
id start end overlappingRows
1 27677 2018-03-01 2018-05-29 2
2 27677 2018-04-12 2018-04-26 2
3 74744 2016-10-03 2016-11-05 1
4 111111 2018-01-01 2018-01-31 1
5 111111 2018-11-11 2018-12-31 1
6 174095 2018-12-01 2018-12-20 2
7 174095 2018-12-19 2018-12-31 2
8 210610 2018-04-13 2018-09-27 1
9 227156 2018-12-19 2018-12-31 1
10 303693 2017-02-20 2017-04-09 1
11 370474 2017-07-13 2017-08-19 1
Изменить 2019-03-07, чтобы справиться с расширенным набором данных OP
Это можно решить путем агрегирования в неэквивалентном самосоединении
library(data.table)
# coerce character dates to IDate class
cols <- c("start", "end")
setDT(df)[, (cols) := lapply(.SD, as.IDate), .SDcols = cols]
# non-equi self-join and aggregate
tmp <- df[df, on = .(id, start <= end, end >= start), .N, by = .EACHI]
# append counts to original dataset
df[, overlapping.rows := tmp$N]
df
blockquote>id start end overlapping.rows 1: 174095 2018-12-19 2018-12-31 2 2: 227156 2018-12-19 2018-12-31 1 3: 210610 2018-04-13 2018-09-27 1 4: 27677 2018-04-12 2018-04-26 2 5: 370474 2017-07-13 2017-08-19 1 6: 303693 2017-02-20 2017-04-09 1 7: 74744 2016-10-03 2016-11-05 1 8: 174095 2018-12-01 2018-12-18 2 9: 27677 2018-03-01 2018-05-29 2 10: 111111 2018-01-01 2018-01-31 1 11: 111111 2018-11-11 2018-12-31 1 12: 174095 2018-11-30 2018-12-25 3
Используя data.table , связывающий код, можно написать более компактным, но и более запутанным способом:
[1122 ] Обратите внимание, что часть для добавления результатов к оригиналуlibrary(data.table) cols <- c("start", "end") setDT(df)[, (cols) := lapply(.SD, as.IDate), .SDcols = cols][ , overlapping.rows := df[df, on = .(id, start <= end, end >= start), .N, by = .EACHI]$N][]
df
основана на комментарии Фрэнка .
Моя первоначальная попытка использовать второе объединение для добавления результатов к исходному
df
потерпела неудачу в том случае, если есть разные значения для того жеid
, что и , указанного в OP . Это можно исправить, включив номер строки во второе объединение:library(data.table) # coerce character dates to IDate class cols <- c("start", "end") setDT(df)[, (cols) := lapply(.SD, as.IDate), .SDcols = cols] # append row number tmp <- df[, rn := .I][ # non-equi self-join and aggregate df, on = .(id, start <= end, end >= start), .(rn = i.rn, .N), by = .EACHI] # append counts to original dataset by joining on row number df[tmp, on = "rn", overlapping.rows := N][, rn := NULL] df
blockquote>id start end overlapping.rows 1: 174095 2018-12-19 2018-12-31 2 2: 227156 2018-12-19 2018-12-31 1 3: 210610 2018-04-13 2018-09-27 1 4: 27677 2018-04-12 2018-04-26 2 5: 370474 2017-07-13 2017-08-19 1 6: 303693 2017-02-20 2017-04-09 1 7: 74744 2016-10-03 2016-11-05 1 8: 174095 2018-12-01 2018-12-18 2 9: 27677 2018-03-01 2018-05-29 2 10: 111111 2018-01-01 2018-01-31 1 11: 111111 2018-11-11 2018-12-31 1 12: 174095 2018-11-30 2018-12-25 3
Объяснение
Условие соединения в соединении без равенства выполняет трюк. Два интервала не перекрываются , если первый заканчивается до начала второго или первый интервал начинается после окончания второго интервала,
e 1 < s 2 ИЛИ e 2 < s 1
Теперь, если два интервала действительно пересекаются / перекрываются, то противоположное из вышеприведенного должно быть истинным. Отрицая и применяя закон Де Моргана , мы получаем условия
s 2 = e 1 И e 2 ]> = s 1
, которые используются в неравных объединениях .
Данные
Расширенный набор данных OP, как описано в РЕДАКТИРОВАНИИ ОП 2019-03-06:
library(data.table) df <- fread("id start end 174095 2018-12-19 2018-12-31 227156 2018-12-19 2018-12-31 210610 2018-04-13 2018-09-27 27677 2018-04-12 2018-04-26 370474 2017-07-13 2017-08-19 303693 2017-02-20 2017-04-09 74744 2016-10-03 2016-11-05 174095 2018-12-01 2018-12-18 27677 2018-03-01 2018-05-29 111111 2018-01-01 2018-01-31 111111 2018-11-11 2018-12-31 174095 2018-11-30 2018-12-25")