Página 1 de 1

Como usar um campo sem nome pré-definido?

Enviado: 19 Ago 2021 19:50
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?

Como usar um campo sem nome pré-definido?

Enviado: 23 Ago 2021 09:43
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

Como usar um campo sem nome pré-definido?

Enviado: 23 Ago 2021 10:41
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.

Como usar um campo sem nome pré-definido?

Enviado: 23 Ago 2021 11:13
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.