PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 25 → [RESOLVIDO] Procedimento Recursivo com HExecuteSQLQuery
[RESOLVIDO] Procedimento Recursivo com HExecuteSQLQuery
Débuté par Willian Fernando, 06 déc. 2015 15:34 - 5 réponses
Membre enregistré
123 messages
Popularité : +46 (46 votes)
Posté le 06 décembre 2015 - 15:34
Para quem vai trabalhar com algum procedimento Recursivo (um bom exemplo seria uma tabela com os menus do sistema)
Onde si faz uma recursividade em busca dos Filhos de cada menu (apenas um exemplo), fica aqui a dica na hora de executar o HExecuteSQLQuery

Si você executar o HExecuteSQLQuery com o mesmo nome de DATA SOURCE como Parâmetro, vai ser lançado um erro pois o DATA SOURCE é compartido na mesma seção, ou seja ele fica compartido nas execuções.

Sendo assim si eu tiver um DATA SOURCE com o nome de DS_MENUS e ele estiver no procedimento Recursivo a cada chamada Recursiva ele será Sobrescrito pela última chamada feita pelo HExecuteSQLQuery

Para solucionar isso tem que dar um nome UNICO ao DATA SOURCE , como fazemos muito simples


//Vamos exemplificar com este procedimento
Procedure menus(n_id_menu_parent is int,nIvel is int) //Procedimento com chamada recursiva
s_sql is string
s_sql = "call f_menus("+n_id_menu_parent+")" //Aqui esta sendo feito com MySQL
ds_menus is Data Source //Nome do Data Source ficando Generico
ds_menus = "ds_" + DateSys() + TimeSys() + GetIdentifier() //Agora dando um valor UNICO em todo o sistema para este datasource
HExecuteSQLQuery(ds_menus,conn_mysql,hQueryDefault+hQueryWithoutCorrection,s_sql)
HReadFirst(ds_menus)
WHILE HFound(ds_menus)
//.......TODO MEU CODIGO DE VALIDAÇÃO DO MENU
menus(ds_menus.id_menu,nIvel + 1) //CHAMADA RECURSIVA
HReadNext(ds_menus) //PROXIMA LINHA DO DATASOURCE UNICO DESTA CHAMADA , INDEPENDENDE DA CHAMADA QUE DEU ORIGEN A RECURISVIDADE
END
Membre enregistré
3 659 messages
Popularité : +175 (223 votes)
Posté le 07 décembre 2015 - 15:02
Ótimo exemplo!!!

Parabéns!

--
Adriano Jose Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
______________________________________________
Membre enregistré
123 messages
Popularité : +46 (46 votes)
Posté le 07 décembre 2015 - 18:53
Membre enregistré
3 659 messages
Popularité : +175 (223 votes)
Posté le 07 novembre 2016 - 12:16
Manual do comando:

http://help.windev.com/en-US/…

Para ter certeza que nao vai ter duplicados e vai incluir com segurança use:

hQueryWithoutCorrection

hQueryWithoutHFCorrection

hCheckDuplicates

hCheckIntegrity

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membre enregistré
3 659 messages
Popularité : +175 (223 votes)
Posté le 03 février 2017 - 14:43
Exemplo

Procedure Existdatabase(TOKEN, CNPJ)

ok is boolean = False

Resultado, Msg is string = ""

IF TOKEN = GloToken AND CNPJ <> "" AND Length(CNPJ) = 14 AND IsNumeric(CNPJ) = True

OkConn is boolean = HConnectionOpen(ConnModel)

IF OkConn = True THEN

SQL_Exec is string = [
sp_roteiroinicial01_existdatabase '@CNPJ@'
]

SQL_Exec = Replace(SQL_Exec,"@CNPJ@",CNPJ,IgnoreCase+WholeWord) //Instrucao SQL

QryAdriano is Data Source

ok = HExecuteSQLQuery(QryAdriano, ConnModel,hQueryWithoutCorrection, SQL_Exec) // <---Obrigatorio ter hQueryWithoutCorrection

Resultado = ErrorInfo() + " " + HErrorInfo()


IF ok = True THEN

// Read the first record of the query
HReadFirst(QryAdriano)
WHILE NOT HOut()
// Process on the query record
Msg = QryAdriano.Existe
// Read the next record
HReadNext()
END
HFreeQuery(QryAdriano)

END


ELSE
Msg = "Erro de conexão com o servidor"
END

ELSE

Msg = "Token errado ou CNPJ errado"

END

RESULT (Msg)


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Message modifié, 03 février 2017 - 14:45
Membre enregistré
123 messages
Popularité : +46 (46 votes)
Posté le 03 février 2017 - 18:41
Mas este exemplo não se aplica ao Tópico em sí

BOLLER a écrit :
Exemplo

Procedure Existdatabase(TOKEN, CNPJ)

ok is boolean = False

Resultado, Msg is string = ""

IF TOKEN = GloToken AND CNPJ <> "" AND Length(CNPJ) = 14 AND IsNumeric(CNPJ) = True

OkConn is boolean = HConnectionOpen(ConnModel)

IF OkConn = True THEN

SQL_Exec is string = [
sp_roteiroinicial01_existdatabase '@CNPJ@'
]

SQL_Exec = Replace(SQL_Exec,"@CNPJ@",CNPJ,IgnoreCase+WholeWord) //Instrucao SQL

QryAdriano is Data Source

ok = HExecuteSQLQuery(QryAdriano, ConnModel,hQueryWithoutCorrection, SQL_Exec) // <---Obrigatorio ter hQueryWithoutCorrection

Resultado = ErrorInfo() + " " + HErrorInfo()


IF ok = True THEN

// Read the first record of the query
HReadFirst(QryAdriano)
WHILE NOT HOut()
// Process on the query record
Msg = QryAdriano.Existe
// Read the next record
HReadNext()
END
HFreeQuery(QryAdriano)

END


ELSE
Msg = "Erro de conexão com o servidor"
END

ELSE

Msg = "Token errado ou CNPJ errado"

END

RESULT (Msg)


--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Message modifié, 03 février 2017 - 10:45


--
Atte. Willian Fernando