MS Access преминава в зависимост от стойността на формуляра

Как да присвоя заявка за преминаване към източник на ред, която зависи от друга стойност във формуляра?

По същество искам да направя това:

SELECT x.companyid, 
       x.companyname, 
       x.productid
  FROM x
 WHERE (((x.CompanyID) = [Forms]![Reporting]![CompanyID_Control]))
ORDER BY x.productid;

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

Прочетох тук че има метод чрез VBA, но не знам как да използвам VBA във връзка с източника на ред на контрола.


person Christopher Robinson    schedule 08.02.2011    source източник
comment
Какво ще кажете за актуализиране на sql за заявката във VBA, така че да можете да изпратите стойността, а не препратката?   -  person Fionnuala    schedule 09.02.2011
comment
Това също ме кара да се чудя защо просто не сте свързали таблицата.   -  person Fionnuala    schedule 09.02.2011
comment
Таблиците са свързани. Можете ли да ми дадете пример за това как мога да актуализирам SQL за заявката във VBA, така че да мога да изпратя стойност, а не препратка?   -  person Christopher Robinson    schedule 09.02.2011


Отговори (4)


Както Remou каза в своя отговор, свързаните таблици ще направят това по-лесно. Ако обаче имате заявка за преминаване с име MyQuery, можете да направите следното, за да накарате RowSource на контрола MyComboOrListBox да се актуализира динамично, когато стойността на CompanyID_Control се промени:

Private Sub CompanyID_Control_AfterUpdate()
Dim SQL As String, qdf AS DAO.QueryDef
    Set qdf = CurrentDB.QueryDefs("MyQuery")
    qdf.SQL = " SELECT  x.companyid, x.companyname, x.productid " & _
              " FROM x " & _
              " WHERE x.CompanyID =" & Me.CompanyID_Control & _
              " ORDER BY x.productid;"
    Me.MyComboOrListBox.RowSource = "MyQuery"
End Sub

Ще трябва също да зададете свойството AfterUpdate на CompanyID_Control на:
[Event Procedure].

Обърнете внимание, че дори ако използвате свързани таблици, както предлага Remou, пак ще ви трябва код в събитието AfterUpdate на CompanyID_Control, за да опресните своя combobox/listbox RowSource:

Private Sub CompanyID_Control_AfterUpdate()
    Me.MyComboOrListBox.Requery
End Sub
person mwolfe02    schedule 10.02.2011
comment
Страхотно, мисля, че най-накрая го разбрах, благодаря на всички. Трябва ли да използвам DAO или ADO? Това трябва ли да бъде изрично дадено във VBA? - person Christopher Robinson; 11.02.2011
comment
Ако работите с Jet, трябва да се придържате към DAO. MS е преминал напред-назад кой от тях задава като стандартен при създаване на нови .mdb. Вие можете да използвате и двете в един и същ проект, но има много припокриване между двете библиотеки по отношение на обекти и методи. Ако сте задали и двете като препратки, тогава техният ред в списъка с препратки става важен. Ако искате да сте изрични във вашия код, можете напълно да квалифицирате всички препратки към методи или обекти, както направих в моя примерен код: qdf As DAO.QueryDef. - person mwolfe02; 11.02.2011
comment
Еха. Години по-късно тази публикация спаси моя бекон. Разкъсах косата си, опитвайки се да измисля начин да използвам таблица UDF като източник на запис за отчет на Access. Този отговор работи наистина добре. - person Rocky; 22.08.2017

В някои случаи ще получите ефективни резултати, като напишете SQL SELECT, като използвате вашата заявка за преминаване като източник FROM:

  SELECT MyPassthrough.*
  FROM MyPassthrough
  WHERE [criteria here]

Това много вероятно ще бъде също толкова ефективно, колкото редактирането на QueryDef на преминаването в кода и ще се провали само когато преминаването не върне в собствения си SELECT полетата, по които трябва да филтрирате. Дали си струва да се промени или не зависи от това за какво използвате преминаването и колко сложно е то.

По принцип винаги избягвам да редактирам запазени QueryDefs. Помислете за това: колко често бихте променяли VIEW на SQL Server с DDL? Не често! В Access това може да доведе до незначително раздуване (или не толкова незначително в някои случаи) и винаги избягвам всичко, което причинява раздуване на предния край, доколкото това е възможно.

person David-W-Fenton    schedule 11.02.2011

Ако таблица е свързана, можете просто да изпълните заявка срещу нея, сякаш е таблица на Access, това включва препращане към формуляри. Така:

SELECT * FROM MyLinkedTable
WHERE ID = Forms!MyForm!MyID

Ще работи добре.

За да промените трайно SQL на заявка, можете да използвате SQL свойството на QueryDef:

 Set qdf = CurrentDB.QueryDefs("MyQuery")
 qdf.SQL = "SELECT * FROM MyLinkedTable " & _
           "WHERE ID = " & Forms!MyForm!MyID  ''Or on MyForm, Me.MyID

Можете също така да зададете източник на запис на формуляр или източник на ред на комбо или списъчно поле на SQL низ, със свързана таблица е достатъчно просто:

 Me.RecordSource = "SELECT * FROM MyLinkedTable " & _
           "WHERE ID = " & Forms!MyForm!MyID  ''Or on MyForm, Me.MyID

Or

 Me.MyCombo.RowSource = "SELECT * FROM MyLinkedTable " & _
           "WHERE ID = Forms!MyForm!MyID"
person Fionnuala    schedule 10.02.2011
comment
мислите ли, че няма наказание за изпълнение при използване на първата опция? Особено ако бекендът не е MS, да речем DB2 или Oracle... - person Patrick Honorez; 11.02.2011
comment
Доколкото разбирам, което не казва много, не би трябвало да има голяма разлика в изпълнението на умерено проста заявка, която може да се добавя в Access. Ако има фантастични неща или сканирания на таблици, преминаването вероятно е добра идея. - person Fionnuala; 11.02.2011
comment
Благодаря ти. Тъй като се опитвам да осъществя достъп до задния край директно чрез заявка за преминаване, не мога директно да редактирам заявката с позоваване на контрола на формуляр в областта на SQL. Знам, че трябва да използвам VBA. Къде да поставя VBA кода, който споменахте по-горе? - person Christopher Robinson; 11.02.2011
comment
Добавих някои бележки, но къде ще поставите кода зависи от това как работи вашето приложение. Подходящите често използвани събития включват събития след актуализация за контроли и текущо събитие за формуляра. - person Fionnuala; 11.02.2011
comment
Не съм сигурен, че виждам предимство в промяната на клаузата WHERE на преминаване пред използването на преминаването като свързана таблица и използването на стойност, получена от контрола в критерии, използващи преминаването. - person David-W-Fenton; 10.03.2011

Току-що го разбрах след тонове опити, това е лесно решение, създайте своето преминаване с всичко, което искате да извикате във формуляра, но го оставете празно, така че да извиква всичко и след това запазете преминаването. Затворете това и създайте нова заявка и добавете всяка колона от passthrou. Сега в критериите на новата заявка, която извиква passthrough, добавете [Forms]![Reporting]![CompanyID_Control]) и просто се уверете, че формулярът е отворен, трябва да работи също толкова бързо, но сега можете използвайте формулярите си

person JRod    schedule 09.03.2011
comment
Не е ли това, което предложих в отговора си? Не трябва ли да го изберете като правилен отговор? Или направихте нещо различно от това, което предложих? - person David-W-Fenton; 10.03.2011