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

Форум: MS ACCESS

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

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

 
 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Как прграммно разорвать связи
 
 автор: Мюллер   (01.12.2008 в 11:07)   личное сообщение
19 Кб.
 
   to: Lukas   (01.12.2008 в 10:56)
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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:39)   личное сообщение
 
   to: Lukas   (30.11.2008 в 15:33)
 

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

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:33)   личное сообщение
 
   to: час   (30.11.2008 в 15:26)
 

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

With appAccess.CurrentDb 

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

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

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

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

Поправка:

With appAccess.CurrentDb

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

    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:45)   личное сообщение
 
   to: час   (30.11.2008 в 14:39)
 


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

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

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:39)   личное сообщение
 
   to: час   (30.11.2008 в 14:30)
 


With appAccess
.Relations.Delete strRelationName
End With

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

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

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

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

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

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

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

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

currentdb.Relations и т.д.

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

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

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