Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Помогите сформировать запрос на добавление / 25 сообщений из 27, страница 1 из 2
27.03.2018, 16:12
    #39621321
bormman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос на добавление
Пытаюсь вставить данные с листа Excel в базу Access, но запрос не проходит (Automation error).
Скорее всего проблема в том, что таблица в которую добавляю данные имеет связь один ко многим ( табл. Actions - поле NR_ID ), и для вставки данных в поле NR_ID нужно вытащить данные из поля ID таблицы Actions_NR которые соответствуют записи по Actions_NR.DATA=#4/1/2005#.
SQL знаю слабенько, помогите сформировать правильный запрос.

Базу прилагаю......

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
xlBase = ThisWorkbook.Path & "\Stocks.xlsm"
acBase = ThisWorkbook.Path & "\Stocks.accdb"
 
  SQL = "INSERT INTO Actions (PRICE, NR_ID) " & _
            "SELECT *, Actions_NR.ID " & _
            "FROM [2005$A1:A8] IN '" & xlBase & "' [Excel 12.0;HDR=YES;], Actions_NR " & _
            "INNER JOIN Actions ON Actions_NR.ID = Actions.NR_ID " & _
            "WHERE (Actions_NR.DATA=#4/1/2005#)"
           
  Set connAC = New ADODB.Connection
 
      connAC.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & acBase & ";"
      connAC.Execute SQL
...
Рейтинг: 0 / 0
27.03.2018, 16:21
    #39621334
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос на добавление
Импортируйте данные во временную таблицу ХОТЬ КАК-НИБУДЬ. А потом уже из неё кладите данные (возможно, с обработкой) в боевые таблицы.

А ошибка, скорее всего, потому, что просто не поддерживается объединение типа
Код: sql
1.
FROM tableA, tableB INNER JOIN tableC
...
Рейтинг: 0 / 0
27.03.2018, 16:33
    #39621364
bormman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос на добавление
авторА ошибка, скорее всего, потому, что просто не поддерживается объединение типа
FROM tableA, tableB INNER JOIN tableC
Ну а если сформировать как-то подзапрос типа.....

Код: vbnet
1.
2.
3.
4.
5.
6.
SQL = "INSERT INTO Actions (PRICE, NR_ID) " & _
            "SELECT * " & _
            "FROM [2005$A1:A8] IN '" & xlBase & "' [Excel 12.0;HDR=YES;] " & _
            "SELECT Actions_NR.ID FROM Actions_NR " & _
            "INNER JOIN Actions ON Actions_NR.ID = Actions.NR_ID " & _
            "WHERE (Actions_NR.DATA=#4/1/2005#)"
...
Рейтинг: 0 / 0
27.03.2018, 16:40
    #39621376
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос на добавление
bormmanНу а если сформировать как-то подзапрос типа.....Вы эта... подставьте вместо переменной xlBase что-нить очевидное, типа C:\file.xlsx да посмотрите, что получилось в переменной SQL. И прикиньте, как оно соотносится с синтаксисом SQL-языка...
...
Рейтинг: 0 / 0
27.03.2018, 16:48
    #39621390
bormman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос на добавление
авторВы эта... подставьте вместо переменной xlBase что-нить очевидное
Это Вы к чему? намек на то, что запрос в принципе не рабочий да?
Вы ошибаетесь - прекрасно работает, но в данном случае приходится использовать INNER JOIN и вот тут возникает проблема. Но я уверен, сформировать запрос можно - вот только моих знаний не хватает :(
...
Рейтинг: 0 / 0
27.03.2018, 17:25
    #39621451
Прогер_самоучка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос на добавление
bormmanПытаюсь вставить данные с листа Excel в базу Access, но запрос не проходит (Automation error).
Скорее всего проблема в том, что таблица в которую добавляю данные имеет связь один ко многим ( табл. Actions - поле NR_ID ), и для вставки данных в поле NR_ID нужно вытащить данные из поля ID таблицы Actions_NR которые соответствуют записи по Actions_NR.DATA=#4/1/2005#.
SQL знаю слабенько, помогите сформировать правильный запрос.

Базу прилагаю......

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
xlBase = ThisWorkbook.Path & "\Stocks.xlsm"
acBase = ThisWorkbook.Path & "\Stocks.accdb"
 
  SQL = "INSERT INTO Actions (PRICE, NR_ID) " & _
            "SELECT *, Actions_NR.ID " & _
            "FROM [2005$A1:A8] IN '" & xlBase & "' [Excel 12.0;HDR=YES;], Actions_NR " & _
            "INNER JOIN Actions ON Actions_NR.ID = Actions.NR_ID " & _
            "WHERE (Actions_NR.DATA=#4/1/2005#)"
           
  Set connAC = New ADODB.Connection
 
      connAC.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & acBase & ";"
      connAC.Execute SQL




http://www.sql.ru/forum/actualfile.aspx?id=21290520] Приложенный файл (Stocks.zip - 29Kb) нечем посмотреть accdb
Почему ?
Код: sql
1.
SELECT *
...
Рейтинг: 0 / 0
27.03.2018, 17:37
    #39621459
bormman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос на добавление
авторнечем посмотреть accdb
Почему ?
Код: vbnet
1.
SELECT *


SELECT * ... тут идет выборка из листа Excel(A1:A8)
SELECT *, Actions_NR.ID ..... тут выборка из поля ID табл. Actions_NR .

В принципе в ячейке А1 имя столбца - PRICE , по этому можно написать и так:
Код: vbnet
1.
SELECT PRICE, Actions_NR.ID

... но я и так делал - не проходит.
...
Рейтинг: 0 / 0
27.03.2018, 23:56
    #39621620
bormman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос на добавление
Может с UNION скомбинировать ?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
SQL = "INSERT INTO Actions (PRICE, NR_ID) " & _
            "SELECT * " & _
            "FROM " & _
            "(SELECT * FROM [2005$A1:A8] IN '" & xlBase & "' [Excel 12.0;HDR=YES;] AS PRICE " & _
            "UNION " & _
            "SELECT Actions_NR.ID FROM Actions_NR INNER JOIN Actions ON Actions_NR.ID = Actions.NR_ID) AS ID " & _
            "WHERE (Actions_NR.DATA=#4/1/2005#)"


с таким запросом выдает "Неопознанная ошибка"
...
Рейтинг: 0 / 0
28.03.2018, 07:40
    #39621678
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос на добавление
bormmanЭто Вы к чему? намек на то, что запрос в принципе не рабочий да?
Вы ошибаетесь - прекрасно работает
Да ну?
Берём
bormman
Код: vbnet
1.
2.
3.
4.
5.
6.
SQL = "INSERT INTO Actions (PRICE, NR_ID) " & _
            "SELECT * " & _
            "FROM [2005$A1:A8] IN '" & xlBase & "' [Excel 12.0;HDR=YES;] " & _
            "SELECT Actions_NR.ID FROM Actions_NR " & _
            "INNER JOIN Actions ON Actions_NR.ID = Actions.NR_ID " & _
            "WHERE (Actions_NR.DATA=#4/1/2005#)"


Подставляем предложеное мной xlBase = "C:\file.xlsx". Получаем в переменной SQL значение
Код: sql
1.
2.
3.
4.
5.
6.
7.
INSERT INTO Actions (PRICE, NR_ID) 
SELECT * 
FROM [2005$A1:A8] IN 'C:\file.xlsx' [Excel 12.0;HDR=YES;] 
SELECT Actions_NR.ID 
FROM Actions_NR 
INNER JOIN Actions ON Actions_NR.ID = Actions.NR_ID 
WHERE (Actions_NR.DATA=#4/1/2005#)

Вы и дальше намерены утверждать, что запрос "прекрасно работает"?
...
Рейтинг: 0 / 0
28.03.2018, 09:36
    #39621730
Прогер_самоучка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос на добавление
bormmanавторнечем посмотреть accdb
Почему ?
Код: vbnet
1.
SELECT *



SELECT * ... тут идет выборка из листа Excel(A1:A8)
SELECT *, Actions_NR.ID ..... тут выборка из поля ID табл. Actions_NR .

В принципе в ячейке А1 имя столбца - PRICE , по этому можно написать и так:
Код: vbnet
1.
SELECT PRICE, Actions_NR.ID


... но я и так делал - не проходит.без
Код: sql
1.
INNER JOIN

как себя ведёт запрос?
...
Рейтинг: 0 / 0
28.03.2018, 14:46
    #39622079
bormman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос на добавление
AkinaДа ну?
Берём.....
Вы и дальше намерены утверждать, что запрос "прекрасно работает"?
Выше я сказал, что работает прекрасно, НО без INNER JOIN и соотв. попыток вытянуть данные с табл. Actions_NR .
Вот можете убедиться - прикрепил zip (внутри база+ексель).
...
Рейтинг: 0 / 0
28.03.2018, 14:48
    #39622082
bormman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос на добавление
Прогер_самоучкабез
Код: sql
1.
INNER JOIN

как себя ведёт запрос?
Да все так же ... Automation error
...
Рейтинг: 0 / 0
28.03.2018, 14:58
    #39622092
Прогер_самоучка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос на добавление
bormmanПрогер_самоучкабез
Код: sql
1.
INNER JOIN


как себя ведёт запрос?
Да все так же ... Automation errorИ тут же пишите
bormmanВыше я сказал, что работает прекрасно, НО без INNER JOIN и соотв. попыток вытянуть данные с табл. Actions_NR

Залейте данные, а потом апдейте. Как вам такой вариант ?
...
Рейтинг: 0 / 0
28.03.2018, 15:00
    #39622094
Помогите сформировать запрос на добавление
ИМХО, запрос надо строить исключительно на листе Excel без всяких INNER JOIN. А Actions.NR_ID получить функцией DLookup и ли подчиненным запросом в качестве источника поля.
...
Рейтинг: 0 / 0
28.03.2018, 15:19
    #39622110
bormman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос на добавление
Без INNER JOIN я имел в виду запрос только к листу ексель без попыток выбрать данные в одном запросе и с листа ексель и с таблицы акса. Постом выше я прикрепил файл - посмотрите.
Вообще вопрос стоит не типа "дайте мне скорее решение" - решение у меня есть и не одно.... я хочу решить вопрос более "изящно" что-ли :) ну и положить в копилку что-то новое.
Конечно, можно скинуть данные с листа в таблицу Т, а уже потом другим запросом вставить данные из Т в рабочую базу или просто тупо использовать Loop с конструкцией INSERT INTO VALUE... но это все лишние телодвижения... ну в общем надеюсь вы меня понимаете.
...
Рейтинг: 0 / 0
28.03.2018, 16:06
    #39622145
Прогер_самоучка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос на добавление
bormmanБез INNER JOIN я имел в виду запрос только к листу ексель без попыток выбрать данные в одном запросе и с листа ексель и с таблицы акса. Постом выше я прикрепил файл - посмотрите.
Вообще вопрос стоит не типа "дайте мне скорее решение" - решение у меня есть и не одно.... я хочу решить вопрос более "изящно" что-ли :) ну и положить в копилку что-то новое.
Конечно, можно скинуть данные с листа в таблицу Т, а уже потом другим запросом вставить данные из Т в рабочую базу или просто тупо использовать Loop с конструкцией INSERT INTO VALUE... но это все лишние телодвижения... ну в общем надеюсь вы меня понимаете.лично я вижу, что вы пытаетесь решить, а не ищите на готовенькое.
Иначе даже бы отвечать не стал ;)

bormmanПостом выше я прикрепил файл - посмотрите.если бы мог, то давно бы посмотрел

Прогер_самоучканечем посмотреть accdb 21290860
...
Рейтинг: 0 / 0
28.03.2018, 16:07
    #39622149
Прогер_самоучка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос на добавление
Кривцов АнатолийИМХО, запрос надо строить исключительно на листе Excel без всяких INNER JOIN. А Actions.NR_ID получить функцией DLookup и ли подчиненным запросом в качестве источника поля.На сколько помню, именно так есть.
Поэтому и спросил работает ли без иннер джоина(без второй таблицы)
...
Рейтинг: 0 / 0
28.03.2018, 16:13
    #39622155
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос на добавление
Проверьте вот такой вариант:

Код: vbnet
1.
2.
3.
4.
5.
  SQL = "INSERT INTO Actions (PRICE, NR_ID) " & _
        "SELECT xlTable.*, Actions_NR.ID " & _
        "FROM [2005$A1:A8] IN '" & xlBase & "' [Excel 12.0;HDR=YES;] AS xlTable, Actions_NR, Actions " & _
        "WHERE Actions_NR.ID = Actions.NR_ID " & _
        "AND (Actions_NR.DATA=#4/1/2005#)"


Код: sql
1.
2.
3.
4.
5.
INSERT INTO Actions (PRICE, NR_ID) 
SELECT xlTable.*, Actions_NR.ID
FROM [2005$A1:A8] IN 'xlBaseName.xlsx' [Excel 12.0;HDR=YES;] AS xlTable, Actions_NR, Actions
WHERE Actions_NR.ID = Actions.NR_ID
AND (Actions_NR.DATA=#4/1/2005#)



И ещё - это всё же ADODB, и мне кажется, что литерал даты там должен быть не #4/1/2005#, а '2005-01-04'... ну и проверьте, как вообще ADODB относится к Jet-style имени экселевской таблицы...
...
Рейтинг: 0 / 0
28.03.2018, 16:54
    #39622198
bormman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос на добавление
Прогер_самоучкаесли бы мог, то давно бы посмотрел
Вот то же но в формате 97-2003
...
Рейтинг: 0 / 0
28.03.2018, 17:13
    #39622216
bormman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос на добавление
AkinaПроверьте вот такой вариант:

Код: vbnet
1.
2.
3.
4.
5.
  SQL = "INSERT INTO Actions (PRICE, NR_ID) " & _
        "SELECT xlTable.*, Actions_NR.ID " & _
        "FROM [2005$A1:A8] IN '" & xlBase & "' [Excel 12.0;HDR=YES;] AS xlTable, Actions_NR, Actions " & _
        "WHERE Actions_NR.ID = Actions.NR_ID " & _
        "AND (Actions_NR.DATA=#4/1/2005#)"


Нет, не проходит. Мне кажется, что причину нашел. Начал проверять запрос по кускам, и выяснил что акс никак не хочет принимать имена полей без имен таблиц в SELECT... например это проходит :
Код: vbnet
1.
2.
3.
SQL = "SELECT Actions.PRICE, Actions_NR.ID " & _
            "FROM Actions_NR INNER JOIN Actions ON Actions_NR.ID = Actions.NR_ID " & _
            "WHERE ((Actions_NR.ID)=(SELECT ID FROM Actions_NR WHERE Actions_NR.DATA=#4/1/2005#))"


а это нет :
Код: vbnet
1.
2.
3.
SQL = "SELECT PRICE, ID " & _
            "FROM Actions_NR INNER JOIN Actions ON Actions_NR.ID = Actions.NR_ID " & _
            "WHERE ((Actions_NR.ID)=(SELECT ID FROM Actions_NR WHERE Actions_NR.DATA=#4/1/2005#))"


и поэтому в этом месте " SELECT PRICE, Actions_NR.ID " & _ акс не знает что ему брать с листа...
И ещё - это всё же ADODB, и мне кажется, что литерал даты там должен быть не #4/1/2005#, а '2005-01-04'
Принимает оба варианта.
проверьте, как вообще ADODB относится к Jet-style имени экселевской таблицы...
Где бы такое почитать?
...
Рейтинг: 0 / 0
29.03.2018, 09:42
    #39622455
Прогер_самоучка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос на добавление
bormmanНет, не проходит. Мне кажется, что причину нашел. Начал проверять запрос по кускам, и выяснил что акс никак не хочет принимать имена полей без имен таблиц в SELECT... например это проходит :
Код: vbnet
1.
2.
3.
SQL = "SELECT Actions.PRICE, Actions_NR.ID " & _
            "FROM Actions_NR INNER JOIN Actions ON Actions_NR.ID = Actions.NR_ID " & _
            "WHERE ((Actions_NR.ID)=(SELECT ID FROM Actions_NR WHERE Actions_NR.DATA=#4/1/2005#))"



а это нет :
Код: vbnet
1.
2.
3.
SQL = "SELECT PRICE, ID " & _
            "FROM Actions_NR INNER JOIN Actions ON Actions_NR.ID = Actions.NR_ID " & _
            "WHERE ((Actions_NR.ID)=(SELECT ID FROM Actions_NR WHERE Actions_NR.DATA=#4/1/2005#))"

логично, чёрт побери.
У вас же же в двух таблицах это поле встречается, прога сама должна догадаться какое поле вы имели в в иду ?
...
Рейтинг: 0 / 0
29.03.2018, 09:55
    #39622459
Помогите сформировать запрос на добавление
Видимо так:
Код: sql
1.
2.
3.
4.
INSERT INTO Actions (PRICE, NR_ID) SELECT Лист.PRICE, Лист.ID 
FROM [2005$A1:A8] As Лист IN 'Путь' [Excel 12.0;HDR=YES;] 
INNER JOIN Actions_NR.ID ON Лист.ID = Actions.NR_ID
WHERE (Actions_NR.DATA=#4/1/2005#)


В вашем xlsm файле в колонке ID присутствует только значения 3, что соответствует значению записи с Actions_NR с нужной датой. Чтоб втащить эти данные, никакой INNER JOIN не нужен. Или это пример не наглядный?
...
Рейтинг: 0 / 0
29.03.2018, 14:58
    #39622715
Помогите сформировать запрос на добавление
Или так:
Код: sql
1.
2.
3.
4.
INSERT INTO Actions (PRICE, NR_ID) SELECT Лист.PRICE, Лист.ID 
FROM [Excel 12.0;HDR=YES;DATABASE=Путь].[2005$A1:A8] As Лист
INNER JOIN Actions_NR.ID ON Лист.ID = Actions.NR_ID
WHERE (Actions_NR.DATA=#4/1/2005#)
...
Рейтинг: 0 / 0
29.03.2018, 15:59
    #39622736
bormman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите сформировать запрос на добавление
Прогер_самоучкаУ вас же же в двух таблицах это поле встречается, прога сама должна догадаться какое поле вы имели в в иду ?
Да точно... уже шарики за ролики пошли
Кривцов Анатолий В вашем xlsm файле в колонке ID присутствует только значения 3, что соответствует значению записи с Actions_NR с нужной датой. Чтоб втащить эти данные, никакой INNER JOIN не нужен. Или это пример не наглядный?
Нет, это поле ID на листе xl я вставил для примера и проверки будет ли работать если данные брать только с листа xl - если только с листа, то все работает:
Код: vbnet
1.
2.
3.
SQL = "INSERT INTO Actions (PRICE, NR_ID) " & _
          "SELECT PRICE, ID " & _
          "FROM [2005$A1:B8] IN '" & xlBase & "' [Excel 12.0;HDR=YES;]"


Но данные для поля Actions.NR_ID надо брать с таблицы Actions_NR.ID , т.е. рабочие данные беру с листа xl а данные для поля Actions.NR_ID беру с табл. Actions_NR.ID ... если Вы откроете базу, то там видно, что таблицы связаны (один ко многим) и что бы мне добавить данные на дату которая уже есть в табл. Actions_NR - нужно знать ID этой записи для вставки ее в поле NR_ID табл. Actions
И все это я хочу сделать в одном запросе... но пока облом
Вариации в Ваших примерах то же не работают
...
Рейтинг: 0 / 0
29.03.2018, 16:33
    #39622762
Помогите сформировать запрос на добавление
bormmanНет, это поле ID на листе xl я вставил для примера и проверки будет ли работать если данные брать только с листа xl Это чтоб запутать чужих и сбить с толку своих?

Тогда попробуйте то, о чем я писал ранее:
Код: sql
1.
2.
3.
NSERT INTO Actions (PRICE, NR_ID) 
SELECT PRICE, (SELECT TOP 1 ID FROM Actions_NR WHERE DATA=#4/1/2005#) As ID 
FROM [2005$A1:A8] IN 'Путь' [Excel 12.0;HDR=YES;]


или
Код: plsql
1.
2.
3.
INSERT INTO Actions (PRICE, NR_ID) 
SELECT PRICE, DLookup('[ID]', '[Actions_NR]', 'DATA=#4/1/2005#') As ID 
FROM [2005$A1:A8] IN 'Путь' [Excel 12.0;HDR=YES;]
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Помогите сформировать запрос на добавление / 25 сообщений из 27, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]