Fórum Tem outra maneira de unir os tables sem usar MasterSource? #286034

24/06/2005

0

Boa tarde amigos,

Estou quase terminando um programinha feito em Delphi, graças a vcs do forum que me ajudaram, mais ainda falta um negocio que estou em duvida como fazer, bom uso o Delphi 5 e tabela paradox.

O problema eh o seguinte: Criei uma tablea de cadastro de clientes, outra de saidas e outra de entradas. Sei que no paradox se eu fizer index e usar * como chave posso ligar tabela pai/filho nos tables dos forms ai quando selecionar a empresa a tabela saida e tabela entrada que estao ligadas na tabela clientes vai me mostrar somente os cadastros da empresa selecionada, mais queria saber se posso fazer esse mesmo processo sem ter que usar index do paradox pq acho que da muito pau nas tabelas, preciso juntar o cliente nessas tabelas estou pensando em fazer com SQL ja usei o SQL para fazer o group by, so que nao sei como ou se tem jeito de fazer tambem para juntar a tabela cliente com a tabela saida e entrada.

So preciso que na tabela saida e tabela entrada, reconheça os valores lançados por cnpj do cliente. Entao preciso saber como fazer para unir essas tabelas sem precisar fazer index das tabelas e nem usar no table os comandos do indexName, MasterSource e MasterFields.

Desde ja agradeço a ajuda de todos
Obrigado...Adriano!


Adriano_servitec

Adriano_servitec

Responder

Posts

24/06/2005

Emerson Nascimento

faça da mesma forma que você já faz hoje, mas troque as tables por queries.


Responder

Gostei + 0

24/06/2005

Adriano_servitec

Desculpe amigo por nao ter entendido o que vc quis dizer com ´-Faça da mesma forma como voce faz hoje, so troque tables por querys´ nao entendi


Agradeço pela ajuda.
Obrigado


Responder

Gostei + 0

24/06/2005

Emerson Nascimento

pelo que eu entendi, vc usa tables e datasources para fazer a ligação mestre/detalhe, certo?
ao invés de tables, utilize queries.

a ligação seria assim:
query mestre:
SQL: select * from tabelamestre [where bla, bla, bla]
RequestLive: True <-- muito importante
[i:00c32e3116]obs: recomendo que você utilize os filtros na query. não abra tabelas trazendo todos os registros. utilize sempre o where.[/i:00c32e3116]

datasource mestre:
dataset: querymestre

query detalhe:
SQL: select * from tabeladetalhe where campoderelacionamento=:campoderelacionamentodatabelamestre
mastersource: datasourcemestre;
RequestLive: True <-- muito importante
[i:00c32e3116]nota: no where você tem que especificar todos os campos de ligação. os parâmetros têm que ter exatamente os mesmos nomes da tabela mestre. esses parâmetros serão preenchidos pelo mastersource.[/i:00c32e3116]

datasource detalhe:
dataset: querydetalhe

nota: o RequestLive é alterado para True para que a edição possa ser feita diretamente na query.

pronto. acho que é só isso. assim você não precisa mais de tables.


Responder

Gostei + 0

24/06/2005

Adriano_servitec

Eh isso ai amigo,

Valeu ficou bem explicado agora, nao sabia que tinha esse recurso na query

Obrigado pela ajuda
Adriano...


Responder

Gostei + 0

24/06/2005

Adriano_servitec

Ola amigo, so mais uma coisinha nao entendo nada de SQL

fiz dentro da querymestre assim pq nao funcionava de outro jeito

seclet * from tbempresa
where cnpj=cnpj //so assim funcionou a where bom quero que essa seja a ligacao da tabela mestre

na querydetalhe dentro da SQL fiz assim
select * from entrada
where cnpjempr=cnpj // nao funciona na hora de gravar ele nao aparece na dbgrid

se faço assim dentro da querydetalhe
select * from entrada
where cnpjempr=cnpjempr //grava legal e aparece na dbgrid, so que na empresa seguinte aparece os mesmos dados que fiz na empresa 1, eh como se nao tivesse ligado nada.
Outra coisa eh o mastersource nao achei ele sera que eh o mesmo de datasource que fica na querydetralhe, se for liguei ela no datasource do querymestre.

Bom amigo desculpe mais nao consegui fazer, se nao for encomodo preciso mais uma ajudinha para terminar, pois so preciso que a empresa 1 fique aparecendo na grid os dados lançados quando seleciono ela e a empresa 2 os dados que faço lançamentos nela

Agradeço pela ajuda
Adriano


Responder

Gostei + 0

24/06/2005

Emerson Nascimento

preste atenção nos exemplos que eu te passei. a ligação é feita por parâmetros que serão preenchidos automaticamente.

deveria ser algo como:

mestre:
select * from tbempresa
where
{aqui vc coloca a condição de busca da tabela principal. não tem nada a ver com o relacionamento em si}

detalhe:
select * from entrada
where cnpjempr=:cnpj
{note os dois pontos (:) isso indica que cnpj é um parâmetro. saliento que esse parâmetro DEVE ter o mesmo nome do campo de ligação da tabela principal}

quando você aponta o mastersource, o componente vai até o datasource ali apontado; vai no dataset (no caso, a tabela mestre); pega o valor do campo cnpj - que é o mesmo nome que você deu ao parâmetro (por isso tem que ter o mesmo nome); joga o valor encontrado no parâmetro da query detalhe e abre a query detalhe. isso é feito automaticamente cada vez que você altera o ponteiro de registros na query principal.

ajudei ou compliquei?

qualquer dúvida, poste aí...


Responder

Gostei + 0

24/06/2005

Adriano_servitec

Nossa ta dificil pra mim amigo

vamos la entao na tabela tbcliente no database desktop paradox esta assim
sequencia N
cnpj A 18
empresa A 50
ano A 4

na tabela entrada esta assim no database desktop paradox
Codig +
SEQUENCIA N
CNPJ A 18 // ESSA NAO TEM NADA HAVER COM O CNPJ DA TBEMPRESA
EMPRESA A 55 //TAMBEM NAO TEM NADA HAVER COM EMPRESA DA TBEMPRESA
CF A 1
CODIGO A 10
VALOR $
TAXA N
IPI $
Descricao A 25
Hrlcto T
Data D
ANO A 4 //ESSA TEM EM COMUM COM A TBEMPRESA
CNPJEMPR A 18 //ESSA TEM EM COMUM COM A TBEMPRESA

Quero fazer a ligaçao do ano e cnpjempr da querydetalhe com querymestre.

Entao montei a querymestre assim mais nao funciona
select * from tbempresa
where sequencia, cnpj, empresa, ano

nao quer aceitar as virgulas

na querydetalhe montei assim
select * from entrada
where cnpjempr=:cnpj
nao reconhece a cnpj

Nao sei aonde estou fazendo errado.
Desculpe amigo pq nao sei nada de SQL mais achei interessante
Se puder me ajudar novamente agradeço

Adriano


Responder

Gostei + 0

24/06/2005

Emerson Nascimento

partindo da estrutura que você passou:

tabela tbcliente:
sequencia N 
cnpj A 18 
empresa A 50 
ano A 4 

tabela entrada:
Codig + 
sequencia N
cnpj A 18
empresa A 55
CF A 1 
CODIGO A 10 
VALOR $ 
TAXA N 
IPI $ 
Descricao A 25 
Hrlcto T 
Data D 
ANO A 4
CNPJEMPR A 18


querymestre:
select * from tbempresa
where
{condição que não tem nada a ver com o relacionamento. note que essa informação já havia sido dada antes.}

na querydetalhe:
select * from entrada
where cnpjempr=:cnpj and ano=:ano

note que vc precisa informar na querydetalhe.datasource (e não mastersource como eu havia dito antes) o datasource mestre.


Responder

Gostei + 0

24/06/2005

Emerson Nascimento

partindo para um exemplo mais pratico, coloque a seguinte instrução na tabela mestre:

select * from tbempresa
where ano = :ano_desejado

aí, antes de abrí-la, passe o valor para o parâmetro:

querydetalhe.close;
querymestre.close;
querymestre.parambyname(´ano_desejado´).asstring := ´2005´; // ou algum ano válido
querymestre.open;
querydetalhe.open;

a query detalhe fica da forma que havia sido passada. aquela instrução não deve ser alterada, a menos que seja alterada a condição de relacionamento.


Responder

Gostei + 0

24/06/2005

Adriano_servitec

So uma coisinha amigo, vc esta colocando esses comando dentro da query/propriedades/SQL?


Nao sei pq da erro no meu, fiz do jeito que tu me passou e nao funciona
na query2 da erro de cnpj, quando tento colocar o query active=TRUE

o erro eh esse
QUERY2 FIELD ´CNPJ´ IS OF AN UNKNOW TYPE


Responder

Gostei + 0

24/06/2005

Emerson Nascimento

Colega, te mandei um email. Veja o que está diferente e poste aqui no fórum para compartilhar sua experiência.


Responder

Gostei + 0

25/06/2005

Adriano_servitec

Ola Emerson Blz, agora sim funcionou, acho que estava faltando o DATABASE, nao tinha colocado, o resto estava do jeito que vc me passou.

Bom mais ainda estou com um problema, esse form que recebe na tabela entrada tenho 3 dbgrids ligadas em 3 querys

na query1 esta o exemplo que vc me passou //funcionando perfeitamente
no SQL
select * from entrada where cnpjempr=:cnpjempr and ano:=ano
ligada o datasource da query na form17 aonde seleciono a empresa.

Obs mudei cnpj para cnpjempr pq na tabela entrada ja tenho cnpj que nao eh o mesmo das empresa cadastradas.

agora nos 2 querys fiz assim
query2 ele tem que somar os valores quando lanço cnpj igual caso contrario inclui uma nova linha
SQL
select cnpj, sum(valor), sum(ipi) from entrada
where cnpjempr=:cnpjempr and ano=:ano
group by cnpj

query3
SQL
select cf, sum(valor), sum(ipi) from entrada
where cnpjempr=:cnpjempr and ano=:ano
group by cf

Bom nesse caso se eu ligar o query ao datasource da query1 nao funciona fica em branco na dbgrid se eu ligar na form17 aonde esta as empresas cadastradas nao aparece o lançamento no dbgrid

Se eu nao usar o where nas query2 e query3, os valores ficam de todas empresas que fiz o mestre/detalhe

Sera que fui claro na duvida?
Bom desde ja agradeço pela ajuda amigo
E obrigado por ter feito aquele programinha para me ajudar

Abraços Adriano...


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar