RELACIONAMENTO ENTRE TABELAS USANDO LEFT JOIN
Boa tarde pessoal,
Estou com um problema, tenho 4 tabelas com campos relacionados. Tentei montar uma consulta no Access q me cospisse a string sql. Consegui a Seguinte string:
SELECT CadPac.*, CadProf.NomeProf, DadoApac.*, DadoCons.CidPac
FROM (CadProf LEFT JOIN (CadPac LEFT JOIN DadoApac ON CadPac.CodPac = DadoApac.CodPac) ON CadProf.CodProf = DadoApac.MedSolic) LEFT JOIN DadoCons ON (CadProf.CodProf = DadoCons.CodMed) AND (CadPac.CodPac = DadoCons.CodPac);
Mas dá o seguinte erro:
A instrução SQL não pà 'de ser executada porque contém associações externas ambÃguas. Para fazer com que uma das associações seja executada primeiro, crie uma consulta separada que execute a primeira associação e, em seguida, inclua essa consulta em sua instrução SQL. (Erro 3258)
Jah tentei, tb, a seguinte string:
"SELECT CadPac.*, [CadProf].*, DadoApac.*, [DadoCons].* From CadPac, CadProf, DadoApac, DadoCons WHERE [CadPac].[CodPac]=[DadoApac].[CodPac] And [CadProf].[CodProf]=[DadoApac].[MedSolic] And [CadPac].[CodPac]=[DadoCons].[CodPac];"
Consigo selecionar e tudo, mas quando tento dar um move next no recorset da o seguinte erro:
Operação Cancelada
O q posso fazer?!?! Preciso Selecionar estes campos pra mostrar em um form só........
Desde jah obrigado.....
Estou com um problema, tenho 4 tabelas com campos relacionados. Tentei montar uma consulta no Access q me cospisse a string sql. Consegui a Seguinte string:
SELECT CadPac.*, CadProf.NomeProf, DadoApac.*, DadoCons.CidPac
FROM (CadProf LEFT JOIN (CadPac LEFT JOIN DadoApac ON CadPac.CodPac = DadoApac.CodPac) ON CadProf.CodProf = DadoApac.MedSolic) LEFT JOIN DadoCons ON (CadProf.CodProf = DadoCons.CodMed) AND (CadPac.CodPac = DadoCons.CodPac);
Mas dá o seguinte erro:
A instrução SQL não pà 'de ser executada porque contém associações externas ambÃguas. Para fazer com que uma das associações seja executada primeiro, crie uma consulta separada que execute a primeira associação e, em seguida, inclua essa consulta em sua instrução SQL. (Erro 3258)
Jah tentei, tb, a seguinte string:
"SELECT CadPac.*, [CadProf].*, DadoApac.*, [DadoCons].* From CadPac, CadProf, DadoApac, DadoCons WHERE [CadPac].[CodPac]=[DadoApac].[CodPac] And [CadProf].[CodProf]=[DadoApac].[MedSolic] And [CadPac].[CodPac]=[DadoCons].[CodPac];"
Consigo selecionar e tudo, mas quando tento dar um move next no recorset da o seguinte erro:
Operação Cancelada
O q posso fazer?!?! Preciso Selecionar estes campos pra mostrar em um form só........
Desde jah obrigado.....
A trua instrução sql está com problemas (óbvio hehehehe)..Faz o seguinte....explica o que são estas 3 tabelas e o que vc quer fazer...e a gente faz o sql juntos.
tenta assim:
SELECT CadPac.*, CadProf.NomeProf, DadoApac.*, DadoCons.CidPac FROM CadProf
LEFT JOIN CadPac ON CadProf.CodProf = DadoApac.MedSolic
LEFT JOIN DadoApac ON CadPac.CodPac = DadoApac.CodPac
LEFT JOIN DadoCons ON (CadProf.CodProf = DadoCons.CodMed) AND (CadPac.CodPac = DadoCons.CodPac)
SELECT CadPac.*, CadProf.NomeProf, DadoApac.*, DadoCons.CidPac FROM CadProf
LEFT JOIN CadPac ON CadProf.CodProf = DadoApac.MedSolic
LEFT JOIN DadoApac ON CadPac.CodPac = DadoApac.CodPac
LEFT JOIN DadoCons ON (CadProf.CodProf = DadoCons.CodMed) AND (CadPac.CodPac = DadoCons.CodPac)
ok Laerte.
Vamos as tabela:
CadPac: Tabela que contem os dados pessoais de pacientes
CadProf: Cadastro de Profissionais
DadoApac: Dados de preenchimento de um laudo Médico
DadoCons: Dados da ultima consulta do paciente
Eu tenho um formulário q usam todas essas tabelas. Eu tenho campos relacionados em todas:
CadPac.CodPac ---> DadoApac.CodPac
CadProf.CodProf --> DadoApac.MedSolic
CadPac.CodPac ---> DadoCons.CodPac
Preciso mostrar todos estes dados neste formulário, com todos esse relacionamentos. Fiz a Consulta no Access e me deu estes resultados.
Ele mostra todos os registros....blz...quando eu monto no VB e faço consulta tudo cert, mas quando vou mover o recordset para qualquer posição ou adicionar um novo registro ele da o segundo erro q escrevi, como posso montar esta consulta pra dar certo?
Será q fui claro?
rs
Obrigado
Vamos as tabela:
CadPac: Tabela que contem os dados pessoais de pacientes
CadProf: Cadastro de Profissionais
DadoApac: Dados de preenchimento de um laudo Médico
DadoCons: Dados da ultima consulta do paciente
Eu tenho um formulário q usam todas essas tabelas. Eu tenho campos relacionados em todas:
CadPac.CodPac ---> DadoApac.CodPac
CadProf.CodProf --> DadoApac.MedSolic
CadPac.CodPac ---> DadoCons.CodPac
Preciso mostrar todos estes dados neste formulário, com todos esse relacionamentos. Fiz a Consulta no Access e me deu estes resultados.
Ele mostra todos os registros....blz...quando eu monto no VB e faço consulta tudo cert, mas quando vou mover o recordset para qualquer posição ou adicionar um novo registro ele da o segundo erro q escrevi, como posso montar esta consulta pra dar certo?
Será q fui claro?
rs
Obrigado
Valeu Eriva_br, mas não deu certo.......
Herbert..intaum a estrutura sql está dando certo ?..o problema é quando vc tenta mover o recordset. Quanto a inserir , eu não sei como vc está fazendo isso..mas vc não vai conseguir inseriri nada por este sql...a unica maneira de vc fazer isso seria se este sql fosse uma view do sql server..e ainda assim com algumas restrições. Este sql só te retorna dados e vc usa recordset...pra inserir vc tem que usar o proprio objeto ADODB.connection...
Eu pensei que o problema estivesse na estrutura sql..que é minha praia....não sei se poderei te ajudar ...mas como vc esta abrindo o recordset ?....manda o codigo pra gente..com certeza se eu não conseguir te ajudar ..alguém consegue...
Abraços
Eu pensei que o problema estivesse na estrutura sql..que é minha praia....não sei se poderei te ajudar ...mas como vc esta abrindo o recordset ?....manda o codigo pra gente..com certeza se eu não conseguir te ajudar ..alguém consegue...
Abraços
olhan o código
Private Sub Form_Load()
Set mss2 = New adodb.Recordset
mss2.Open "SELECT CadPac.*, [CadProf].*, DadoApac.*, [DadoCons].* From CadPac, CadProf, DadoApac, DadoCons WHERE [CadPac].[CodPac]=[DadoApac].[CodPac] And [CadProf].[CodProf]=[DadoApac].[MedSolic] And [CadPac].[CodPac]=[DadoCons].[CodPac];" , db
End Sub
Mas quando tento dar um mss2.MoveNext ele dá o erro
Abraços
Private Sub Form_Load()
Set mss2 = New adodb.Recordset
mss2.Open "SELECT CadPac.*, [CadProf].*, DadoApac.*, [DadoCons].* From CadPac, CadProf, DadoApac, DadoCons WHERE [CadPac].[CodPac]=[DadoApac].[CodPac] And [CadProf].[CodProf]=[DadoApac].[MedSolic] And [CadPac].[CodPac]=[DadoCons].[CodPac];" , db
End Sub
Mas quando tento dar um mss2.MoveNext ele dá o erro
Abraços
Herbert..ele te da o erro de operação cancelada ?...realmente não posso te ajudar neste caso.....mas dando uma olhadinha no sql acima....acho que ele pode até não estar te dando erro....mas acho que ele não vai te trazer os dados que vc quer, pois no inicio vc disse left joins e agora vc está usando inner joins.
WHERE [CadPac].[CodPac]=[DadoApac].[CodPac] aqui vc faz um inner join da CODPAC com a DADOAPAC - se não tiver dados na dadoapac.codpac iguais com a codpac.codpac ele não vai te trazer nada da cadpac.
And [CadProf].[CodProf]=[DadoApac].[MedSolic] aqui vc faz o inner join da CadProf com a dadoapac da mesma maneira..se não tiver dados na cadprod.codprof iguais na dadoapac.medsolic não vai te trazer nada.
And [CadPac].[CodPac]=[DadoCons].[CodPac]; e aqui a mesma coisa com a cadpac.codpac e dadoscons.codpac.....
Estou lhe dizendo isso pq no inicio da pergunta vc falava de left joins (eu estava supondo que o cadastro de pacientes tinha que ser exibido independente de haver os dados nas outras tabelas) e da maneira que está no sql acima isso não vai acontecer.
WHERE [CadPac].[CodPac]=[DadoApac].[CodPac] aqui vc faz um inner join da CODPAC com a DADOAPAC - se não tiver dados na dadoapac.codpac iguais com a codpac.codpac ele não vai te trazer nada da cadpac.
And [CadProf].[CodProf]=[DadoApac].[MedSolic] aqui vc faz o inner join da CadProf com a dadoapac da mesma maneira..se não tiver dados na cadprod.codprof iguais na dadoapac.medsolic não vai te trazer nada.
And [CadPac].[CodPac]=[DadoCons].[CodPac]; e aqui a mesma coisa com a cadpac.codpac e dadoscons.codpac.....
Estou lhe dizendo isso pq no inicio da pergunta vc falava de left joins (eu estava supondo que o cadastro de pacientes tinha que ser exibido independente de haver os dados nas outras tabelas) e da maneira que está no sql acima isso não vai acontecer.
Eu sei laerte, mas é q tentei usar essa por dica de um amigo
Tópico encerrado , respostas não são mais permitidas