Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Как передать записи в другой MDB файл?  [new]
Nebo
Guest
Читал, читал хелп:) ...
И про репликацию, и про экспорт таблицы в формат XML и про сохранение ADO рекордсета в файл командой rst.save с последующим его восстановлением rst.open...
Все замечательно:) Но вот если запись содержит поле, в котором хранится внедренная Excel таблица. Ее уже вроде не передашь через XML.

Допустим я сохраняю ADO recordset в файл.

Можно ли из сохраненного в файл ADO recordseta добавлять записи в таблицу в другую базу? Что-то я не понял этот момент. Там есть такая команда rst.UpdateBatch Добавит ли она новые записи в таблицу? А если поле счетчика ID в recordsete начнет конфликтовать с существующими в другой базе ID записями?

Мне нужно программно запись (записи) на экране (пусть даже без внедренной Excel таблицы, Бог с ней) сохранить в файл, отправить этот файл почтой и чтобы человек на другом компьютере смог загрузить записи из этого файла к себе в базу. Чтоб это было легко и просто.

Получается, что я должен все таки делать маленькую MDB - эшку для обмена одной или несколькими записей. Как бы свой аналог репликации. Так?

Или есть какие-то варианты проще? Чтобы парой строк, если так можно выразиться:)
Может у кого-нибудь есть примерчик?

Репликация ACCESS мне все таки не подходит. Это уже будут лишние навороты.
27 дек 06, 20:39    [3590197]     Ответить | Цитировать Сообщить модератору
 Re: Как передать записи в другой MDB файл?  [new]
mds_world
Member

Откуда: Ташкент
Сообщений: 27548
Я думаю для вас оптимальным было бы сохранить данные в текстовом или екселовском файле. Создать их можно с помощью метода OutputTo. У адресата эти данные прочитать из файла или подлинковать к его БД и читать обычными запросами.
27 дек 06, 20:47    [3590215]     Ответить | Цитировать Сообщить модератору
 Re: Как передать записи в другой MDB файл?  [new]
mds_world
Member

Откуда: Ташкент
Сообщений: 27548
Вот пример создания .xls файла с помощью метода OutputTo. Выводится таблица sdata, на выходе файл sdata.xls.
DoCmd.OutputTo acOutputTable, "sdata", acFormatXLS, "sdata.xls", True
Но можно выводить и запросы, отчеты, формы.
27 дек 06, 20:56    [3590235]     Ответить | Цитировать Сообщить модератору
 Re: Как передать записи в другой MDB файл?  [new]
Nebo
Guest
С экспортом в Excel пока не очень хочу связываться. За совет все равно спасибо.

Примерно сделаю так:

1. Программно создаю пустой mdb - Счета.mdb. Наверное SQL запросом, чтобы не связываться с ADOX. Название пустой базе даст пользователь через FileDialog.

2. Помечу на экране нужные записи для отправки их в этот файл.

3. Потом программно запросом на создание таблицы отправлю эти записи в предварительно созданный mdb
Запрос на создание таблицы прост.

SELECT tblDocument.* INTO tblDocument IN 'C:\Temp\Счета.mdb'
FROM tblDocument;


4. Дальше удалю столбец счетчика ID в таблице в созданном новом Счета.mdb. Это чтобы не было конфликтов при добавлении записей из этого файла в базу-приемник.

Файл для передачи готов! Можно отсылать его по электронке получателю.

Дальше как его загрузить, на месте получателя?

1. Запросом на добавление загружаю записи из этого файла в базу.
Запрос прост.

INSERT INTO tblDocument
SELECT *
FROM tblDocument IN 'C:\Temp\Счета.mdb';


Примерно так.

Плюс здесь в том, что сразу задано в файле обмена имя таблицы. Известно таким образом имя таблицы в которую нужно добавить данные из файла обимена. Также OLE объекты можно передавать. Ну и то, что структура таблицы в файле обмена идентична структуре таблицы в базе назначения.
27 дек 06, 21:43    [3590324]     Ответить | Цитировать Сообщить модератору
 Re: Как передать записи в другой MDB файл?  [new]
bubucha
Member

Откуда:
Сообщений: 5636
5. Придумать механизм разруливания конфликных ситуация на клиенте (нарушение уникальности
записи например)
6. Придумать механизм отката загруженной порции на клиенте (послали не то, или клиент забыл заменить полученный mdb-посылку)
(По п4 - можно выкачивать данные и без ID)
27 дек 06, 22:40    [3590418]     Ответить | Цитировать Сообщить модератору
 Re: Как передать записи в другой MDB файл?  [new]
NEBO
Guest
bubucha
(По п4 - можно выкачивать данные и без ID)


Данные конечно-же можно выкачивать без ключевого столбца ID.
Почему я забираю запись вместе с ключевым столбцом ID?
У меня примерно 150 полей в таблице. Трудно в строковой переменной, содержащей запрос, перечислить такое количество полей, трудно контролировать столько полей.

Такой запрос как, например, этот:

SELECT tblDocument.* INTO tblDocument IN 'C:\Temp\Счета.mdb'
FROM tblDocument;

Это короткий запрос. Его можно присвоить строковой переменной.
С нем можно программно подставлять имя базы.
Имя базы я не знаю заранее. Файл может назваться по разному.

В общем проблема в том, что запрос может быть очень длинным из-за большого числа полей.

Поэтому я обхожусь кратким. Но за это получаю столбец ID который мешает при обратной загрузке данных и который приходится удалять.

Интересно, как составить запрос так, чтобы можно было вывести много полей, примерно 150, но без ключевого столбца ID. В конструкторе запросов такой запрос можно сделать. Не проблема.

Но как мне менять имя файла, вот эту самую строчку 'C:\Temp\Счета.mdb'

Ага!!! Увидел! Есть такое свойство запроса - база данных получатель. Надо попробовать поработать с этим свойством. Вот оно это свойство запроса:

query.Connect = databasetype;parameters;

Длинный запрос у меня будет сохраненным. Используя это свойство, похоже, я смогу подставлять имя базы программно. Слава ACEESS! Всегда выручает.
28 дек 06, 04:45    [3590773]     Ответить | Цитировать Сообщить модератору
 Re: Как передать записи в другой MDB файл?  [new]
Nebo
Guest
Что-то я не пойму как программно изменить свойства запроса, те что в красном овале.

Работаю через DAO.

К сообщению приложен файл. Размер - 0Kb
28 дек 06, 05:47    [3590788]     Ответить | Цитировать Сообщить модератору
 Re: Как передать записи в другой MDB файл?  [new]
Alexander G
Member

Откуда: Чукчи мы, однако
Сообщений: 3270
из DAO у запроса это не меняется, насколько помню
filename="C:\lala\lala.mdb
strSQL = "INSERT INTO t1  IN " & "'" & filename & "'" &  "SELECT * FROM t1;"
dbs.Execute strSQL
28 дек 06, 07:04    [3590835]     Ответить | Цитировать Сообщить модератору
 Re: Как передать записи в другой MDB файл?  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 5127
Не знаю, может и не совсем в тему, но у меня похожий был случай. Так я использовал для передачи MDB базу. Программно создавал базу, создавал таблицы, копировал в них что надо и переносил как файл MDB. Потом программно к нему линковался и доставал нужную информацию. Вот парочка ссылок, может пригодится - Программное создание баз MDB и Кое-что об архивировании, или программное создание баз и таблиц.
28 дек 06, 10:34    [3591383]     Ответить | Цитировать Сообщить модератору
 Re: Как передать записи в другой MDB файл?  [new]
Dionisiu
Member

Откуда: Крым
Сообщений: 151
Вот один способ формирования синхронизации:

Private Sub Syhnro_Click()
On Error GoTo doiterr
    
    
    Dim ws As Workspace
    Dim db  As Database
    Dim dbnew As Database
    Dim tbl As TableDef
    Dim rec As Recordset
    Dim dbname As String
    Dim timep As String
    Dim SQLstring As String
    Dim tabname As String
    Dim dbrepname As String
    Dim ccc As Double
    Dim way As Boolean
    Dim qwe As QueryDef
    Dim wer As Date
                    
    
    Set ws = DBEngine.Workspaces(0)
    Set db = CurrentDb
    Set tbl = db.TableDefs("Param") 'это такая таблица с параметрами базы
    Set rec = tbl.OpenRecordset
    rec.MoveFirst
    ccc = rec!DBPlace 'тут  хранится параметр филиала, откуда высылаается синхро
    If ccc = 1 Then
            way = False
        Else
            way = True
    End If
    Set tbl = db.TableDefs("Depart") 'подразделение филиала, посылающего синхро
    Set rec = tbl.OpenRecordset
    rec.FindFirst "DepId=" & ccc
    dbname = rec!DepDescr
    dbrepname = dbname + Format(Date, "ddmmyy") + ".mdb"
    dbname = "C:\Base\Synchro\" + dbname + Format(Date, "ddmmyy") + ".mdb" 'имя и путь строго заданы, но можно и через диалог
    If Dir(dbname) <> "" Then Kill (dbname)
    Set dbnew = ws.CreateDatabase(dbname, dbLangGeneral)
    
    DoCmd.OpenForm "Syhnro", acNormal
    wer = [Forms]![Syhnronisation].[Dat]
    timep = Format(wer, "mm") & "/" & Format(wer, "dd") & "/" & Format(wer, "yy")
    Set tbl = db.TableDefs("SynhroList") 'в таблице хранятся имена и параметры таблиц, которые должны быть выгружены.
    Set rec = tbl.OpenRecordset
    rec.MoveFirst
    ccc = 0
    For ccc = 1 To rec.RecordCount
        If rec!out = way Then
        tabname = rec!Table
        Me.Process.Text = Me.Process.Text + Chr(13) + Chr(10) + "Создание " + tabname
        
        If rec.fields(4).Value = 0 Then
            SQLstring = "SELECT " & tabname & ".* INTO " & tabname & " IN '" & dbname & "'FROM " & tabname & " WHERE (((" & tabname & ".[TimeStamp])>=#" & timep & "#));"
        Else
            SQLstring = "SELECT " & tabname & ".* INTO " & tabname & " IN '" & dbname & "'FROM " & tabname
        End If
       
        DoCmd.RunSQL SQLstring
        Me.Process.Text = Me.Process.Text & " - Ok"
        End If
        rec.MoveNext
    Next
    Me.Process.Text = Me.Process.Text + Chr(13) + Chr(10) + "Процесс завершен без ошибок!"
    Me.Process.Text = Me.Process.Text + Chr(13) + Chr(10) + "Создан файл: "
    Me.Process.Text = Me.Process.Text + Chr(13) + Chr(10) + dbrepname
    MsgBox "Синхронизация завершена!!!", vbOKOnly
    Me!Process.Text = ""
    Me.Folder.SetFocus
    Me.Process.Visible = False
    
doitex:
    Me.Folder.Requery
    Me.FileName.Requery
    Me.Requery
    Exit Sub

doiterr:
    Me.Process.Text = Me.Process.Text & " - ОШИБКА!!!"
    MsgBox "Обнаружена ошибка!", vbOKOnly
    Resume doitex
End Sub

О таблицах, выгружаемых в синхро: они содержат ID-поля с типом "Код репликации", там 128 байт на запись - повторение двух записей при одновременной работе 50-ти подразделений невозможно
28 дек 06, 11:05    [3591600]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить