none
Duvida de Iniciante : Trabalhando com IF para tratamento de inserção. RRS feed

  • Pergunta

  • Bom, meu problema é o seguinte, eu tenho uma tabela que pode estar inicialmente vazia ou pode estar com dados, e como ela pode ser migrada do interbase (o sgbd do delphi) o seu campo key não pode ter alto incremento, pois ele perderia as keys do banco de dados velho.

    Ou seja, eu tenho uma tabela chamada Receita que tem como Key o campo codigo.

    O campo código não está como autoincremente, por isso devo fazer uma pesquisa para saber o último e setar o valor do codigo para o ultimo +1, o problema é que quando a tabela esta vazia e tento pegar o ultimo codigo + 1 ele atribui o valor do codigo como nulo e não consegue inserir keys nulas (logico =D).

     

    Bom meu codigo está assim (funcionando perfeito se a tabela não estiver vazia):

     

    ALTER PROCEDURE dbo.REC_INS

    @Codigo AS INT,

    @CodigoCliente AS INT,

    @CodigoEmpresa AS INT,

    ... @(outros campos)

     

    AS

    SELECT @recCodigo = MAX(recCodigo)+1 FROM ModuloReceita;

     

    INSERT INTO ModuloReceita (Codigo, CodigoCliente, CodigoEmpresa, ... (outros campos))

    VALUES ModuloReceita (@Codigo, @CodigoCliente, @CodigoEmpresa, ... @(outros campos))

     

    RETURN

     

    Eu queria inserir nesse codigo um tratamento antes de inserir, do tipo:

    se @recCodigo = Null faça @recCodigo = 1

     

    Tem como fazer isso?

    Alguém poderia me ajudar, pois ta dificil achar na internet esse negócio?

    Agradeço desde já, pois se vc leu até aqui, quer dizer que vc se interessou em me ajudar =D.

    segunda-feira, 4 de junho de 2007 17:41

Respostas

  • Mas essa é a minha intenção...

    O banco velho apresenta problemas em sua estruturas, erros em formas Normais e etc...

    Eu to migrando desse banco para o meu para que fique "perfeito", ou seja, eu necessito dos dados mas não necessito da estrutura, pois agora é uma nova.

    Exemplo: Campos que antes existiam la, não existem nessa nova estrutura, campos que antes eram obrigatórios agora não são mais e campos que não eram obrigatórios agora são.

    Novas colunas foram implementadas devido a reformulação do software.

    Ou seja, é necessário muitas mudanças na estrutura, por isso a forma de migração que uso é via programação mesmo, ou vou colhendo todo o dado, faço verificações em cima dele e migro.

    A migração está correta, agora só falta saber como inserir com o ultima Key +1, sendo que deve funcionar quando a tabela estiver vazia tb.

     

    Obrigado novamente e espero que agora tenha entendido o meu problema.

    sexta-feira, 8 de junho de 2007 20:57

Todas as Respostas

  • Oi !

     

    "o seu campo key não pode ter alto incremento, pois ele perderia as keys do banco de dados velho"

     

    Seu problema está nesta afirmação.

     

    Através da instrução set identity insert on/off você pode ligar e desligar a possibilidade de insert direto em campos autoincremento, de forma a que possa manter os IDs dos seus registros originais sem problemas.

     

    []'s

     

     

    segunda-feira, 4 de junho de 2007 19:35
  • Não entendi, o identity do meu campo esta setado como no, ou seja, ele não incrementa altomaticamente...

    Se eu colocar ele como yes ele vai incrementar altomaticamente mas quando eu migrar o banco de dados do interbase para sql ele perderá os códigos antigos e inserirá novos. Por exemplo um código = 310 pode ser migrado como 288 ( e será feito isso por causa desse indentity).

    Eu não entendi muito bem oq vc quiz dizer. Eu não criei tabelas via código, eu criei via Visual Studio, onde o campo tem uma propriedade de Indentity que pode ser setada como No e Yes, colocando (e dependendo de como setar essa propriedade ela agirá conforme dito acima).

    segunda-feira, 4 de junho de 2007 20:04
  • Oi !

     

    Eu quis dizer que quando você migrar o banco do interbase para o sql server ele não perderá os códigos antigos, porque no processo de migração você pode utilizar o set identity insert on/off .

     

    Por isso você poderia setar seu campo como identity e evitar o trabalho todo que você já estava planejando.

     

    []'s

     

    segunda-feira, 4 de junho de 2007 21:13
  • Mas eu preciso que os códigos do banco passado continuem iguais, pois se não perderia a relação... exemplo:

    No banco velho a receita tal foi feita para o cliente 12 (codigo do banco velho) se eu migrasse e colocasse um novo codigo esse cliente viraria 6 por exemplo e outro cliente que num tinha nada ver com a receita e que agora possui o codigo 12 seria o novo cliente da receita.

    Veja que setar para incrementar altomaticamente é péssimo, pois eu perderia informações do banco antigo. Vo dar um exemplo mais claro em numeros:

     

    Inseri o cliente Renan

    Inseri o cliente Vitor

    Inseri o cliente Gabriela

    Inseri o cliente João

    Inseri o cliente Maria

    Inseri o cliente Lana

    Inseri o cliente Fulano

    Deleta o cliente Maria

    Deleta o cliente João

    Deleta o cliente Vitor

     

    Situação  no Banco Antigo ficaria assim (nome do cliente e codigo):

    Renan 1

    Gabriela 3

    Lana 6

    Fulano 7

     

    Vamo supor agora que o cliente Gabriela faça uma receita (codigo da receita e codigo do cliente):

    1 3

     

    Agora migremos com o identity ON no banco de dados Sql (Migrar Interbase[Banco Velho] para Sql[Banco Novo])

    Situação no Banco Novo ficaria assim (nome do cliente e codigo):

    Renan 1

    Gabriela 2

    Lana 3

    Fulano 4

     

    e as receitas (codigo da receita e codigo do cliente):

    1 3

     

    Ou seja... a receita agora pertence a cliente Lana, é disso que eu to falando em questão de perder informações....

     

     

     

    Seria muito mais simples se me explicassem como inserir um registro com o ultimo id +1.

    Eu ja sei como faz isso, mas como fazer isso até quando o banco tiver vazio? Essa é minha duvida, eu quero saber como inserir ifs perguntando : O BANCO TA VAZIO? SE SIM INSERE COM O CODIGO 1 SENAO INSERE COM O CODIGO DE INSERT (postado acima).

    terça-feira, 5 de junho de 2007 16:49
  • Oi !

     

    "Mas eu preciso que os códigos do banco passado continuem iguais"

     

    Mas é isso que eu estou dizendo desde o inicio : *Vão ficar iguais* mesmo que você utilize um campo autonumeração no novo banco.

     

    []'s

     

     

    terça-feira, 5 de junho de 2007 17:11
  • Mudam sim, pois eu ja fiz o teste.

     

    Bom... não tem problema, eu acabei de resolver...

    Pra quem esteja interessado é o seguintes:

     

    AS

    SET NOCOUNT ON

    INSERT INTO CadastroReceita (recCodigo, recCodigoCliente, recCodigoEmpresa, ...outros campos)

    VALUES (@recCodigo, @recCodigoCliente, @recCodigoEmpresa, ...outros campos)

    SELECT NEWID = SCOPE_IDENTITY()

    RETURN

     

    Resolvido, com a insersão do SET NOCOUNT ON no começo e + SELECT NEWID no final eu consigo setar o id para o ultimo como se fosse um alto increment.

     

    Vlw dennes, pelo esforço em em ajudar, mas acho que vc não entendeu bem o meu problema, bom de qualquer forma obrigado.

    terça-feira, 5 de junho de 2007 18:54
  • Oi !

     

    "Mudam sim, pois eu ja fiz o teste"

     

    Mas é isso que estou dizendo desde o inicio, você testou errado, você não entendeu a solução que estou passando para você.

     

    Se você utilizar a instrução set identity insert ON durante seu processo de migração, seus códigos não mudam. Tenho certeza absoluta que no seu teste você não levou em consideração o set identity insert ON.

     

    Ou seja : Você poderia resolver seu problema de forma muito mais simples, mantendo os códigos e sem ter que fazer com que o campo deixasse de ser autonumeração.

     

    []'s

     

    terça-feira, 5 de junho de 2007 20:36
  • fechado com o dennes nao muda nao, com o set identity insert vc. pode passar um valor qualquer para o identity

     

    Abs;

     

    quarta-feira, 6 de junho de 2007 10:24
  • Olha so, eu uso o VB, nele possui as seguintes propriedades de uma coluna:

    Indentity Specification

    (Is Identity)

     

    Com os dois Setados como YES (se vc setar o Is Identity ele automaticamente seta o Specification) o banco migrado fica assim:

    http://img517.imageshack.us/img517/5234/cpiademigradoyesca1.png

     

    E setados como NO fica assim:

    http://img522.imageshack.us/img522/5850/cpiademigradonojk8.png

     

    O codigo oito se perde, com o Indetity YES, fiz mais testes pra comprovar e esses são os resultados do meu ultimo teste.

    Os dados realmente não se perdem, mas seus códigos são sobreescrevidos, e isso eu não quero...

    O codigo que postei acima não resolve meu problema tb, pensei que resolvia, mas não, ele da erro em alguns casos ...

     

    Bom, oq queria saber mesmo era como inserir ifs no Sql Server perguntano se a tabela está null.

     

    Eu queria que respondessem a minha primeira pergunta, pois acho que deixei claro que no meu caso apenas setar Identity para no ou yes não resolveria, pode ser que resolva para outras pessoas, mas para mim Não.

     

    Mas... Obrigrado mesmo assim pela atenção, e se alguém souber responder por favor não exite em postar =D

     

    quarta-feira, 6 de junho de 2007 19:04
  • Oi !

     

    O erro no seu teste começa no fato de estar usando o VB.NET para uma migração que tem esse nível de complexidade.

     

    Com DTS, SSIS ou linked server resolveria o problema sem ter esse trabalho todo.

     

    []'s

     

     

    quarta-feira, 6 de junho de 2007 20:12
  • Eu não posso fazer isso, pois o programa em que estou trabalhando tem a parte toda de migração em VB.

     

    Tipo, num é um trabalho grande, eu só quero saber como faz um if para verificar se uma variável é nula, só isso, veja minha pergunta no primeiro post. É isso que estou perguntando =D Mas vlw denovo a tentativa.

    sexta-feira, 8 de junho de 2007 16:16
  • Oi !

     

    Você não está fazendo da forma ideal e está mudando a forma de funcionamento da aplicação, ao invés de apenas migrar os dados... é sobre isso que estamos alertando você.

     

    Além do mais, mesmo com a migração em VB o identity insert poderia ser feito... mais complexo, mas poderia sim...

     

    []'s

     

    sexta-feira, 8 de junho de 2007 16:30
  • Mas essa é a minha intenção...

    O banco velho apresenta problemas em sua estruturas, erros em formas Normais e etc...

    Eu to migrando desse banco para o meu para que fique "perfeito", ou seja, eu necessito dos dados mas não necessito da estrutura, pois agora é uma nova.

    Exemplo: Campos que antes existiam la, não existem nessa nova estrutura, campos que antes eram obrigatórios agora não são mais e campos que não eram obrigatórios agora são.

    Novas colunas foram implementadas devido a reformulação do software.

    Ou seja, é necessário muitas mudanças na estrutura, por isso a forma de migração que uso é via programação mesmo, ou vou colhendo todo o dado, faço verificações em cima dele e migro.

    A migração está correta, agora só falta saber como inserir com o ultima Key +1, sendo que deve funcionar quando a tabela estiver vazia tb.

     

    Obrigado novamente e espero que agora tenha entendido o meu problema.

    sexta-feira, 8 de junho de 2007 20:57
  • Oi !

     

    Considero isso mais um motivo para utilizar os campos autonumeração. Migrar para uma nova estrutura e já começar com uma POG (Programação Orientada a Gambiarra) não é uma boa idéia.

     

    []'s

     

    sexta-feira, 8 de junho de 2007 21:33
  • Pode até ser gambiarra mas é necessário mudar a estrutura sim.

     

    Eu poderia ficar aqui discutindo mais sobre usar ou não usar autonumeração... mas NÃO FOI ISSO QUE EU PERGUNTEI.

     

    Eu simplesmente quero saber COMO USAR IFS DENTRO DE UMA PROCEDURE.

     

    Mais precisamente, como perguntar se uma variável que recebe o ultimo ID é nula.

    Por favor, vamos no conter a pergunta principal, ou intão postemos fora daqui algum tópico "Autonumerar ou não? Qual melhor jeito".

    Veja, eu estou tentando, tentando e tentando perguntar algo simples mas até agora oq perguntei no começo ainda num foi respondido e sim discutido e olha que essa discução não tem quase nada haver com oq perguntei.

     

    O tópico tomou um rumo diferente doque eu queria por isso perguntarei denovo e não questionarei mais a questão da autonumeração...

     

    Façamos o seguinte, autonumeração resolve? Sim.

    Daria para eu implementar no meu sistema? Não.

    E com uma função que pega o ultimo ID e pergunta se ja existe elementos na tabela? Sim.

    Qual sua pergunta? É saber como se cria uma procedure com ifs sendo um deles responsável por perguntar se uma variável é nula.

    Mas isso não é gambiarra? Pode ser, mas mesmo assim quero implementar desse modo.

    Tem certeza que autonumeração não pode ser implementado? Sim.

    Pq não? Pq o sistema é fornecido a várias impresas, mesmo sendo um sistema que não teve um processo de levantamento de requisitos, faze de planejamento e etc... é um sistema completo e compacto mas que precisa de "reformas" e é isso que eu devo fazer, por isso devo mecher na estrutura mas sem fazer com que perca-se os dados.

     

    Afinal de contas, oq vc quer saber? Como se cria uma procedure com ifs sendo um deles responsável por perguntar se uma variável é nula, a pergunta está melhor formulada no primeiro post.

    segunda-feira, 11 de junho de 2007 17:29