Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2012, 21:47   #1
gluk_fm
Форумчанин
 
Аватар для gluk_fm
 
Регистрация: 09.06.2011
Сообщений: 515
По умолчанию Из рекордсет в таблицу

Добрый вечер.
Уважаемые програмисты, может кто-то встречался с проблемой загрузки данных из рекордсета в таблицу.
Краткое описание:
1. Создал процедурку создания таблицы с полями из рекордсет (запросы рекордсета будут разные, сразным количеством столбцов и т.д, поэтому пытаюсь создать универсальный инструмент)
2. Попытался присвоить добавленным полям формат значений из рекордсет (явно не очень успешно но не критично)

Код:
Dim nFildForm1 As Variant
Set tdf = db.CreateTableDef("temp")
For i = 1 To rstRecordset.Fields.Count - 1
nFild = rstRecordset.Fields(i).Name
nFild1 = VarType(rstRecordset.Fields(i).Value)
nFild2 = rstRecordset.Fields(i).NumericScale
nFild3 = rstRecordset.Fields(i).Value
   Set rstConst = db.OpenRecordset("SELECT sp_KonstantPerem.kod, sp_KonstantPerem.Constant, sp_KonstantPerem.Description " & _
                                    "FROM sp_KonstantPerem;")
rstConst.MoveFirst
Do Until rstConst.EOF
If nFild1 = rstConst![kod] Then
If nFild1 = 3 And InStr(1, nFild3, ",", 0) < 0 Or InStr(1, nFild3, ".", 0) < 0 Then nFild1 = 7
GoTo n1:
End If

rstConst.MoveNext
Loop
nFild1 = 10
n1:

Set fld1 = tdf.CreateField(nFild, nFild1, nFild2)
tdf.Fields.Append fld1

Next i
Столкнулся со следующей проблемой: Как мне данные из рекордсета загнать в созданную таблицу или может есть возможность сразу на основания рекордсет создать таблицу?

Заранее спасибо за помощь
gluk_fm вне форума Ответить с цитированием
Старый 27.11.2012, 23:17   #2
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

Доброго.
Формируйте для каждой записи рекордсета запрос на добавление. Если откроете "секрет" формирования рекордсета то можно будет подумать ...
на неконкретные вопросы даю неконкретные ответы ...
Step_UA вне форума Ответить с цитированием
Старый 28.11.2012, 01:50   #3
Myhaylo
Форумчанин
 
Регистрация: 19.07.2012
Сообщений: 520
По умолчанию

Может быть, Вам стоит сразу воспользоваться запросом на создание таблицы? Тогда проблемы разных количества столбцов и форматов данных сразу отпадают...
Окупант, руки прочь от Украины!!! Слава Героям!
Myhaylo вне форума Ответить с цитированием
Старый 28.11.2012, 11:40   #4
gluk_fm
Форумчанин
 
Аватар для gluk_fm
 
Регистрация: 09.06.2011
Сообщений: 515
По умолчанию

Доброе утро.
Уважаемые програмисты, проблема и состоит в
Код:
1. Создал процедурку создания таблицы с полями из рекордсет (запросы рекордсета будут разные, сразным количеством столбцов и т.д, поэтому пытаюсь создать универсальный инструмент)
Тоесть набор полей для запроса на добавление является динамическим (количество, наименование, тип данных) будут всегда разными. В связи с чем и возникает вопрос каким образом можно VB создать/сгенерировать запрос на добавление из рекордсета?

Может кто-то делал что-то подобное?
Пока появилась идея загнать всё в массив и сделать что-то типа импорта, но не уверен что такое выйдет.....

Myhaylo, я думал над этим, НО получилась такая ситуация, что все запросы на 100% будут генерироваться не мной, а соответственно на 100% они будут как запросы на выборку.....

Лень - двигатель прогресса.

Последний раз редактировалось gluk_fm; 28.11.2012 в 11:43.
gluk_fm вне форума Ответить с цитированием
Старый 29.11.2012, 00:18   #5
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте gluk_fm.
Вы не думали применить Excel для решения задачи?
С его применением задача может быть решена за семь шагов:
1. создать сессию Excel - .
2. открыть файл шаблон/заготовку.
3. выложить на лист рекордсет.
4. сохранить и закрыть файл и Excel.
5. изменить SQL конструкцию существующего запроса обращением к внешней таблице Excel.
6. удалить существующую таблицу.
7. создать таблицу.

В коде это может выполняться так:
Код:
Dim XL, XT, rst As ADODB.Recordset, i%, s$
'
Set XL = CreateObject("Excel.Application")
Set XT = XL.WorkBooks.Open(CurrentProject.Path + "\Temlate.xls")
XT.Sheets(1).Cells.Clear
XT.Sheets(1).Range("A2").CopyFromRecordset rst 
For i = 0 To rst.Fields.Count - 1
    XT.Sheets(1).Cells(1, i + 1) = rst.Fields(i).Name
Next
    XT.Save
    XL.Quit
Set XT = Nothing
Set XL = Nothing
s = "SELECT * FROM [Excel 8.0;DATABASE=" + CurrentProject.Path + "\Temlate.xls].[Лист1$]"
CurrentDb.QueryDefs("qExcel").SQL = s '
CurrentDb.Execute("Drop Table TmpExcel") ' 
CurrentDb.Execute("SELECT * INTO TmpExcel FROM qExcel") '
(конечно обработчик ошибок стоит добавить)

Евгений.

Последний раз редактировалось Teslenko_EA; 29.11.2012 в 00:20.
Teslenko_EA вне форума Ответить с цитированием
Старый 29.11.2012, 01:28   #6
Myhaylo
Форумчанин
 
Регистрация: 19.07.2012
Сообщений: 520
По умолчанию

Цитата:
Сообщение от gluk_fm Посмотреть сообщение
все запросы будут генерироваться не мной - они будут как запросы на выборку...
Так и хорошо. Пусть этот запрос на выборку сохранён на закладке "Запросы" окна "база данных" как "Запрос1". Тогда Ваш запрос на создание таблицы "НоваяТаблица" имеет вид:

SELECT Запрос1.* INTO НоваяТаблица FROM Запрос1;
Окупант, руки прочь от Украины!!! Слава Героям!
Myhaylo вне форума Ответить с цитированием
Старый 29.11.2012, 11:14   #7
gluk_fm
Форумчанин
 
Аватар для gluk_fm
 
Регистрация: 09.06.2011
Сообщений: 515
По умолчанию

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


Уважаемый "Teslenko_EA", Вы как всегда даёте толковые советы, но к сожалению/радости мне хотелось бы уйти от использования "Excel", так как данные процедуры хочу написать для выполнения в моё отстуствие, а на данном компьютере паралельно будут выполнятся макросы екселя что непременно приведёт к сбою.....

Пока возникла идея сгенерировать из запроса на выборку запрос на добавление, что-то вроде:

Код:
Set SQLt = "Select tabl_ish.* &" & _
"From tabl_ish " & _
" where tabl_ish.bb=1"

db.execute ("insert into temp " & SQLt) 

или

p1 = instr(1,SQLt,"From",0)

db.execute (mid(SQLt,1,p1) & "INTO temp " & mid(SQLt,p1,1000)
Но я что-то глубоко сомневаюсь что у меня такое выйдет, так как часто используется что-то вроде:
Код:
sum/100 as Ssum, iif(T.b=1,22,334) as PP
и т.д.
Может кто-то делал что-то подобное или может посказать где можно такое почитать?


Спасибо "Teslenko_EA" в случае если не найду варианта решения буду пробовать Ваш вариант с доработкой: При запуске процедуры, останавливать действующие макросы (или вгонять их в sleep) и через Event (если не ошибаюсь) прокручивать данную процедуру.....

Последний раз редактировалось gluk_fm; 29.11.2012 в 11:18.
gluk_fm вне форума Ответить с цитированием
Старый 29.11.2012, 19:43   #8
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

gluk_fm, Ваши опасения по поводу "..паралельно будут выполнятся макросы екселя что непременно приведёт к сбою.."
напрасны.

в коде выполняется команда: CreateObject("Excel.Application") (а не GetObject(, "Excel.Application"))
Следовательно создается новая, не зависящая от работающей сессия Excel, именно об этом я писал:
Цитата:
1. создать сессию Excel...
а после выполнения - заполнения и сохранения листа, она закрывается (.. XL.Quit ..)
не отображаясь и не доставляя проблем работающим приложениям.

Евгений.

P.S. все свои сообщения я подписываю в надежде, что обращаться ко мне будут по имени.

Последний раз редактировалось Teslenko_EA; 29.11.2012 в 19:45.
Teslenko_EA вне форума Ответить с цитированием
Старый 30.11.2012, 00:09   #9
Myhaylo
Форумчанин
 
Регистрация: 19.07.2012
Сообщений: 520
По умолчанию

Цитата:
Сообщение от gluk_fm Посмотреть сообщение
такой вариант не пройдёт по причине выемки запросов на выборку из внешних источников, что не позволит его сохранять как запрос.
Но раз Вы собираетесь работать с объектом RecordSet, то там будет запрос. Вот и сохраняйте текст этого запроса как "Запрос1". Таким запросом может быть хоть запрос к DBF-файлу, хоть к таблице в другой базе данных, даже запрос к серверу... Вы же не данные сохраняете, а именно способ их получения.
Или у Вас будет "виртуальный" RecordSet?
Вот зря Вы не ответили Step_UA...
Окупант, руки прочь от Украины!!! Слава Героям!
Myhaylo вне форума Ответить с цитированием
Старый 30.11.2012, 17:51   #10
gluk_fm
Форумчанин
 
Аватар для gluk_fm
 
Регистрация: 09.06.2011
Сообщений: 515
По умолчанию

Добрый день.
Спасибо что помогаете с моей проблемой.
Обьяснение:
Виртуальный не рекордсет - а источники получения в нём, тоесть конект.... Так что даже если я и сохраню его как запрос толку с этого не будет....
На данный момент есть рекордсет и пустая таблица с такими же именами полей, как можно написать запрос на добавление из запроса на выборку при динамическом количестве полей?
Присер запроса:

Код:
cSqlString = "SELECT b.arcdate,b.summanow/100 as summanow,b.summanoweq/100 as summanoweq,a.baccountid as BACCOUNT_ID,a.currencyid as CURRENCY_ID,c.id as CONTR_ID,c.name as CONTR_NAME,c.identifycode as CONTR_TAXCODE,cr.id as CONTR_RANKID,cr.sname as CONTR_RANK_SNAME,cu.symbolcode " & _
"FROM arc_balance b,aaccount a,contragent c,contragrank cr,currency  cu " & _
"WHERE " & _
      "a.baccountid in (2512,2513,2520,2523,2526,2530,2531,2541,2542,2544,2545,2552,2553,2554,2560,2561,2562,2565,2570,2571,2572,2600,2601,2602,2603,2604,2605,2606,2620,2622,2625,2640,2641,2642,2643,2650,2655) " & _
      "and sign(b.summanoweq)=1 " & _
      "and cr.id in (3,4) " & _
      "and b.corrmode IN (0, 2) " & _
      "and a.ID = b.accountid " & _
      "and c.id = a.contragentid " & _
      "and c.contragrankid=cr.id " & _
      "and a.currencyid=cu.id(+) " & _
"and (b.arcdate=to_date('13.11.2012','dd.mm.yyyy') or b.arcdate=to_date('12.11.2012','dd.mm.yyyy'))"

Спасибо, Евгений я думаю что данный вариант я смогу использовать, если не получится всётаки пройти по пути который я наметил.

Последний раз редактировалось gluk_fm; 30.11.2012 в 17:54.
gluk_fm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление записи в таблицу через таблицу Anton911 БД в Delphi 0 14.05.2012 11:51
Объединить таблицу access и таблицу paradoxa в таблицу access GROSS777 БД в Delphi 1 09.02.2012 14:58
сохранить таблицу uraura БД в Delphi 4 18.01.2011 18:05
Запрос возвращает пустую таблицу, если один из подзаросов возвращает пустую таблицу ArtInt SQL, базы данных 9 12.05.2010 15:40
Выборка данных в рекордсет из диапазона. Kveldulv Microsoft Office Excel 1 15.03.2010 14:24