Help me,please!

24 отговора 706 прегледа
#1

Help me,please!

имам таблица на ACCESS с две таблици.
table1 - field_ID,field11,field12
table2 - field_ID,field21,field22,filed23

Работя с table2,и искам да ползвам field11 от table1,което е текстовата ст-ст на номенклатурата във формата.
Като направя query и показвам него с ADO във формата, при изтриването на записа съответно ми изтрива и field_ID в table1.
Как да го запазя?

Отговор
в отговор на question #2

Re: Help me,please!

Ако става дума за Access 2000, знам, че свързаните към данните форми
вътрешно използват обектния модел DAO. Но това е между другото.

Ако използвате Jet (т.е. таблиците са .mdb-файл), то проблемът най-вероятно
се дължи на релация между полета от таблицата с номенклатурите и таблицата
със записите, и която е с включен референциален интегритет с опция за
каскадно изтриване. В случай, когато в релация участва поле от таблица с
номенклатури, би трябвало да се изключи изцяло референциалния интегритет.

От менюто:
"Tools" -> "Relationships..."

Показва се схема на таблиците/заявките и релациите. Ако тя е празна, чрез
контекстното меню добавете в схемата двете таблици, които споменахте.

Със свързваща линия трябва да е показана релация. Натиснете десен бутон върху
нея и от контекстното меню изберете "Edit Relationship...". В показалия се
диалогов панел изключете опцията "Еnforce Referential Integrity" и натиснете "OK".

Смятам, че така проблемът ще се оправи. Ако не, дайте още информация относно
полетата на таблиците, релациите и заявките, които използвате.

Успех!

Отговор
в отговор на Highwaytohell #3

Re: Help me,please!

Тази релация ми трябваше, затова си направих нов АДО за другата таблица и във формата показах само интересуващия ме текст.
Така се получи.
обаче имам проблеми със кода на VB, че там все още нищо не знам

Отговор
в отговор на Highwaytohell #4

Re: Help me,please!

Zabrawih da kaja edno goliamo BLAGODAIA!

Отговор
в отговор на question #5

Re: Ако не е решен проблема, пиши пак

И аз благодаря.

Ако не си решил задачката, дай я в по-формализиран вид: какви са точно таблиците и какво смислово представят те, какви са полетата, кои полета са първични ключове, какви релации между таблиците искаш (обясни го по смисъл), какви заявки евентуално се опитваш да направиш, какви форми искаш да направиш, какво да визуализират и какво поведение да имат.

Още въпроси: На кой Access работиш? Какво разбираш под АДО?

За да напиша код на VB, би трябвало възпроизведа задачката при мен и да ти пусна обратно решението.
Успех!


Отговор
в отговор на Highwaytohell #6

Re: Ако не е решен проблема, пиши пак

MS Office 97
Този го реших, обаче имам май безброй за 24 часа. Например на .mdb -то сложих парола и сега не ми се отваря формата (VB6).

В пропъртите на Аdodc-controlite не ми дава да коригирам вече нищо.

Това го копнах от друго място, но не ми свършии работа.


Dim strConnect As String
Set Cnn = New ADODB.Connection

strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Password=sezam;User ID=Admin;" & _
"Data Source=C:\DB1.mdb;" & _
"Persist Security Info=True;" & _
"Jet OLEDB:System database=C:\system.mdw"

With Cnn
.CursorLocation = adUseClient
.Open strConnect
End With

Set Rst = New ADODB.Recordset
Rst.ActiveConnection = Cnn


до сутринта със сигурност ще имам още .Може ли пак да питам?

Отговор
в отговор на question #7

look this

За нещата,които питах досега се получаваше ефекта на
зададения въпрос, на който ти идва отговора в главата
още докато питаш.
Но ето едно нещо, на което се връщам постоянно и все не
се справям както трябва.
Когато филтрирам записи всичко си работи нормално,
но не успявам да му направя нова подредба на записите
в брояча - т.e. да не ми показва "Record 6/3",защото
във филтъра има 3 записа обаче това е 6-тия запис от
целия рекордсет.
Ето какво имам в кода.


Dim sBookMark As String
Dim recRecordset1 As Recordset, recRecordset2 As Recordset
Dim sFilterStr As String
If Adodc1.Recordset.RecordCount = 0 Then Exit Sub

следващото трябва да е оригиналния рекордсет
sBookMark = Adodc1.Recordset.Bookmark
Set recRecordset1 = Adodc1.Recordset 'save the recordset

sFilterStr = InputBox("критерий някакъв")
If Len(sFilterStr) = 0 Then Exit Sub
Adodc1.Recordset.Filter = sFilterStr

и тук трябва да се присвои на recRecordset2 новия набор,
пък и да могат да му се прередят записите, за да може ето
това:

Private Sub Adodc1_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
On Error Resume Next
lblStatus.Caption = Adodc1.Recordset.Bookmark & "/" & Adodc1.Recordset.RecordCount
End Sub

да ги показва вярно.

Освен това ако можеш да ми кажеш например къде мога да прочета
нещо компактно за multi-потребителски режим?

Май много стана....

Отговор
в отговор на question #8

Засега умувам

Мислех, че разработваш на Access, доколкото разбрах, работиш върху VB 6.0 приложение с използване на .mdb весия Access 97. Тъй като съм деинсталирал Visual Studio 6.0, ще трябва да поумувам, за да разбера новите въпроси. Няма да е зле да имаш MSDN. Междувременно ти предлагам напосоки линкове, където има вероятност да намериш каквото ти трябва.

Access 2000 Developer's Handbook. Chapter 6: ActiveX Data Objects
[ulr] [линк] [/url]

ADO Provider Properties and Settings
[линк]

Advanced ADO for the VBA Programmer
[линк]

An Easy Way to Create OLE DB Connection Strings
[линк]

Everything You Need to Know About ADO Recordsets
[линк]

И още нещо: не задавай твърдо ConnectionString-говете в дата-контролите, инициализирай ги в събитието Form_Load.

Отговор
в отговор на Highwaytohell #9

Re: Засега умувам

На АCCESS би ми било лесно. VB ме затруднява. Имам MSDN. Правилно си разбрал какво разработвам. Все забравям, че хората не знаят това, което ми е в главата.

Отговор
в отговор на question #10

Re: look this

Замени реда:

 lblStatus.Caption = Adodc1.Recordset.Bookmark & "/" & Adodc1.Recordset.RecordCount 


със следното:

 lblStatus.Caption = Adodc1.Recordset.AbsolutePosition & "/" & Adodc1.Recordset.RecordCount 


Извинявай, че се забавих, ама настъпиха работните дни...

Отговор
в отговор на Highwaytohell #11

Re: look this

всяко гениално нещо е просто.
Благодаря ти много.
Може ли да ти задавам още въпроси?

Отговор
в отговор на question #12

Re: look this

И още не ми се отваря секюрнатото мдб.

Нещо не ми сработи латиницата.Извинявай!

Отговор
в отговор на question #13

Няма начин, ще отворим .MDB-то

Този е малко по-сложен въпрос, не заради конкретния проблем, а защото ако искаш да изпипаш добре връзката към базата, ще е нужна малка реорганизация на кода.

Но първо просто ще отворим базата с паролата, малко да помисля. Междувременно натрупай и другите въпроси.

Аз тествам нещата на VB.NET с конвертиран стар проект от VB 6.0, съдържащ ADO Data Controls. Горе-долу е същото.

Отговор
в отговор на question #14

Отваряне на .MDB: Може ли да пробваш нещо?

Без да съм проучил, имам смътното усещане, че не е добре .mdb-файлът с паролата да е версия Access 97 (Jet 3.51).

Нищо не пречи да пробваш следното: архивирай .mdb-файла, вземи негово копие без парола, конвертирай го във формат за Access 2000 (Jet 4.0), след това на копие на получения файл сложи парола. Опитай да се включиш към получения файл без парола, след това и към получения файл с парола и да видим какво ще стане.

Обаче може да се появи проблем и от версията на System.mdw.

Ще се ползва ли конкурентно от няколко потребителя базата?

Отговор
в отговор на question #15

Пиша оттук, че горе много се обърка

Брей, съвсем ги обърках постингите.

По въпроса за включване към базата данни с паролата:

Препоръчвам ти да тестваш връзката към базата данни, като си направиш .udl файл. Направи празен текстов файл, задай му разширение на името - .udl и щракни върху него. Ще се стартира Microsoft Data Link Editor, един прост диалогов панел, има и бутонче "Help". Избери в първия му екран "Microsoft Jet 4.0 OLE DB provider", в другите екрани е очевидно какво трябва да се въведе. Има и бутон за тестване на връзката. Като приключиш с редактирането, отвори файла (внимание, Unicode!) с Notepad. В него ще видиш готов ConnectionString. Копирай си го където трябва в проекта. Обаче по-нататък имай предвид, че компилираното приложение трябва да е конфигурируемо поне по отношение на пътя до базата данни. А и не трябва да се допуска възможността паролата да се вижда в .exe файла.

Има известно противоречие в това, което описваш в свободен текст и това, което задаваш в ConnectionString. Какво си направил: сложил си парола само на базата данни или използваш т. нар. user-level security (както личи от кода)?

User-level security на Access не е интегрирана със системата за сигурност на операционната система. Ще създаде много допълнителна работа по поддръжката на акаунти в системната база данни (която често обича да се изгубва). Администраторът ще бере ядове...

От чисто практически съображения, препоръчвам да сложиш само ПАРОЛА НА БАЗАТА ДАННИ. Ето за този случай какъв примерен .udl файл съм получил:


[oledb]
; Everything after this line is an OLE DB initstring
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\TestDatabase.mdb;Persist Security Info=False;Jet OLEDB:Database Password=password


Разбира се, тази защита твърде елементарно се разбива. Изборът й зависи от това, доколко са компетентни потребителите. Ако ти трябва по-сериозна защита, или използвай user-level security (ама... виж по-горе), или използвай друг двигател за бази данни.

Поиграй си, пробвай. Успех!

P.S.: Пиши какво се получава.

Отговор
в отговор на Highwaytohell #16

Re: Пиша оттук, че горе много се обърка

Цял ден поглеждам тук и понеже стоях до късно снощи мислех,че последното писано през нощта е от мен. Изобщо не помня кога го писах. И сега виждам, че ти си ми отговарял.
Няма да се изпсувам.

Отговор
в отговор на Highwaytohell #17

Re: Пиша оттук, че горе много се обърка

Получава се това, че ми се отваря формата , но контрола (ADODC1) ми е недостъпен и си изглежда hide-нат. Всъщност изобщо не мога да му присвоя RecordSource.

Отговор
в отговор на question #18

Re: Пиша оттук, че горе много се обърка

Реших си проблема със секуритатите. Само че през менютата.

ADODCProperties ->Property Pages ->Build->Data Link Properties ->All

Там сега указах и пътя до system.mdw. Преди да ми проговориш за него нямаше кой да се сети.

Поглеждай днес пак.

Отговор
в отговор на question #19

Re: Пиша оттук, че горе много се обърка

Я да попиша още малко, че ми е дошла музата и след утре ще имам само да благодаря. няма да питамповече.

Парола сложих само на ACCESS-а. Обаче май ще се работи от повече от едно место. Доколкото знам с ACCESS-a това става по два начина - или се оставя обща таблица, а се размножават останалите query-та, macros-и и т.н. или се правят репликации.

При задача на VB върху аксеска база данни как се прави това?

Извинявай, обаче наистина ми е много напечено.

Отговор
в отговор на question #20

Многопотребителски сценарий

Относно многопотребителския сценарий:

Репликация? Не!!!

На съответните работни места се инсталира VB-приложението - изпълнимия файл, .dll, .ocx, както и евентуално конфигурационни файлове, написани от теб. Базата данни (.mdb) се поставя в споделена в мрежата папка с права на потребителите за четене, запис и изтриване (за съжаление трябва). Приложенията се конфигурират така, че по време на изпълнението в ConnectionStrings да се зарежда UNC-пътя към базата данни (.mdb). В базата данни може да има всичко, но от практиката ми е известно, че от VB-приложението може се ползват по същество таблиците и заявките (queries).

По-горе ти намекнах (не бяхме си дошли на думата), че не трябва твърдо да се програмират ConnectionStrings, те трябва да се конструират и присвояват по време на изпълнението, на базата на конфигурационна информация. Тя може да е в .ini-файл или в registry, както избереш. В случая, по-добре да е в registry, там можеш да скриеш и паролата на базата данни.

Така, ако се промени мрежовия път на базата данни, инсталираните приложения само ще се преконфигурират. В противен случай идваме до абсурда да се налага да компилираш наново и да преинсталираш приложенията.

Отговор