none
SCRIPT RRS feed

  • Pergunta

  • bom dia, tudo bem?

    Gostaria de uma ajuda de como a melhor forma de fazer:

    Tenho uma tabela de Caracteristicas tecnicas de produtos, que tem um campo "Ordem" que é a ordem que o usuario quer que as caracteristicas sejam apresentadas.

    ID - Indice Primario
    ID_Produto
    ID_CT
    Valor
    Ordem

    O usuario tem na barra de ferramentas  4 botoes, para enviar para o primeiro da ordem, ordem anterior, ordem proxima, e ultimo na ordem.

    Quando o usurio clica em um desses botoes, tenho que alterar a ordem do registro e todos as ordem posteriores dentro do ID_Produto.

    Qual seria a melhor forma de fazer esses script no banco? Eu iria fazer loop, mas acho que teria como rodar um comando so.

    Obrigado!

    sexta-feira, 26 de abril de 2019 15:03

Respostas

  • DaviSaba,

    Isso não verdade é função da aplicação, você deve codificar para que a aplicação conectada no banco de dados, execute os commandos de First, Next, Prior e Last.

    Este é comportamento padrão que os componentes de conexão e mapeamento de dados devem fazer, automaticamente ao executar estas ações vinculadas ao seu componente de banco de dados, mapaeado a sua query, o próprio componente que esta com os dados em memória vai mudar os valores para seus respectivos campos em tela.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta DaviSaba sábado, 27 de abril de 2019 20:25
    sexta-feira, 26 de abril de 2019 15:14
  • Deleted
    • Marcado como Resposta DaviSaba sábado, 27 de abril de 2019 20:25
    sexta-feira, 26 de abril de 2019 17:13
  • Davi,

    Mesmo assim, ao usuário acessar a aplicação, e os dados que serão apresentados para ele, estão na ID 4, o componente que esta apresentando os dados, é quem deve permitir a movimentação e não o banco de de dados.

    Respeito a sua opinião e argumentação, mas não concordo com ele.

    Mas qual será o critério de identificar a movimentação, é o campo ID ou Ordem?

    No caso para poder movimentar da forma que você quer, trata-se basicamente do uso de comando Select através de uma query dinâmica ou Stored Procedure, na qual poderia ser passado um parâmentro para informar se deveria avançar ou retroceder o registro.

    Com isso, o outro parâmentro recebi o valor do atual registro por exemplo 4 muda a posição.

    Não sei se é isso, é um passo inicial, tomando como base a coluna ID. Veja se este exemplo te ajuda:

    Create Table Teste
    (Id TinyInt Primary Key,
     IdProduto TinyInt,
     IDCT TinyInt,
     Valor Varchar(20),
     Ordem TinyInt)
    Go
    
    Insert Into Teste 
    Values (1, 2, 1, 'Sansung1',1),
           (2, 2, 3, 'Sansung2',2),
           (3, 2, 4, 'Sansung3',3),
           (4, 2, 4, 'Sansung4',4)
    Go
    
    Alter Procedure P_MovimentarRegistros @Acao Char(1) = 'F' , @PosicaoAtual TinyInt = 1
    As
    Begin
    
    Set NoCount On
    
    If (@PosicaoAtual <= (Select Max(ID) From Teste) And @PosicaoAtual <> 0 And @Acao In ('F','P','N','L'))
    Begin
    
     If @Acao = 'F'
      Set @PosicaoAtual = (Select Min(ID) From Teste)
    
     If @Acao = 'P' And @PosicaoAtual <= (Select Max(ID) From Teste)
      Set @PosicaoAtual = @PosicaoAtual - 1
     Else
      Set @PosicaoAtual = (Select Min(ID) From Teste)
    
     If @Acao = 'N' And @PosicaoAtual = (Select Max(ID) From Teste)
      Set @PosicaoAtual = (Select Min(ID) From Teste)
     Else
      Set @PosicaoAtual = @PosicaoAtual + 1
    
     If @Acao = 'L'
      Set @PosicaoAtual = (Select Max(ID) From Teste)
    
    
     Select * From Teste
     Where Ordem = @PosicaoAtual
    End
    End
    
    -- Executando --
    Exec P_MovimentarRegistros 'F',1
    Go

    Tem ajustes a serem feitos, mas é um caminho.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    sexta-feira, 26 de abril de 2019 17:15
  • José,

    Eu também que pode ser feito, mas você também não concorda que este tipo de funcionalidade é a aplicação que deve fazer e não o banco de dados.

    E seu eu entendi, ele quer movimentar a posição dos valores do registro na tela da aplicação.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]



    sexta-feira, 26 de abril de 2019 17:19
  • (...) E seu eu entendi, ele quer movimentar a posição dos valores do registro na tela da aplicação.

    Se o objetivo é alterar somente na tela, então me parece que basta ele implementar o conceito de lista circular diretamente na aplicação.

    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.


    Ok, perfeito, então não entendi errado, sim a lista circular é o caminho!!!

    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta DaviSaba sábado, 27 de abril de 2019 20:26
    sexta-feira, 26 de abril de 2019 17:34
  • Deleted
    • Marcado como Resposta DaviSaba sábado, 27 de abril de 2019 20:26
    sexta-feira, 26 de abril de 2019 17:41

Todas as Respostas

  • DaviSaba,

    Isso não verdade é função da aplicação, você deve codificar para que a aplicação conectada no banco de dados, execute os commandos de First, Next, Prior e Last.

    Este é comportamento padrão que os componentes de conexão e mapeamento de dados devem fazer, automaticamente ao executar estas ações vinculadas ao seu componente de banco de dados, mapaeado a sua query, o próprio componente que esta com os dados em memória vai mudar os valores para seus respectivos campos em tela.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta DaviSaba sábado, 27 de abril de 2019 20:25
    sexta-feira, 26 de abril de 2019 15:14
  • Pedro, justamente acho que eu deve ser implementado no Banco, mas eu nao sei como fazer esse Script

    Exemplo, a tabela esteja assim:

    ID -  ID_Produto  -  ID_CT  -  Valor         -  Ordem
    1           2                  1          Sansung         1
    2           2                  2          A6                  2
    3           2                  3          Prateado         3
    4           2                  4          Quadcore        4


    Imagina que o usuario pegue o ID 4 e diz que é o primeiro da ordem, o ID 4 fica com a ordem 1, e eu tenho que reordenar os demais, o ordem 1 vira ordem 2 e assim por diante.

    Pode me ajudar?
    sexta-feira, 26 de abril de 2019 15:27
  • Deleted
    • Marcado como Resposta DaviSaba sábado, 27 de abril de 2019 20:25
    sexta-feira, 26 de abril de 2019 17:13
  • Davi,

    Mesmo assim, ao usuário acessar a aplicação, e os dados que serão apresentados para ele, estão na ID 4, o componente que esta apresentando os dados, é quem deve permitir a movimentação e não o banco de de dados.

    Respeito a sua opinião e argumentação, mas não concordo com ele.

    Mas qual será o critério de identificar a movimentação, é o campo ID ou Ordem?

    No caso para poder movimentar da forma que você quer, trata-se basicamente do uso de comando Select através de uma query dinâmica ou Stored Procedure, na qual poderia ser passado um parâmentro para informar se deveria avançar ou retroceder o registro.

    Com isso, o outro parâmentro recebi o valor do atual registro por exemplo 4 muda a posição.

    Não sei se é isso, é um passo inicial, tomando como base a coluna ID. Veja se este exemplo te ajuda:

    Create Table Teste
    (Id TinyInt Primary Key,
     IdProduto TinyInt,
     IDCT TinyInt,
     Valor Varchar(20),
     Ordem TinyInt)
    Go
    
    Insert Into Teste 
    Values (1, 2, 1, 'Sansung1',1),
           (2, 2, 3, 'Sansung2',2),
           (3, 2, 4, 'Sansung3',3),
           (4, 2, 4, 'Sansung4',4)
    Go
    
    Alter Procedure P_MovimentarRegistros @Acao Char(1) = 'F' , @PosicaoAtual TinyInt = 1
    As
    Begin
    
    Set NoCount On
    
    If (@PosicaoAtual <= (Select Max(ID) From Teste) And @PosicaoAtual <> 0 And @Acao In ('F','P','N','L'))
    Begin
    
     If @Acao = 'F'
      Set @PosicaoAtual = (Select Min(ID) From Teste)
    
     If @Acao = 'P' And @PosicaoAtual <= (Select Max(ID) From Teste)
      Set @PosicaoAtual = @PosicaoAtual - 1
     Else
      Set @PosicaoAtual = (Select Min(ID) From Teste)
    
     If @Acao = 'N' And @PosicaoAtual = (Select Max(ID) From Teste)
      Set @PosicaoAtual = (Select Min(ID) From Teste)
     Else
      Set @PosicaoAtual = @PosicaoAtual + 1
    
     If @Acao = 'L'
      Set @PosicaoAtual = (Select Max(ID) From Teste)
    
    
     Select * From Teste
     Where Ordem = @PosicaoAtual
    End
    End
    
    -- Executando --
    Exec P_MovimentarRegistros 'F',1
    Go

    Tem ajustes a serem feitos, mas é um caminho.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    sexta-feira, 26 de abril de 2019 17:15
  • José,

    Eu também que pode ser feito, mas você também não concorda que este tipo de funcionalidade é a aplicação que deve fazer e não o banco de dados.

    E seu eu entendi, ele quer movimentar a posição dos valores do registro na tela da aplicação.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]



    sexta-feira, 26 de abril de 2019 17:19
  • Deleted
    sexta-feira, 26 de abril de 2019 17:27
  • Entendi que voces tinha dito que seria o Banco, a primeira resposta entendi isso.

    Bom até pode ser, mas eu posso ter muitos itens. Esta em um datagridview, ele clicou no item 4 e clicou no botao primeira ordem. Na aplicacao eu posso entao recalcular tudo isso, e depois tenho que gravar isso no banco de dados. Pensei que como essa operacao trata-se exclusivamente de manipulacao de registros do banco de dados, seria mais interessante implementar no banco.

    Mas com certeza voces são muito mais experientes que eu.

    sexta-feira, 26 de abril de 2019 17:30
  • (...) E seu eu entendi, ele quer movimentar a posição dos valores do registro na tela da aplicação.

    Se o objetivo é alterar somente na tela, então me parece que basta ele implementar o conceito de lista circular diretamente na aplicação.

    José Diz     Belo Horizonte, MG - Brasil     [T-SQL performance tuning: Porto SQL]   [e-mail]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.


    Ok, perfeito, então não entendi errado, sim a lista circular é o caminho!!!

    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta DaviSaba sábado, 27 de abril de 2019 20:26
    sexta-feira, 26 de abril de 2019 17:34
  • Deleted
    • Marcado como Resposta DaviSaba sábado, 27 de abril de 2019 20:26
    sexta-feira, 26 de abril de 2019 17:41