Access Dropdown to filter subform - ms-access

Apologies if this has been answered but being new to access i cant see what will help me,
I have a access form that as a subform in it that displays an engineer name and a tickbox to select when logging downtime for the engineering team. however there is 4 teams and they are generally getting bigger which now means we have to scroll through the names to get to an engineer we want.
I have a list of all the engineers and what team they are associated to on 1 table and on the main form there is a dropdown with the teams on. When i select a team from the dropdown i want the subform to filter out any engineers that dont belong to select team.
Additional Information
Subform_SelectEngineer
Dropdown name is TeamFilter
Hope this is substantial information

on after update for your Teamfilter, set your
subform_selectengineer.filter = "[TeamName] = '" & me.teamfilter & "'"
subform_selectenginner.filteron = true

Related

How can I input data for a many-to-many table in Access?

I'm sure that this is a basic question but I'm struggling to get to grips with Access.
In my case I have two tables: Student and Subject, linked by a junction table, StudentSubject. Student and Subject have a many to many relationship, as one student can study multiple subjects, and one subject can be studied by many students.
What I don't understand specifically is how to input data so that each student can study more than one subject. I've created a Form with a Subform that looks like this:
When I try to input anything into the "SubjectName" field, it says "Field cannot be updated". If I press "Okay" the message goes away and I can type something in the field, but as soon as I try to put something else in the record below for "Subject", the same error comes up. Then when I press the arrow to go to the Next Record on the Form, and save the form, nothing has changed in any of the tables.
Here are the three tables and their relationships:
I'm not too sure what I'm doing wrong here, but the end goal is that I can input a student and also input all of the subjects that they are doing, so that each student's individual list of subjects is stored alongside their name. I don't know where the "Field cannot be updated" error is coming from.
Could anyone advise?
You need 3 forms:
One form for students,
One form for subjects
One form for the Student-Subject table
The Student-Subject form will be a sub-form in both of the other forms. This form can have combo-boxes for the student and subject. For example, here's what editing a student might look like:
This way, you can easily add new subjects a student is taking (and similarly, add new students that are taking a subject).
Note that both the Subject and Student columns are being shown. What I've done in the past is have a bit of VBA to hide the appropriate column based on what the parent form is:
Option Explicit
' note that this code goes in the Student-Subject form.
Private Sub Form_Load()
If Me.HasParent Then
Me.cboStudentID.ColumnHidden = (Me.Parent.Name = "frmStudent")
Me.cboSubjectID.ColumnHidden = (Me.Parent.Name = "frmSubject")
End If
End Sub
'''''''''''''''''''''''''''''''''''''''''''
Public Function HasParent() As Boolean
On Error GoTo err_handle
HasParent = Not Me.Parent Is Nothing
Exit Function
err_handle:
HasParent = False
Exit Function
End Function
This way, the appropriate column is hidden based on whether you're editing a student (and the Student column will be hidden) or editing a subject (and the Subject column will be hidden).
Typically you have two different views on such a multi to multi relation. One is you are in the student's view and the other is if you are in the subject's view.
In the case of the student's view you must create a form to edit the student's table and you have to add a subform to edit the detail data table, i.e. StudentSubject. This detail table has to be synchronized with your StudentID from the main form. Usually this is already done by the wizard. But please be aware that you have only the ids in the detail table. To display a readable information you need to change the text boxes to combo boxes and to bind the combo boxes to the underlying tables.
Because you have only numbers in the detail table StudentSubject you cannot input text directly into this box. If the SubjectName has not been registered in the table Subject you have to add the new entry before you can select this. To dynamically add a new text entry you may use the "Not in List" event to handle this.

How to populate data in a one to many relationship between two forms when the target form's table has no matching entry?

This is probably a dumb question, but I'm a noob, so forgive me. I have two tables with a one to many relationship based on a OrderNumber. Essentially, I have some order details in one table, including OrderNumber (the one side of the relationship) and I am trying to get a list of LotNumbers in the other table using the OrderNumberLot (the many side) to link them together, as there can be many lot numbers on one order. The primary key in tblOrderDetails is OrderNumber and the primary key in tblLotNumber is LotID (auto number), but the linked field is OrderNumberLot. I made a open form button located on frmOrderDetail to open frmLotNumbers (based on the tblLotNumber). The deal is when frmLotNumber opens the OrderNumberLot field is blank. I understand there is no associated record in tblLotNumber, because I am trying to enter it, but how do I get the OrderNumber from the previous form, frmOrderDetail, with the button to automatically populate in the OrderNumberLot field in frmLotNumbers? I certainly don't want people to have to type it, because they will screw it up as badly as I have this explanation of my question! Thanks in advance for the help.
I agree with June7 on using a subform-approach for your purpose.
If you already have created the form, you could simply drag it from the sidebar onto your mainform and set the "Link Master Fields" and "Link Child Fields" to "OrderNumber" and "OrderNumberLot" - or you just use the subform-wizard and follow its instructions.
Though, some people dislike subforms in general and try to avoid them whenever possible - which might make sense at further stages of development. Instead of subforms, you could then use vba to transfer information from one form to another.
Lets say your button is named bt_openform
Private Sub bt_openform_Click()
'Open the desired form. The option "acFormAdd" forces the form
'to add a new entry whenever loading and requerying.
'As we want to add a new record, we will not use the filter settings
DoCmd.OpenForm "frmLotNumber", , , ,acFormAdd
'Next, store information from the initial form into the newly opened form
'To refer to data from the current form (meaning the one, in which the Sub is triggerd),
'you can use "Me.fieldname" and to refer to another form, use "Forms!formname!fieldname"
Forms!frmLotNumber!OrderNumberLot = Me.OrderNumber
End Sub
You could also do it the other way around and retrieve the information when loading the form:
Private Sub Form_Load()
Me.OrderNumberLot = Forms!frmOrderDetail!OrderNumber
End Sub
To be on the safe site, one might want to nest this function in an if statement, to check whether frmOrderDetail is open or not. This way, you can open your frmLotNumber from different forms without causing troubles
If CurrentProject.AllForms("frmOrderDetail").IsLoaded Then Me.OrderNumberLot = Forms!frmOrderDetail

How to autofill tableA-fieldA based on tableA-fieldB by getting the data from tableB?

First, some context: I am used to working with Excel, and I have been using it to create production calculators for my worldbuilding hobby. Due to some recent problems with excessive amounts of data needing calculation, I have finally given in and tried switching it all into Access.
I have been doing some readings on how to use Access, and based on that I decided on the following:
1) I have a temperature table for regions (boreal, temperate...) with specific production levels (1,2...)
2) I have a precipitation table for regions (wet, arid...) with specific production levels (1, 2...)
3) I then have a biome table where I mix the above regions to create my biomes with the following fields:
- Biome.
- Precipitation (dropdown menu from table 2).
- Temperature (dropdown menu from table 1).
- Productivity level (which should be Precipitation Production Level from Table 2 times the Temperature Production Level from Table 1).
QUESTION: How can I have the Productivity Level in table 3 be automatic?
NOTE 1: I don't know VBA and this is my first time working with Access.
NOTE 2: I habe been told to just create table 3 as a form, but I do not think that works with what I want to do. Just in case it may be relevant (and I am not seeing the obvious), I'll next describe my first goal at building this database.
DATA ENTRY FORM: all the tables referenced below are connected by the concatenation of latitude-longitude. I have only built it partially (main form and city subform) successfully.
- main form based on table with 3 fields: latitude, longitude, terrain.
- subform based on table with 3 fields: city name, foundation date, collapse date.
- 3 subforms based on 3 tables, each representing a time period, with 2 fields: biome (biomes change in a given area depending on time periods), and its productivity levels.
After building the world, coordinate by coordinate, I will then go to the next phase - creating tables where I identify plants and animals, plus products derived from them and their levels of productivity. This will then be used to create my world's economy system and a list of characters in different levels of wealth.
I can make this work somewhat easily in Excel (without using VBA), but the amount of data will kill the file before I can use it. I only hope I'll manage to pull it off in Access - but I'll deal with this monster one step at a time. Right now, I am just focusing on the question I posted above. Thank you for any assistance you may be able to give me.
You want a database trigger meaning that entering data into biome table in the specified columns "triggers" the calculation for your third table. Access does not support triggers but there is a workaround. You use a form and create events to the textboxes of the triggering attributes.
Create a new form based on your biome table. I suggest you get the triggers to work first. Later you can add it to your form with all the subforms. Since you are new to Access you do not want to deal with subforms so soon because they make everything more complicated than it needs to be.
You rename the textboxes Precipitation, Temperature, ProductivityLevel to something like txtPrecipitation txtTemperature txtProdLevel
You open the VBA-Editor and try the following code in your new form:
.
'Trigger Events
private sub txtTemperature_Change()
call CalculateProductivityLevel()
end sub
private sub txtPrecipitation_Change()
call CalculateProductivityLevel()
end sub
private sub txtTemperature_AfterUpdate()
call CalculateProductivityLevel()
end sub
private sub txtPrecipitation_AfterUpdate()
call CalculateProductivityLevel()
end sub
'Calculation Procedure
private sub CalculateProductivityLevel()
'Check if both attributes have values. If not do not calculate anything
if (Len(me.txtTemperature & "") = 0) OR (Len(me.txtPreciperation & "") = 0) Then
exit sub
else
me.txtProdLevel = me.txtTemperature * me.txtTemperature
end sub
Note
The trigger events will call the calulcation procedure when there are new entries in the two attributes or new entries are saved.
Make sure to put the code in the new form tab of your VBA-editor
untested code so there might be some errors

MS Access 2010- How to update field on one table based on field in another table

I'm designing a database to track requests. Currently, I have a form that its' record source is based off a query "Unassigned Requests". This query is based off my table Requests, and returns all "unassigned Requests". In this form, I would like the status field to change to "Assigned", once a Tech field has been assigned to the request. I currently have the Default for the Tech Assigned field set to "Blank', and the status field set to 'Unassigned". Both of these fields are combo boxes. The status field has a control source from the request table and row source from the status table. The tech assigned field has a control source from the Tech table and the row source is based off a query.
I have tried multiple solutions that have not seemed to work. I have limited experience with Macros and VBA. I would appreciate any suggestions on solving this problem.
I am going to make some assumptions regarding your post and if any are incorrect please let me know.
You have a request form where a request is assigned to a Tech. On that form there is a dropdown for the status, and also for the Tech.
You want to make it so when the tech dropdown is filled out with a tech's name you want the dropdown to change to assigned.
If this is the case I would recommend using the Tech Assigned field's AfterUpdate event. The code would look something like this:
Private Sub cboTech_Assigned_AfterUpdate()
If Nz(Me.cboTech_Assigned.Value, "") <> "" Then
Me.cboStatus = "Assigned"
Else
Me.cboStatus = ""
End If
End Sub
Obviously you will need to adjust to your own naming scheme. I should also point out that I don't even know if that Nz function is needed, I have just gotten into the habit of putting it everywhere. If I misunderstood something about what you want to do please let me know!

Populating a form with a dropdown - Access

I am trying to create a form in access that has a dropdown at the top and will populate the rest of the form with the record that corresponds to what is chosen.
I have looked at 2 different guides online but both point to older versions of Access and I think I am missing something.
So. The order that I did everything:
I went to the table for the form. And I clicked Form. This made a quick form with all of the fields as text boxes.
I deleted the field that will be the dropdown and I put in a dropdown canceling the wizard
In the data section for the dropdown. I edited "Row Source" to select the field that will be in the dropdown and the unique ID, in that order.
I set the bound Column to 2 (I have tried both)
I set the name of the Combo Box to "TitleSelector"
In Form Settings. For "Record Source". I have "[forms]![Edit Piece].[TitleSelector] & "*" in Criteria for "ID". I also have the rest of the fields in the Query listed
I added the "me.requery" to on change
Not sure if it means anything. When I was typing in the Criteria for "ID" it did not show "TitleSelector" in the drop down.
I am using Access 2010
Edit:
My Problem -
The dropdown itself shows everything correctly. However nothing happens when I choose something
Edit:
SELECT Pieces.ID, Pieces.Title, Pieces.Composer, Pieces.Instrumentation, Pieces.Location, Pieces.Location_2
FROM Pieces
WHERE (((Pieces.ID)=[forms]![Edit Piece].[TitleSelector]));
Edit:
Here is a link to a copy of my database: https://www.dropbox.com/s/tpnqm686tj653fg/Trisha%20Database.accdb
Adding the me.requery to the ON CHANGE EVENT
(select CODE BUILDER - and enter the me.requery there) should work.
I have downloaded the sample file. Your problem is that the Record Source for the [Edit Piece] form is set to...
SELECT Pieces.ID, Pieces.Title, Pieces.Composer, Pieces.Instrumentation, Pieces.Location, Pieces.Location_2 FROM Pieces WHERE (((Pieces.ID)=[forms]![Edit Piece].[TitleSelector] & "*"));
...and the & "*" at the very end is causing the query to return no records. Removing that last bit so the Form's Record Source is...
SELECT Pieces.ID, Pieces.Title, Pieces.Composer, Pieces.Instrumentation, Pieces.Location, Pieces.Location_2 FROM Pieces WHERE (((Pieces.ID)=[forms]![Edit Piece].[TitleSelector]));
...gets your form working.
Edit
To have your form display information from the related tables (instead of just the foreign key values from the [Pieces] table), change the Record Source of the Form from...
SELECT Pieces.ID, Pieces.Title, Pieces.Composer, Pieces.Instrumentation, Pieces.Location, Pieces.Location_2 FROM Pieces WHERE (((Pieces.ID)=[forms]![Edit Piece].[TitleSelector]));
...to...
SELECT Pieces.ID, Pieces.Title, Composer.Composer, Instrumentation.Instrumentation, Location.Location, Location_1.Location AS Location_2 FROM (Location INNER JOIN (Instrumentation INNER JOIN (Composer INNER JOIN Pieces ON Composer.ID = Pieces.Composer) ON Instrumentation.ID = Pieces.Instrumentation) ON Location.ID = Pieces.Location) INNER JOIN Location AS Location_1 ON Pieces.Location_2 = Location_1.ID WHERE (((Pieces.ID)=[forms]![Edit Piece].[TitleSelector]));