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.