Desafio!!! Avançado... Linha/coluna - Update, Cursor, Row
Olá pessoal bom dia,
Estou com seguinte problema, no resultado da tabela 1, vindo de uma importação txt, feita
varias transformações para chegar a esse resultado.Para concluir a finalização do formato, Não estou conseguindo fazer uma conversão para resultado parecido com a tabela 2.
que é o objetivo desta importação.A ideia é criar uma nova tabela, com resultados parecido com a 2.
Tentei com tabelas temporarias #temp, Cursor, RowSet para depois criar essa tabela mais não estou acertanto.
As informações de nota fiscal e fornecedor esta misturada com os outros campos, ou seja,
Descricao tem a notafiscal, e fornecedor é replicar a informação.Não estou conseguindo buscar essas informações que estão misturadas e preencher os
campos Fornecedor e NotaFiscal corretamente.Podem me ajudar. Por favor! tenho um tempinho martelando nisto e não esta saindo.
Versão Banco de Dados SQL Server 2000
Tabela 1 RowNumber CodProduto Descrição Valor Fornecedor NotaFiscal 8 N.Fiscal: 627 NULL 33-7 NULL 9 306-9 BEMINAL 30`S 16 NULL NULL 10 31523-0 MEL APIS FLORA 144G C/ GELEIA 5,9 NULL NULL 12 2656-5 NOVOFER 120ML 0 NULL NULL 26 22633-5 TIRAS-TESTE OPTIUM 25`S 43,2 NULL NULL 27 23109-6 ACIDO ACETILSALICILICO 100MG 10`S G EMS 1,12 NULL NULL 28 25317-0 MIODON 200MG 30`S 12,25 NULL NULL 36 N.Fiscal: 628 NULL 33-10 NULL 37 23275-0 CLOR METFORMINA 850MG 60`S E G 12,17 NULL NULL 38 20540-0 SAB LIQ LUX SHOWER 250ML TOQUE 2,26 NULL NULL 41 29319-9 TERM CLINICO CHRISPIM BLISTER 4,95 NULL NULL 42 32711-5 TERM GERATHERM OUV E TEST LAR 0 NULL NULL 43 23276-9 FLUCONAZOL 150MG 2 CAPS EMS GE 30,24 NULL NULL 47 N.Fiscal: 629 NULL 48-1 NULL 48 31592-3 DES AXE SECO AERO 90G VICE 5,43 NULL NULL 49 16673-1 SAB GRANADO BEBE 250ML GLICERI 5,5 NULL NULL 50 25248-4 FR MONICA NOTURNA JUMBO MD 27 4,26 NULL NULL 51 29461-6 SH SEDA 350ML BRILHO GLOSS 3,36 NULL NULL 55 N.Fiscal: 630 NULL 33-7 NULL 56 25317-0 MIODON 200MG 30`S 12,25 NULL NULL 57 28287-1 BIOMULTI POLIV 30`S 13,51 NULL NULL Tabela 2 RowNumber CodProduto Descrição Valor Fornecedor NotaFiscal 9 306-9 BEMINAL 30`S 16 33-7 627 10 31523-0 MEL APIS FLORA 144G C/ GELEIA 5,9 33-7 627 12 2656-5 NOVOFER 120ML 0 33-7 627 26 22633-5 TIRAS-TESTE OPTIUM 25`S 43,2 33-7 627 27 23109-6 ACIDO ACETILSALICILICO 100MG 10`S G EMS 1,12 33-7 627 28 25317-0 MIODON 200MG 30`S 12,25 33-7 627 37 23275-0 CLOR METFORMINA 850MG 60`S E G 12,17 33-10 628 38 20540-0 SAB LIQ LUX SHOWER 250ML TOQUE 2,26 33-10 628 41 29319-9 TERM CLINICO CHRISPIM BLISTER 4,95 33-10 628 42 32711-5 TERM GERATHERM OUV E TEST LAR 0 33-10 628 43 23276-9 FLUCONAZOL 150MG 2 CAPS EMS GE 30,24 33-10 628 48 31592-3 DES AXE SECO AERO 90G VICE 5,43 48-1 629 49 16673-1 SAB GRANADO BEBE 250ML GLICERI 5,5 48-1 629 50 25248-4 FR MONICA NOTURNA JUMBO MD 27 4,26 48-1 629 51 29461-6 SH SEDA 350ML BRILHO GLOSS 3,36 48-1 629 56 25317-0 MIODON 200MG 30`S 12,25 33-7 630 57 28287-1 BIOMULTI POLIV 30`S 13,51 33-7 630
Respostas
Sharp.br, bom dia segue uma sugestão utilizando cursor, porém não é a melhor forma de resolver, mas no momento acho que vai quebrar seu galho.
-- tabela temporária DECLARE @tb TABLE ( RowNumber TINYINT ,CodProduto VARCHAR(80) NULL ,Descrição VARCHAR(80) NULL ,Valor MONEY NULL ,Fornecedor VARCHAR(80) NULL ,NotaFiscal VARCHAR(80) NULL ) -- populo a tabela temporária SET NOCOUNT ON INSERT @tb SELECT 8 , 'N.Fiscal:' , '627', NULL ,'33-7' , NULL UNION SELECT 9 , '306-9' ,'BEMINAL 30`S', 16 , NULL, NULL UNION SELECT 10, '31523-0','MEL APIS FLORA 144G C/ GELEIA', 5.9, NULL, NULL UNION SELECT 12, '2656-5','NOVOFER 120ML', 0 , NULL, NULL UNION SELECT 26, '22633-5','TIRAS-TESTE OPTIUM 25`S', 43.2, NULL, NULL UNION SELECT 27, '23109-6','ACIDO ACETILSALICILICO 100MG 10`S G EMS', 1.12,NULL,NULL UNION SELECT 28, '25317-0','MIODON 200MG 30`S', 12.25,NULL,NULL UNION SELECT 36, 'N.Fiscal:', '628', NULL,'33-10',NULL UNION SELECT 37, '23275-0','CLOR METFORMINA 850MG 60`S E G', 12.17, NULL,NULL UNION SELECT 38, '20540-0','SAB LIQ LUX SHOWER 250ML TOQUE', 2.26 , NULL,NULL UNION SELECT 41, '29319-9','TERM CLINICO CHRISPIM BLISTER' , 4.95 , NULL,NULL UNION SELECT 42, '32711-5','TERM GERATHERM OUV E TEST LAR', 0 , NULL,NULL UNION SELECT 43, '23276-9','FLUCONAZOL 150MG 2 CAPS EMS GE', 30.24, NULL,NULL UNION SELECT 47, 'N.Fiscal:', '629', NULL, '48-1', NULL UNION SELECT 48, '31592-3','DES AXE SECO AERO 90G VICE', 5.43,NULL ,NULL UNION SELECT 49, '16673-1','SAB GRANADO BEBE 250ML GLICERI', 5.5 ,NULL ,NULL UNION SELECT 50, '25248-4','FR MONICA NOTURNA JUMBO MD 27', 4.26,NULL ,NULL UNION SELECT 51, '29461-6','SH SEDA 350ML BRILHO GLOSS', 3.36,NULL ,NULL UNION SELECT 55, 'N.Fiscal:', '630', NULL, '33-7' ,NULL UNION SELECT 56, '25317-0','MIODON 200MG 30`S', 12.25, NULL, NULL UNION SELECT 57, '28287-1','BIOMULTI POLIV 30`S', 13.51, NULL, NULL --::> Cria uma tabela temporária que ira armazenar os dados tratados DECLARE @tbResultado TABLE ( RowNumber TINYINT ,CodProduto VARCHAR(80) NULL ,Descrição VARCHAR(80) NULL ,Valor MONEY NULL ,Fornecedor VARCHAR(80) NULL ,NotaFiscal VARCHAR(80) NULL ) --::> Váriáveis que irão receber o valor das colunas no Cursor DECLARE @csRowNumber TINYINT ,@csCodProduto VARCHAR(80) ,@csDescrição VARCHAR(80) ,@csValor MONEY ,@csFornecedor VARCHAR(80) ,@csNotaFiscal VARCHAR(80) ,@NFiscalNOVA INT ,@FornecNOVA VARCHAR(10) DECLARE csObjeto CURSOR FAST_FORWARD FOR ( SELECT RowNumber, CodProduto, Descrição, Valor, Fornecedor, NotaFiscal FROM @tb ) OPEN csObjeto FETCH NEXT FROM csObjeto INTO @csRowNumber, @csCodProduto, @csDescrição, @csValor, @csFornecedor, @csNotaFiscal WHILE (@@FETCH_STATUS = 0) BEGIN IF ISNUMERIC(@csDescrição) = 1 BEGIN SELECT @NFiscalNOVA = @csDescrição, @FornecNOVA = @csFornecedor END ELSE BEGIN INSERT INTO @tbResultado SELECT @csRowNumber, @csCodProduto, @csDescrição, @csValor, @FornecNOVA, @NFiscalNOVA END FETCH NEXT FROM csObjeto INTO @csRowNumber, @csCodProduto, @csDescrição, @csValor, @csFornecedor, @csNotaFiscal END CLOSE csObjeto DEALLOCATE csObjeto --::> Exibi o resultado FINAL SELECT * FROM @tbResultado
Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino- Marcado como RespostaSharp.BR terça-feira, 3 de novembro de 2009 14:10
Todas as Respostas
- Sharp.BR,
Como você realizou o processo de importação dos dados?
Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA - atraves de um aplicativo já existente.. ele busca um txt(gerado de um relatorio de um sistema que não tempos acesso para modificação) por isso que o nº da nota esta em descrição.. e insere esses dados txt em uma tabela no sql server.
Estava muito mistura diversas informações desnecessaria.
agora o desafio é, pegar o que esta na tabela 1... transformar em tabela 2... para depois eu inserir corretamente nas tabelas relacionadas do sistema usando procedure. Sharp.br, bom dia segue uma sugestão utilizando cursor, porém não é a melhor forma de resolver, mas no momento acho que vai quebrar seu galho.
-- tabela temporária DECLARE @tb TABLE ( RowNumber TINYINT ,CodProduto VARCHAR(80) NULL ,Descrição VARCHAR(80) NULL ,Valor MONEY NULL ,Fornecedor VARCHAR(80) NULL ,NotaFiscal VARCHAR(80) NULL ) -- populo a tabela temporária SET NOCOUNT ON INSERT @tb SELECT 8 , 'N.Fiscal:' , '627', NULL ,'33-7' , NULL UNION SELECT 9 , '306-9' ,'BEMINAL 30`S', 16 , NULL, NULL UNION SELECT 10, '31523-0','MEL APIS FLORA 144G C/ GELEIA', 5.9, NULL, NULL UNION SELECT 12, '2656-5','NOVOFER 120ML', 0 , NULL, NULL UNION SELECT 26, '22633-5','TIRAS-TESTE OPTIUM 25`S', 43.2, NULL, NULL UNION SELECT 27, '23109-6','ACIDO ACETILSALICILICO 100MG 10`S G EMS', 1.12,NULL,NULL UNION SELECT 28, '25317-0','MIODON 200MG 30`S', 12.25,NULL,NULL UNION SELECT 36, 'N.Fiscal:', '628', NULL,'33-10',NULL UNION SELECT 37, '23275-0','CLOR METFORMINA 850MG 60`S E G', 12.17, NULL,NULL UNION SELECT 38, '20540-0','SAB LIQ LUX SHOWER 250ML TOQUE', 2.26 , NULL,NULL UNION SELECT 41, '29319-9','TERM CLINICO CHRISPIM BLISTER' , 4.95 , NULL,NULL UNION SELECT 42, '32711-5','TERM GERATHERM OUV E TEST LAR', 0 , NULL,NULL UNION SELECT 43, '23276-9','FLUCONAZOL 150MG 2 CAPS EMS GE', 30.24, NULL,NULL UNION SELECT 47, 'N.Fiscal:', '629', NULL, '48-1', NULL UNION SELECT 48, '31592-3','DES AXE SECO AERO 90G VICE', 5.43,NULL ,NULL UNION SELECT 49, '16673-1','SAB GRANADO BEBE 250ML GLICERI', 5.5 ,NULL ,NULL UNION SELECT 50, '25248-4','FR MONICA NOTURNA JUMBO MD 27', 4.26,NULL ,NULL UNION SELECT 51, '29461-6','SH SEDA 350ML BRILHO GLOSS', 3.36,NULL ,NULL UNION SELECT 55, 'N.Fiscal:', '630', NULL, '33-7' ,NULL UNION SELECT 56, '25317-0','MIODON 200MG 30`S', 12.25, NULL, NULL UNION SELECT 57, '28287-1','BIOMULTI POLIV 30`S', 13.51, NULL, NULL --::> Cria uma tabela temporária que ira armazenar os dados tratados DECLARE @tbResultado TABLE ( RowNumber TINYINT ,CodProduto VARCHAR(80) NULL ,Descrição VARCHAR(80) NULL ,Valor MONEY NULL ,Fornecedor VARCHAR(80) NULL ,NotaFiscal VARCHAR(80) NULL ) --::> Váriáveis que irão receber o valor das colunas no Cursor DECLARE @csRowNumber TINYINT ,@csCodProduto VARCHAR(80) ,@csDescrição VARCHAR(80) ,@csValor MONEY ,@csFornecedor VARCHAR(80) ,@csNotaFiscal VARCHAR(80) ,@NFiscalNOVA INT ,@FornecNOVA VARCHAR(10) DECLARE csObjeto CURSOR FAST_FORWARD FOR ( SELECT RowNumber, CodProduto, Descrição, Valor, Fornecedor, NotaFiscal FROM @tb ) OPEN csObjeto FETCH NEXT FROM csObjeto INTO @csRowNumber, @csCodProduto, @csDescrição, @csValor, @csFornecedor, @csNotaFiscal WHILE (@@FETCH_STATUS = 0) BEGIN IF ISNUMERIC(@csDescrição) = 1 BEGIN SELECT @NFiscalNOVA = @csDescrição, @FornecNOVA = @csFornecedor END ELSE BEGIN INSERT INTO @tbResultado SELECT @csRowNumber, @csCodProduto, @csDescrição, @csValor, @FornecNOVA, @NFiscalNOVA END FETCH NEXT FROM csObjeto INTO @csRowNumber, @csCodProduto, @csDescrição, @csValor, @csFornecedor, @csNotaFiscal END CLOSE csObjeto DEALLOCATE csObjeto --::> Exibi o resultado FINAL SELECT * FROM @tbResultado
Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino- Marcado como RespostaSharp.BR terça-feira, 3 de novembro de 2009 14:10
- Showwwwwwwwwww....
Funcionou, perfeitinho. Obrigadão Leonardo!!! - Sharp.BR, valeu pelo retorno.
um abraço.
Se a minha ajuda lhe for útil não esqueça de classificar. Att. Leonardo Marcelino


