Boa tarde,
Preciso de uma ajuda com um processo que desejamos implementar aqui na empresa aonde trabalho. Há algum tempo me foi pedido para criar um relatório ao qual iria trazer uma quantidade muito grande de informações. Este mesmo relatório deveria ficar adequado para ser importado no Excel. Depois de algumas tentativas frustradas, consegui cria-lo e para isso tive que desenvolver uma Procedure dentro do banco.
Até ai tudo bem, só que agora eles pediram não mais para separar por ponto e virgula e sim usar uma especie de tabulação, igual a que usamos no word mesmo.
Estou anexando um exemplo de como o relatorio deve ficar, notem o alinhamento das informações. É exatamente assim que devo deixar o relatório atual.
Atualmente esta procedure faz uma busca com um Select, atribui em variaveis atraves do Fetch e em seguida concatena todas as informaçoes em uma variavel do tipo varchar2(3000), Segue abaixo a concatenação:
"@vDescricao" := '2' || ';' || "@vEntCod" || ';' || "@vEntNome" || ';' || "@vCNPJ" || ';' || "@vEntLograd" || ' ' || "@vEntEnder" || ' ' ||
"@vEntNro" || ' ' || "@vEntBairro" || ';' || "@vNomeCidade" || ';' || "@vEstado" || ';' || "@vEntCep" || ';' ||
"@vFoneEntidade" || ';' || "@vCodAltProduto" || ';' || "@vQtdItemNf" || ';' || "@vUnitVendaPosNet" || ';' ||
"@vTotVendaPosNet" || ';' || "@vEntCod" || ';' || "@vEntNome" || ';' || "@vCNPJ" || ';' || "@vEntLograd"
|| ' ' || "@vEntEnder" || ' ' || "@vEntNro" || ' ' || "@vEntBairro" || ';' || "@vNomeCidade" || ';' ||
"@vEstado" || ';' || "@vEntCep" || ';' || "@vFoneEntidade" || ';' || "@vNFExib" || ';' || "@vNFDataEmisExib"
|| ';' || "@vNFDevExib" || ';' || "@vNFDataDevExib" || ';' || "@vPedEnt" || ';' || "@vDataPedEnt" || ';' || "@vPedVendaNum" || ';' || "@vDataPedVenda"
|| ';' || '' || ';' || '' || ';' || "@vClassEntCod" || ';' || "@vCustoUnitPos" || ';' || "@vCustoTotPos" || ';' || "@vCNPJ" || ';' ||
"@vEntNome" || ';' || '' || ';' || "@vNomeVendedor" || ';' || "@vDataSolic" || ';' || "@vDataPedProm" || ';' ||
"@vNumShortForm" || ';' || "@vTipoVenda" || ';' || "@vFlagEstrutura";
Fico no aguardo de alguma resposta.
Att,
Luiz H. Pedrinho
Tabulação
-
- Rank: Estagiário Sênior
- Mensagens: 9
- Registrado em: Qua, 16 Nov 2011 10:01 am
- Anexos
-
- Exemplo de tabulação.rar
- Exemplo do Arquivo como deve ficar o alinhamento de tabulação no Oracle.
- (101.54 KiB) Baixado 357 vezes
- fsitja
- Rank: OraSauro
- Mensagens: 611
- Registrado em: Seg, 19 Jan 2009 4:29 pm
- Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
Acho que uma boa alternativa para resolver isso seria através da função XMLQUERY. Ela pode fazer um "loop" no seu SELECT e retornar as linhas no formato esperado, de forma bastante eficiente, como um CLOB (que não tem limitação de tamanho como o VARCHAR2.
Se precisar de alguma ajuda mais específica, veja se consegue postar suas tabelas, com a estrutura simplificada e alguns dados de exemplo só para ilustrar o resultado que você espera. Assim fica mais fácil de ajudar, já podemos testar algo mais concreto.
Se precisar de alguma ajuda mais específica, veja se consegue postar suas tabelas, com a estrutura simplificada e alguns dados de exemplo só para ilustrar o resultado que você espera. Assim fica mais fácil de ajudar, já podemos testar algo mais concreto.
-
- Moderador
- Mensagens: 641
- Registrado em: Seg, 03 Set 2007 3:26 pm
- Localização: Fortaleza - CE
att,
Daniel N.N.
Daniel N.N.
Opa,
usar tabulação é simples. Basta usar a função CHR(09) (tabulação horizontal). O número segue a tabela ascii.
Porém, acredito que o seu problema você não resolva apenas com tabulação. É um layout com posições demarcadas para informações. Terá que controlar as posições para inserir os dados, colocar espaços onde for necessário e "truncar" também.
usar tabulação é simples. Basta usar a função CHR(09) (tabulação horizontal). O número segue a tabela ascii.
Porém, acredito que o seu problema você não resolva apenas com tabulação. É um layout com posições demarcadas para informações. Terá que controlar as posições para inserir os dados, colocar espaços onde for necessário e "truncar" também.
-
- Rank: Estagiário Sênior
- Mensagens: 9
- Registrado em: Qua, 16 Nov 2011 10:01 am
Daniel, é exatamente isso que eu preciso, você matou o problema com sua resposta. Você saberia me orientar como eu pesquiso essa solução ou se tu já tem algo pronto como exemplo de como faço esse tipo de truncagem que você mencionou?
Att,
Luiz H. Pedrinho
Att,
Luiz H. Pedrinho
-
- Moderador
- Mensagens: 641
- Registrado em: Seg, 03 Set 2007 3:26 pm
- Localização: Fortaleza - CE
att,
Daniel N.N.
Daniel N.N.
É trabalhoso mas é simples.
Dei uma rápida pesquisada aqui e acredito que os seguintes tópicos podem ajudar:
http://glufke.net/oracle/viewtopic.php?t=7858
http://glufke.net/oracle/viewtopic.php?t=7155
Por exemplo, digamos que seu texto precise gerar um arquivo com cada linha o nome e a matrícula do funcionário.
ex: "FULANO DE TAL 0000001234"
Você pode pegar informação do nome e da matrícula e fazer os tratamentos e definir os tamanhos em que ela pode ocupar.
Você pode estruturar melhor, definindo as posições em constantes, ou em tabelas e etc...
Como disse o conceito é bem simples só é trabalhoso.
Boa sorte.
Dei uma rápida pesquisada aqui e acredito que os seguintes tópicos podem ajudar:
http://glufke.net/oracle/viewtopic.php?t=7858
http://glufke.net/oracle/viewtopic.php?t=7155
Por exemplo, digamos que seu texto precise gerar um arquivo com cada linha o nome e a matrícula do funcionário.
ex: "FULANO DE TAL 0000001234"
Você pode pegar informação do nome e da matrícula e fazer os tratamentos e definir os tamanhos em que ela pode ocupar.
var_name := SUBSTR(RPAD(v_nome,20,' '),1,20); /* Aqui defino que o campo nome deve possuir 20 caracteres, RPAD completa com espaços se sobrar e o SUBSTR garante que não vai passar de 20 caso o nome seja muito grande.*/
var_matricula := SUBSTR(LPAD(v_matricula,10,0),1,10); /* semelhante ao anterior porém com tamanho 10 e o numero é completado à esqueda com ZEROs.*/
linha_atual := var_name || var_matricula;
Como disse o conceito é bem simples só é trabalhoso.
Boa sorte.
-
- Rank: Estagiário Sênior
- Mensagens: 9
- Registrado em: Qua, 16 Nov 2011 10:01 am
Muito obrigado Daniel, vou realizar alguns testes mais creio que seja exatamente isso que eu preciso.
Att,
Luiz H. Pedrinho
Att,
Luiz H. Pedrinho
-
- Rank: Estagiário Sênior
- Mensagens: 9
- Registrado em: Qua, 16 Nov 2011 10:01 am
Daniel, fiz os testes como você me passou o exemplo e ficou perfeito, consegui ajustar o relatório. Como você mesmo disse é simples porem muito trabalhoso.
Muito obrigado pela ajuda.
Att,
Luiz H. Pedrinho
Muito obrigado pela ajuda.
Att,
Luiz H. Pedrinho
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante