Access - Visual Basic (Dor Cabeça)

Dave

New member
Boas ...
Estava aqui a querer fazer um simples teste no Access VBA e estou com um problema que não consigo ver a solução ... alguém que perceba sabe a solução:

O problema é apenas um problema de teste .. mas mesmo simples esta-me a dar um erro qualquer parvo.

então é assim

Tenho Tabela de nome ALUNOS em que tem colunas de Nome e Idade de pessoas.

Queria que me fornecesse o numero de pessoas de X idade que estão na tabela.


O código que coloquei foi:


###############################

Option Compare Database
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim numreg As Integer


Private Sub Comando0_Click()
x = 4 ' Tou partir principio que quero as com 4 anos

Set db = CurrentDb()
Set rs = db.OpenRecordset("SELECT * From Alunos Where Idade = '" & x & "'")

numreg = rs.RecordCount
MsgBox "NÚMERO DE REGISTROS DA TABELA PEDIDOS: " & numreg

End Sub

###################
O que é que está aqui mal ?
 
Além do problema das plicas, estás a usar o "recordcount" que te retorna a quantidade de registos acedidos, tal como refere no help:

Remarks

Use the RecordCount property to find out how many records in a Recordset or TableDef object have been accessed. The RecordCount property doesn't indicate how many records are contained in a dynaset–, snapshot–, or forward–only–type Recordset object until all records have been accessed. Once the last record has been accessed, the RecordCount property indicates the total number of undeleted records in the Recordset or TableDef object. To force the last record to be accessed, use the MoveLast method on the Recordset object. You can also use an SQL Count function to determine the approximate number of records your query will return.
Ou seja, tal como no help explicam, tens 2 soluções:

1 - mover o apontador para o último registo através do movelast:

(...)
rs.MoveLast
numreg = rs.RecordCount
(...)
2 - no SQL usares a função count:

Set db = CurrentDb()
Set rs = db.OpenRecordset("SELECT count(*) as QT From Alunos Where Idade = " & x )

numreg = rs.Fields("QT")
MsgBox "NÚMERO DE REGISTROS DA TABELA PEDIDOS: " & numreg
 
... e ainda tens uma terceira solução. Em vez de usares o acesso por DAO, usares directamente a função DCount do Access:

Private Sub Comando0_Click()
x = 4 ' Tou partir principio que quero as com 4 anos
numreg = DCount("*","Alunos","Idade=" & x)
MsgBox "NÚMERO DE REGISTROS DA TABELA PEDIDOS: " & numreg
End Sub
 
... e ainda tens uma terceira solução. Em vez de usares o acesso por DAO, usares directamente a função DCount do Access:

Sim eu optei por usar esta função ... mas acabei por me deparar com outro problema.

Se só fosse string's e numero era ''simples'' com Dcount. O problema é que tb tenho filtrar por data e já tentei:

y=Date

DCount("*", "[Alunos]", "[Data]=#" & Format(y, "dd/mm/yyyy") & "#")
e
DCount("*", "[Alunos]", "[Data]=#" & y & "#")

e não consigo que me dê o numero de registos com a data de hoje [8b][8b] .

Tens alguma ideia do problema que possa estar a cometer?

Obrigado ajuda
 
Além do problema das plicas, estás a usar o "recordcount" que te retorna a quantidade de registos acedidos, tal como refere no help:

Ou seja, tal como no help explicam, tens 2 soluções:

1 - mover o apontador para o último registo através do movelast:

2 - no SQL usares a função count:


É impressionante ... tudo funciona bem até introduzir o valor de uma Data. Se quiser filtrar uma Data ele diz-me sempre numero de registos é zero [8b]

Y= Date


Set db = CurrentDb()
Set rs = db.OpenRecordset("SELECT count(*) as QT From Alunos Where Idade = " & x & " And Data = #" & Format(y, "dd/mm/yyyy") & "#")

ou

Set db = CurrentDb()
Set rs = db.OpenRecordset("SELECT count(*) as QT From Alunos Where Idade = " & x & " And Data = #" & y & "#")

PS: já me está a apetecer deitar o PC pela janela fora apr:)
 
O engine utiliza internamente o formato americano mm/dd/yyyy.

experimenta:

DCount("*", "[Alunos]", "[Data]=#" & Format(y, "mm/dd/yyyy") & "#")
 
O engine utiliza internamente o formato americano mm/dd/yyyy.

experimenta:

DCount("*", "[Alunos]", "[Data]=#" & Format(y, "mm/dd/yyyy") & "#")


Mas essa é igual à qu tinha já colocado aqui, /ver post acima ....excepto que colocas-te mm/dd/yyyy em vês de dd/mm/yyyy.

Mas se o formato na minha tabela está em dia/mês/ano ... tenho usar dd/mm/yyyy,certo?

Confesso que problema ridiculo me está ''irritar'',porque fiz micro programa só testar esta funcionalidade do Dcount com datas e não a consigo meter a funcionar [:vm)].

Tens mais algum ideia :sh)
 
em programação tens de usar mm/dd/yyyy que é o formato usado pelo "jet engine". dd/mm/yyyy é só o formato regional de visualização.

O mesmo se passa com o ponto e a vírgula. Em VBA usas sempre o ponto como separador decimal, mesmo que visualmente nos campos apareçam com a virgula como separador decimal.
 
em programação tens de usar mm/dd/yyyy que é o formato usado pelo "jet engine". dd/mm/yyyy é só o formato regional de visualização.

O mesmo se passa com o ponto e a vírgula. Em VBA usas sempre o ponto como separador decimal, mesmo que visualmente nos campos apareçam com a virgula como separador decimal.

eu '' mato-me '' se o erro que estive meio dia de volta dele foi esse [:D][:D]..

Vou ver e já dou feedback
 
em programação tens de usar mm/dd/yyyy que é o formato usado pelo "jet engine". dd/mm/yyyy é só o formato regional de visualização.

O mesmo se passa com o ponto e a vírgula. Em VBA usas sempre o ponto como separador decimal, mesmo que visualmente nos campos apareçam com a virgula como separador decimal.

[8b][8b][8b] Era mesmo isso ... Obrigado

Mais alguma duvida até terminar programa [;)] já sei onde posso esclarecer[;)]

Abraço
 
A dor de cabeça continua [;)] ...

Mais uma duvida :sh).

Tenho num Form um botão que vai mostrar um relatório.

Gostava que após alguns cáculos ele me envia-se as variáveis para os campos de TextBox do Relatório.

Private Sub Comando195_Click()
x = 1+1
DoCmd.OpenReport "RelatorioMensal", acViewReport
Reports!RelatorioMensal!NomeDoCampo = x


A variável X é exemplificativa. Mas não funciona :( ... será que sou obrigado a carregar os valores das variáveis todos numa tabela?[8b]
 
Há vários "estratagemas" para passares valores para um report. Se calhar o mais correcto é usares o parâmetro "OpenArgs" do comando "OpenReport". A sintaxe referida no help é:

expression.OpenReport(ReportName, View, FilterName, WhereCondition, WindowMode, OpenArgs)

No botão do form:
Private Sub Comando195_Click()
x = 1+1

DoCmd.OpenReport "RelatorioMensal", acViewPreview, , , , x


No evento "activate" do report, colocas:
Private Sub Report_Activate()
Me.
NomeDoCampo = Me.OpenArgs
End Sub


Tens de ter em conta que o "OpenArgs" é do tipo string. Se quiseres passar vários parâmetros tens de arranjar forma de os concatenar, e depois o report tem de ser "inteligente" para os separar.
Na net encontram-se muitos exemplos de como o fazer.
 
Há vários "estratagemas" para passares valores para um report. Se calhar o mais correcto é usares o parâmetro "OpenArgs" do comando "OpenReport". A sintaxe referida no help é:

expression.OpenReport(ReportName, View, FilterName, WhereCondition, WindowMode, OpenArgs)

No botão do form:
Private Sub Comando195_Click()
x = 1+1
DoCmd.OpenReport "RelatorioMensal", acViewPreview, , , , x


No evento "activate" do report, colocas:
Private Sub Report_Activate()
Me.NomeDoCampo = Me.OpenArgs
End Sub

Tens de ter em conta que o "OpenArgs" é do tipo string. Se quiseres passar vários parâmetros tens de arranjar forma de os concatenar, e depois o report tem de ser "inteligente" para os separar.
Na net encontram-se muitos exemplos de como o fazer.

É uma boa opção, no entanto no meu caso é mais complicado porque as variáveis que tenho que passar para dentro Relatorio são umas 12 variáveis :sh) ....

Acho que vou ter de ir pelo metodo de introduzir valores numa tabela, acaba por ser mais fácil.

No entanto por este metodo acho sempre complicado porque nunca percebi muito bem os erros que dá ...
P.E. :
Porque é que nesta instrução dá erro a executar a ultima linha .. Erro 3219
Tabela nome: TEMP tem 3 colunas ... | Data | Idade | Nome |

########################################

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strsql As String


J = 2
A = Date
D = "David"


strsql = "INSERT INTO [Temp] Values('" & A & "','" & J & "','" & D & "');"
Set db = CurrentDb
Set rs = db.OpenRecordset(strsql)

#########################################
 
Julgo que dá erro porque a instrução "INSERT" não retorna um recordset.
Em vez do "OpenRecordSet" podes usar o "Execute".
E atenção às armadilhas com os tipos de dados. Embora o Access tente uma conversão de tipos implícita (tenta converter automaticamente) isso pode ser uma fonte de erros. Quando constróis a instrução de SQL, deves respeitar os tipos de dados, só usando as plicas para as strings, e usando #mm-dd-yyyy# para as datas.

Assim:

########################################

'Dim db As DAO.Database
'Dim rs As DAO.Recordset

Dim strsql As String

J = 2
A = Date
D = "David"

'strsql = "INSERT INTO [Temp] Values('" & A & "','" & J & "','" & D & "');"
'Set db = CurrentDb
'Set rs = db.OpenRecordset(strsql)


strsql = "INSERT INTO [Temp] Values(#" & Format(A, "mm-dd-yyyy") & "#," & J & ",'" & D & "');"

CurrentDb.Execute strsql

#########################################
 
Julgo que dá erro porque a instrução "INSERT" não retorna um recordset.
Em vez do "OpenRecordSet" podes usar o "Execute".
E atenção às armadilhas com os tipos de dados. Embora o Access tente uma conversão de tipos implícita (tenta converter automaticamente) isso pode ser uma fonte de erros. Quando constróis a instrução de SQL, deves respeitar os tipos de dados, só usando as plicas para as strings, e usando #mm-dd-yyyy# para as datas.

Assim:

########################################

'Dim db As DAO.Database
'Dim rs As DAO.Recordset

Dim strsql As String

J = 2
A = Date
D = "David"

'strsql = "INSERT INTO [Temp] Values('" & A & "','" & J & "','" & D & "');"
'Set db = CurrentDb
'Set rs = db.OpenRecordset(strsql)


strsql = "INSERT INTO [Temp] Values(#" & Format(A, "mm-dd-yyyy") & "#," & J & ",'" & D & "');"

CurrentDb.Execute strsql

#########################################


Mas assim vou ter um problema ... ele vai-me armazenar as datas em mm/dd/yyyy. Não consigo armazenar valor em tabela com dd/mm/yyyy ?
 
Mas assim vou ter um problema ... ele vai-me armazenar as datas em mm/dd/yyyy. Não consigo armazenar valor em tabela com dd/mm/yyyy ?
Não tem a ver uma coisa com outra.

Internamente as datas são sempre guardadas da mesma forma (julgo que até deve ser em formato numérico).

Nos comandos de SQL convém que seja em formato mm/dd/yyyy, que é o formato nativo do jet engine.

A forma como as datas são visualizadas depende da configuração do PC (Regional Settings), ou dos parâmetros de formatação dos controlos.
 
Não tem a ver uma coisa com outra.

Internamente as datas são sempre guardadas da mesma forma (julgo que até deve ser em formato numérico).

Nos comandos de SQL convém que seja em formato mm/dd/yyyy, que é o formato nativo do jet engine.

A forma como as datas são visualizadas depende da configuração do PC (Regional Settings), ou dos parâmetros de formatação dos controlos.

Sim podes ter razão mas o que acho estranho é por exemplo:
Uma data de 01/02/2011 (dia/mês/ano)

Qaundo a envio para uma tabela ele coloca-me na tabela: 02/01/2011

Depois quando a vou espetar no relatório em data longa: 02 Janeiro 2011

é isto que acho estranho ele fazer :sh)

queria que me coloca-se no relatorio 01 Fevereiro 2011
 
Sim podes ter razão mas o que acho estranho é por exemplo:
Uma data de 01/02/2011 (dia/mês/ano)

Qaundo a envio para uma tabela ele coloca-me na tabela: 02/01/2011

Depois quando a vou espetar no relatório em data longa: 02 Janeiro 2011

é isto que acho estranho ele fazer :sh)

queria que me coloca-se no relatorio 01 Fevereiro 2011
Não me parece nada estranho. Está de acordo com o que te tinha dito.
Ao inserires 01/02/2011 via SQL, como é uma data válida no formato mm/dd/yyyy (formato americano), o "jet engine" grava no campo: mês=01, dia=02, ano=2011.

Depois, a forma de visualização, depende da configuração regional, ou da formatação do campo/controlo....
 
Não me parece nada estranho. Está de acordo com o que te tinha dito.
Ao inserires 01/02/2011 via SQL, como é uma data válida no formato mm/dd/yyyy (formato americano), o "jet engine" grava no campo: mês=01, dia=02, ano=2011.

Depois, a forma de visualização, depende da configuração regional, ou da formatação do campo/controlo....

Sim mas se vou buscar o campo a uma tabela e pedir para me escrever no relatório em Data Longa, ele vai-me colocar mal a data :sh) .. Algum modo de dar a vola a isso?[8b]
 
Back
Top