Tem outra maneira de unir os tables sem usar MasterSource?
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!
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
Curtidas 0
Respostas
Emerson Nascimento
24/06/2005
faça da mesma forma que você já faz hoje, mas troque as tables por queries.
GOSTEI 0
Adriano_servitec
24/06/2005
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
Agradeço pela ajuda.
Obrigado
GOSTEI 0
Emerson Nascimento
24/06/2005
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.
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.
GOSTEI 0
Adriano_servitec
24/06/2005
Eh isso ai amigo,
Valeu ficou bem explicado agora, nao sabia que tinha esse recurso na query
Obrigado pela ajuda
Adriano...
Valeu ficou bem explicado agora, nao sabia que tinha esse recurso na query
Obrigado pela ajuda
Adriano...
GOSTEI 0
Adriano_servitec
24/06/2005
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
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
GOSTEI 0
Emerson Nascimento
24/06/2005
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í...
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í...
GOSTEI 0
Adriano_servitec
24/06/2005
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
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
GOSTEI 0
Emerson Nascimento
24/06/2005
partindo da estrutura que você passou:
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.
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.
GOSTEI 0
Emerson Nascimento
24/06/2005
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.
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.
GOSTEI 0
Adriano_servitec
24/06/2005
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
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
GOSTEI 0
Emerson Nascimento
24/06/2005
Colega, te mandei um email. Veja o que está diferente e poste aqui no fórum para compartilhar sua experiência.
GOSTEI 0
Adriano_servitec
24/06/2005
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...
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...
GOSTEI 0