Bom dia a todos do Máximo Access,
Estou com algumas atualizações no meu Projeto 2013, e a questão é que cosegui um bom bocado de conhecimento aqui, e já fiz algo incrível, a questão do que venho abrir este tópico é gerar um RecordSet automático para todos os formulários usando simplemente uma função do módulo.
Consegui fazer este código, porém estou com problemas em adicionar mais linhas em subformulário, só está adicionando 1 linha e não passa disso, não tem como criar uma nova linha ou registro.
Trabalho com DAO e estou tentando trabalhar com ele Desconectado(Desacoplado) mas não estou tendo sucesso com subformulário, estou um bocado de tempo tentando fazer algo, mas nada vem a mente, estou quase apelando para uma tabela temporária...
Veja o que tenho:
Módulo:
Formulário:
O que já tenho pronto é, pegar todos os campos dos formulários e salvar em uma tabela, uso este código:
Agora estou tentanto e tentando, mas sem sucesso até então, pegar todos os registros desta tabela onde foi salvo e trazer até ao módulo de chamar os recordset e aplicar no módulo com "imagino eu usando um for each ou do loop" cada campo salvo com !campo1 !campo2 !campo3 automáticamente sem o usuário ter que digitar todos os campos daquele formulário.
Alguém por favor pode dar uma luz de como eu vou extrair as informações da tabela e trazer para o módulo, aplicando com um procedimento (DLookUp Concatenado, ou Each For, ou Do While Loop...) assim o usuário não precisaria digitar sempre que fazer um formulário novo, só chamando a repectiva função!
Aguardo Sugestões Abraços a todos!
Estou com algumas atualizações no meu Projeto 2013, e a questão é que cosegui um bom bocado de conhecimento aqui, e já fiz algo incrível, a questão do que venho abrir este tópico é gerar um RecordSet automático para todos os formulários usando simplemente uma função do módulo.
Consegui fazer este código, porém estou com problemas em adicionar mais linhas em subformulário, só está adicionando 1 linha e não passa disso, não tem como criar uma nova linha ou registro.
Trabalho com DAO e estou tentando trabalhar com ele Desconectado(Desacoplado) mas não estou tendo sucesso com subformulário, estou um bocado de tempo tentando fazer algo, mas nada vem a mente, estou quase apelando para uma tabela temporária...
Veja o que tenho:
Módulo:
- Código:
Option Compare Database
Public Function caminho() As String
caminho = Application.CurrentProject.Path & "\Ideias_be.accdb"
End Function
Public Function fecha()
On Error Resume Next
rs.Close: Set rs = Nothing
db.Close: Set db = Nothing
End Function
Public Function abre(SQL As String, frm As Form)
On Error Resume Next 'GoTo Error:
Dim ctl As Control
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = OpenDatabase(caminho, False, False)
Set rs = db.OpenRecordset(SQL)
Dim Campo As Variant
Dim X As Variant
Dim Y As Variant
'Pega todos os controles
For Each ctl In frm.Controls
Select Case ctl.ControlType
Case acTextBox, acComboBox, acListBox, acOptionGroup, acCheckBox
'Execução
If ctl.Name <> "" Or Not IsNull(ctl.Name) Then
X = "" & ctl.Name
ctl.Value = rs(X)
End If
'Fim de Execução
End Select
'Próximo controle
Next ctl
rs.Close
Set rs = Nothing
db.Close
Set db = Nothing
Exit Function
Error:
MsgBox "Teste - " & Err.Description & " Nº: " & Err.Number
End Function
Public Function abre2(SQL As String, frm As Form)
On Error Resume Next 'GoTo Error:
Dim ctl As Control
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = OpenDatabase(caminho, False, False)
Set rs = db.OpenRecordset(SQL)
Dim Campo As Variant
Dim X As Variant
Dim Y As Variant
Dim i As Integer
Y = rs.RecordCount
'Pega todos os controles
For i = 1 To 2
For Each ctl In frm.Controls
Select Case ctl.ControlType
Case acTextBox, acComboBox, acListBox, acOptionGroup, acCheckBox
'Execução
If ctl.Name <> "" Or Not IsNull(ctl.Name) Then
X = "" & ctl.Name
ctl.Value = rs(X)
End If
'Fim de Execução
End Select
'Próximo controle
Next ctl
rs.FillCache
rs.MoveNext
Next i
rs.Close
Set rs = Nothing
db.Close
Set db = Nothing
Exit Function
Error:
MsgBox "Teste - " & Err.Description & " Nº: " & Err.Number
End Function
Public Function Combo(Campo As String, frm As Form) 'Carrega combo com lista em recordset linha por linha
On Error GoTo Error
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim j As Integer
Dim k As Variant
Set db = OpenDatabase(caminho)
Set rs = db.OpenRecordset("SELECT " & Campo & " FROM Funcionario ORDER BY Codigo")
Do Until rs.EOF
k = rs(Campo)
j = j + 1
With frm(Campo)
.AddItem k
End With
'Me.AprovadoGerente.AddItem "0;Reprovado", Index:=0
rs.MoveNext
Loop
Call fecha
Exit Function
Error:
MsgBox "Teste - " & Err.Description & " Nº: " & Err.Number
End Function
Formulário:
- Código:
Option Compare Database
Option Explicit
Private Sub Codigo_AfterUpdate()
Call abre("SELECT * FROM Funcionario WHERE Codigo =" & Me.Codigo, Me)
Call abre2("SELECT * FROM FuncionarioSub WHERE Codigo =" & Me.Codigo, Me.FuncionarioSub.Form)
End Sub
Public Sub Form_Open(Cancel As Integer)
Call abre("SELECT * FROM Funcionario", Me)
Call Combo("Codigo", Me)
Call abre2("SELECT * FROM FuncionarioSub WHERE Codigo =" & Me.Codigo, Me.FuncionarioSub.Form)
End Sub
- Código:
Public Function frmX(frm As Form) 'Verifica todos os campos e subformulário do formulário
Dim ctl As Control
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = OpenDatabase(caminho, False, False)
Dim Item As Integer
Dim cont As Integer
On Error GoTo Error
DoCmd.SetWarnings False
db.Execute "DELETE * FROM tblFormCampos WHERE NomeForm ='" & frm.Name & "'"
For Each ctl In frm.Controls
' Percorre todos os tipos de controles
Select Case ctl.ControlType
Case acTextBox, acComboBox, acListBox, acOptionGroup, acCheckBox
If ctl.Name <> "" Or Not IsNull(ctl.Name) Then
Set rs = db.OpenRecordset(SQLi("Campo", "tblFormCampos", "NomeForm = '" & frm.Name & "' And Campo = '" & ctl.Name & "'"))
Item = Item + 1
cont = rs.RecordCount
If cont = 0 Then
db.Execute "INSERT INTO tblFormCampos (NomeForm, Item, Campo, SubForm) Values('" & frm.Name & "', '" & Item & "', '" & ctl.Name & "', '-')"
Set rs = Nothing
End If
End If
Case acSubform
If ctl.Name <> "" Or Not IsNull(ctl.Name) Then
Set rs = db.OpenRecordset(SQLi("SubForm", "tblFormCampos", "NomeForm = '" & frm.Name & "' And SubForm = '" & ctl.Name & "'"))
Item = Item + 1
cont = rs.RecordCount
If cont = 0 Then
db.Execute "INSERT INTO tblFormCampos (NomeForm, Item, SubForm, Campo) Values('" & frm.Name & "', '" & Item & "', '" & ctl.Name & "', '-')"
Set rs = Nothing
End If
End If
End Select
Next ctl
DoCmd.SetWarnings True
db.Close
Set db = Nothing
Exit Function
Error:
msgbox "(FrmX).Percorre todos os campos - " & Err.Description & " Nº: " & Err.Number
End Function
Agora estou tentanto e tentando, mas sem sucesso até então, pegar todos os registros desta tabela onde foi salvo e trazer até ao módulo de chamar os recordset e aplicar no módulo com "imagino eu usando um for each ou do loop" cada campo salvo com !campo1 !campo2 !campo3 automáticamente sem o usuário ter que digitar todos os campos daquele formulário.
Alguém por favor pode dar uma luz de como eu vou extrair as informações da tabela e trazer para o módulo, aplicando com um procedimento (DLookUp Concatenado, ou Each For, ou Do While Loop...) assim o usuário não precisaria digitar sempre que fazer um formulário novo, só chamando a repectiva função!
Aguardo Sugestões Abraços a todos!
- Anexos
- Ideias.zip
- Você não tem permissão para fazer download dos arquivos anexados.
- (44 Kb) Baixado 18 vez(es)
Última edição por dhtm15 em 25/2/2013, 14:25, editado 3 vez(es) (Motivo da edição : Adicionar novas informações!)