Clipper On Line • Ver Tópico - Como usar um campo sem nome pré-definido?

Como usar um campo sem nome pré-definido?

Discussão sobre SQL

Moderador: Moderadores

 

Como usar um campo sem nome pré-definido?

Mensagempor JoséQuintas » 19 Ago 2021 19:50

         IF :String( "ESNUMDEP", 1 ) $ "123456789"
            :ExecuteCmd( "UPDATE JPITEM SET IEQTD" + :String( "ESNUMDEP", 1 ) + "=IEQTD" + :String( "ESNUMDEP", 1 ) + ;
               iif( :String( "ESTIPLAN", 1 ) == "2", "-", "+" ) + NumberSQL( :Number( "ESQTDE" ) ) + ;
               " WHERE IDPRODUTO = " + NumberSQL( :Number( "ESPRODUTO" ) ) )
         ENDIF


Tenho por exemplo a rotina acima.
Existe alguma forma de fazer isso sem ter que trocar para 9 comandos diferentes ?
IEQTD1, IEQTD2 ... IEQTD9 ?

Ou sem ter que fazer um comando linguição com todas as 9 possibilidades?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18153
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Como usar um campo sem nome pré-definido?

Mensagempor sergiosouzalima » 23 Ago 2021 09:43

Olá!

Seu eu entendi bem, talvez essa maneira que tenho usado, seja útil para você.

Veja os exemplos.

FUNCTION Main()
LOCAL cSql := "", cSqlResult := ""

    cSql := "UPDATE JPITEM SET"+;
            " IEQTD#{ESNUMDEP} = IEQTD#{ESNUMDEP}" + ;
            " #{cSinal} #{ESQTDE}" +;
            " WHERE IDPRODUTO = #{ESPRODUTO}"

    ? "==== Exemplo 01"
    cSqlResult := StrSwap2( cSql, {"ESNUMDEP" => LTrim(Str(1)), "cSinal" => "-", "ESQTDE" => LTrim(Str(210.40)), "ESPRODUTO" => LTrim(Str(123))} )       
    ? cSqlResult
    ? ""

    ? "==== Exemplo 02"
    cSqlResult := StrSwap2( cSql, {"ESNUMDEP" => LTrim(Str(2)), "cSinal" => "+", "ESQTDE" => LTrim(Str(45.90)), "ESPRODUTO" => LTrim(Str(345))} )       
    ? cSqlResult
    ? ""

    ? "==== Exemplo 03"
    cSqlResult := StrSwap2( cSql, {"ESNUMDEP" => LTrim(Str(9)), "cSinal" => "-", "ESQTDE" => LTrim(Str(440)), "ESPRODUTO" => LTrim(Str(145900))} )       
    ? cSqlResult
    ? ""
RETURN NIL


O resultado deste teste é o seguinte:

==== Exemplo 01                                                                                                                                                                  
UPDATE JPITEM SET IEQTD1 = IEQTD1 - 210.40 WHERE IDPRODUTO = 123                                                                                                                 

==== Exemplo 02                                                                                                                                                                 
UPDATE JPITEM SET IEQTD2 = IEQTD2 + 45.90 WHERE IDPRODUTO = 345                                                                                                                 

==== Exemplo 03                                                                                                                                                                 
UPDATE JPITEM SET IEQTD9 = IEQTD9 - 440 WHERE IDPRODUTO = 145900 


Se resolve desta maneira, eu envio a function "StrSwap2", a qual estou desenvolvendo e testando.

Abraços
sergiosouzalima
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 48
Data de registro: 26 Out 2020 11:25
Cidade/Estado: São Paulo / SP
Curtiu: 1 vez
Mens.Curtidas: 4 vezes

Como usar um campo sem nome pré-definido?

Mensagempor JoséQuintas » 23 Ago 2021 10:41

É que o tópico é sobre SQL, e acabei não mencionando isso.
A dúvida é sobre como fazer o mesmo, mas numa STORED PROCEDURE em SQL.
Normalmente se usa nome de campo, e não uma variável com o nome do campo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18153
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Como usar um campo sem nome pré-definido?

Mensagempor sergiosouzalima » 23 Ago 2021 11:13

Olá!

Conheço melhor o banco Oracle, mas você pode procurar pelos termos "dynamic sql" e/ou "bind variables"
para Oracle ou outros SGBDs.

Não testei, mas em Oracle seria algo assim:

CREATE OR REPLACE PROCEDURE UPDATE_ITEM (ieqt NUMBER) IS
   sql_stmt  VARCHAR2(200);
BEGIN
  sql_stmt := 'UPDATE JPITEM SET IEQTD'|| TO_CHAR(ieqt) || '= IEQTD' || TO_CHAR(ieqt) || ' - 210.40 WHERE IDPRODUTO = 123';

  EXECUTE IMMEDIATE sql_stmt;

  EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE ('Error!');
END UPDATE_ITEM;
/


Mas mesmo assim, se pensarmos em query dinâmicas, você poderia enviar a query inteira do Harbour para seu SGBD
e executar a query dentro de uma procedure de banco, por exemplo.

Mas é só uma ideia.

Abraços.
sergiosouzalima
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 48
Data de registro: 26 Out 2020 11:25
Cidade/Estado: São Paulo / SP
Curtiu: 1 vez
Mens.Curtidas: 4 vezes




Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 8 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro