164 / 49 / 27
Регистрация: 04.06.2013
Сообщений: 636
1

Работа с OLE (создать документ Access)

27.06.2013, 22:51. Показов 4415. Ответов 27
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
пытаюсь создать документ access, но выдаёт ошибку.
C++
1
2
3
4
5
6
vVarApp=CreateOleObject("Access.Application");
   AnsiString vAsCurDir=GetCurrentDir();
AnsiString vAsCurDir1=vAsCurDir+"\\my.mdb";
ShowMessage(vAsCurDir1);
vVarDoc.OleProcedure("SaveAs",vAsCurDir1.c_str());
vVarApp.OleProcedure("Quit");
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.06.2013, 22:51
Ответы с готовыми решениями:

Создать в таблице Access OLE-поле
Здравствуйте. Помогите пожалуйста правильно сформировать запрос. Нужно в access создать OLE-поле....

работа из ASP с OLE-полями ACCESS-a
Народ, проблема следующая: есть база .mdb, в которой один столбец имеет тип 'OLE'. В нем лежат...

Создать форму в access, чтобы заполняла базу данных и автоматически формировала документ Word
Добрый день! Необходимо создать форму, которая заполняет таблицу в базе данных и автоматически...

Произошли ошибки во время выполнения многошаговой операции OLE DB. По возможности, проверьте значения всех состояний OLE DB. Работа не выполнена
OleDbConnection cn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +...

27
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,413
28.06.2013, 09:07 2
А где вы видите тут создание документа? Я вижу создание объекта обслуживающего Access и сохранение документа vVarDoc который взялся невесть откуда. А создание где? И что за ошибка?
0
164 / 49 / 27
Регистрация: 04.06.2013
Сообщений: 636
28.06.2013, 22:01  [ТС] 3
помогите, как создать базу данных access.я этот код взял из создания Word, и сам переделал немного.но не могу разобраться
0
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,413
28.06.2013, 22:49 4
Цитата Сообщение от mish_k98 Посмотреть сообщение
как создать базу данных
зачем вам этот героизм? пусть она уже будет. с тем количеством таблиц которое вам нужно. и с той структурой таблиц которая вам нужна. ибо забивать все это через OLE скучно - все равно что вместо заполнения шаблона Word каждый раз рисовать его заново программным способом. и сохранять ее особо не нужно - изменения применяются по мере выполнения инструкций - Access в этом плане не Word - там нельзя наворотить и закрыть без сохранения - все вносится в базу сразу же. поэтому просто открывайте базу и модифицируйте. если хотите - в начале копируйте файл. заполнять надеюсь умеете. в VBA это что то вроде

Visual Basic
1
2
3
4
Dim con As New adodb.Connection
Call con.Open("Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & ActiveWorkbook.path & "\" & db_file_name & ".accdb;")
 
Call con.Execute("INSERT INTO " & table & " бла бла бла
0
164 / 49 / 27
Регистрация: 04.06.2013
Сообщений: 636
29.06.2013, 19:36  [ТС] 5
дело в том, что мне просто нужно создать документ access, а потом я буду с ним работать через sql.а таких документов
Цитата Сообщение от vxg Посмотреть сообщение
зачем вам этот героизм? пусть она уже будет. с тем количеством таблиц которое вам нужно. и с той структурой таблиц которая вам нужна.
я не знаю сколько.
0
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,413
30.06.2013, 12:39 6
возможно натолкнет на мысль
Создание базы из VBA - нужен совет
особенно читать

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dim strDB As String
strDB = 'xxx.mdb'
 
'Create new instance of Microsoft Access.
Set appAccess = CreateObject('Access.Application')
 
'Open database in Microsoft Access window.
appAccess.NewCurrentDatabase strDB
 
'Get Database object variable.
Set dbs = appAccess.CurrentDb
 
'Create new table.
Set tdf1 = dbs.CreateTableDef('MaterialInc')
0
164 / 49 / 27
Регистрация: 04.06.2013
Сообщений: 636
30.06.2013, 19:45  [ТС] 7
я не знаю как это сделать на c++builder
0
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,413
30.06.2013, 21:44 8
Цитата Сообщение от mish_k98 Посмотреть сообщение
я не знаю как это сделать на c++builder
все тоже самое что и в VBA только заворачивается в OleProcedure и т.п.
0
164 / 49 / 27
Регистрация: 04.06.2013
Сообщений: 636
30.04.2014, 22:35  [ТС] 9
с созданием базы разобрался.но как ме в ней создать 4 таблицы, а в таблицах несколько полей?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32983 / 21292 / 8177
Регистрация: 22.10.2011
Сообщений: 36,569
Записей в блоге: 8
30.04.2014, 23:16 10
Создание таблицы с полями:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    const int dbInteger = 3;
    const int dbText = 10;
 
    Variant acc = CreateOleObject("Access.Application");
    acc.OleFunction("NewCurrentDatabase", WideString(ExtractFilePath(ParamStr(0)) + "test.mdb"));
    Variant TableDef = acc.OleFunction(WideString("CurrentDb")).OleFunction(WideString("CreateTableDef"), WideString("tblInfo"));
    Variant Fld = TableDef.OleFunction(WideString("CreateField"), WideString("Title"), dbText, 20);
    Variant Fld1 = TableDef.OleFunction(WideString("CreateField"), WideString("Description"), dbText, 200);
    Variant Fld2 = TableDef.OleFunction(WideString("CreateField"), WideString("Index"), dbInteger, 0);
    TableDef.OlePropertyGet(WideString("Fields")).OleProcedure(WideString("Append"), Fld);
    TableDef.OlePropertyGet(WideString("Fields")).OleProcedure(WideString("Append"), Fld1);
    TableDef.OlePropertyGet(WideString("Fields")).OleProcedure(WideString("Append"), Fld2);
    acc.OleFunction(WideString("CurrentDb")).OlePropertyGet(WideString("TableDefs")).
        OleProcedure(WideString("Append"), TableDef);
    acc.OleFunction(WideString("Quit"));
    acc = Unassigned;
Хоть 10 штук... Проверил только что на AccessXP, нормально создается база с табличкой.
1
164 / 49 / 27
Регистрация: 04.06.2013
Сообщений: 636
01.05.2014, 10:25  [ТС] 11
пасибо.оказывается не всё так сложно.но меня интересует, для чего 10-14 строки?

Добавлено через 44 секунды
и что означают эти цифровые параметры?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32983 / 21292 / 8177
Регистрация: 22.10.2011
Сообщений: 36,569
Записей в блоге: 8
01.05.2014, 10:31 12
10-12 добавляют к таблице ранее созданные поля (они были созданы отдельно, теперь надо их прицепить куда-то, правда?), а 13-14 добавляют саму таблицу (уже с полями) в БД.
Цитата Сообщение от mish_k98 Посмотреть сообщение
что означают эти цифровые параметры?
Посмотри на описание метода CreateField, видишь там Type и Size? Вот Type у меня и задается либо Text либо Integer (соответственно, Text - с размером, для Integer размер не нужен, поэтому там 0)
1
164 / 49 / 27
Регистрация: 04.06.2013
Сообщений: 636
01.05.2014, 10:54  [ТС] 13
я понял.а как мне создать поля типа date и типа float, и за одно как мне флоат вводить туда в формате 0,00
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32983 / 21292 / 8177
Регистрация: 22.10.2011
Сообщений: 36,569
Записей в блоге: 8
01.05.2014, 12:24 14
C++
1
2
3
4
5
6
7
    const int dbDouble = 7;
    const int dbDate = 8;
 
    Variant Fld3 = TableDef.OleFunction(WideString("CreateField"),
        WideString("Price"), dbDouble, 0);
    Variant Fld4 = TableDef.OleFunction(WideString("CreateField"),
        WideString("Data"), dbDate, 0);
, и точно так же, как остальные поля добавить к TableDef-у... Ну посмотри уже на свойства/методы объекта Field, я ж не могу всю программу за тебя писать...
1
164 / 49 / 27
Регистрация: 04.06.2013
Сообщений: 636
02.05.2014, 21:52  [ТС] 15
а как сделать одно поле типа счётчик, в msdn я такого не нашол. и что означают эти константы, почему они именно такие?

Добавлено через 12 минут
вот мой код для создания двух таблиц,хотя надо 4.но мне выдаёт ошибку, когда я запускаю выполнение этого кода
C++
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
const int dbInteger = 3;
    const int dbText = 10;
    const int dbDouble = 7;
    const int dbDate = 8;
 
 
    Variant acc = CreateOleObject("Access.Application");
    acc.OleFunction("NewCurrentDatabase", WideString(ExtractFilePath(ParamStr(0)) + "sklad_copy.mdb"));
    Variant TableDef = acc.OleFunction(WideString("CurrentDb")).OleFunction(WideString("CreateTableDef"), WideString("приход"));
    Variant Fld = TableDef.OleFunction(WideString("CreateField"), WideString("Товар"), dbText, 30);
    Variant Fld1 = TableDef.OleFunction(WideString("CreateField"), WideString("Количество"), dbInteger, 0);
    Variant Fld2 = TableDef.OleFunction(WideString("CreateField"), WideString("Цена"), dbDouble, 0);
    Variant Fld3 = TableDef.OleFunction(WideString("CreateField"), WideString("Сумма"), dbDouble, 0);
    Variant Fld4 = TableDef.OleFunction(WideString("CreateField"), WideString("Расчет"), dbDouble, 0);
    Variant Fld5 = TableDef.OleFunction(WideString("CreateField"), WideString("Долг"), dbDouble, 0);
    Variant Fld6 = TableDef.OleFunction(WideString("CreateField"), WideString("Дата"), dbDate, 0);
    Variant Fld7 = TableDef.OleFunction(WideString("CreateField"), WideString("Поставщик"), dbText, 25);
    Variant Fld8 = TableDef.OleFunction(WideString("CreateField"), WideString("Код"), dbInteger, 0);
    TableDef.OlePropertyGet(WideString("Fields")).OleProcedure(WideString("Append"), Fld);
    TableDef.OlePropertyGet(WideString("Fields")).OleProcedure(WideString("Append"), Fld1);
    TableDef.OlePropertyGet(WideString("Fields")).OleProcedure(WideString("Append"), Fld2);
    TableDef.OlePropertyGet(WideString("Fields")).OleProcedure(WideString("Append"), Fld3);
    TableDef.OlePropertyGet(WideString("Fields")).OleProcedure(WideString("Append"), Fld4);
    TableDef.OlePropertyGet(WideString("Fields")).OleProcedure(WideString("Append"), Fld5);
    TableDef.OlePropertyGet(WideString("Fields")).OleProcedure(WideString("Append"), Fld6);
    TableDef.OlePropertyGet(WideString("Fields")).OleProcedure(WideString("Append"), Fld7);
    TableDef.OlePropertyGet(WideString("Fields")).OleProcedure(WideString("Append"), Fld8);
    acc.OleFunction(WideString("CurrentDb")).OlePropertyGet(WideString("TableDefs")).OleProcedure(WideString("Append"), TableDef);
    acc.OleFunction(WideString("Quit"));
 
    Variant TableDef2 = acc.OleFunction(WideString("CurrentDb")).OleFunction(WideString("CreateTableDef"), WideString("Склад"));
    Variant Fld9 = TableDef2.OleFunction(WideString("CreateField"), WideString("Товар"), dbText, 30);
    Variant Fld10 = TableDef2.OleFunction(WideString("CreateField"), WideString("Склад"), dbInteger, 25);
    Variant Fld11 = TableDef2.OleFunction(WideString("CreateField"), WideString("Колличество"), dbInteger, 0);
    Variant Fld12 = TableDef2.OleFunction(WideString("CreateField"), WideString("Цена"), dbDouble, 0);
    Variant Fld13 = TableDef2.OleFunction(WideString("CreateField"), WideString("Сумма"), dbDouble, 0);
    Variant Fld14 = TableDef2.OleFunction(WideString("CreateField"), WideString("Расчет"), dbDouble, 0);
    Variant Fld15 = TableDef2.OleFunction(WideString("CreateField"), WideString("Долг"), dbDouble, 0);
    Variant Fld16 = TableDef2.OleFunction(WideString("CreateField"), WideString("Дата"), dbDate, 0);
    Variant Fld17 = TableDef2.OleFunction(WideString("CreateField"), WideString("Код"), dbInteger, 0);
    TableDef2.OlePropertyGet(WideString("Fields")).OleProcedure(WideString("Append"), Fld9);
    TableDef2.OlePropertyGet(WideString("Fields")).OleProcedure(WideString("Append"), Fld10);
    TableDef2.OlePropertyGet(WideString("Fields")).OleProcedure(WideString("Append"), Fld11);
    TableDef2.OlePropertyGet(WideString("Fields")).OleProcedure(WideString("Append"), Fld12);
    TableDef2.OlePropertyGet(WideString("Fields")).OleProcedure(WideString("Append"), Fld13);
    TableDef2.OlePropertyGet(WideString("Fields")).OleProcedure(WideString("Append"), Fld14);
    TableDef2.OlePropertyGet(WideString("Fields")).OleProcedure(WideString("Append"), Fld15);
    TableDef2.OlePropertyGet(WideString("Fields")).OleProcedure(WideString("Append"), Fld16);
    TableDef2.OlePropertyGet(WideString("Fields")).OleProcedure(WideString("Append"), Fld17);
    acc.OleFunction(WideString("CurrentDb")).OlePropertyGet(WideString("TableDefs")).OleProcedure(WideString("Append"), TableDef2);
 
    acc.OleFunction(WideString("Quit"));
    acc = Unassigned;
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32983 / 21292 / 8177
Регистрация: 22.10.2011
Сообщений: 36,569
Записей в блоге: 8
03.05.2014, 00:15 16
29-ю строку убери, она не нужна, не надо уходить из Access.Application, пока не закончишь создание и привязку всех таблиц. Quit должен быть только в самом конце, после создания всех четырех табличек
Цитата Сообщение от mish_k98 Посмотреть сообщение
что означают эти константы, почему они именно такие?
Открой файл DAO_XP.h, и посмотри:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
enum class DataTypeEnum
{
  dbBoolean = 1, 
  dbByte = 2, 
  dbInteger = 3, 
  dbLong = 4, 
  dbCurrency = 5, 
  dbSingle = 6, 
  dbDouble = 7, 
  dbDate = 8, 
  dbBinary = 9, 
  dbText = 10, 
  dbLongBinary = 11, 
  dbMemo = 12, 
  dbGUID = 15, 
  dbBigInt = 16, 
  dbVarBinary = 17, 
  dbChar = 18, 
  dbNumeric = 19, 
  dbDecimal = 20, 
  dbFloat = 21, 
  dbTime = 22, 
  dbTimeStamp = 23
};
Можешь пользоваться этими определениями, можешь переопределить их как const int...
Цитата Сообщение от mish_k98 Посмотреть сообщение
как сделать одно поле типа счётчик
C++
1
2
3
4
    // Создать поле типа Long Integer
    Variant Fld1 = TableDef.OleFunction(WideString("CreateField"), WideString("ID"), Dao_xp::DataTypeEnum::dbLong, 0);
    // И выставить ему атрибут "Автоинкрементное поле"
    Fld1.OlePropertySet(WideString("Attributes"), Dao_xp::FieldAttributeEnum::dbAutoIncrField);
Это как раз с использованием готовых Enum-ов, если что - можешь определить константы:
C++
1
2
    const int dbLong = 4;
    const int dbAutoIncrField = 16;
, и использовать их...
1
164 / 49 / 27
Регистрация: 04.06.2013
Сообщений: 636
03.05.2014, 10:22  [ТС] 17
а как сделать, чтобы этот процесс был скрытым, а то у меня появляется постоянно аксес и ждёт пока я закрою, хотя это после того, как я добавил try catch и showmessage в конце создания
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32983 / 21292 / 8177
Регистрация: 22.10.2011
Сообщений: 36,569
Записей в блоге: 8
03.05.2014, 10:28 18
Ничего не ждет, на долю секунды проскакивает окно Access-а, и тут же исчезает. Как победить это - не знаю.
Цитата Сообщение от mish_k98 Посмотреть сообщение
хотя это после того, как я добавил try catch и showmessage в конце создания
Значит, убери то, что добавил - не будет висеть окно...
0
164 / 49 / 27
Регистрация: 04.06.2013
Сообщений: 636
03.05.2014, 11:58  [ТС] 19
значит это просто уже билдер виноват...но оно так не должно быть...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32983 / 21292 / 8177
Регистрация: 22.10.2011
Сообщений: 36,569
Записей в блоге: 8
03.05.2014, 12:19 20
Покажи, где именно ты добавил try/catch и вывод сообщения, я попробую запустить у себя.
0
03.05.2014, 12:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2014, 12:19
Помогаю со студенческими работами здесь

Как можно запустить текстовый документ без OLE
Я сделал инсталлер и в разделе описание нужно нажать на кнопку описания. Я хочу чтобы с нажатием на...

Как узнать открыт ли данный Excel документ в OLE
Здравствуйте. С помощью свойства OlePropertyGet можно подключиться к книге...

Как из 1С по средствам Ole в документ Word вложить объект "Лист к
Как из 1С по средствам OLE в документ word вложить объект "Лист книгиExcel"? Если делать из...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru