Текст в на странице руководства является неоднозначным.
Если pshared отличен от нуля, то семафор разделяется между процессами и должен располагаться в область общей памяти.
Поскольку дочерний элемент, созданный fork (2), наследует сопоставления памяти родителя, он также может обращаться к семафору.
blockquote>Да, но он все еще должен находиться в общем регионе. В противном случае память просто копируется с обычным CoW , и это все.
Вы можете решить это, по крайней мере, двумя способами:
- Использовать
sem_open("my_sem", ...)
- Используйте
shm_open
иmmap
для создания общей области
Вот демонстрационная Определяемая пользователем функция (UDF) и возможное использование.
Функция:
Function Coalsce(strSQL As String, strDelim, ParamArray NameList() As Variant)
Dim db As Database
Dim rs As DAO.Recordset
Dim strList As String
Set db = CurrentDb
If strSQL <> "" Then
Set rs = db.OpenRecordset(strSQL)
Do While Not rs.EOF
strList = strList & strDelim & rs.Fields(0)
rs.MoveNext
Loop
strList = Mid(strList, Len(strDelim))
Else
strList = Join(NameList, strDelim)
End If
Coalsce = strList
End Function
Использование:
SELECT documents.MembersOnly,
Coalsce("SELECT FName From Persons WHERE Member=True",":") AS Who,
Coalsce("",":","Mary","Joe","Pat?") AS Others
FROM documents;
Версия ADO, вдохновленная комментарием onedaywhen
Function ConcatADO(strSQL As String, strColDelim, strRowDelim, ParamArray NameList() As Variant)
Dim rs As New ADODB.Recordset
Dim strList As String
On Error GoTo Proc_Err
If strSQL <> "" Then
rs.Open strSQL, CurrentProject.Connection
strList = rs.GetString(, , strColDelim, strRowDelim)
strList = Mid(strList, 1, Len(strList) - Len(strRowDelim))
Else
strList = Join(NameList, strColDelim)
End If
ConcatADO = strList
Exit Function
Proc_Err:
ConcatADO = "***" & UCase(Err.Description)
End Function
От: http://wiki.lessthandot.com/index.php/Concatenate_a_List_into_a_Single_Field_%28Column%29
Для объединения строк в Доступе Вы, вероятно, должны будете кодировать, который выглядит примерно так:
Public Function Coalesce(pstrTableName As String, pstrFieldName As String)
Dim rst As DAO.Recordset
Dim str As String
Set rst = CurrentDb.OpenRecordset(pstrTableName)
Do While rst.EOF = False
If Len(str) = 0 Then
str = rst(pstrFieldName)
Else
str = str & "," & rst(pstrFieldName)
End If
rst.MoveNext
Loop
Coalesce = str
End Function
Вы захотите добавить, что обработка ошибок кодирует и очищает Ваш recordset, и это изменится немного, если Вы будете использовать ADO вместо ДАО, но общее представление является тем же.
Я думаю, что Nz - то, что Вы после, синтаксис Nz(variant, [if null value])
. Вот ссылка на документацию: Функция Nz
---Person---
John
Steve
Richard
DECLARE @PersonList nvarchar(1024)
SELECT @PersonList = Nz(@PersonList + ',','') + Person
FROM PersonTable
PRINT @PersonList
Хотя Nz делает сопоставимую вещь ОБЪЕДИНИТЬ, Вы не можете использовать его в Доступе, чтобы сделать операцию, которую Вы выполняете. Это не ОБЪЕДИНЕНИЕ, которое создает список значений строки, это - конкатенация в переменную.
К сожалению, это не возможно в запросе Доступа, который должен быть единственным SQL-оператором и где нет никакого средства для объявления переменной.
Я думаю, что необходимо было бы создать функцию, которая откроет набор результатов, выполнит итерации по нему и свяжет значения строки в строку.
Я понимаю здесь, что у Вас есть таблица "человек" с 3 записями. Нет ничего сопоставимого с тем, что Вы описываете в Доступе.
В "стандартном" Доступе (ДАО recordset), необходимо будет открыть recordset и использовать getrows метод, чтобы иметь данные
Dim rs as DAO.recordset, _
personList as String, _
personArray() as variant
set rs = currentDb.open("Person")
set personArray = rs.getRows(rs.recordcount)
rs.close
после того как у Вас есть этот массив (это будет двумерным), можно управлять им для извлечения "столбца", в котором Вы будете нуждаться. Мог бы быть умный способ извлечь массив с одним размером из этого, таким образом, можно затем использовать инструкцию "по Соединению" связать каждое значение массива в одной строке.