Como usar um campo sem nome pré-definido?

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como usar um campo sem nome pré-definido?

Mensagem por JoséQuintas »

Código: Selecionar todos

         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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
sergiosouzalima
Usuário Nível 1
Usuário Nível 1
Mensagens: 48
Registrado em: 26 Out 2020 11:25
Localização: São Paulo / SP

Como usar um campo sem nome pré-definido?

Mensagem por sergiosouzalima »

Olá!

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

Veja os exemplos.

Código: Selecionar todos

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:

Código: Selecionar todos

==== 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
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como usar um campo sem nome pré-definido?

Mensagem por JoséQuintas »

É 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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
sergiosouzalima
Usuário Nível 1
Usuário Nível 1
Mensagens: 48
Registrado em: 26 Out 2020 11:25
Localização: São Paulo / SP

Como usar um campo sem nome pré-definido?

Mensagem por sergiosouzalima »

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:

Código: Selecionar todos

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.
Responder