Jump to content
Notícias do ACBr

click.png

click.png

click.png

click.png

click.png

click.png

click.png

click.png

click.png

logos

Texto.png

p200

click.png

click.png

click.png

Reestruturar updates do formato OldSetClauseSemantics = 1 para sql padrao.


Go to solution Solved by Rodrigo Cunha,

Recommended Posts

  • Usuários SAC

Olá a todos!
   Eu utilizo o firebird 2.5 com a opção OldSetClauseSemantics = 1. Ex:

  update lixo_teste set vlr_01 = (select max(prc_venda) from produto_empresa pe where cd_loja=2 and lixo_teste.cd_prod = pe.cd_prod), vlr_02 = vlr_01 - 1, vlr_03 = vlr_02 - 1 where exists (select * from produto_empresa pe where cd_loja=2 and lixo_teste.cd_prod = pe.cd_prod);

   Utilizo muito a recuperação do valor da coluna 1 em outras colunas. Como as novas versões do firebird não tem essa opção, terei que reescrever todos os meus updates? Como ficaria? um exemplo pv. Tenho que ficar repedindo o select max... nas outras colunas pra obter o valore necessário? Tenho subselects grandes, seria uma grande mudança. Preciso de sugestões e/ou esclarecimentos.

Obg.

Link to post
Share on other sites
Em 23/04/2021 at 09:43, Rodrigo Cunha disse:

Olá a todos!
   Eu utilizo o firebird 2.5 com a opção OldSetClauseSemantics = 1.

   Utilizo muito a recuperação do valor da coluna 1 em outras colunas. Como as novas versões do firebird não tem essa opção, terei que reescrever todos os meus updates? Como ficaria? um exemplo pv. Tenho que ficar repedindo o select max... nas outras colunas pra obter o valore necessário? Tenho subselects grandes, seria uma grande mudança. Preciso de sugestões e/ou esclarecimentos.

Obg.

Olá Rodrigo.

   Esse problema se resolve reavaliando o método que se faz o SQL. Por exemplo, se você precisa pegar um valor para utilizar várias vezes, você pode usar o "ExecuteBlock" que permite executar um SQL como se fosse dentro de uma procedure. Daí joga o valor numa variável e reutiliza quantas vezes precisar.

   Usando o Execute Block você poderá usar também outros recursos como "For Select"...

Em 23/04/2021 at 09:43, Rodrigo Cunha disse:

update lixo_teste set vlr_01 = (select max(prc_venda) from produto_empresa pe where cd_loja=2 and lixo_teste.cd_prod = pe.cd_prod), vlr_02 = vlr_01 - 1, vlr_03 = vlr_02 - 1 where exists (select * from produto_empresa pe where cd_loja=2 and lixo_teste.cd_prod = pe.cd_prod);

   Eu particularmente não entendi esse código seu. O que vem a ser a tabela lixo_teste? É uma tabela temporária? Porque o Where exists é feito dessa maneira?

   Sem entender a estrutura do seu BD fica difícil de ajudar. Por favor, nos dê a modelagem das tabelas usadas, mesmo que sejam apenas os campos usados no SQL em questão.

[]'s

Consultor SAC ACBr

Elton
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link to post
Share on other sites
  • Usuários SAC

Obg pelo retorno. Vamos lá.

Criei uma tabela temporaria com o nome: Create Table  lixo_teste (cd_prod integer, vlr_01 numeric(9,2), vlr_02 numeric(9,2), vlr_03 numeric(9,2)).

Ai eu uso o update pra pegar o valor maximo de uma coluna de outra tabela e colocar no vlr_01, depois eu pego o campo vlr_01 diminuo 1 e atribuo ao campo vlr_02 e a mesma coiasa com o campo vlr_03. Então ficaria assim

cd_prod  vlr_01   vlr_02    vlr_03

000001   10,00       9,00       8,00

000002  15,00       14,00      13,00

Como o vlr_01 é de um select max... eu uso o resultado dentro da mesma update para compor os campos vlr_02 e vlr_03. 

No firebird 2.5 eu utilizada o OldSetClauseSemantics = 1 , mas no firebird 3 não há essa possibilidade. Eu queria entender se no update eu não consigo mesmo utilizar o resultado de uma campo para ser utilizado em outro, no caso, no mesmo comando: update lixo_teste vlr_01 = 10, vlr_02 = vlr_01 -1, vlr_03 = vlr_02 - 1. Neste exemplo não fica 10 - 9 - 8 o resultado e sim 10 -1  -1. Se eu quiser aproveitar a informação eu devo colocar no execute block o update lixo_teste set vlr_01=10. depois update lixo_teste vlr_02 = vlr_01  - 1....
Ou tem alguma outra forma de eu aproveitar minha lógica?

Link to post
Share on other sites
2 minutos atrás, Rodrigo Cunha disse:

No firebird 2.5 eu utilizada o OldSetClauseSemantics = 1 , mas no firebird 3 não há essa possibilidade. Eu queria entender se no update eu não consigo mesmo utilizar o resultado de uma campo para ser utilizado em outro,

Apenas pra explicar essa parte, você não consegue porque isso é fora do "padrão SQL". O Firebird permitia isso, mas como estava fora do padrão, eles removeram. Ou seja, essa alteração foi feita pro Firebird ficar mais compatível com os padrões SQL.

10 minutos atrás, Rodrigo Cunha disse:

Criei uma tabela temporaria com o nome: Create Table  lixo_teste (cd_prod integer, vlr_01 numeric(9,2), vlr_02 numeric(9,2), vlr_03 numeric(9,2)).

Ai eu uso o update pra pegar o valor maximo de uma coluna de outra tabela e colocar no vlr_01, depois eu pego o campo vlr_01 diminuo 1 e atribuo ao campo vlr_02 e a mesma coiasa com o campo vlr_03. Então ficaria assim

cd_prod  vlr_01   vlr_02    vlr_03

000001   10,00       9,00       8,00

000002  15,00       14,00      13,00

Como o vlr_01 é de um select max... eu uso o resultado dentro da mesma update para compor os campos vlr_02 e vlr_03. 

Você não vai conseguir fazer isso no mesmo update a não ser que repita o "select max" várias vezes.

Acho que ainda não entendi o que você está tentando fazer... Quero dizer, por que você precisa dessa tabela temporária? Qual é a ideia/funcionalidade?

17 minutos atrás, Rodrigo Cunha disse:

Se eu quiser aproveitar a informação eu devo colocar no execute block o update lixo_teste set vlr_01=10. depois update lixo_teste vlr_02 = vlr_01  - 1....

Isso de executar dois updates, você poderia fazer isso até por fora de um execute block. Bastando executar um update após o outro.

 

Já o Execute block permite você fazer algo como:

EXECUTE BLOCK
AS
declare MPV Numeric(9,2);
declare CDP INT;
BEGIN
  FOR SELECT max(prc_venda), cd_prod
      from produto_empresa pe
      INTO MPV, CDP
  DO
  BEGIN
    update lixo_teste
    set vlr_01 = :MPV, vlr_02 = :MPV - 1, vlr_03 = :MPV - 2
    where cd_prod = :CDP
  END
END

 

[]'s

Consultor SAC ACBr

Elton
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link to post
Share on other sites
  • Usuários SAC
  • Solution

Boa noite! A minha questão era se realmente não havia uma forma de preservar meus updates, pois estão todos naquele formato. Terei que alterar todos em meu sistema para adequar no padrão sql. Infelizmente terei muita dificuldade de ir para o Firebird 3. Obg pelas informações.

Link to post
Share on other sites
10 horas atrás, Rodrigo Cunha disse:

Boa noite! A minha questão era se realmente não havia uma forma de preservar meus updates, pois estão todos naquele formato. Terei que alterar todos em meu sistema para adequar no padrão sql. Infelizmente terei muita dificuldade de ir para o Firebird 3. Obg pelas informações.

Mas digo que vai ganhar muito em velocidade e já vai ficar pronta para a versão 4.0

Consultor SAC ACBr Juliomar Marchetti
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

skype: juliomar
telegram: juliomar
http://www.juliomarmarchetti.com.br
Embarcadero MVP
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil
Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...