Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: MS SQL 2012 Джойн с вложенным запросом: "Не удалось привязать составной идентификатор"?

Вот такой запрос:
SELECT 
	TabKalend.PK_Дата AS Месяц,
	TabFirm.ID AS [IdNci_0062],
	TabSt.[RowCode],
	0 AS Сумма
FROM Календарь_Месяцы AS TabKalend WITH (NOLOCK)
CROSS JOIN Nci_0062 AS TabFirm WITH (NOLOCK)
INNER JOIN (
SELECT TabFact.[IdNci_0062]
	,TabFact.[Id]
	,TabFact.[PosCode]
	,TabFact.[StrType]
	,TabFact.[RowCode]
	,TabFact.[NAME]
	,TabFact.[DateBeg]
	,TabFact.[FormulaOlap]


FROM [dbo].[Rpt_0001_OLAPDIM] AS TabFact WITH (NOLOCK)
WHERE TabFact.[DateBeg] = 
	(SELECT MIN(TabFact2.[DateBeg]) FROM [dbo].[Rpt_0001_OLAPDIM] AS TabFact2 WITH (NOLOCK) 
		WHERE 
			TabFact2.[IdNci_0062] = TabFact.[IdNci_0062] 
			AND TabFact2.[RowCode] = TabFact.[RowCode]
			AND TabFact2.[DateBeg] <= TabKalend.PK_Дата
	)
	
) AS TabSt ON TabSt.[IdNci_0062] = TabFirm.ID

Выдает следующую ошибку:
автор
Не удалось привязать составной идентификатор "TabKalend.PK_Дата".

Подскажите пожалуйста в чем может быть проблема?
Суть задачи выбрать из таблицы "Rpt_0001_OLAPDIM" только те записи, которые отвечают условию по полю [DateBeg], самая ранняя запись больше даты из таблицы дат "Календарь_Месяцы".
Ответ:
Кесарь
TaPaK
Кесарь,

и как по вашему будет работать
AND TabFact2.[DateBeg] <= [TabKalend].[PK_Дата


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


P.S.

Невнимательно посмотрел: я не уверен на счёт "AND TabSt.[DateBeg] <= [TabKalend].[PK_Дата]", а не той строки, что вы обозначили.
Вопрос: Не удалось открыть базу данных "msdb"...

Открываю экземпляр MS SQL, выдает ошибку

При выполнении инструкции или пакета Transact-SQL возникло исключение. (Microsoft.SqlServer.ConnectionInfo)

Дополнительные сведения:

Не удалось открыть базу данных "msdb" вследствие недоступности файлов, нехватки памяти или места на диске. Подробности см. в журнале ошибок SQL Server. (Microsoft SQL Server, ошибка:945)

Все диски проверил место есть. Список баз не раскрывается, точнее раскрывается пустой с той же ошибкой.

в логе есть строки

SQL Server detected a logical consistency-based I/O error: неправильная контрольная сумма (ожидаемая: 0x1f802a4f; фактическая: 0x1f80b0a3). It occurred during a прочитать of page (2:0) in database ID 4 at offset 0000000000000000 in file 'S:\Microsoft SQL Server\MSSQL10_50.PB\MSSQL\DATA\MSDBLog.ldf'. Additional messages in the SQL Server error log or system event log may provide more detail. This is a severe error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information, see SQL Server Books Online.

2018-11-22 13:25:42.45 spid17s Ошибка: 5105, серьезность: 16, состояние: 1.
2018-11-22 13:25:42.45 spid17s A file activation error occurred. The physical file name 'S:\Microsoft SQL Server\MSSQL10_50.PB\MSSQL\DATA\MSDBLog.ldf' may be incorrect. Diagnose and correct additional errors, and retry the operation

ЧекДБ выдает ошибку

автор
Use msdb
alter database msdb set SINGLE_USER
DBCC CHECKDB ('msdb', REPAIR_REBUILD)


Сообщение 945, уровень 14, состояние 2, строка 1
Не удалось открыть базу данных "msdb" вследствие недоступности файлов, нехватки памяти или места на диске. Подробности см. в журнале ошибок SQL Server.

Бэкапов нет. Даже не знали что они нужны. На SQL работает 1С.

Что делать? Помогите пожалуйста
Ответ: Alexey Tarasenko,

Рекомендация: для системных баз необходимо регулярно выполнять резервное копирование.
Вопрос: Запрос на вывод названия вместо id

Всем привет!
Не получается создать запрос для вывода имени вместо id.
Имя (TIP) должно браться из таблицы TIP_CONTR1. Таблицы соединены через поле TIP_CONTR_ID.
Код Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT 
"ID",
"TIP_CONTR_ID",
"TIP",
"FIO_NAME",
"INFO",
"PASPORT",
"ADRESS",
"PHONE",
"REKVIZIT",
"INN",
"KPP"
 FROM   "СONTRACTOR"
 INNER JOIN ("TIP_CONTR1" INNER JOIN  "СONTRACTOR"  ON TIP_CONTR1.ID=СONTRACTOR.TIP_CONTR_ID) 

Запрос который используется для формы:
Код Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT 
"ID",
"TIP_CONTR_ID",
"FIO_NAME",
"INFO",
"PASPORT",
"ADRESS",
"PHONE",
"REKVIZIT",
"INN",
"KPP"
 FROM   "СONTRACTOR" 
WHERE 
(   
 INSTR(UPPER("FIO_NAME"),UPPER(NVL(:P1_REPORT_SEARCH,"FIO_NAME"))) > 0  OR
 INSTR(UPPER("INFO"),UPPER(NVL(:P1_REPORT_SEARCH,"INFO"))) > 0  OR
 INSTR(UPPER("PASPORT"),UPPER(NVL(:P1_REPORT_SEARCH,"PASPORT"))) > 0  OR
 INSTR(UPPER("ADRESS"),UPPER(NVL(:P1_REPORT_SEARCH,"ADRESS"))) > 0  OR
 INSTR(UPPER("PHONE"),UPPER(NVL(:P1_REPORT_SEARCH,"PHONE"))) > 0  OR
 INSTR(UPPER("REKVIZIT"),UPPER(NVL(:P1_REPORT_SEARCH,"REKVIZIT"))) > 0  OR
 INSTR(UPPER("INN"),UPPER(NVL(:P1_REPORT_SEARCH,"INN"))) > 0  OR
 INSTR(UPPER("KPP"),UPPER(NVL(:P1_REPORT_SEARCH,"KPP"))) > 0 
)
Ответ:
Цитата Сообщение от Vers7 Посмотреть сообщение
выдало ошибку, которую я написал выше
Если поле id (или какое другое) есть и в той, и в другой таблице, то и будет такая ошибка, поскольку Oracle не знает, из какой таблицы надо выбирать это поле.
Надо писать:
Код SQL
1
2
SELECT contractor.id,
...
А вообще хороший стиль писать имя таблицы (или лучше алиас - см. выше) перед каждым полем - это улучшает читабельность запроса.
Вопрос: Исправить ошибку "Subquery returned more than 1 value"

В чем ошибка? Только на один айди "20" остальным работает нормально, что здесь не так в 20 айди?

Код SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT     ko.Ray, CONVERT(VARCHAR(25), ee, 110) AS ee,
                          (SELECT DISTINCT Closet
                            FROM          dbo.Diction AS d1
                            WHERE      (d1.Ats = 20) AND (d1.Ray = ko.Ray)) AS closet,
                          (SELECT DISTINCT Grom
                            FROM          dbo.Diction AS d2
                            WHERE      (d2.Ats = 20) AND (d2.Ray = ko.Ray)) AS grom,
                          (SELECT DISTINCT Magistral
                            FROM          dbo.Diction AS d3
                            WHERE      (d3.Ats = 20) AND (d3.Ray = ko.Ray)) AS magistral
FROM         (SELECT DISTINCT opo.Ray,
                                                  (SELECT     MAX(OpenRayDate) AS Expr1
                                                    FROM          dbo.Openclose AS op
                                                    WHERE      (op.Ats = 20) AND (op.Ray = opo.Ray)
                                                  ) AS ee
                       FROM          dbo.Openclose AS opo
                       WHERE      (opo.Ats = 20)
                     ) AS ko, diction dic
WHERE    (dic.ats=20 AND ko.ray=dic.ray AND dic.control='T') AND  (DATEPART(week, ee) <= DATEPART(week, GETDATE()) - 3) AND (YEAR(ee) = YEAR(GETDATE()))
ORDER BY ko.Ray
Ошибка:

Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Ответ:
Код SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT     ko.Ray, CONVERT(VARCHAR(25), ee, 110) AS ee,
                          (SELECT top 1 Closet
                            FROM          dbo.Diction AS d1
                            WHERE      (d1.Ats = @ats) AND (d1.Ray = ko.Ray)) AS closet,
                          (SELECT top 1 Grom
                            FROM          dbo.Diction AS d2
                            WHERE      (d2.Ats = @ats) AND (d2.Ray = ko.Ray)) AS grom,
                          (SELECT top 1 Magistral
                            FROM          dbo.Diction AS d3
                            WHERE      (d3.Ats = @ats) AND (d3.Ray = ko.Ray)) AS magistral
FROM         (SELECT DISTINCT opo.Ray,
                                                  (SELECT     MAX(OpenRayDate) AS Expr1
                                                    FROM          dbo.Openclose AS op
                                                    WHERE      (op.Ats = @ats) AND (op.Ray = opo.Ray)
                                                  ) AS ee
                       FROM          dbo.Openclose AS opo
                       WHERE      (opo.Ats = @ats)
                     ) AS ko, diction dic
WHERE    (dic.ats=@ats AND ko.ray=dic.ray AND dic.control='T') AND  (DATEPART(week, ee) <= DATEPART(week, GETDATE()) - 3) AND (YEAR(ee) = YEAR(GETDATE()))
Вопрос: Одно ли и то же в цикле: "Where current of cur" или "Where id=cur.id" ?

Интересует (Оракл 11g), это одно и то же написать так или сяк:
+
Procedure (....)
  IS               
    CURSOR cur(xx INTEGER) IS
        SELECT id, a,b
           FROM tbl  WHERE id = xx
        for update of b nowait;
  begin
    xx:= 567;
    FOR rr IN cur( xx) LOOP        
	update tbl set b = 152
            Where current of cur;
    END LOOP;
  end;

Или если в цикле:
update ... Where id = cur.id;
Запросы на самом деле именно такие простые. Я думаю, что здесь без разницы, а в доке не могу найти? но искать пока продолжаю ...
Ответ:
Доктар123

В вашем случае вобще лучше обойтись
без курсора внутри процедуры.
update ...
WHERE id = xx



імхо
не обойтись, нечем смоделировать nowait;

.....
stax
Вопрос: Как получить ID записи в табличной форме?

Есть табличная форма в режиме "только чтение". В ней есть скрытое от пользователя поле ID и другие поля. Как сделать так, чтобы при двойном клике по заголовку строки таблицы открывалась форма для редактирования записи с выделенным ID.

Если я создаю макрос на открытие формы с условием "ID=" & [ID] - форма открывается, но не с тем ID по которому был клик, а с самым последним в табличной форме. Как сделать так, чтобы при клике по таблице открывалась форма с тем ID, на котором стоит курсор?

Если сделать поле ID видимым и открывать форму по клику прямо по этому полю, то все работает, но мне бы так делать не хотелось. Потому что ID поле вообще не нужно пользователю, и кликать надо именно по нему.

И еще вопрос. Можно ли сделать так, чтобы курсор в табличной форме был "сплошной"? Ну примерно как в Тотал Командере) Чтобы его можно было двигать с клавиатуры стрелками и открывать запись по щелчку по любому участку строки таблицы, а не выцеливать мышью заголовок или какое-то специальное поле?
Ответ: mobile, Спасибо!

Мне казалось что я так и делал, только без проверки на выбор нескольких полей. Я прописал в условии макроса "ID=" & [ID] и думал это тоже самое что и "ID=" & me.ID в VBA. Макрос в вообще поставил временно, чтобы по быстрому проверить. Попробую сделать на VBA. Даже не думал, что дело может быть в этом..
Вопрос: Составной идентификатор

Доброго времени суток.

Я все еще нуб в MSSQL.

Есть таблица SF, в ней столбец Stage, в котором лежат текстовые данные. Они постоянно повторяются, так что было решено сделать по ним справочник Stage - ID и, собственно, Stage. Справочник был составлен при помощи группировки столбца Stage из SF, т.е. несовпадения исключены.
Далее хочу заменить в SF значения в Stage на их айдишники из справочника Stage
T-SQL
1
update dbo.SF set dbo.SF.Stage=dbo.Stage.ID where dbo.SF.Stage=dbo.Stage.Stage
Пишет "Не удалось привязать составной идентификатор "dbo.Stage.Stage""
Пробовала переформатировать Stage.ID из инта в нварчар, не помогло, ошибка та же.
Таблицы никак не связаны, и в первой, и во второй ключевое поле ID, не составное.
Помогите, пожалуйста.
Ответ:
Сообщение от iap
Однако, я не понял, какого типа dbo.SF.Stage и dbo.Stage.ID?
nvarchar и int соответственно. Ничего не смешивала, просто тыкала пальцем в небо наугад.
Сообщение от iap
В dbo.SF тоже надо создать числовое поле, например, StageID, и заполнить его UPDATEом.
А dbo.SF.Stage не трогать (или вообще удалить)
Я думаю в данный момент об этом, ибо все равно придется внешний ключ цеплять.

Спасибо! Раньше ни разу не доводилось использовать from в апдейте.
Вопрос: Присвоение значения полю типа "Вложение" с использованием VBA

Дорогие коллеги, помогите решить элементарнейшую задачу которая меня поставила просто в тупик (поскольку я не профессионально занимаюсь программированием, а только время от времени для своих личных нужд.)

Есть таблица "Письма" где последний столбец "Документ" - поле типа вложения где хранятся файлы.
Нужно просто эту таблицу скопировать в другую такую же по структуре существующую таблицу другой базы данных Access скажем в "Экспорт_Письма". Элементарно но...
В другой базе данных есть структура данных, и эта таблица экспортом самого Access не может быть скопирована, поскольку старую надо удалить. Запросом SQL невозможно это сделать поскольку хотя и выбрать множественное поле можно через SELECT и точку Письма.Документ.FileData, Письма.Документ.FileName, Письма.Документ.FileType, поле вложение состоит из 6 подполей.

Но в конструкции INSERT INTO нельзя использовать поля со множественным значением (это поле типа вложение). Можно только через конструкцию VALUES, но ээээ.... Если вы знаете как это сделать через SQL !!!!! Это просто было был шикарно.
Я постарался сделать через VBA. Вроде всё должно быть просто - надо создать два объекта recordset и поля одно присвоить полям другого. Конечно можно использовать методы .SaveToFile и .LoadFromFile и прогнав файлы через диск компьютера добиться результата. Но как это сделать напрямую - ничего не получается, просто море ошибок исправляя которые приходишь к другим и в итоге пришёл в тупик...

Итого на данный этап просто хочу в одной и той же базе данных скопировать все строки таблицы "Письма" в таблицу "Экспорт_Письма" - листинг следующий:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Public Sub Экспорт_данных()
'Открываем базу данных
Set текущаяБазаДанных = CurrentDb
'Для открытия другой базы данных будем использовать
'Set текущаяБазаДанных = OpenDatabase("Экспорт.accdb")
'Инициируем объекты рекордсет
Dim исхТаблица, редТаблица, запРедВложение, запИсхВложение As DAO.Recordset2
Dim редВложение, исхВложение As DAO.Field2
 
'Открываем таблицы
Set исхТаблица = текущаяБазаДанных.OpenRecordset("Письма", dbOpenTable)
'Set редТаблица = текущаяБазаДанных.OpenRecordset("Экспорт_Письма", dbOpenTable, dbInconsistent, dbOptimistic)
Set редТаблица = текущаяБазаДанных.OpenRecordset("Экспорт_Письма", dbOpenTable)
    'Очищаем строки записи
    Do While Not редТаблица.EOF
    редТаблица.Delete 'удаляем запись
    редТаблица.MoveNext 'переходим к следующей записи
    Loop
    'Прогоняем строки записи
    Do While Not исхТаблица.EOF
    редТаблица.AddNew 'добавляем новую запись
    'Перебераем поля записи
    For i = 0 To исхТаблица.Fields.Count - 1
    'Если последнее поле, то ...
    If Not исхТаблица.Fields(i).IsComplex Then
    редТаблица.Fields(i) = исхТаблица.Fields(i) 'Присваеваем значение полей
    End If
    Next i
    редТаблица.Update 'обновляем добавленную запись
    редТаблица.MovePrevious
    редТаблица.Edit
    For i = 0 To исхТаблица.Fields.Count - 1
    'Если последнее поле, то ...
    If исхТаблица.Fields(i).IsComplex Then
    'Инициируем поле вложение
    Set исхВложение = исхТаблица.Fields(i)
    Set редВложение = редТаблица.Fields(i)
    Set запИсхВложение = исхВложение.Value
    Set запРедВложение = редВложение.Value
    'Перебираем поле вложения
    Do While Not запИсхВложение.EOF
    'Перебераем поля нашего вложения
    запРедВложение.AddNew
    For j = 0 To запИсхВложение.Fields.Count - 1
    If Not IsNull(запИсхВложение.Fields(j).Value) Then
    [B]запРедВложение.Fields(j) = запИсхВложение.Fields(j) 'Присваеваем значение полей вложения[/B] Вот это вот строка вызывает ошибку!!!
    End If
    Next j
    запРедВложение.Update 'обновляем добавленное вложение
    запИсхВложение.MoveNext 'переходим к следующему вложению
    Loop
    запИсхВложение.Close
    запРедВложение.Close
    End If
    Next i
    редТаблица.Update 'обновляем изменённую запись
    исхТаблица.MoveNext 'переходим к следующей записи
    Loop
'Закрываем таблицы
исхТаблица.Close
редТаблица.Close
End Sub
Из изучения msdn. вроде понятно что вся особенность работы с полем типа Вложение заключается в том чтобы передать поле типа вложения через параметр .Value в объект Recordset.

Visual Basic
1
2
3
4
    Set исхВложение = исхТаблица.Fields(i)
    Set редВложение = редТаблица.Fields(i)
    Set запИсхВложение = исхВложение.Value
    Set запРедВложение = редВложение.Value
Ну или проще:

Set запИсхВложение = исхТаблица.Fields(i).Value
Set запРедВложение = редТаблица.Fields(i).Value

Мы получили recordset - где находятся все 6 подполей нашего поле "Документы".
Иии... дальше перебераем все подполя вложения в цикле

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
 Do While Not запИсхВложение.EOF
    'Перебераем поля нашего вложения
    запРедВложение.AddNew
    For j = 0 To запИсхВложение.Fields.Count - 1
    If Not IsNull(запИсхВложение.Fields(j).Value) Then
    [B]запРедВложение.Fields(j) = запИсхВложение.Fields(j)[/B] 'Присваеваем значение полей вложения
    End If
    Next j
    запРедВложение.Update 'обновляем добавленное вложение
    запИсхВложение.MoveNext 'переходим к следующему вложению
    Loop
И вот это вот строка запРедВложение.Fields(j) = запИсхВложение.Fields(j) 'Присваеваем значение полей вложения
- вызывала и вызывает ошибку.
"Run-time error '3164': Невозможно обновить поле" - и никак её не перепрыгнуть.
Интересно то, что данная конструкция проходит всё так 5 циклов - то есть 5 подполей нашего поля вложения заполняются, в том числе и двоичные данные файла!!! Но 6-ый цикл (присвоение 6-го последнего подполя) вызывает ошибку!!!

Изменение конструкции на

запРедВложение.Fields(j).Volume = запИсхВложение.Fields(j).Volume

ошибку не убирает.

Конструкция

Visual Basic
1
2
3
 If Not IsNull(запИсхВложение.Fields(j).Value) Then
    запРедВложение.Fields(j) = запИсхВложение.Fields(j) 'Присваеваем значение полей вложения
   End If
Была введена затем что когда цикла попадет на значение подполя Null то тоже выходит эта же ошибка
"Run-time error '3164': Невозможно обновить поле"
но цикл проходит только один раз - присваивается только одно подполе, до других 5-ти подполей цикл не доходит.

Я уже выделил отдельно присвоение полей простого типа

Visual Basic
1
2
3
4
5
6
7
8
9
 редТаблица.AddNew 'добавляем новую запись
    'Перебераем поля записи
    For i = 0 To исхТаблица.Fields.Count - 1
    'Если последнее поле, то ...
    If Not исхТаблица.Fields(i).IsComplex Then
    редТаблица.Fields(i) = исхТаблица.Fields(i) 'Присваеваем значение полей
    End If
    Next i
    редТаблица.Update 'обновляем добавленную запись
возвращаемся назад

Visual Basic
1
2
 редТаблица.MovePrevious
    редТаблица.Edit
, и присвоение одного этого поля с вложением

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 For i = 0 To исхТаблица.Fields.Count - 1
    'Если последнее поле, то ...
    If исхТаблица.Fields(i).IsComplex Then
    'Инициируем поле вложение
    Set исхВложение = исхТаблица.Fields(i)
    Set редВложение = редТаблица.Fields(i)
    Set запИсхВложение = исхВложение.Value
    Set запРедВложение = редВложение.Value
    'Перебираем поле вложения
    Do While Not запИсхВложение.EOF
    'Перебераем поля нашего вложения
    запРедВложение.AddNew
    For j = 0 To запИсхВложение.Fields.Count - 1
    If Not IsNull(запИсхВложение.Fields(j).Value) Then
    [B]запРедВложение.Fields(j) = запИсхВложение.Fields(j) 'Присваеваем значение полей вложения[/B] 
    End If
    Next j
    запРедВложение.Update 'обновляем добавленное вложение
    запИсхВложение.MoveNext 'переходим к следующему вложению
    Loop
    запИсхВложение.Close
    запРедВложение.Close
    End If
    Next i
Ничего не выходит
Помогите пожалуйста как в поле вложение запРедВложение добавить данные? через изменения каких свойств объекта это делается? Через Files? Values? или ещё что то.

База с макросом во вложении.

Заранее спасибо всем откликнувшимся!
Ответ:
Сообщение от mobile
Разобраться в Вашем коде сложновато. Лучше попробуйте процедуру, которая добавляет вложение в таблицу. Вставьте эту процедуру в свой код с нужными параметрами
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub addAttach(NomerKod, pathAttach)
'NomerKod - значение счетчика Код в т.Письма
'pathAttach - путь к документу и его имя с расширением. Например "c:\temp\Письмо.rtf"
    Dim rst As DAO.Recordset2, rstA As DAO.Recordset2, db As DAO.Database
    Set db = CurrentDb
    Set rst = db.OpenRecordset("select * from Письма where Код=" & NomerKod)
    rst.Edit
    Set rstA = rst.Fields("Документ").Value
    rstA.AddNew
    rstA.Fields("FileData").LoadFromFile pathAttach
    rstA.Update
    rst.Update
End Sub
Огромное спасибо за ответ!

вашу строку

Visual Basic
1
rstA.Fields("FileData").LoadFromFile pathAttach
я уже использовал и на этом построил первую версию своей процедуры. В ней файлы выгружались на диск с помощью
.SaveToFile и потом загружались обратно
в вашем случае это будет что то типа.

Visual Basic
1
2
rstB.Fields("FileData").SaveToFile pathAttach
rstA.Fields("FileData").LoadFromFile pathAttach
Но при этом все файлы будут скопированы на диск и там же останутся после работы процедуры.

Я же хочу обойтись без этого.

Добавлено через 29 минут
Ура товарищи!!! Проблема решена!
Может кому понадобиться инструкция по работе с полями типа Вложение.

Суть проблемы выяснилось после того как я убрал цикл перебора всех подполей поля вложения и вместо этого начал обращаться к конкретным подполям по их имени.

строки с 44 по 48
Visual Basic
1
2
3
4
5
                        For j = 0 To запИсхВложение.Fields.Count - 1
                            If Not IsNull(запИсхВложение.Fields(j).Value) Then
                                запРедВложение.Fields(j) = запИсхВложение.Fields(j) 'Присваеваем значение полей вложения Вот это вот строка вызывает ошибку!!!
                            End If
                        Next j
я заменил просто на
Visual Basic
1
2
3
запРедВложение.Fields("FileData").Value = запИсхВложение.Fields("FileData").Value 'Присваеваем значение полей вложения
запРедВложение.Fields("FileName").Value = запИсхВложение.Fields("FileName").Value
запРедВложение.Fields("FileType").Value = запИсхВложение.Fields("FileType").Value
И тут выяснилось что теперь вызывает ошибку именно это присвоение (строка 3):
Visual Basic
1
запРедВложение.Fields("FileType").Value = запИсхВложение.Fields("FileType").Value
То есть видимо тип файла ядро базы данных определяет сама автоматически и не позволяет заполнять это поле вручную.
Видимо даже больше - из всех 6-ти подполей которое содержит поле типа Вложение вручную можно заполнить только два это FileData и FileName остальные заполняются самим ядром базы данных. (я непрофессионал поэтому прошу простить меня за возможную делетантность). Самое главное что необходимо присвоить только два этих подполя и вложение скопируется в новую таблицу, остальные присваивать не надо.
Итого мой код работает и выглядит теперь так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Public Sub Экспорт_данных()
'Открываем базу данных
Set текущаяБазаДанных = CurrentDb
'Для открытия другой базы данных будем использовать
'Set текущаяБазаДанных = OpenDatabase("Экспорт.accdb")
'Инициируем объекты рекордсет
Dim исхТаблица, редТаблица, запРедВложение, запИсхВложение As DAO.Recordset2
 
'Открываем таблицы
Set исхТаблица = текущаяБазаДанных.OpenRecordset("Письма", dbOpenTable)
Set редТаблица = текущаяБазаДанных.OpenRecordset("Экспорт_Письма", dbOpenTable)
    
    'Очищаем таблицу
    Do While Not редТаблица.EOF
        редТаблица.Delete 'удаляем запись
        редТаблица.MoveNext 'переходим к следующей записи
    Loop
    
    'Заполняем таблицу
    'Прогоняем строки записи
    Do While Not исхТаблица.EOF
        редТаблица.AddNew 'добавляем новую запись
            'Перебераем поля записи. Не через коллекцию потому что нужно одновременно использовать ссылку на одно и то же поле но в разных Recordset'ах
            For i = 0 To исхТаблица.Fields.Count - 1
                'Если поле не типа мультизначение
                If Not исхТаблица.Fields(i).IsComplex Then
                    редТаблица.Fields(i) = исхТаблица.Fields(i) 'Присваеваем значение полей
                'Если поле типа мультизначение
                Else
                    'Иницилизируем Recordset'ы в которые передаём наше поле типа вложение
                    'Это и есть основное отличие - этот тип поле преедаётся на обработку в объект типа Recordset
                    Set запИсхВложение = исхТаблица.Fields(i).Value
                    Set запРедВложение = редТаблица.Fields(i).Value
                    'Перебераем все вложения нашего поля (вдруг там не один файл)
                    Do While Not запИсхВложение.EOF
                        запРедВложение.AddNew 'добавляем новое вложение
                        'Присваиваеми вложения одной таблицы в другую
                        запРедВложение.Fields("FileData").Value = запИсхВложение.Fields("FileData").Value
                        запРедВложение.Fields("FileName").Value = запИсхВложение.Fields("FileName").Value
                        запРедВложение.Update 'обновляем добавленное вложение
                        запИсхВложение.MoveNext 'переходим к следующему вложению
                    Loop
                    'Закрываем Recordset'ы
                    запИсхВложение.Close
                    запРедВложение.Close
                End If
            Next i
        редТаблица.Update 'обновляем изменённую запись
        исхТаблица.MoveNext 'переходим к следующей записи
    Loop
'Закрываем таблицы
исхТаблица.Close
редТаблица.Close
End Sub
Вопрос: Установить атрибуты столбца для фильтрации и сортировки записей

Подскажите пожалуйста, что бы изменить в таблице колонку, и указать атрибуты: "не может быть нулевым" "не может повторятся" и сразу сортируется по возрастанию. какие это атрибуты?

Добавлено через 3 минуты
SQL
1
ALTER TABLE Года MODIFY Года.Год BIGINT NOT NULL;
выдает ошибку: Неправильный синтаксис около конструкции "modify".
Ответ: эм... не, а в ms sql как это выглядит?

Добавлено через 2 минуты
я понимаю что alter table, выбор таблицы, выбор столбца, а как эти атрибуты то прописываются?
Вопрос: Замена в базе данных в столбце "Информация" весь текст на город

Добрый день!
Не могу решить вопрос, есть таблица:
БД1 столбцы: Номер, Дата, Информация

В поле "Информация" введён текст, в котором обязательно присутствует название города.
Нужно заменить в базе данных в столбце "Информация" весь текст на город (Славград, Королёв, Мытищи, Другие)

Пробовал через iif
Запрос отрабатывает, заменяет и выводит два столбца: уникальный номер и город.
Но обновить таблицу не могу UPDATE ругается:
Код SQL
1
2
3
4
5
6
7
UPDATE БД1
SET БД1.Информация =(SELECT Номер,
iif БД1.Информация LIKE '*Славград*', "Славград", 
iif БД1.Информация LIKE '*Королёв*', "Королёв", 
iif БД1.Информация LIKE '*Мытищи*', "Мытищи", 
iif БД1.Информация LIKE '*Другие*', "Другие" 
FROM БД1)
Можно конечно запрос iif сохранить в БД2, а потом:

Код SQL
1
2
3
UPDATE SAS
SET БД1.Информация =БД2.Информация
WHERE БД1.Номер=БД2.Номер
Но хочется обновить одним запросом, без промежуточных БД.

Добавлено через 14 минут
Выше UPDATE указал с ошибками.
Пробовал запрос:
Код SQL
1
2
3
4
5
UPDATE БД1
SET БД1.Информация =(SELECT iif (БД1.Информация LIKE '*Славград*', "Славград", 
iif (БД1.Информация LIKE '*Королёв*', "Королёв", 
iif (БД1.Информация LIKE '*Мытищи*', "Мытищи", "Другие"))))
FROM БД1)
Выпадает ошибка: В операции должен испльзоваться обновляемый запрос.
Ответ: Andrelol, сделайте это в двух разных запросах. В первом делаете те замены, для которых вхождение образца есть.

Во втором заменяете на "Другой" все остальные тексты.

Код SQL
1
2
3
UPDATE БД1 LEFT JOIN БД3 ON БД1.Информация=[БД3].[Город]
SET БД1.Информация = "Другой"
WHERE isnull([БД3].[Город]);