QUERY FUNCIONA NO ACCESS MAS NO VB 6.0 NAO

MARCOSREZENDE 20/03/2012 15:58:25
#397692
Boa tarde a todos, sou novo por aqui, fiquei sabendo deste forum através de amigos meus, o meu problema é o seguinte, estou criando uma instrução SQL no Access que é a seguinte:

TRANSFORM MIN(Notas.nota) As Nota
SELECT Alunos.Cod_aluno, Alunos.Nome_aluno
FROM Alunos INNER JOIN (Materias INNER JOIN Notas ON Materias.Cod_Materia = Notas.Cod_Materia) ON Alunos.Cod_aluno = Notas.Cod_aluno
GROUP BY Alunos.Nome_aluno, Alunos.Cod_aluno
PIVOT Materias.Descricao

Isto se faz baseando-se nestas três tabelas:

Tabela Alunos:

COD_ALUNO NOME_ALUNO

001 AAAAAA

002 BBBBBBB

Tabela Materias:

COD_MATERIA DESCRICAO

01 PORTUGUÊS

02 MATEMÁTICA

03 GEOGRAFIA

Tabela Notas:

COD_ALUNO COD_MATERIA NOTA

001 01 7

001 02 8

002 02 6

002 03 5

A instrução SQL acima é para realizar uma REFRÊNCIA CRUZADA onde que a junção dessas três tabelas criaria um consulta que ficaria da seguinte maneira:

COD_ALUNO NOME_ALUNO DESCRICAO NOTA

001 AAAAAA PORTUGUÊS 7

001 AAAAAA MATEMATICA 8

e assim por diante.

POIS BEM, no Access funciona legal, porém quando eu tento executar a mesma ação no VB 6.0 ele dé o seguinte erro:
[Ô]Erro de sintaxe na clausula From[Ô]

Vi e Re-vi a instrução acima, mas não consigo encontrar o problema, alguém poderia me auxiliar? Aforma de se montar uma SQL no ACCESS se difere no VB ????

Grato pela atenção


Marcos.






KERPLUNK 20/03/2012 16:25:48
#397697
O que você está querendo fazer é uma tabela Pivot. No access isso é bem simples de ser feito e é exatamente como você está fazendo. Quando se trata de uma conexão ADO ou mesmo DAO, as tabelas pivot não podem mais ser utilizadas. O mais próximo disso são os DataShapes, que são bem complexos de se trabalhar.
O melhor para seu caso é fazer as seleções uma à uma...
MARCOSREZENDE 20/03/2012 16:30:07
#397701
KERLUNK muito obrigado pelo pronto atendimento.
Você teria como postar um exemplo (pode ser bem pequeno, com 2 tabelas apenas), para eu ver se eu consigo adapta-las as minhas condições?


Marcos
KERPLUNK 20/03/2012 16:33:46
#397703
Exemplo de DataShape, ou de como fazer a mesma coisa com vários selects?
MARCELO.TREZE 20/03/2012 17:04:56
#397710
posta seu códiog no vb pra gente ver

LLAIA 20/03/2012 17:17:54
#397714
Erro na cláusula FROM? Acredito que vc esteja concatenando mal a sua string SQL. Vc poderia colar aqui no fórum o código no VB da SQL aplicada nos data objects que vc está usando.
MARCOSREZENDE 21/03/2012 07:19:20
#397769
Pessoal, o fonte está logo abaixo:

Option Explicit
DefInt A-Z

Public vgSituacao As Integer [ô]situação de edição que do módulo
Public vgCaracteristica As Integer [ô]caracteristica do módulo
Public vgTipo As Integer [ô]tipo do módulo
Public vgPriVez As Integer [ô]flag de carregamento do módulo
Public vgFormID As Long [ô]identificador único para o módulo
Public vgIdentTab As String [ô]nome da tabela principal do módulo
Public vgEmBrowse As Integer [ô]flag se o módulo esta em grade
Public vgTemFiltro As Integer [ô]flag se tem ou não filtro no módulo
Public vgFiltroInicial As String [ô]filtro inicial do módulo
Public vgOrdemInicial As String [ô]ordem inicial do módulo
Public vgCancelou As Integer [ô]flag cancela ou nao o processo do módulo
Public vgQueryAtual As String [ô]expressão SQL definada para o módulo

Public vgUltimoFiltro As String [ô]último filtro definido no módulo
Public vgUltimaOrdem As String [ô]última ordenação feita no módulo
Public vgUltimoFiltroComTit As String [ô]titulo do último filtro definido no módulo
Public vgUltimaOrdemComTit As String [ô]titulo da última ordenação feita no módulo
Public vgSQL As String [ô]expressão SQL que define o módulo
Public vgFP As New frmPreview [ô]formuário de preview do relatório
Public vgTooltips As New cTooltips [ô]classe de ajuda para os controes do módulo
Public vgFG As frmGauge [ô]formulário do gauge
Public vgQReg As Long [ô]quantidade de já feira para o gauge

Dim txtCampo(3) As New FormataCampos [ô]classe dos compos tipo texto do módulo
Dim Cmes As Integer, Cano As Integer, Vc_inicial As String
Dim Vc_final As String

[ô]inicializa variaveis (apelidos) coms os campos correspondentes
Private Sub InicializaApelidos(vgComOQue As Integer)
On Error Resume Next [ô]prepara para possíveis erros
Cmes = txtCampo(0).Value
Cano = txtCampo(1).Value
Vc_inicial = txtCampo(2).Value
Vc_final = txtCampo(3).Value
If Err Then Err.Clear [ô]se deu algum erro, vamos resetá-lo
End Sub

[ô]executa processos/validacoes nos campos do formuário
Public Function Executar(vgOq As String) As String
Dim vgMsg As String, vgOk As Integer, vgNVez As Integer
On Error GoTo DeuErro [ô]fica na espera de um erro...
vgMsg$ = [Ô][Ô] [ô]retorna uma msg dizendo o motivo
vgOk = True [ô]se a validação esta OK
vgNVez = 0 [ô]porque não fez o processo/validacoes
If vgOq = INICIALIZACOES Then
ElseIf vgOq = INI_APELIDOS Then
InicializaApelidos COM_REGISTRO
End If
Executar = vgMsg$ [ô]prepara saida da função
Exit Function [ô]e cai fora...

DeuErro:
Select Case Err [ô]vamos verificar se deu algum erro
Case 3197 [ô]registro acabou de ser alterado por outro usuário
Resume
Case 3046, 3158, 3186, 3187, 3188, 3189, 3218, 3260
vgNVez = vgNVez + 1 [ô]outro usuário acessando
If vgNVez <= 10 Then [ô]vamos tentar 10 vezes
Delay 0.5 [ô]mais antes espera 1/2 segundo
Resume [ô]antes de tentar
End If
End Select
Executar = Err.Source + [Ô]|[Ô] + Trim$(Str$(Err)) + [Ô]|[Ô] + Error$ [ô]não teve jeito o erro não pode ser evitado...
End Function

[ô]evento - quando o conteúdo do campo for alterado
Private Sub txtCp_Change(Index As Integer)
If vgPriVez Or txtCampo(Index).PriVez Then Exit Sub
InicializaApelidos COM_TEXTBOX [ô]inicializa apelidos com o que esta sendo digitado
txtCampo(Index).Change
End Sub

[ô]evento - quando o campo receber o foco
Private Sub txtCp_GotFocus(Index As Integer)
txtCampo(Index).GotFocus
End Sub


[ô]evento - quando qq tecla for digitada no campo
Private Sub txtCp_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)
txtCampo(Index).KeyDown KeyCode, Shift
End Sub

[ô]evento - quando qq tecla for digitada no campo
Private Sub txtCp_KeyPress(Index As Integer, KeyAscii As Integer)
txtCampo(Index).KeyPress KeyAscii
End Sub

[ô]evento - quando o campo perder o foco
Private Sub txtCp_LostFocus(Index As Integer)
txtCampo(Index).LostFocus [ô]executa LostFocus na classe
End Sub


[ô]evento - inicialização do formulário
Private Sub Form_Load()
On Error GoTo DeuErro
Screen.MousePointer = vbHourglass
Caption = LoadGasString(33700)
vgFormID = 884
vgIdentTab = [Ô][Ô]
vgPriVez = True
vgTipo = TP_COMUM
vgCaracteristica = F_COMUM
vgTemFiltro = False
vgSituacao = ACAO_NAVEGANDO
Set botOk.Picture = LoadPicture(LoadGasPicture(500))
Set botCancela.Picture = LoadPicture(LoadGasPicture(520))
DefineControles
vgTooltips.Create
Label(0).Caption = LoadGasString(33705)
Label(1).Caption = LoadGasString(33706)
Label(2).Caption = LoadGasString(33707)
Label(3).Caption = LoadGasString(33708)
vgTooltips.AddTool botOk, 0, LoadGasString(33709)
vgTooltips.AddTool botCancela, 0, LoadGasString(33710)
AjustaTamanho Me
Executar INICIALIZACOES
InicializaApelidos COM_TEXTBOX
Screen.MousePointer = vbDefault
vgPriVez = False
Exit Sub

DeuErro:
CErr.NumErro = Err
CErr.FunctionName = [Ô]Form_Load[Ô]
CErr.Origem = CStr(vgFormID) + [Ô] - [Ô] + Me.Caption
CErr.Show
End Sub


[ô]evento - quando o formulário receber o foco
Private Sub Form_Activate()
AtivaForm Me
End Sub

[ô]evento - redefinido o tamanho do formulário
Private Sub Form_Resize()
AjustaPanFundo Me
End Sub

[ô]define as propriedades das classe dos campos do formuário
Public Sub DefineControles()
On Error GoTo DeuErro

Set txtCampo(0).CtPri = txtCp(0)
txtCampo(0).DataType = 1
txtCampo(0).Mask = [Ô]99[Ô]
txtCampo(0).BoundColumn = [Ô][Ô]
txtCampo(0).ListFields = [Ô][Ô]
txtCampo(0).OrderFields = [Ô][Ô]
txtCampo(0).Relation = [Ô][Ô]
txtCampo(0).Source = [Ô][Ô]

Set txtCampo(1).CtPri = txtCp(1)
txtCampo(1).DataType = 1
txtCampo(1).Mask = [Ô]9999[Ô]
txtCampo(1).BoundColumn = [Ô][Ô]
txtCampo(1).ListFields = [Ô][Ô]
txtCampo(1).OrderFields = [Ô][Ô]
txtCampo(1).Relation = [Ô][Ô]
txtCampo(1).Source = [Ô][Ô]

Set txtCampo(2).CtPri = txtCp(2)
txtCampo(2).DataType = 0
txtCampo(2).Mask = [Ô]9999[Ô]
txtCampo(2).StuffChar = [Ô]0[Ô]
txtCampo(2).BoundColumn = [Ô][Ô]
txtCampo(2).ListFields = [Ô][Ô]
txtCampo(2).OrderFields = [Ô][Ô]
txtCampo(2).Relation = [Ô][Ô]
txtCampo(2).Source = [Ô][Ô]

Set txtCampo(3).CtPri = txtCp(3)
txtCampo(3).DataType = 0
txtCampo(3).Mask = [Ô]9999[Ô]
txtCampo(3).StuffChar = [Ô]0[Ô]
txtCampo(3).BoundColumn = [Ô][Ô]
txtCampo(3).ListFields = [Ô][Ô]
txtCampo(3).OrderFields = [Ô][Ô]
txtCampo(3).Relation = [Ô][Ô]
txtCampo(3).Source = [Ô][Ô]

Exit Sub

DeuErro:
CErr.NumErro = Err
CErr.FunctionName = [Ô]DefineControles0[Ô]
CErr.Origem = CStr(vgFormID) + [Ô] - [Ô] + Me.Caption
CErr.Show
End Sub

[ô]evento - valida digitações e prossegue a execução
Private Sub botOk_Click()
Dim k As String, vgFGrid As New frmBrowse
If vgPriVez Then Exit Sub
vgPriVez = True
k$ = Executar(VALIDACOES) [ô]faz validaçao dos campos
If Len(k$) > 0 Then [ô]EPA!... tem campo errado
If InStr(k$, [Ô]|[Ô]) > 0 Then
Err.Source = Parse$(k$, [Ô]|[Ô])
Err.Number = Val(Parse$(k$, [Ô]|[Ô])) [ô]deu erro
Err.Description = Parse$(k$, [Ô]|[Ô])
CErr.NumErro = Err.Number
CErr.Show
Else
Beep [ô]manda aviso sonoro
MsgBox k$, vbCritical, vgAtencao$ [ô]mostra mensagem do erro
End If
Screen.MousePointer = vbDefault [ô]reseta o pointer do mouse
vgPriVez = False
Exit Sub [ô]e sai para continuar a ediçao ou inclusao
End If [ô]OK. os campos estao certos
Screen.MousePointer = vbHourglass [ô]mouse = ampulheta
vgFGrid.vgTitConsulta = LoadGasString(33700)
vgFGrid.vgFromFormID = 884
vgNovaQuery$ = [Ô]SELECT Funcionários.Código, Funcionários.Nome, Cred_desc.Data [Ô] + _
[Ô]FROM Funcionários INNER JOIN (Convênios INNER JOIN Cred_desc ON Convênios.[Código convênio] = Cred_desc.[Código convênio]) ON Funcionários.[Código] = [Ô] + _
[Ô]Cred_desc.[Código funcionário] [Ô] + _
[Ô]GROUP BY Funcionários.Nome, Funcionários.Código, Cred_desc.Data PIVOT Convênios.Descrição[Ô]
vgFGrid.vgFiltroInicial = [Ô][Ô]
Unload Me
vgFGrid.grdBrowse.Move 0, 0 [ô]descarrega este form
vgFGrid.Show [ô]mostra na grade
Screen.MousePointer = vbDefault [ô]cursor do mouse = default
vgPriVez = False
End Sub

[ô]evento - cancela formulário
Private Sub botCancela_Click()
Unload Me
End Sub

[ô]evento - descarregando o formulário da memória
Private Sub Form_Unload(Cancel As Integer)
Dim i As Integer
On Error Resume Next
FinalizaForm Me
For i = 0 To UBound(txtCampo)
txtCampo(i).Finalize
Set txtCampo(i) = Nothing
Next
Set vgFG = Nothing
Set vgTooltips = Nothing
Set frmFrm00884 = Nothing [ô]libera o segmento de código do form
End Sub

[ô]evento - quando qq tecla for digitada no formulário
Private Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyEscape Then [ô]se teclou ESC
Unload Me [ô]tira este form da memória
End If
End Sub


[ô]evento - quando o mouse for
ROBIU 21/03/2012 08:10:48
#397772
Resposta escolhida
[txt-color=#e80000]Obs: Não coloque acentos, caracteres especiais ou espaços em nome de campos de sua tabela.[/txt-color]
Use a própria consulta do Access, sem filtros, no select vb6 como você faz com as tabelas. Por exemplo, Se a tabela Pivot no Access for [Ô]ConsMedia[Ô], você faz um select assim:

Select * From ConsMedia Where Cod_Aluno=[ô][Ô] & Txt1.Text & [Ô][ô][Ô]



MARCELO.TREZE 21/03/2012 08:56:46
#397780
A primeira query trata de uma tabela e a 2 de outra tabela, qual seria a certa

porém baseado no seu primeiro código, seria assim

sSQL = [Ô]SELECT A.Cod_Aluno, A.Nome_aluno, M.Cod_materias, M.Descricao, N.Cod_aluno, N.Cod_materia, N.Notas [Ô] & _
[Ô]FROM alunos A INNER JOIN (Notas N INNER JOIN Materias M ON N.Cod_materias = M.Cod_materias) ON A.Cod_aluno = N.Cod_aluno [Ô] & _
[Ô]ORDER BY A.Cod_aluno, A.Nome_aluno, M.Descriao, N.notas[Ô]


repare que não usei group by, pois não vi necessidade do mesmo.



MARCOSREZENDE 21/03/2012 09:09:28
#397785
Marcelo e demais colegas, a primeira query no topo do post, foi um exemplo um pouco mais simples. A minha query na verdade é composta também por 3 tabelas, são elas:

TABELA CONVÊNIOS
CAMPOS:
- Código Convênio
- Descrição
- Tipo

TABELA CRED_DESC
CAMPOS:
- Código Convênio
- Mês
- Ano
- Código funcionário
- Data
- Valor
- Nome

TABELA FUNCIONÁRIOS
CAMPOS:
- Código
- Nome
(DEMAIS CAMPOS)



Desculpem por não ter me espressado direito.
MARCELO.TREZE 21/03/2012 09:24:58
#397790
tenta fazer sua query do jeito que expliquei acima

Página 1 de 3 [22 registro(s)]
Tópico encerrado , respostas não são mais permitidas