Tabulação

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
luispedroka
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qua, 16 Nov 2011 10:01 am

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
Anexos
Exemplo de tabulação.rar
Exemplo do Arquivo como deve ficar o alinhamento de tabulação no Oracle.
(101.54 KiB) Baixado 326 vezes
Avatar do usuário
fsitja
Rank: OraSauro
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

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.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

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.
luispedroka
Rank: Estagiário Sênior
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
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

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.

Selecionar tudo

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;
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.
luispedroka
Rank: Estagiário Sênior
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
luispedroka
Rank: Estagiário Sênior
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
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Legal.
Responder
  • Informação