Is it possible to pass a "Enter Parameter Value" to form if query fails? - forms

I was working with an Access 2013 database and had a question about the "Enter Parameter Value" box. I am using a Form whose record source is tied to a "Select" query.
If the query finds the result I'm looking for, it populates the form with its values. If the query fails, it keeps the form blank for a new entry to be made by users.
Some of my users have been complaining that they'd like to pass the value they initially put into "Enter Parameter Value" to the form if the query fails so they don't have to enter data twice into the form.
Is it possible to pass a value from "Enter Parameter Value" to the form box instead of too a query?

One way would be enter the value in a form box and then programmatically pass the value as parameter to your query.
some pseudo:
Open the querydef
Set the parameter value
Set the query as form's rowSource
Some code:
check here:
http://bytes.com/topic/access/answers/887449-how-pass-parameter-value-query-via-vba

in Access 2010 and 2013
This uses DAO and might be of interest
DIM MyQryDef as querydef
Dim a as string
a = ""
a = a & "PARAMETERS Parameter1 INT, Parameter2 INT; "
a = a & "SELECT f1, f2 FROM atable WHERE "
a = a & "f3 = [Parameter1] AND f4 = [Parameter2] "
a = a & ";"
Set MyQryDef = currentdb().CreateQueryDef("MyQueryName", a)
MyQryDef.Parameters("Parameter1").Value = 33
MyQryDef.Parameters("Parameter2").Value = 2
' You could now use MyQryDef with DAO recordsets
' to use it with any of OpenQuery, BrowseTo , OpenForm, OpenQuery, OpenReport, or RunDataMacro
DoCmd.SetParameter "Parameter1", 33
DoCmd.SetParameter "Parameter2", 2
DoCmd.Form YourFormName
' or
DoCmd.SetParameter "Parameter1", 33
DoCmd.SetParameter "Parameter2", 2
DoCmd.OpenQuery MyQryDef.Name
See here:
https://msdn.microsoft.com/en-us/library/office/ff194182(v=office.14).aspx
Harvey

Related

how to use a form to navigate to specific query based on what is entered on the msgbox?

So I have a Access database with a table transaction.
On the table there is a column called profit filtered by month.
I have already made a few queries to calculate the total profit on monthly basis (eg. Jun,July,Aug)
So is it possible to create a form with a pop-up message box, and by enter a month number on the box and click, it will lead to a specific query?
I think it is a good idea but I know little about ACCESS programing so any comment are much appriciated!
You can use VBA's InputBox function to create the pop-up. If your queries already exist in the database, you could then use the results of that function to determine which query to open. For example:
Public Sub OpenExistingQuery()
Dim intMonth As Integer
intMonth = InputBox("Please enter a month number:", "Enter Month Number")
DoCmd.OpenQuery "qryMonth" & intMonth, acViewNormal
End Sub
Alternatively, you could use the results of the InputBox function to dynamically build a query, and then open it:
Public Sub OpenDynamicQuery()
Const strQueryName As String = "qryDynamicMonth"
Dim db As DAO.Database: Set db = CurrentDb
Dim qdf As DAO.QueryDef
Dim intMonth As Integer
intMonth = InputBox("Please enter a month number:", "Enter Month Number")
On Error Resume Next
DoCmd.Close acQuery, strQueryName, acSaveNo
DoCmd.DeleteObject acQuery, strQueryName
On Error GoTo 0
Set qdf = db.CreateQueryDef(strQueryName)
qdf.SQL = "SELECT * FROM your_table_name WHERE your_monthnumber_column = " & intMonth
qdf.Close
DoCmd.OpenQuery strQueryName, acViewNormal
Set qdf = Nothing
Set db = Nothing
End Sub
Please note that the above functions are of the "quick-and-dirty" variety. They really need better error handling, sanitation of user input, etc. But hopefully you get the idea, and can take care of that on your own.

Dynamic Variables With PowerQuery

I have a table on my workbook that looks like below
Parameter Value
salestart 01/01/2016
saleend 01/21/2016
And I am trying to query a postgresql database and use the value for salestart and saleend in the where clause. I am just stuck on how to get the syntax perfect to achieve such a result. This is what I have thus far, but I get an error of:
ODBC escape convert error
And this is the actual syntax I am attempting. What must I alter so that this will be a valid statement and return the data I am needing?
let
Parameter = Excel.CurrentWorkbook(){[Name="Parameters"]}[Content],
txtsalestart = Table.TransformColumnTypes(Parameter,{{"salestart", type text}}),
txtsaleend = Table.TransformColumnTypes(Parameter,{{"saleend", type text}}),
Source = Odbc.Query("dsn=123", "Select * from saledb AND CAST(saledate As Date) BETWEEN between '"&#"txtsalestart" & "'" AND '"&#"txtsaleend" & "'#(lf)ORDER BY saleitem ASC")
in
Source
The query value is not built correctly: "'" AND '" should be "' AND '"

How to Call A Query Into A Form In Access? (ms-access)

I have a query that you enter a number, and you get a result (it calculates something).
Now, I have a form with two inputs. In one input you type a number. After you type the number, I want my query to be called with the input's value as an argument, and then generate the number from query's result to the second input.
Here's an example VBA:
Private Sub Refresh_Button_Click()
Dim strSQL as String
Dim inputbox1 as String
Dim myR As Recordset
'set the input1 as a string
inputbox1 = Me.input_box_1
'this select statement creates a SQL string
strSQL = "Select whatever from table_name where field = '" & inputbox1 & "'"
'this recordset pulls your SQL statement so you can get your fields
Set myR = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
'this gives the value of your second input box
Me.input_box_2 = myR!field_you_want_to_appear
Me.Refresh
Set myR = Nothing
End Sub

Auto Populate fields in MS Access Form

Is there a way to automatically populate fields in an MS Access form? Lets say the user makes a selection from a specific combo box on the form, is there something that can be done to automatically select the other fields on the form based on the PK?
Id like to add that the fields to auto populate would come from various tables..
***ammendment
I need to return multiple values once i select a specific record in the combo box. Can someone help? The multiple values will come from a query that returns values like this:
ID Code Count
24 TST 4
24 BPB 7
24 SSS 10
In the form, the combo box would chose the ID number. Once I choose an ID number of 24, i want to return all 3 records above that come from a query called Project_Error_Final (in this example there are 3 values to return, but i want the query to return any records with ID = 24). The VBA code i have so far is:
Private Sub cboProjectID_Change()
Dim VarComboKey As Integer
Dim VarObjective As Variant
Dim VarStartDate As Variant
Dim VarEndDate As Variant
Dim VarRiskCategory As Variant
Dim VarTarDatSet As Variant
Dim VarErrorCount As Variant
Dim VarErrorCode As Variant
VarComboKey = Me.cboProjectID.Value
VarObjective = DLookup("[Objective]", "[Project_HDR_T]", "[Project_ID] = " & VarComboKey)
Me.txtObjective = VarObjective
VarStartDate = DLookup("[Start_Date]", "[Project_HDR_T]", "[Project_ID] = " & VarComboKey)
Me.txtStartDate = VarStartDate
VarEndDate = DLookup("[End_Date]", "[Project_HDR_T]", "[Project_ID] = " & VarComboKey)
Me.txtEndDate = VarEndDate
VarRiskCategory = DLookup("[Risk_Category]", "[Project_HDR_T]", "[Project_ID] = " & VarComboKey)
Me.txtRiskCategory = VarRiskCategory
VartxtTarDatSet = DLookup("[Targeted_Dataset]", "[Project_Targeted_Dataset]", "[Project_ID] = " & VarComboKey)
Me.txtTarDatSet = VartxtTarDatSet
VarErrorCount = DLookup("[Count_Error_Codes]", "[Project_Error_Final]", "[project_ID] = " & VarComboKey)
Me.txtErrorCount = VarErrorCount
VarErrorCode = DLookup("[ErrorCode]", "[Project_Error_Final]", "[project_ID] = " & VarComboKey)
Me.txtErrorCode = VarErrorCode
End Sub
The value in question is the VarErrorCount and VarErrorCode. In the VBA code above, only a single value is returned. But, I am looking for multiple VarErrorCount and VarErrorCode values to be returned in my form once the ID combo box field is selected. In this particular example VarErrorCode should return "TST", "BPB" and "SSS." The VarErrorCount should return the corresponding VarErrorCode values: "4","7","10"
With regards to your multiple returns, you can't use a DLookup, but I will show you how you can achieve the result you want, as per your description.
In this particular example VarErrorCode should return "TST", "BPB" and "SSS." The VarErrorCount should return the corresponding VarErrorCode values: "4","7","10"
Change your last 4 lines above the End Sub to the following:
Dim dbs as DAO.Database
Dim rst1 as DAO.Recordset
Dim rst2 as DAO.Recordset
Set dbs = CurrentDb
Set rst1 = dbs.OpenRecordset("SELECT [Count_Error_Codes] FROM [Project_Error_Final] WHERE [project_ID] = " & VarComboKey)
If rst1.RecordCount > 0 Then
rst1.MoveFirst
Do Until rst1.EOF
VarErrorCount = VarErrorCount & rst1!Count_Error_Codes & ","
rst1.MoveNext
Loop
' Remove the last comma
VarErrorCount = Mid(VarErrorCount, 1, Len(VarErrorCount) - 1)
End If
Set rst2 = dbs.OpenRecordset("SELECT [ErrorCode] FROM [Project_Error_Final] WHERE [project_ID] = " & VarComboKey)
If rst2.RecordCount > 0 Then
rst2.MoveFirst
Do Until rst2.EOF
VarErrorCode = VarErrorCode & rst2!ErrorCode & ","
rst2.MoveNext
Loop
' Remove the last comma
VarErrorCode = Mid(VarErrorCode, 1, Len(VarErrorCode) - 1)
End If
rst1.Close
Set rst1 = Nothing
rst2.Close
Set rst2 = Nothing
dbs.Close
Set dbs = Nothing
Me.txtErrorCount = VarErrorCount
Me.txtErrorCode = VarErrorCode
Yes there is!
Obviously, you need to be able to relate the combo box selection to the value you wish to be populated into the other field(s). Assuming that you have a 1:1 relationship with the PK (since you want to display only one value in your form), you can use the AfterUpdate event plus the DLookup() function to retrieve a related value using the PK.
As a simple example, I set up a table named Foods as follows:
FoodID, FoodName, FoodCategory
1, Orange, Fruits
2, Chicken, Poultry
3, Almond, Nuts
4, Lettuce, Vegetables
In the form, I have a control that selects the FoodID as the PK bound value named ComboFoods, and an unbound text box control named TextFoodCategory that we will populate with the FoodCategory from the Foods table.
I've assigned the following code to the AfterUpdate event of the Combo Box so that when the value of the combo box changes, the text box will be populated:
Private Sub ComboFoods_AfterUpdate()
'Create a variable to store the combo box primary key selection
Dim VarComboKey As Integer
'Create a variable to store the DLookup results
Dim VarFoodCat As Variant
'Capture the primary key of the combo box
VarComboKey = Me.ComboFoods.Value
'Retrieve the related field value
VarFoodCat = DLookup("[FoodCategory]", "[Foods]", "[FoodID] = " &
VarComboKey)
'Set the value of the text box to the variable
Me.TextFoodCategory.Value = VarFoodCat
This will return the FoodCategory that is related to PK. This is all using one table, but the DLookup statement can be modified to reference any query or table that contains the PK.
Please note that DLookup will only work properly when the PK is unique in the data you are referencing. It will not work in a one to many relationship unless you specify other criteria that restrict the results to one record. There are other ways to use SQL queries and recordsets within VBA if you need to return multiple records, but that this out of scope for this question.
This worked when tested - best of luck!

Access 2010 - Cannot edit textbox in unbound form which is populated by recordset

I am using Access 2010 with linked tables from SQL Server 2008. I have a form that I am populating using a recordset and the control source of the textbox in this form is set to a field from the recordset. I find that although I can navigate through all the 16 records on the form, and the form loads correctly, I am unable to edit the Notes text box. It needs to be editable. The textbox has Enabled=True and Locked=False. The AllowEdits property of the form is set to true. All the tables in the query have primary keys. So, is it my query then - since it has right and inner joins in it? So the issue is that I cannot type in the textbox.
Just a little background, I tried using a query as the recordsource for this form, but found that Access' AutoSave feature inserted incomplete records into my Result table, in addition to the updates and inserts done by my Save button event. If the only way to circumvent this is to ask the user whether he/she would like to save changes every time he navigates, then that would be way too frustrating for the end user. So, I have had to use an unbound form where I use VBA to populate it using a ADO recordset.
Incidentally, I can edit the DocID and DocumentType columns, it's the fields from the query that cannot be changed (QCNote)
Here is the code from my Form_Open event. I also have a Form_Current event that disables the Submit button for inapplicable categories.
Private Sub Form_Open(Cancel As Integer)
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Set cn = CurrentProject.AccessConnection
Set rs = New ADODB.Recordset
With rs
Set .ActiveConnection = cn
DocID = [Forms]![QCDocAttributes]![DocID]
DocumentType = [Forms]![QCDocAttributes]![Document Type]
strSQL = "SELECT " & DocID & " AS DocID,'" & DocumentType & "' AS DocumentType, QC_QCDecisionPoint.Description, QC_QCDecisionPoint.QCDecisionPointID , QC_QCResultDecisionPoint.QCNote FROM QC_QCResultDecisionPoint RIGHT JOIN ((QC_QCAttribute INNER JOIN QC_QCAttributeDecisionPointAsc ON QC_QCAttribute.QCAttributeID = QC_QCAttributeDecisionPointAsc.QCAttributeID) INNER JOIN QC_QCDecisionPoint ON QC_QCAttributeDecisionPointAsc.QCDecisionPointID = QC_QCDecisionPoint.QCDecisionPointID) ON QC_QCResultDecisionPoint.QCDecisionPointID = QC_QCDecisionPoint.QCDecisionPointID WHERE (((QC_QCAttribute.Description)= '" & [Forms]![QCDocAttributes]![AttributesDropdown] & "' ));"
.Source = strSQL
.LockType = adLockOptimistic
.CursorType = adOpenKeyset
.Open
End With
Set Me.Recordset = rs
Set rs = Nothing
Set cn = Nothing
End Sub