Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как прграммно разорвать связи
 
 автор: час   (30.11.2008 в 13:32)   личное сообщение
 
 

Имеется база ххх . mdb
в ней две таблицы - DOG и KAS - связь один ко многим
Вопрос:
Как из другой базы zzz.mdb ,
программно,
разорвать звязь между таблицами в базе ххх . mdb

  Ответить  
 
 автор: Силыч   (30.11.2008 в 13:42)   личное сообщение
 
 

currentdb.Relations и т.д.

  Ответить  
 
 автор: час   (30.11.2008 в 14:01)   личное сообщение
 
 

Мне бы разорвать звязь между таблицами в другой базе из текущей программно.

  Ответить  
 
 автор: Lukas   (30.11.2008 в 14:15)   личное сообщение
 
 

Может как -то так.
strFileDBName-Путь к изменяемой базе.
Открываем ее как текущую:

Set appAccess = CreateObject("Access.Application")
    appAccess.OpenCurrentDatabase strFileDBName, True
...Здесь рвем связь
    appAccess.CloseCurrentDatabase
    appAccess.DoCmd.Quit
    Set appAccess = Nothing

  Ответить  
 
 автор: час   (30.11.2008 в 14:30)   личное сообщение
 
 

пробываю!!!
А что это за оператор (Здесь рвем связь)
Я раньше программно их не рвал
И даже приближонно не знаю как это реализовать и в текущеё то базе, а тут замахнулся на внешнюю

  Ответить  
 
 автор: Lukas   (30.11.2008 в 14:39)   личное сообщение
 
 


With appAccess
.Relations.Delete strRelationName
End With

  Ответить  
 
 автор: час   (30.11.2008 в 14:39)   личное сообщение
 
 

Dim appAccess As Access.Application
Set appAccess = New Access.Application
With appAccess
.OpenCurrentDatabase Obmen
.как порвать всё?
.CloseCurrentDatabase
End With
Set appAccess = Nothing

  Ответить  
 
 автор: Lukas   (30.11.2008 в 14:45)   личное сообщение
 
 


    Dim rel As Relation
    For Each rel In appAccess.Relations
        appAccess.Relations.Delete rel.Name
    Next rel

  Ответить  
 
 автор: Lukas   (30.11.2008 в 14:50)   личное сообщение
 
 

Возможно, так правильнее:

    Dim i As Integer
    For i = 0 To appAccess.Relations.Count - 1
        appAccess.Relations.Delete appAccess.Relations(i).Name
    Next i

Вот только не знаю как коллекция Relations нумеруется, с 0 или с 1

  Ответить  
 
 автор: Lukas   (30.11.2008 в 14:53)   личное сообщение
 
 

Первый вариант рабочий, а второй пока нет.

  Ответить  
 
 автор: Lukas   (30.11.2008 в 14:56)   личное сообщение
 
 

Еще один вариант, самый(единственно) правильный

    With appAccess
        Do While .Relations.Count > 0
            .Relations.Delete .Relations(0).Name
        Loop
    End With

  Ответить  
 
 автор: час   (30.11.2008 в 15:09)   личное сообщение
 
 


Спасибо огромное
Пробую РВАТЬ И метать..............

Говорят - метот нот фоунд

  Ответить  
 
 автор: Lukas   (30.11.2008 в 15:16)   личное сообщение
 
 

У людей сомненья какую связь правильно создать, а он их рвет все подряд без разбора. Ужос.

  Ответить  
 
 автор: час   (30.11.2008 в 15:17)   личное сообщение
 
 

Я просто перепошутил.
Связь тама одна
Таблиц две
Не ошибусь

Говорят - метот нот фоунд
.Relations

  Ответить  
 
 автор: Lukas   (30.11.2008 в 15:24)   личное сообщение
 
 

Поправка:

With appAccess.CurrentDb

  Ответить  
 
 автор: час   (30.11.2008 в 15:26)   личное сообщение
 
 

Вы думаете мопожет?
мне же во внешней базе надо рвать
тода .OpenCurrentDatabase Obmen не корректно

  Ответить  
 
 автор: Lukas   (30.11.2008 в 15:33)   личное сообщение
 
 

Так CurrentDb у нас будет открываться в объекте appAccess, а не в Application
И в строке

With appAccess.CurrentDb 

мы работаем с CurrentDb объекта appAccess, а не Application
А поможет точно, я попробовал.

  Ответить  
 
 автор: Lukas   (30.11.2008 в 15:39)   личное сообщение
 
 

Вот полный код:

Public Sub DeleteAllRelations(strFileDBName As String)
    Dim appAccess As Object

    Set appAccess = CreateObject("Access.Application")
    appAccess.OpenCurrentDatabase strFileDBName, True
    With appAccess.CurrentDb
        Do While .Relations.Count > 0
            .Relations.Delete .Relations(0).Name
        Loop
    End With
    appAccess.CloseCurrentDatabase
    appAccess.DoCmd.Quit
    Set appAccess = Nothing
End Sub

  Ответить  
 
 автор: Lukas   (30.11.2008 в 15:44)   личное сообщение
 
 

А может вообще надо средствами библиотек ADOX, DAO ?

  Ответить  
 
 автор: час   (30.11.2008 в 15:43)   личное сообщение
 
 

А у мня ругается .....
скотина......

Dim appAccess As Access.Application
Set appAccess = New Access.Application
With appAccess.CurrentDb
 .OpenCurrentDatabase Obmen
.Relations.Delete .Relations(0)
 .CloseCurrentDatabase
End With
Set appAccess = Nothing

  Ответить  
 
 автор: Lukas   (30.11.2008 в 15:46)   личное сообщение
 
 

Возьмите мой кусок, он рабочий.

  Ответить  
 
 автор: час   (30.11.2008 в 15:49)   личное сообщение
 
 

ДА, Lukas - твой код рабочий!!!!
А у меня какая - то ХР , а не код...............

Хорошо, что хоть у тебя всё рабочее получается, а то ба мне кирдык.
Спасибо тебе!!!!

  Ответить  
 
 автор: Lukas   (30.11.2008 в 15:52)   личное сообщение
 
 

Да не на чем.
Может завтра кто более правильное решение подкинет.

  Ответить  
 
 автор: час   (30.11.2008 в 15:56)   личное сообщение
 
 

Кудыж правильнее?
Связи рвуться...........
Есть правда
"НАКЛАДОЧКА"

  Ответить  
 
 автор: Lukas   (30.11.2008 в 15:59)   личное сообщение
 
 

"НАКЛАДОЧКА"
Какая?

  Ответить  
 
 автор: час   (30.11.2008 в 15:59)   личное сообщение
 
 

Кратковременно появляется пустое серое
окно Access .

Надо как-то видимо VISIBLe

  Ответить  
 
 автор: Lukas   (30.11.2008 в 16:01)   личное сообщение
 
 

А у меня не видно.

  Ответить  
 
 автор: час   (30.11.2008 в 16:06)   личное сообщение
 
 

Хорошо тебе!!!!!!

  Ответить  
 
 автор: час   (30.11.2008 в 16:07)   личное сообщение
 
 

Ваще-то
Вот чё я творю


Private Sub Кнопка4_Click()
 Dim Of As String
 Dim OTPRAVKA As String
Of = Nz(DFirst("OFISA", "PUTI"))
If Of = "" Then
Call MsgBox("Не установлен префикс офиса" _
            & vbCrLf & "Выгрузку производить нельзя!!!!!!!!!!!!!" _
            , vbCritical, "Предупреждение ")
Exit Sub
End If
If Of = "ZAVOD" Then
Call MsgBox("Установлен префикс центрального офиса" _
            & vbCrLf & "Выгрузку производить нельзя!!!!!!!!!!!!!" _
            , vbCritical, "Предупреждение ")
Exit Sub
End If
    
    If MsgBox("Выгружаем данные за " & Me!Поле97 & " ГОД ?", vbYesNo) = vbNo Then MsgBox "ВЫБЕРИТЕ НУЖНЫЙ ГОД ": Exit Sub
    PutTablic = Nz(DFirst("PutTablic", "PUTI"))
    If CheckDir(PutTablic & "\BAZA" & Me![Поле97] & ".mdb") = False Then
    Call MsgBox("Не обнаружен путь к основной таблице -> kas" & Me!Поле97, vbCritical, "Предупреждение.")
    Call MsgBox("Укажите папку расположения таблиц.", vbQuestion, "Сообщение.")
    PutTablic = FileUtils_GetFolderName
    If Nz(PutTablic) = "" Then
    DoCmd.Close acForm, Me.Name
    Quit
    End If
    Exit Sub
    End If
 
If Zanato(PutTablic & "\BAZA" & Me!Поле97 & ".mdb") = True Then Exit Sub
   PutObmena = Nz(DFirst("PutObmena", "PUTI"))
           Obmen = PutObmena & "\Obmen" & Me!Поле97 & ".mdb"
           OTPRAVKA = PutObmena & "\OTPRAVKA" & Me!Поле97 & ".mdb"
         If CheckDir(Obmen) = True Then
        Kill Obmen
        End If
            FileCopy PutTablic & "\BAZA" & Me!Поле97 & ".mdb", Obmen
Call DeleteAllRelations(Obmen)
        Call LinkTabNewName(Obmen, "kas" & Me!Поле97, "kas_osnovna")
        Call LinkTabNewName(Obmen, "dog" & Me!Поле97, "dog_osnovna")
        If Nalichie_Tablici("kas_osnovna") = True Then
    ' Удалить записи из таблицы kas с Ofis создания не равной местному
DoCmd.OpenQuery "Udalenie_V_Obmene_KAS"
   ' Удалить записи из таблицы kas с датой создания не равной периоду
DoCmd.OpenQuery "Udalenie_V_Obmene_DOG"
        End If
        

Call DeleteTableName("kas_osnovna")
Call DeleteTableName("dog_osnovna")
        If CheckDir(OTPRAVKA) = True Then
        Kill OTPRAVKA
        End If
        DBEngine.CompactDatabase Obmen, OTPRAVKA
        
        If CheckDir(OTPRAVKA) = True Then
        MsgBox "СОЗДАН файл обмена с основным офисом " & OTPRAVKA
        End If


End Sub

  Ответить  
 
 автор: Lukas   (30.11.2008 в 16:20)   личное сообщение
 
 

Так может файл обмена создавать с нуля, а не копировать?

  Ответить  
 
 автор: час   (30.11.2008 в 16:22)   личное сообщение
 
 

Можно и с нуля, но видимо это редьки не слаще.......

  Ответить  
 
 автор: Lukas   (30.11.2008 в 16:39)   личное сообщение
 
 

Две таблицы нужны, насколько я понял в файле обмена?
А структура таблиц как в текущей базе или в другой?

  Ответить  
 
 автор: час   (30.11.2008 в 17:10)   личное сообщение
 
 

Ты всё понял правильно!!!!

СТруктура везде одинаковая

  Ответить  
 
 автор: Lukas   (30.11.2008 в 17:16)   личное сообщение
 
 

Ну так создаем новый файл, экспортируем в него таблицы (без данных) из текущей бд, экспортируем данные.

  Ответить  
 
 автор: час   (30.11.2008 в 17:29)   личное сообщение
 
 

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

  Ответить  
 
 автор: Lukas   (30.11.2008 в 17:41)   личное сообщение
 
 

Нужные таблицы из третьей базы прилинкованы к текущей?

  Ответить  
 
 автор: час   (30.11.2008 в 19:26)   личное сообщение
 
 

Нет,
я их линкую по мере необходимости.
А эта "база" для обслуживания основной.
"техническая такая"

  Ответить  
 
 автор: Lukas   (30.11.2008 в 19:41)   личное сообщение
 
 

А что если сделать два запроса:
INSERT (в новый файл) ... SELECT FROM (из файла базы данных) WHERE (наши условия)?

  Ответить  
 
 автор: Lukas   (30.11.2008 в 21:46)   личное сообщение
 
 

Попробовал, пашет:

INSERT INTO tblItem IN 'C:\Documents and Settings\Lukas\Рабочий стол\БазаНовая.mdb'
SELECT ItemName, ItemValue
FROM tblItem IN 'C:\Documents and Settings\Lukas\Рабочий стол\БазаДанных.mdb'
WHERE IDItem Between 5 AND 8;

Запускаю запрос на выполнение в третьей базе.

  Ответить  
 
 автор: час   (01.12.2008 в 09:50)   личное сообщение
 
 

Хорошо, что пашет, кто бы усомнился, чтоб у тебя не похало, - тому в оахало!!!
.....
Это вы одно поле перебрасываете.?
А создать пустую базу - программно это как?
А таблицы там создать - это как ?-
структура может поменяться (количество и нааименование полей)

  Ответить  
 
 автор: Lukas   (01.12.2008 в 09:56)   личное сообщение
 
 

http://am.rusimport.ru/MSAccess/topic.aspx?ID=462

А полей как видно отсюда два:
SELECT ItemName, ItemValue

...структура может поменяться (количество и нааименование полей)...
А это можно предварительно считывать из оригинала.

  Ответить  
 
 автор: час   (01.12.2008 в 10:23)   личное сообщение
 
 

Ты уже не спишь???????
Ты как железный - ночью ещё не спишь, а утром уже не спишь.

Сходил , я , глянул......

  Ответить  
 
 автор: час   (01.12.2008 в 10:25)   личное сообщение
 
 

И так чего получается

1. Создать программно базу.
2.Создаь программно таблицы 1 и 2
3. Перебросить данные в аблицы 1 и 2
4. Сжать базу.

А ведь у мня щас первые два-три пункта решаются копированием базы.
одной строкой кода
Filecopy a,b

  Ответить  
 
 автор: Lukas   (01.12.2008 в 10:30)   личное сообщение
 
 

Сжимать не обязательно, наверное. Хотя если пересылать по почте, можно сжать и засунуть в архив.
При программном сжатии может получиться конфуз. Я всегда лапками сжимаю.

  Ответить  
 
 автор: час   (01.12.2008 в 10:32)   личное сообщение
 
 

При программном сжатии может получиться конфуз. Я всегда лапками сжимаю

Вы что-то имеете ввиду !!!

  Ответить  
 
 автор: Lukas   (01.12.2008 в 10:38)   личное сообщение
 
 

На форуме SQL.ru, периодически народ жалуется на исчезновение файла при программном (и автоматическом, когда установлена опция сжимать при закрытии) сжатии.
Выполнять команду вручную на сжатие (после создания резервной копии) из интерфейса Access-а надежнее. Вот.

  Ответить  
 
 автор: час   (01.12.2008 в 10:43)   личное сообщение
 
 

Кстати об исчезновениях ...
Тока что пытался проверить базу доктором Access
База исчезла без следа - хорошо в раре сжата копия.
А на той неделе труд целого дня - просто исчез - модуль в базе был, закрыл открыл и модуль сплыл.
"Чудеса глюкозные"

  Ответить  
 
 автор: Lukas   (01.12.2008 в 10:48)   личное сообщение
 
 

Как показывает моя небольшая практика, исчезают обычно модули (особенно форм), в которых ошибки в коде (причем зачастую банальные типа If без End IF). Стал писать чуть внимательнее, глюков стало значительно меньше.

  Ответить  
 
 автор: Lukas   (01.12.2008 в 10:27)   личное сообщение
 
 

Что - то не спалось сегодня, обычно раньше 12 меня из пушки не разбудить.

  Ответить  
 
 автор: час   (01.12.2008 в 10:40)   личное сообщение
 
 

Вот и я удивлён....
Зима располагает к спячке
А Вы с утра в инетной скачке.....

  Ответить  
 
 автор: Lukas   (01.12.2008 в 10:45)   личное сообщение
 
 

А делать нечего пока.
В душе унылая тоска.

  Ответить  
 
 автор: час   (01.12.2008 в 10:50)   личное сообщение
 
 

Давай развею Вам тоску
Забъю задачею "башку"
Коль думой занята башка
Уйдёт сама собой тоска

  Ответить  
 
 автор: Lukas   (01.12.2008 в 10:56)   личное сообщение
 
 

Тоска уйдет, сомнений нет.
Вот только будет ли ответ?
В глазах песок, в мозгу туман,
Тут нужен видимо стакан.

  Ответить  
 
 автор: Мюллер   (01.12.2008 в 11:07)   личное сообщение
19 Кб.
 
 

Вот пример удаления-создания связей. Может уже апаздал, но мало ли

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList