ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Duvida exportar para Excel.

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17338

MensagemEnviada: Seg Ago 26, 2019 3:48 pm    Assunto: Duvida exportar para Excel. Responder com Citação

Tenho um mestre/detalhe.
Pai - contato 1
Filho - comunicacao N tenho vários cadastros.

Preciso ver se tem como exportar os dados desta tabela COMUNICACAO, junto com a tabela pai em varias células do Excel, em apenas uma linha.
_________________
Quer uma bateria musical profissional completa em seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.hhopdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 8913
Localização: Sinop-MT

MensagemEnviada: Ter Ago 27, 2019 11:48 am    Assunto: Responder com Citação

faz um join nas tabelas
_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17338

MensagemEnviada: Ter Ago 27, 2019 1:24 pm    Assunto: Responder com Citação

joemil escreveu:
faz um join nas tabelas


Mais eu preciso criar colunas. Não um em baixo do outro?

Exemplo
Tabela contato
Código:
1 Adriano
2 Delphi


Tabela comunicacao
Código:
id - idcontato - descricao
1--------1-------101010
2--------1-------202020
3--------1-------303030
4--------2-------505050


No excel
linha1
Código:
col1---col2--------col3-------col4-------col5
1-----adriano----101010---202020---303030
2-----delphi------505050


Tem como?
_________________
Quer uma bateria musical profissional completa em seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.hhopdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17338

MensagemEnviada: Ter Ago 27, 2019 4:16 pm    Assunto: Responder com Citação

Pra mim pode ser até uma Stored Procedure se for possível em Firebird 2.5
_________________
Quer uma bateria musical profissional completa em seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.hhopdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11312

MensagemEnviada: Ter Ago 27, 2019 8:50 pm    Assunto: Responder com Citação

Boa noite,

Talvez a função de agregação List do Firebird possa ser útil no seu caso:

Código:
select
    ct.IdContato,
    ct.Nome,
    list(cm.Descricao, ';') as Descricao
from Contato as ct
inner join Comunicaocao as cm
    on cm.IdContato = ct.IdContato
group by
    ct.IdContato,
    ct.Nome


Dessa forma os valores do campo Descricao vão retornar separados por ';' dentro do mesmo campo. Depois você pode pegar esse campo e separar os valores para gerar a planilha ou talvez gerar um arquivo do tipo csv e deixar com que a importação no Excel faça a separação dos valores.

Espero que ajude

_________________
Assinatura: https://www.imoveisemexposicao.com.br/imoveis-venda-guarulhos-residencial-apartamento
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17338

MensagemEnviada: Qua Ago 28, 2019 9:44 am    Assunto: Responder com Citação

Então Imex, ao executar da forma que estou querendo gera duplicidade dos campos na list
Veja só o select
Código:

select
    ct.IdContato,
    ct.Nome,
    list(cp.numerobeneficio, ';') as NumeroBeneficio,
    list(cp.valorbeneficio, ';') as ValorBeneficio,
    list(cm.valor, ';') as DescricaoTelefone
from Contato as ct
/* Incluir listas */
left join complementar as cp
    on cp.contato_idcontato = ct.idcontato
left join Comunicacao as cm
    on cm.contato_idcontato = ct.IdContato
group by
    ct.IdContato,
    ct.Nome
order by
    NumeroBeneficio desc, ValorBeneficio desc, DescricaoTelefone desc
   


Olhe a imagem duplicando as listas

Isso devido ao fato de estar usando mais de uma tabela no join

Tabela complementar


Tabela comunicacao

_________________
Quer uma bateria musical profissional completa em seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.hhopdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11312

MensagemEnviada: Qua Ago 28, 2019 11:06 am    Assunto: Responder com Citação

Acho que isso está ocorrendo porque são 2 Joins de 1:N.
Como só está sendo utilizado um campo da tabela Comunicacao, acho que uma alternativa seria utilizar uma subquery:

Código:
select
    ct.IdContato,
    ct.Nome,
    list(cp.numerobeneficio, ';') as NumeroBeneficio,
    list(cp.valorbeneficio, ';') as ValorBeneficio,
    (select list(cm.valor, ';') from Comunicacao as cm
     where cm.contato_idcontato = ct.IdContato) as DescricaoTelefone
from Contato as ct
/* Incluir listas */
left join complementar as cp
    on cp.contato_idcontato = ct.idcontato
group by
    ct.IdContato,
    ct.Nome
order by
    NumeroBeneficio desc, ValorBeneficio desc, DescricaoTelefone desc


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17338

MensagemEnviada: Qua Ago 28, 2019 1:34 pm    Assunto: Responder com Citação

Se eu tiver mais outras tabelas vou ter que ficar fazendo subselects?

Exemplo assim funcionou
Código:
select
    ct.IdContato||';' as idcontato,
    ct.Nome||';' as nome,
    --list(trim(cm.valor), ';')||';' as DescricaoTelefone,
    (select list(cm.valor, ';')||';'
      from Comunicacao as cm
        where cm.contato_idcontato = ct.IdContato
        and cm.valor <> '') as DescricaoTelefone,

     /*
      ( select
         list(trim(cp.numerobeneficio), ';'),
         list(trim(cp.valorbeneficio), ';')||';'
       from complementar cp
         where cp.contato_idcontato = ct.IdContato) as Complementos
         */

    ( select
         list(trim(cp.numerobeneficio), ';')||';'
       from complementar cp
         where cp.contato_idcontato = ct.IdContato
         and cp.numerobeneficio > 0) as numerobeneficio,

    ( select
         list(trim(cp.valorbeneficio), ';')||';'
       from complementar cp
         where cp.contato_idcontato = ct.IdContato
         and cp.valorbeneficio > 0) as valorbeneficio,

     list(trim(em.contrato), ';')||';' as Contrato,
     list(trim(em.valor), ';')||';' as Valor

from Contato as ct

left join emprestimo em on em.contato_idcontato = ct.IdContato

  --- só pra teste o where
 -- where ct.idcontato = 443680


group by
    ct.IdContato,
    ct.Nome
order by
    DescricaoTelefone desc


Porém minha duvida aqui é se eu tiver 10 campos nesta tabela terei que fazer 10 subselects?
Código:
  ( select
         list(trim(cp.numerobeneficio), ';')||';'
       from complementar cp
         where cp.contato_idcontato = ct.IdContato
         and cp.numerobeneficio > 0) as numerobeneficio,

    ( select
         list(trim(cp.valorbeneficio), ';')||';'
       from complementar cp
         where cp.contato_idcontato = ct.IdContato
         and cp.valorbeneficio > 0) as valorbeneficio,


Esta concat ai é só pra ver se mando csv, ainda ta em teste.
_________________
Quer uma bateria musical profissional completa em seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.hhopdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11312

MensagemEnviada: Qua Ago 28, 2019 2:24 pm    Assunto: Responder com Citação

Acho que uma alternativa para quando for mais de um campo é utilizar uma CTE para fazer o Join separadamente. Segue um exemplo considerando a query inicial:

Código:
with
    CTE_CP as
    (
        select
            ct.IdContato,
            ct.Nome,
            list(cp.numerobeneficio, ';') as NumeroBeneficio,
            list(cp.valorbeneficio, ';') as ValorBeneficio,
        from Contato as ct
        left join complementar as cp
            on cp.contato_idcontato = ct.idcontato
        group by
            ct.IdContato,
            ct.Nome
    ),

    CTE_CM as
    (
        select
            ct.*,
            list(cm.valor, ';') as DescricaoTelefone
        from CTE_CP as ct
        left join Comunicacao as cm
            on cm.contato_idcontato = ct.IdContato
        group by
            ct.IdContato,
            ct.Nome
    )

select
    *
from CTE_CM
order by
    NumeroBeneficio desc, ValorBeneficio desc, DescricaoTelefone desc


A segunda CTE do exemplo acima não seria necessária pois o Join poderia ser feito no último Select, fora a opção da subquery, mas deixei dessa forma para demonstrar como ficaria a estrutura no caso de ter Join com várias tabelas diferentes.

Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17338

MensagemEnviada: Qua Ago 28, 2019 3:22 pm    Assunto: Responder com Citação

imex escreveu:
Acho que uma alternativa para quando for mais de um campo é utilizar uma CTE para fazer o Join separadamente. Segue um exemplo considerando a query inicial:

Código:
with
    CTE_CP as
    (
        select
            ct.IdContato,
            ct.Nome,
            list(cp.numerobeneficio, ';') as NumeroBeneficio,
            list(cp.valorbeneficio, ';') as ValorBeneficio,
        from Contato as ct
        left join complementar as cp
            on cp.contato_idcontato = ct.idcontato
        group by
            ct.IdContato,
            ct.Nome
    ),

    CTE_CM as
    (
        select
            ct.*,
            list(cm.valor, ';') as DescricaoTelefone
        from CTE_CP as ct
        left join Comunicacao as cm
            on cm.contato_idcontato = ct.IdContato
        group by
            ct.IdContato,
            ct.Nome
    )

select
    *
from CTE_CM
order by
    NumeroBeneficio desc, ValorBeneficio desc, DescricaoTelefone desc


A segunda CTE do exemplo acima não seria necessária pois o Join poderia ser feito no último Select, fora a opção da subquery, mas deixei dessa forma para demonstrar como ficaria a estrutura no caso de ter Join com várias tabelas diferentes.

Espero que ajude
Olá Imex, não entendi este sleect porque o mesmo não executa.

Ta com erro de sintaxe, ai arrumei este group by
Código:
select
            ct.*,
            list(cm.valor, ';') as DescricaoTelefone
        from CTE_CP as ct
        left join Comunicacao as cm
            on cm.contato_idcontato = ct.IdContato
        group by
            ct.IdContato,
            ct.Nome


Mais ai não pega o outro select
from CTE_CP
_________________
Quer uma bateria musical profissional completa em seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.hhopdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11312

MensagemEnviada: Qua Ago 28, 2019 4:27 pm    Assunto: Responder com Citação

A query ficou dessa forma?

Código:
with
    CTE_CP as
    (
        select
            ct.IdContato,
            ct.Nome,
            list(cp.numerobeneficio, ';') as NumeroBeneficio,
            list(cp.valorbeneficio, ';') as ValorBeneficio,
        from Contato as ct
        left join complementar as cp
            on cp.contato_idcontato = ct.idcontato
        group by
            ct.IdContato,
            ct.Nome
    ),

    CTE_CM as
    (
        select
            ct.*,
            list(cm.valor, ';') as DescricaoTelefone
        from CTE_CP as ct
        left join Comunicacao as cm
            on cm.contato_idcontato = ct.IdContato
        group by
            ct.IdContato,
            ct.Nome,
            ct.NumeroBeneficio,
            ct.ValorBeneficio
    )

select
    *
from CTE_CM
order by
    NumeroBeneficio desc, ValorBeneficio desc, DescricaoTelefone desc


Qual mensagem de erro é exibida? E em qual linha?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17338

MensagemEnviada: Qua Ago 28, 2019 4:45 pm    Assunto: Responder com Citação

imex escreveu:
A query ficou dessa forma?

Código:
with
    CTE_CP as
    (
        select
            ct.IdContato,
            ct.Nome,
            list(cp.numerobeneficio, ';') as NumeroBeneficio,
            list(cp.valorbeneficio, ';') as ValorBeneficio,
        from Contato as ct
        left join complementar as cp
            on cp.contato_idcontato = ct.idcontato
        group by
            ct.IdContato,
            ct.Nome
    ),

    CTE_CM as
    (
        select
            ct.*,
            list(cm.valor, ';') as DescricaoTelefone
        from CTE_CP as ct
        left join Comunicacao as cm
            on cm.contato_idcontato = ct.IdContato
        group by
            ct.IdContato,
            ct.Nome,
            ct.NumeroBeneficio,
            ct.ValorBeneficio
    )

select
    *
from CTE_CM
order by
    NumeroBeneficio desc, ValorBeneficio desc, DescricaoTelefone desc


Qual mensagem de erro é exibida? E em qual linha?


Opa, assim deu certo Imex.

Somente precisou retirar a virgula final aqui
Código:
list(cp.valorbeneficio, ';') as ValorBeneficio,

Obrigado.
_________________
Quer uma bateria musical profissional completa em seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.hhopdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB