Access - Visual Basic (Dor Cabeça)

A saga do access retomou depois de uns tempos de interregno por motivos e ida estrangeiro.

Deparei-me com um novo problema:

Basicamente é assim, tenho uma tabela de nome 'Alarmes' que tem 9 campos (F1,F2,F3,F4,F5,F6,F7,Departamento,Observacoes).

A tabela tem 40 linhas com os campos ((F1,F2,F3,F4,F5,F6,F7) preenchidos com determinados valores. O que quero fazer é percorrer linha a linha, encontrar determinadas palavras nos campos (F1,F2,F3,F4,F5,F6,F7) e de acordo com isso preencher o campo Departamento e Observacoes.

Ir percorrendo toda a tabela linha por linha e identificando determinadas strings não tenho qualquer problema. A dificuldade com que me deparei foi na actualização do campo Departamento e observacoes.

O código que estou a usar é o seguinte:

######
Set rst = CurrentDb.OpenRecordset("Alarmes") 'Nome da tabela
If rst.RecordCount = 0 Then
MsgBox "Não há registos na Tabela"
Exit Sub
End If
HoraActual = Hour(Date)

rst.MoveFirst

If InStr(1, rst.Fields("F5"), "Carro") <> 0 Then

MsgBox "Escrever no campo Departamento Oficina " '# está a identificar bem a string no campo F5
CurrentDb.Execute ("UPDATE Alarmes SET Departamento ='Oficina'")

End If
#####

Quando executo o > CurrentDb.Execute ("UPDATE Alarmes SET Departamento ='Oficina'") é me colocado as iniciais Oficina em toda a coluna Departamento, mas eu só queria que me coloca-se nessa coluna, naquela linha.

O que estou a fazer mal?

Obrigado pela ajuda

Cumprs
 
Olá Dave, então de novo à volta do Access? :-)

O problema é que estás a usar o comando "UPDADE" sem especificares a cláusula "WHERE", ou seja, sem indicares quais as linhas a actualizar. Assim, o Access vai actualizar toda a tabela.

Mas em vez de usares esse processo (dos recordsets) podes fazer tudo de uma vez usando o comando SQL de update. Ou seja, apagas todo o código e deixas somente a seguinte instrução:

CurrentDb.Execute ("UPDATE Alarmes SET Departamento ='Oficina' WHERE F5 Like '*Carro*'")


Nota: Julgo que o Access usa o caracter "*" como wildcard. Se não funcionar, experimenta colocar antes o caracter "%":

CurrentDb.Execute ("UPDATE Alarmes SET Departamento ='Oficina' WHERE F5 Like '%Carro%'")
 
Olá Dave, então de novo à volta do Access? :-)

O problema é que estás a usar o comando "UPDADE" sem especificares a cláusula "WHERE", ou seja, sem indicares quais as linhas a actualizar. Assim, o Access vai actualizar toda a tabela.

Mas em vez de usares esse processo (dos recordsets) podes fazer tudo de uma vez usando o comando SQL de update. Ou seja, apagas todo o código e deixas somente a seguinte instrução:

CurrentDb.Execute ("UPDATE Alarmes SET Departamento ='Oficina' WHERE F5 Like '*Carro*'")


Nota: Julgo que o Access usa o caracter "*" como wildcard. Se não funcionar, experimenta colocar antes o caracter "%":

CurrentDb.Execute ("UPDATE Alarmes SET Departamento ='Oficina' WHERE F5 Like '%Carro%'")

Ihihi é verdade, de volta :) tive ausente uns meses por causa pós-graduação mais outros problemas que se me meteram pelo meio que me impediu de estar a efectuar tudo mesmo tempo, mas agora vai ser dedicação ''quase total'' ao VBA, espero daqui a uns meses já saber pelo menos 10% do que sabes ;).

Nesta instrução se calhar não me fiz explicar muito bem, porque é assim,

eu quero ir percorrendo a lista linha por linha e só depois de efectuar determinados testes aos campos F1,F2,F3,F4,F5 e que sei o que escrever no campo Departamento. (o codigo que coloquei com F5 = Carro foi ilustrativo)

ou seja :) imagina que quero chegar a uma tabela com 40 linhas e escrever uma coisa diferente em cada uma das linhas do campo departamento.

> Linha 1 - testo determinados campos e apos esses testes quero escrever no campo 'Departamento' só dessa linha

> Passo linha 2

>Linha 2 - testo determinados campos e apos esses testes quero escrever no campo 'Departamento' só dessa linha

and so on ...

O problema esta na parte de escrever no campo departamento só dessa linha.


(Será que consegui me explicar :S !!?)

é que com essa instrução que sugeriste (se eu percebi), se tiver por exemplo na linha 1 e na linha 4, o campo F5 com a palavra 'Carro', ele vai-me escrever nas duas linhas(1 e 4) a palavra 'Oficina' no campo Departamento não é !!
 
Última edição:
(...)
é que com essa instrução que sugeriste (se eu percebi), se tiver por exemplo na linha 1 e na linha 4, o campo F5 com a palavra 'Carro', ele vai-me escrever nas duas linhas(1 e 4) a palavra 'Oficina' no campo Departamento não é !!
Sim, é isso. Aplica-se a todas as linhas que correspondam à condição "where".

Para processares linha-a-linha, com um recordset, podes tentar "editar" o registo corrente com:

Código:
...
If InStr(1, rst.Fields("F5"), "Carro") <> 0 Then
    MsgBox "Escrever no campo Departamento Oficina " '# está a identificar bem a string no campo F5

[B]    rst.Edit
    rst!Departamento = "Carro"
    rst.Update[/B]

End If
...
 
Sim, é isso. Aplica-se a todas as linhas que correspondam à condição "where".

Para processares linha-a-linha, com um recordset, podes tentar "editar" o registo corrente com:

Código:
...
If InStr(1, rst.Fields("F5"), "Carro") <> 0 Then
    MsgBox "Escrever no campo Departamento Oficina " '# está a identificar bem a string no campo F5

[B]    rst.Edit
    rst!Departamento = "Carro"
    rst.Update[/B]

End If
...

;) era isso mesmo ;)

:D thanks
 
Oi Blink ...

Cá venho com mais uma duvida:sh)

Estou a entar passar a minha tabela alarmes para uma folha de excel
Nome tabela: Alarmes
Nome ficheiro excel: Alarmes2.xls

Estou a usar o seguinte código

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "Alarmes", "E:\Alarmes2.xls"

Mas ele não me está a fazer nada [8b], tens ideia do que possa estar mal?
 
O código parece-me bem. Nota que esse comando cria o ficheiro, mas não o abre.
Se o ficheiro excel de destino já existir, experimenta apagá-lo. Experimenta tb gravar para outro sítio (para C: por exemplo).
Se continuar sem funcionar, experimenta trocar os seguintes parâmetros (constantes) pelos valores:

DoCmd.TransferSpreadsheet 1, 8, "Alarmes", "C:\Alarmes2.xls"
 
ahhh o problema era esse mesmo :| é que o ficheiro não pode já existir ... ou seja tenho que sempre que corro o programa mudar o nome do ficheiro.
Uma das hipoteses que estava a pensar era o nome do ficheiro conter a data no fim (dado que o programa não vai correr mais que uma vez por dia. Ou seja ficar algo do genero
Alarmes08012012.xls (isto no dia 08/01/2012).

será que é possivel fazer?
 
Oi Blink,
mais uma duvida/dificuldade :sh)

Tenho uma query e gostava que o seu filtro fosse alterando durante a execução do programa.
Ou seja, tenho uma QueryDados e mediando a variavel que me aparecer numa combox gostava que o filtro alterasse

Queria algo genero

CurrentDb.Execute ("Select * From QueryDados Where painel ='" & Combo18 & "'")

Mas este comando só funciona se for uma tabela ...como faço para uma Query?

Obrigado ajuda
 
Olá, Dave,

Depende do que pretendes....
Se o que queres é mudar a query e que esta mudança fique "gravada", podes experimentar o QueryDefs, já descrito no post #23: http://forum.autohoje.com/off-topic/97158-access-visual-basic-dor-cabeca.html#post1065808330

Se o que queres é ter um form com uma combobox (painel) e conforme vais seleccionando um "painel" vai-te mostrando os registos correspondentes na query, então a solução é teres um form+subform:
1- crias um form (form2) tipo datasheet que te mostra todos os registos da QueryDados.
2- crias mais um form (form1) vazio onde adicionas a combobox e um subform (escolhes para este subform ser o form2).
3- nas propriedades do subform colocas em "Link Child Fields" o nome do campo "painel".
4- nas propriedades do subform colocas em "Link Master Fields" o nome da combobox.
5- gravas e... voilà, tá feito.
 
Olá, Dave,

Depende do que pretendes....
Se o que queres é mudar a query e que esta mudança fique "gravada", podes experimentar o QueryDefs, já descrito no post #23: http://forum.autohoje.com/off-topic/97158-access-visual-basic-dor-cabeca.html#post1065808330

Se o que queres é ter um form com uma combobox (painel) e conforme vais seleccionando um "painel" vai-te mostrando os registos correspondentes na query, então a solução é teres um form+subform:
1- crias um form (form2) tipo datasheet que te mostra todos os registos da QueryDados.
2- crias mais um form (form1) vazio onde adicionas a combobox e um subform (escolhes para este subform ser o form2).
3- nas propriedades do subform colocas em "Link Child Fields" o nome do campo "painel".
4- nas propriedades do subform colocas em "Link Master Fields" o nome da combobox.
5- gravas e... voilà, tá feito.

Boas Blink ... Eu já tinha tentado a opção do Post #23,mas ela só tem um problema ... é que me actualiza a consulta, mas não me actualiza o subform com os novos dados da consulta .... não sei se me faço entender [8b]

coloco o

Me.SubFormAlarmes.Requery

mesmo assim nada
 
Última edição:
Se já tens um form+subform, então não uses esse processo de alterar a query.
É muito simples criares um "Master-detail" em access (form+subform).
Somente tens de indicar nas propriedades do subform quais os campos de ligação.
Tenta seguir os passos que indiquei no post anterior.
 
Se já tens um form+subform, então não uses esse processo de alterar a query.
É muito simples criares um "Master-detail" em access (form+subform).
Somente tens de indicar nas propriedades do subform quais os campos de ligação.
Tenta seguir os passos que indiquei no post anterior.


Ok ... logo noite vou tentar :)
 
Olá, Dave,

Depende do que pretendes....
Se o que queres é mudar a query e que esta mudança fique "gravada", podes experimentar o QueryDefs, já descrito no post #23: http://forum.autohoje.com/off-topic/97158-access-visual-basic-dor-cabeca.html#post1065808330

Se o que queres é ter um form com uma combobox (painel) e conforme vais seleccionando um "painel" vai-te mostrando os registos correspondentes na query, então a solução é teres um form+subform:
1- crias um form (form2) tipo datasheet que te mostra todos os registos da QueryDados.
2- crias mais um form (form1) vazio onde adicionas a combobox e um subform (escolhes para este subform ser o form2).
3- nas propriedades do subform colocas em "Link Child Fields" o nome do campo "painel".
4- nas propriedades do subform colocas em "Link Master Fields" o nome da combobox.
5- gravas e... voilà, tá feito.


Blink acho que vais ter de me explicar mais 'devagarinho' :sh)

O que é isso de Link Child/Master Fields? :sh) - Andei aqui procura e nas propriedades não vi nenhum campo com esse nome :S
 
2i6z5u.jpg


Não sei como se chamam essas propriedades no Access em português...
Neste exemplo, o "Form1" tem uma combobox e um subform ("Form2").
Nas propriedades do subform (clicando na borda) pode-se definir qual o campo "Master" (colocar o nome da combobox), e qual o campo "Child" (coloca-se o nome do campo do subform).
 

Anexos

  • 2i6z5u.jpg
    2i6z5u.jpg
    112,2KB · Visualizações: 0
2i6z5u.jpg


Não sei como se chamam essas propriedades no Access em português...
Neste exemplo, o "Form1" tem uma combobox e um subform ("Form2").
Nas propriedades do subform (clicando na borda) pode-se definir qual o campo "Master" (colocar o nome da combobox), e qual o campo "Child" (coloca-se o nome do campo do subform).

Tinha estado a investigar e encontrei a instrução

Me.Subform.Form.RecordSource = "Select * From Tebela Where Painel = '" & Combo18 & "'" , que funciona mas a

instrução que me deste já experimentei e tb funciona 100% (foi a opção escolhida :) ) apr:) apr:) e até melhor que a de VBA.

Mais uma vez obrigado [:cool:]

Já te devo estar a dever uns jantares [:D].
 
Voltar
Superior