By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
432,175 Members | 1,689 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 432,175 IT Pros & Developers. It's quick & easy.

[Access-VBA] How to create form which record source are FEW (not only one) tables?

P: 4
Hi.

I created code which makes dynamically form with bounded controls for all columns. I show it to you below.

My problem is, how I have to change this code to create form which record source are few (e.x. 2) tables?

Thank you for help

If you want to use this code, you only have to change value of:
- nazwaTabeli (table's name of which you want to create form)
- nazwaForlumarza (form's name that you want to create)

And code:
Expand|Select|Wrap|Line Numbers
  1. Option Compare Database
  2.  
  3. Sub Formularz()
  4.     Dim Formularz As form
  5.  
  6.     Dim ctlLabel As Control, ctlText As Control
  7.  
  8.     Dim polTextX As Integer, polTextY As Integer
  9.     Dim polLabelX As Integer, polLabelY As Integer
  10.     Dim roznicaX As Integer, roznicaY As Integer, licznik As Integer
  11.     Dim nazwaTabeli As String, nazwaFormularza As String
  12.  
  13.     'Ustawienia nazw tabeli i formularza
  14.     nazwaTabeli = "Zamowienia_"
  15.     nazwaFormularza = "Formularz"
  16.  
  17.     'Check if form of table you want to create is open
  18. If CurrentProject.AllForms(nazwaFormularza).IsLoaded = False Then
  19.  
  20.     'Check if form you want to create exist
  21.     Dim FormularzAktualny As AccessObject
  22.     For Each FormularzAktualny In Application.CurrentProject.AllForms
  23.         If FormularzAktualny.Name = nazwaFormularza Then DoCmd.DeleteObject acForm, nazwaFormularza
  24.         Exit For
  25.     Next FormularzAktualny
  26.  
  27.     ' Position of new formants
  28.     polLabelX = 100
  29.     polLabelY = 100
  30.     polTextX = 1000
  31.     polTextY = 100
  32.     roznicaY = 300
  33.     roznicaX = 2500
  34.     'Numer pola-1
  35.     licznik = 0
  36.  
  37.     'Creation of new form
  38.     Set Formularz = CreateForm
  39.     Formularz.RecordSource = nazwaTabeli
  40.  
  41.     ' Creation of controls for all columns in table
  42.     Dim bazadanych As Database
  43.     Dim pola As Field
  44.     Dim tabela As TableDef
  45.  
  46.     Set bazadanych = CurrentDb
  47.     Set tabela = bazadanych.TableDefs(nazwaTabeli)
  48.  
  49.     For Each pola In tabela.Fields
  50.         'Textboxes
  51.         Set ctlText = CreateControl(Formularz.Name, acTextBox, , "", pola.Name, _
  52.             polTextX + roznicaX, polTextY + roznicaY * licznik)
  53.         'Labels
  54.         Set ctlLabel = CreateControl(Formularz.Name, acLabel, , _
  55.             ctlText.Name, pola.Name, polLabelX, polLabelY + roznicaY * licznik)
  56.         licznik = licznik + 1
  57.     Next
  58.  
  59.     'Set ctlText = CreateControl(frm.Name, acTextBox, , "", nazwaPola, _
  60.         'intDataX, intDataY)
  61.     ' Create child label control for text box.
  62.     'Set ctlLabel = CreateControl(frm.Name, acLabel, , _
  63.          'ctlText.Name, nazwaLabela, intLabelX, intLabelY)
  64.     ' Restore form. - niepotrzebne
  65.     'DoCmd.Restore
  66.  
  67.     'Saving, closing, changing name and opening once more form that was created
  68.     DoCmd.Save acForm, "Formularz1"
  69.     DoCmd.Close acForm, "Formularz1", acSaveYes
  70.     DoCmd.Rename nazwaFormularza, acForm, "Formularz1"
  71.     DoCmd.OpenForm nazwaFormularza, , , , , acWindowNormal
  72.  
  73. 'If form of a name you want to create is open how msg
  74. Else: MsgBox "Formularz jest już uruchomiony", vbOKOnly, "Uwaga"
  75.  
  76. End If
  77.  
  78. End Sub
P.S. sory for my english
Sep 26 '09 #1
Share this Question
Share on Google+
7 Replies


NeoPa
Expert Mod 15k+
P: 31,473
I'm not sure I understand you clearly, but forms have a single RecordSource only (at any one time). That can be a table or a query (queries can have more than one table as their source). It is also possible to change the RecordSource of a form using code. This can even be done while the form is already open.

Does that help at all?
Sep 26 '09 #2

P: 4
I tried to change RecordSource of a form while the form is already in creation but after that there were error in form (unrecognisable source of data).

I was thinking about query, but I dont know how to place query as a record source. I know how to do that in graphical interface but not in VBA :( Could you re-write part of a code below to show me how to do this?
Expand|Select|Wrap|Line Numbers
  1. 'Creation of new form
  2.     Set Formularz = CreateForm
  3.     Formularz.RecordSource = nazwaTabeli
  4.  
  5.     ' Creation of controls for all columns in table
  6.     Dim bazadanych As Database
  7.     Dim pola As Field
  8.     Dim tabela As TableDef
  9.  
  10.     Set bazadanych = CurrentDb
  11.     Set tabela = bazadanych.TableDefs(nazwaTabeli)
  12.  
  13.     For Each pola In tabela.Fields
  14.         'Textboxes
  15.         Set ctlText = CreateControl(Formularz.Name, acTextBox, , "", pola.Name, _
  16.             polTextX + roznicaX, polTextY + roznicaY * licznik)
  17.         'Labels
  18.         Set ctlLabel = CreateControl(Formularz.Name, acLabel, , _
  19.             ctlText.Name, pola.Name, polLabelX, polLabelY + roznicaY * licznik)
  20.         licznik = licznik + 1
  21.     Next
I'd be grateful. Thank you for help.
Sep 26 '09 #3

NeoPa
Expert Mod 15k+
P: 31,473
I'll have a look to see what I can do. In the mean-time please note you should be using the [ CODE ] tags for code.

PS. Tags are done as matching pairs where the opening one is surrounded by [...] and the closing one by [/...]. A set of buttons is available for ease of use in the Standard Editor (Not the Basic Editor). The one for the [ CODE ] tags has a hash (#) on it. You can choose which editor to use in your Profile Options (Look near the bottom of the page).
Sep 27 '09 #4

NeoPa
Expert Mod 15k+
P: 31,473
I've looked at your code and it tells me nothing. There is nothing there which changes the RecordSource. There is no indication anywhere of what you want to use as a RecordSource even. Lastly, there is nothing to indicate where this code comes from. I can do nothing with this.
Sep 27 '09 #5

P: 4
You're wrong.
Below I give you me newest version of a code of this module, which work (create form) FOR 1 table. You can use it in every database and it'll create you form of name nazwaFormularza value.

But before it, im asking - how cant i change this code to create form of more tables?
I tried to create unbound form with bounded controls using code below:
Expand|Select|Wrap|Line Numbers
  1.  'Formularz.RecordSource = nazwaTabeli ' UNBOUND form
  2.     For Each pola In tabela.Fields
  3.         'Tworzenie textboxow
  4.         Set ctlText = CreateControl(Formularz.Name, acTextBox, , "", pola.Name, _
  5.             polTextX + roznicaX, polTextY + roznicaY * licznik)
  6.         ctlText.Name = nazwaTabeli & " " & pola.Name
  7. 'Here i'm trying to create BOUNDED controls but it doesnt work even for 1 table, what is wrong here?
  8.         Formularz.form.Controls(nazwaTabeli & " " & pola.Name).ControlSource = nazwaTabeli & " " & pola.Name
  9.         'ctlText.Name = pola.Name
  10.         'Formularz.form.Controls(pola.Name).ControlSource = pola.Name
  11.         'Tworzenie labeli dla textboxow
  12.         Set ctlLabel = CreateControl(Formularz.Name, acLabel, , _
  13.             ctlText.Name, pola.Name, polLabelX, polLabelY + roznicaY * licznik)
  14.         'ctlLabel.Name = "E" & pola.Name
  15.         ctlLabel.Name = nazwaTabeli & "E " & pola.Name
  16.         licznik = licznik + 1
  17.     Next
  18.  
but it doesnt work :(

And my working module, which creates form:

Expand|Select|Wrap|Line Numbers
  1. Option Compare Database
  2.  
  3. Sub Formularz()
  4.     Dim Formularz As form
  5.  
  6.     Dim ctlLabel As Control, ctlText As Control
  7.  
  8.     Dim polTextX As Integer, polTextY As Integer
  9.     Dim polLabelX As Integer, polLabelY As Integer
  10.     Dim roznicaX As Integer, roznicaY As Integer, licznik As Integer
  11.     Dim nazwaTabeli As String, nazwaFormularza As String
  12.  
  13.     'Ustawienia nazw tabeli i formularza
  14.     nazwaTabeli = "ZAMOWIENIA"
  15.     nazwaFormularza = "Formularz"
  16.  
  17.     'Sprawdzenie czy formularz jest juz uruchomiony
  18. If IsOpen(nazwaFormularza) = False Then
  19.  
  20.     'Jezeli istnieje formularz o nazwie nazwaFormularza jest on usuwany
  21.     If DCount("*", "[MSysObjects]", "Type = -32768 AND Name='" & nazwaFormularza & "'") > 0 Then
  22.         DoCmd.DeleteObject acForm, nazwaFormularza
  23.     End If
  24.  
  25.     ' Ustawienia wartosci pozycji nowych formantow
  26.     polLabelX = 100
  27.     polLabelY = 100
  28.     polTextX = 1000
  29.     polTextY = 100
  30.     roznicaY = 300
  31.     roznicaX = 2500
  32.     'Numer pola-1
  33.     licznik = 0
  34.  
  35.     ' Tworzenie nowego formularza o zrodle danych nazwaTabeli
  36.     Set Formularz = CreateForm
  37.     Formularz.RecordSource = nazwaTabeli
  38.  
  39.     ' Tworzenie zwiazanych formantow dla wszystkich pol tabeli nazwaTabeli
  40.     Dim bazadanych As Database
  41.     Dim pola As Field
  42.     Dim tabela As TableDef
  43.  
  44.     Set bazadanych = CurrentDb
  45.     Set tabela = bazadanych.TableDefs(nazwaTabeli)
  46.  
  47.     For Each pola In tabela.Fields
  48.         'Tworzenie textboxow
  49.         Set ctlText = CreateControl(Formularz.Name, acTextBox, , "", pola.Name, _
  50.             polTextX + roznicaX, polTextY + roznicaY * licznik)
  51.         ctlText.Name = nazwaTabeli & " " & pola.Name
  52.         'Tworzenie labeli dla textboxow
  53.         Set ctlLabel = CreateControl(Formularz.Name, acLabel, , _
  54.             ctlText.Name, pola.Name, polLabelX, polLabelY + roznicaY * licznik)
  55.         ctlLabel.Name = nazwaTabeli & "E " & pola.Name
  56.         licznik = licznik + 1
  57.     Next
  58.  
  59.     'Listing formantow
  60.     'Dim kontr As Control
  61.     'For Each kontr In Formularz.Controls
  62.     '        MsgBox kontr.Name
  63.     '    Next
  64.  
  65.     'Zapisywanie utworzonego formularza, zamykanie go, zmiana jego nazwy i ponowne otwarcie go
  66.     DoCmd.Save acForm, "Formularz1"
  67.     DoCmd.Close acForm, "Formularz1", acSaveYes
  68.     DoCmd.Rename nazwaFormularza, acForm, "Formularz1"
  69.     DoCmd.OpenForm nazwaFormularza, , , , , acWindowNormal
  70.  
  71. 'W przypadku jesli formularz jest wlaczony:
  72. Else: MsgBox "Formularz jest już uruchomiony", vbOKOnly, "Uwaga"
  73.  
  74. End If
  75.  
  76. End Sub
  77.  
  78. Function IsOpen(strName As String, Optional objtype As Integer = acForm)
  79.     IsOpen = (SysCmd(acSysCmdGetObjectState, objtype, strName) <> 0)
  80. End Function
  81.  
Please, help me if u can.
Sep 28 '09 #6

NeoPa
Expert Mod 15k+
P: 31,473
@chrismaliszewski
That may be true. We all make mistakes. You don't say why you think I may be though, so it's hard to be convinced.
@chrismaliszewski
I wish I could understand you well enough to.

Until you decide to respond to my comments though, I see no way forward.

I appreciate there is a language barrier, but I don't see how I can help you if we cannot understand each other clearly.
Sep 28 '09 #7

P: 4
Sorry that I told 'you're wrong'. I wrongly read 'Lastly, there is nothing to indicate where this code comes from.' (i read comes to). I apologies you.

You said:
I've looked at your code and it tells me nothing. There is nothing there which changes the RecordSource.
It is because I have two ideas to solve my problem:
1) Create unbounded form and bound ONLY controls on it (form)
2) Create bounded with first table form and next change record source table/query to another.
Code I showed you above is working one. I thought that u will see my problem. Sorry that I didn't showed it clearly.
If u want to try to solve problem in 1st way I show you below code with this type of problem:
Expand|Select|Wrap|Line Numbers
  1. Option Compare Database
  2.  
  3. Sub Formularz()
  4.     Dim Formularz As form
  5.  
  6.     Dim ctlLabel As Control, ctlText As Control
  7.  
  8.     Dim polTextX As Integer, polTextY As Integer
  9.     Dim polLabelX As Integer, polLabelY As Integer
  10.     Dim roznicaX As Integer, roznicaY As Integer, licznik As Integer
  11.     Dim nazwaTabeli As String, nazwaFormularza As String
  12.  
  13.     'Ustawienia nazw tabeli i formularza
  14.     nazwaTabeli = "ZAMOWIENIA"
  15.     nazwaFormularza = "Formularz"
  16.  
  17.     'Sprawdzenie czy formularz jest juz uruchomiony
  18. If IsOpen(nazwaFormularza) = False Then
  19.  
  20.     'Jezeli istnieje formularz o nazwie nazwaFormularza jest on usuwany
  21.     If DCount("*", "[MSysObjects]", "Type = -32768 AND Name='" & nazwaFormularza & "'") > 0 Then
  22.         DoCmd.DeleteObject acForm, nazwaFormularza
  23.     End If
  24.  
  25.     ' Ustawienia wartosci pozycji nowych formantow
  26.     polLabelX = 100
  27.     polLabelY = 100
  28.     polTextX = 1000
  29.     polTextY = 100
  30.     roznicaY = 300
  31.     roznicaX = 2500
  32.     'Numer pola-1
  33.     licznik = 0
  34.  
  35.     ' Tworzenie nowego formularza o zrodle danych nazwaTabeli
  36.     Set Formularz = CreateForm
  37.     Formularz.Caption = nazwaFormularza
  38.     Formularz.AutoCenter = True
  39.  
  40.     ' Tworzenie zwiazanych formantow dla wszystkich pol tabeli nazwaTabeli
  41.     Dim bazadanych As Database
  42.     Dim pola As Field
  43.     Dim tabela As TableDef
  44.  
  45.     Set bazadanych = CurrentDb
  46.     Set tabela = bazadanych.TableDefs(nazwaTabeli)
  47.  
  48.     'Formularz.RecordSource = nazwaTabeli ' WITHOUT BOUNDING FORM
  49.     For Each pola In tabela.Fields
  50.         'Tworzenie textboxow
  51.         Set ctlText = CreateControl(Formularz.Name, acTextBox, , "", pola.Name, _
  52.             polTextX + roznicaX, polTextY + roznicaY * licznik)
  53.         ctlText.Name = nazwaTabeli & " " & pola.Name
  54. 'WITH BOUNDING CONTROLS (IT DOESNT WORK)
  55.         Formularz.form.Controls(nazwaTabeli & " " & pola.Name).ControlSource = nazwaTabeli & " " & pola.Name
  56.         'ctlText.Name = pola.Name
  57.         'Formularz.form.Controls(pola.Name).ControlSource = pola.Name
  58.         'Tworzenie labeli dla textboxow
  59.         Set ctlLabel = CreateControl(Formularz.Name, acLabel, , _
  60.             ctlText.Name, pola.Name, polLabelX, polLabelY + roznicaY * licznik)
  61.         'ctlLabel.Name = "E" & pola.Name
  62.         ctlLabel.Name = nazwaTabeli & "E " & pola.Name
  63.         licznik = licznik + 1
  64.     Next
  65.  
  66.     'Zapisywanie utworzonego formularza, zamykanie go, zmiana jego nazwy i ponowne otwarcie go
  67.     DoCmd.Save acForm, "Formularz1"
  68.     DoCmd.Close acForm, "Formularz1", acSaveYes
  69.     DoCmd.Rename nazwaFormularza, acForm, "Formularz1"
  70.     DoCmd.OpenForm nazwaFormularza, , , , , acWindowNormal
  71.  
  72. 'W przypadku jesli formularz jest wlaczony:
  73. Else: MsgBox "Formularz jest już uruchomiony", vbOKOnly, "Uwaga"
  74.  
  75. End If
  76.  
  77. End Sub
  78.  
  79. Function IsOpen(strName As String, Optional objtype As Integer = acForm)
  80.     IsOpen = (SysCmd(acSysCmdGetObjectState, objtype, strName) <> 0)
  81. End Function
  82.  
If u want to see and solve 2nd problem, code below:
Expand|Select|Wrap|Line Numbers
  1. Option Compare Database
  2.  
  3. Sub Formularz()
  4.     Dim Formularz As form
  5.  
  6.     Dim ctlLabel As Control, ctlText As Control
  7.  
  8.     Dim polTextX As Integer, polTextY As Integer
  9.     Dim polLabelX As Integer, polLabelY As Integer
  10.     Dim roznicaX As Integer, roznicaY As Integer, licznik As Integer
  11.     Dim nazwaTabeli As String, nazwaFormularza As String
  12.  
  13.     'Ustawienia nazw tabeli i formularza
  14.     nazwaTabeli = "ZAMOWIENIA"
  15.     nazwaFormularza = "Formularz"
  16.  
  17.     'Sprawdzenie czy formularz jest juz uruchomiony
  18. If IsOpen(nazwaFormularza) = False Then
  19.  
  20.     'Jezeli istnieje formularz o nazwie nazwaFormularza jest on usuwany
  21.     If DCount("*", "[MSysObjects]", "Type = -32768 AND Name='" & nazwaFormularza & "'") > 0 Then
  22.         DoCmd.DeleteObject acForm, nazwaFormularza
  23.     End If
  24.  
  25.     ' Ustawienia wartosci pozycji nowych formantow
  26.     polLabelX = 100
  27.     polLabelY = 100
  28.     polTextX = 1000
  29.     polTextY = 100
  30.     roznicaY = 300
  31.     roznicaX = 2500
  32.     'Numer pola-1
  33.     licznik = 0
  34.  
  35.     ' Tworzenie nowego formularza o zrodle danych nazwaTabeli
  36.     Set Formularz = CreateForm
  37.     Formularz.Caption = nazwaFormularza
  38.     Formularz.AutoCenter = True
  39.  
  40.     ' Tworzenie zwiazanych formantow dla wszystkich pol tabeli nazwaTabeli
  41.     Dim bazadanych As Database
  42.     Dim pola As Field
  43.     Dim tabela As TableDef
  44.  
  45.     Set bazadanych = CurrentDb
  46.     Set tabela = bazadanych.TableDefs(nazwaTabeli)
  47.  
  48.     Formularz.RecordSource = nazwaTabeli ' BOUND HERE
  49.     For Each pola In tabela.Fields
  50.         'Tworzenie textboxow
  51.         Set ctlText = CreateControl(Formularz.Name, acTextBox, , "", pola.Name, _
  52.             polTextX + roznicaX, polTextY + roznicaY * licznik)
  53.         ctlText.Name = nazwaTabeli & " " & pola.Name
  54.         Formularz.form.Controls(nazwaTabeli & " " & pola.Name).ControlSource = nazwaTabeli & " " & pola.Name
  55.         'ctlText.Name = pola.Name
  56.         'Formularz.form.Controls(pola.Name).ControlSource = pola.Name
  57.         'Tworzenie labeli dla textboxow
  58.         Set ctlLabel = CreateControl(Formularz.Name, acLabel, , _
  59.             ctlText.Name, pola.Name, polLabelX, polLabelY + roznicaY * licznik)
  60.         'ctlLabel.Name = "E" & pola.Name
  61.         ctlLabel.Name = nazwaTabeli & "E " & pola.Name
  62.         licznik = licznik + 1
  63.     Next
  64.  
  65.     'AND BOUND HERE
  66.     nazwaTabeli = "DP_AMZPOTSP"
  67.     Set tabela = bazadanych.TableDefs(nazwaTabeli)
  68.     Formularz.RecordSource = nazwaTabeli
  69.     'For Each pola In tabela.Fields
  70.     '    'Tworzenie textboxow
  71.         Set ctlText = CreateControl(Formularz.Name, acTextBox, , "", pola.Name, _
  72.             polTextX + roznicaX, polTextY + roznicaY * licznik)
  73.         ctlText.Name = nazwaTabeli & " " & pola.Name
  74.     '    'Tworzenie labeli dla textboxow
  75.         Set ctlLabel = CreateControl(Formularz.Name, acLabel, , _
  76.             ctlText.Name, pola.Name, polLabelX, polLabelY + roznicaY * licznik)
  77.         ctlLabel.Name = nazwaTabeli & "E " & pola.Name
  78.         licznik = licznik + 1
  79.     Next
  80.  
  81.     'Zapisywanie utworzonego formularza, zamykanie go, zmiana jego nazwy i ponowne otwarcie go
  82.     DoCmd.Save acForm, "Formularz1"
  83.     DoCmd.Close acForm, "Formularz1", acSaveYes
  84.     DoCmd.Rename nazwaFormularza, acForm, "Formularz1"
  85.     DoCmd.OpenForm nazwaFormularza, , , , , acWindowNormal
  86.  
  87. 'W przypadku jesli formularz jest wlaczony:
  88. Else: MsgBox "Formularz jest już uruchomiony", vbOKOnly, "Uwaga"
  89.  
  90. End If
  91.  
  92. End Sub
  93.  
  94. Function IsOpen(strName As String, Optional objtype As Integer = acForm)
  95.     IsOpen = (SysCmd(acSysCmdGetObjectState, objtype, strName) <> 0)
  96. End Function
  97.  
  98.  
And there is 3rd way to solve my problem: use query, as I and u said before. But I don't know how to 'bound'(?) query to form in VBA, OR how to use SQL code to bound it to form.

Once more I tell u (and to other people) my problem: how to create bound form which record source are few (not only one) tables/queries OR how to create unbound form with bounded controls?

I hope it'll help you to help me :)
Sep 28 '09 #8

Post your reply

Sign in to post your reply or Sign up for a free account.