Строки объединения / связывают строки

Текст в на странице руководства является неоднозначным.

Если pshared отличен от нуля, то семафор разделяется между процессами и должен располагаться в область общей памяти.

Поскольку дочерний элемент, созданный fork (2), наследует сопоставления памяти родителя, он также может обращаться к семафору.

blockquote>

Да, но он все еще должен находиться в общем регионе. В противном случае память просто копируется с обычным CoW , и это все.

Вы можете решить это, по крайней мере, двумя способами:

  • Использовать sem_open("my_sem", ...)
  • Используйте shm_open и mmap для создания общей области

8
задан Charles 27 January 2014 в 18:31
поделиться

5 ответов

Вот демонстрационная Определяемая пользователем функция (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

14
ответ дан 5 December 2019 в 12:15
поделиться

Для объединения строк в Доступе Вы, вероятно, должны будете кодировать, который выглядит примерно так:

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 вместо ДАО, но общее представление является тем же.

0
ответ дан 5 December 2019 в 12:15
поделиться

Я думаю, что Nz - то, что Вы после, синтаксис Nz(variant, [if null value]). Вот ссылка на документацию: Функция Nz

---Person--- 
John
Steve
Richard

DECLARE @PersonList nvarchar(1024)
SELECT @PersonList = Nz(@PersonList + ',','') + Person
FROM PersonTable

PRINT @PersonList
0
ответ дан 5 December 2019 в 12:15
поделиться

Хотя Nz делает сопоставимую вещь ОБЪЕДИНИТЬ, Вы не можете использовать его в Доступе, чтобы сделать операцию, которую Вы выполняете. Это не ОБЪЕДИНЕНИЕ, которое создает список значений строки, это - конкатенация в переменную.

К сожалению, это не возможно в запросе Доступа, который должен быть единственным SQL-оператором и где нет никакого средства для объявления переменной.

Я думаю, что необходимо было бы создать функцию, которая откроет набор результатов, выполнит итерации по нему и свяжет значения строки в строку.

0
ответ дан 5 December 2019 в 12:15
поделиться

Я понимаю здесь, что у Вас есть таблица "человек" с 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

после того как у Вас есть этот массив (это будет двумерным), можно управлять им для извлечения "столбца", в котором Вы будете нуждаться. Мог бы быть умный способ извлечь массив с одним размером из этого, таким образом, можно затем использовать инструкцию "по Соединению" связать каждое значение массива в одной строке.

0
ответ дан 5 December 2019 в 12:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: