VBA code to make a combo box selection (Access) - vba

My situation is quite simple, a user is presented with a drop down menu (combo box) of customers, if the customer needed to fill the form is not present in the database already the user can click an "Add Customer" button which opens up a pop up form to enter the customer details and insert the new entry into the customers table.
I'm nit picking now but, if the user now wants to select the newly entered customer they must re-select the customer from the combo box which will now present a new entry, is there a way of automatically making the combo box default to the newly inserted customer with an "On Close" event on the pop up form?
This is the "On Close" code I already have which refreshes the customer combo box to add the new entry, is there anything I can add which will make it so the box defaults to the new customer entered?
Private Sub Form_Close()
If CurrentProject.AllForms("edit appointments").IsLoaded Then
Forms![edit appointments]!customerCombo.Requery
End If
If CurrentProject.AllForms("edit purchases").IsLoaded Then
Forms![edit purchases]!customerCombo.Requery
End If
End Sub

I figured it out.
Forms![edit appointments]!customerCombo = DLast("ID", "customer")
This takes the last entry in the "customers" table and sets the value of the combo box to the value contained in the field "ID".

Related

MS Access one form to select table values and use to populate multiple fields on other form?

I have a table called GL_Account and IM_Productline
The table IM_Productline has various fields that need to be populated with a value from the field GL_Account.AccountKey (i.e. IM_ProductLine.InventoryAcctkey and IM_ProductLine.CostOfGoodsSoldAcctKey)
To populate the IM_ProductLine table I made a form "Product Line Maintenance" with all the fields. To populate the field IM_ProductLine.InventoryAcctkey I put a (magnifying glass) button behind the field with the following code:
Private Sub CMD_Select_GL_Account_Click()
Me.Refresh
If IsNull(Select_ProductType) Then
'do nothing
Else
Forms![Product Line Maintenance].InventoryAcctkey = Me.SelectGLAccountKey.Column(0)
Forms![Product Line Maintenance].Refresh
End If
DoCmd.Close
End Sub
So the button opens a form Called "Select GL Account" with a combo box that enable to SELECT GL_Account.AccountKey, GL_Account.Account, GL_Account.AccountDesc
FROM GL_Account; and when the OK button is clicked it writes the value from GL_Account.AccountKey to IM_ProductLine.InventoryAcctkey, closes the form "Select GL Account" and then refreshes the form "Product Line Maintenance" so the account number and description become visible for the user.
This all work fine but here's my question:
Now rather than creating a new form for every account field I need to populate (i.e. "Select Inventory GL Account" select "Cost Of Goods Sold GL Account" etc) I'd prefer to use the form "Select GL Account" to select and populate the 11 different account fields. So behind each xxxAcctkeyfield on form "Product Line Maintenance" is a (magnifying glass) button that when clicked pulls up the form "Select GL Account" and when "OK" is clicked it writes the selected AccountKey to the correct field on form "Product Line Maintenance"?
I'd greatly appreciate anyone's efforts to understand what I am trying to explain and point me in the right direction.
Ok, there is the issue that all 11 fields should not require to be "copied" since you have a relational database (you would ONLY store the row PK ID of that selection in the current report. (a so called FK (foreign key) value). That way, say you want to change the choice? Well then you could pop up that form - search + select the one record with all that information, and then upon return ONLY store the one value.
So, I would give some thoughts to the above - you want to leverage the relational database features. And as a result, you don't need to "copy" all that data. This is not much different then say creating a invoice. I can create the new invoice, but all of the address information, and the customer that this ONE invoice belongs to? Well, that is one column with a FK value that points to the customer. Once I select that one customer, then display of the customer name + address can be say a sub form or some such - but no need exists to "copy" that information. It would also means with near zero code, you could move a invoice between customers!!! - (just change the one fk column with to the new/different customer ID (PK) value.
Now, back to the question at a hand?
You can certainly pop up a form, let the user select, enter, pick and do whatever. And THEN you can have the calling code grab + pick out the values from that form.
The way you do this? It involves a not too wide known trick.
The code that calls the form can simply open that form as a dialog form. This will HALT the calling code, the user does whatever, and when done the calling code will THEN continue. Not only does the calling code continue, but it can get/grab/pull/take any values from that pop up form WIHOUT having to use global vars.
The approach is thus thus:
dim strF as string
strF = "frmPopAskInfo"
docmd.OpenForm strF,,,,,,acDialog
' above code waits for user input
if application.AllForms(strF).IsLoaded = true then
' user did not cancel, get values from form
me!AccountNo = forms(strf)!AccountNumber
etc. etc. etc.
docmd.Close acForm,strF
end if
Now the only other issue? Well, the "ok" button on the popup for DOES NOT close the form, what it does is set visible = False. This will kick the form out of dialog mode.
me.Visible = False
So, if the user hits the cancel buttton (close form) or hits the X upprer right (close form), then the form will NOT be loaded when your calling code continues. But, if they hit OK button, then you don't close the form, but ONLY set visbile = false.
This allows the calling code to continue, you are free to get/grab/take values from that form, and then once done, you close the form.
So a form close in that popup = user canceled the form.
So, a popup form, and even a modal form? They do NOT halt the VBA calling code, but a acDialog form does!
You can thus place 2 or 5 little buttons that pops up this form, the user can pick/choose/select/enter values. When they hit ok, your calling code continues, and you are free to pull values from that form. So while all 3-4 buttons might pop up that form, each individual button launch of the form can have code that follows and updates the given control the pop button was placed beside.

Getting a Value if a Field and Record number is known?

Good Evening,
I am working on a Combo Search Form that is designed to search for information by criteria. The form has a combo box containing field values and a text box beside it. The selection of a field value in the combo box will fill in the text box beside it with the relevant information for that record, all the relevant information is contained in the PetTable.
I have managed to get the combo box to display the fields from the PetTable by setting the rowSource to PetTable and the sourceType to Field List... however that's where I hit my dead end.
In the Text Box beside the combo-box I tried grabbing the value of the combo box and putting it into the textbox by making the Text box control source "=ComboBox", however this just created a textbox which has a literal text string to that of the combo box.
My next thought was to make the text box Control source "=PetTable.PetComboBox" my thought was that the PetTable references the table with my information and the "PetComboBox" becomes the field a need to get. This did not work either and gave a #Name error"
What should be happening is: In the Combo-box if I selected [Pet Name], I would hope that the textbox beside it becomes "Fido" but instead it also becomes [Pet Name].
Any and all help would be appreciated!
Thanks
Desired Effect
What you need to do is to change the Row Source Type of the Combo Box to "Table/Query". Then in the "Row Source" click on the "..." to open up the Query Builder. Select the table that you want. Add the columns that you want. I would suggest the table's primary key PetID, and then any other fields - in your case at least PetName. You may also want to sort by PetName to make it easier for the user to scroll through. Close the Query Builder and save the changes. Change the combo box's ColumnCount to 2, and set the Column Widths to be "0cm;6cm" (setting the first column to have a width of 0 means that it is not displayed to the user).
Now move to you TextBox, and set the Control Source to be:
=[Combo0].Column(1)
Note that columns in a combox box are 0-indexed, so the first column is column 0, the second (in your case containing PetName) is column 1.
As you actually want to show the field names, rather than the data in the combo box, then you will need to set the RowSourceType to be "Field List", and then select the table name as the RowSource.
You will then need a small piece of VBA to lookup the value of that field in the table for the current record:
Sub sListFieldData()
If Not IsNull(Me!Combo0) Then
Me!Text2 = DLookup(Me!Combo0, "tblPet", "PetID=" & Me!PetID)
Else
Me!Text2 = ""
End If
End Sub
And you will then need to call this procedure in the combo box's AfterUpdate event (to catch when it has been changed by the user) and also in the form's Current event (to catch when the user moves between records):
Private Sub Combo0_AfterUpdate()
Call sListFieldData
End Sub
Private Sub Form_Current()
Call sListFieldData
End Sub
Regards,

How we can grab value from list box and fills automatically related text box in new form

I have a list box and its row source is "tblitems" with bellow fields.
Now I like when right click on this list box and select one option for example "new task" it opens new task form and automatically Grab the item number from a list box and fills related text box "item number" in "new task" form that is bounded to table "tbltask"
Now when I press "Apply" button it insert new record in "tbltask".
tblItems
item number (pk)
item name (text)
tbltask
task number (auto number,pk)
item number
enter image description here
Getting a value from a list box in a form is:
Me.List_Box_Name.Value
Or if you have unbound values then get it based on the column:
Me.List_Box_Name.Column(2)
or whichever column you need.
You can then populate fields with DLookup or a recordset. Then if you want this to happen when you open a new form, you may want to look into this:
Private Sub Form_Load()
'Stuff you want to happen when that form loads
End Sub
Updated
The following will print out the value each time you click it. You can use this method to trigger a new form to open, or you can have a user click a submit button afterwards.
Private Sub Test_List_Click()
Debug.Print Me.Test_List.Value
DoCmd.OpenForm "Form_Name"
End Sub
Now I'm not exactly sure the best way to add your variable to the opened form. If it were me with my limited knowledge, I would add a global or public string and have the Form_Load() check to see if that string length is greater than 0. If yes then it will populate the field.
Hope that helps
Update 2
Actually this link will help you populate a field from previous form:
MS Access - open a form taking a field value from a previous form

MS Access Copying value from a form into another form text box

Here's my problem: I have the below code which copies the employee username from FormB and puts it in FrmEmployee when i click on a record in FormB (which is opened through a cmd button on FrmEmployee and lists all employees in the company and their shift pattern).
Private Sub Form_Click()
Forms!FrmEmployeee.Form.Username = Me.Username
End Sub
This works but it will only set the current username field to what is selected on FormB. FormB is in a datasheet view and will hold multiple values for the employee username. So what I want to do is expand the above code somehow so it takes me to the next record on FrmEmployee which means when i select another user from FormB this value will be copied into the next Username record, allowing me to build a list of employees.
From my understanding, what you need actually is to store multiple line/items from your FORM B.
So my suggestion is changing your textbox on FrmEmployee into a ListBox. So everytime you out the cursor on the active record, it add the record into the listbox

Intercepting combobox dropdown

Urgh, I have spent the last couple of hours on this now. I normally end up finding the answer from a bit of Googling, but not with this one. Bit of a headache.
My questions:
How can I catch when a user clicks the dropdown arrow on a combobox and prevent the dropdown list from being displayed.
How can I then clear and populate the dropdown list and display it programmatically?
I have one agent program remotely connected to a server over the internet. When you click the dropdown arrow on the agent, it queries the server to determine what needs to be in the dropdown list. It then displays the dropdown list. The comboboxes act as filters for the subsequent comboboxes on the GUI. A delay in displaying the dropdown list is perfectly acceptable while retrieving the data. Initially querying all the possibly entries in the dropdown list is not an option because there are so many! Needs to be comboboxes compared to listboxes as the user may also type an entry that is not in the list.
Hopefully this will clarify what I am doing:
GUI on the agent:
ComboBox1 - displays the countries
ComboBox2 - displays the cities - dropdown list determined by ComboBox1 selected item
ComboBox3 - displays the towns - dropdown list determined by ComboBox2 selected item
ComboBox4 - displays the streets - dropdown list determined by ComboBox3 selected item
Instead of populating the drop down when the user clicks the drop down button I would suggest that you populate and enable the following combo box when the value of the previous combo box changes. If populating the combo box is slow the delay is much more pleasant after the user has selected a value than before the user is going to select a value.
Assuming you are using Windows Forms here is a handler for the first combo box:
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
ComboBox2.Enabled = True
' Fill ComboBox2 based on ComboBox1.SelectedItem
ComboBox2.Items.Clear()
ComboBox2.Items.Add("Foo")
ComboBox2.Items.Add("Bar")
End Sub
Note that ComboBox2 to ComboBox4 are disabled intially and only are enabled when they are filled with data.