Olá pessoal…
Na vídeo aula de hoje, vou falar um pouco sobre Manipulação de Banco de Dados em AdvPL (DbSkip, Eof, DbSelectArea, etc).
Abaixo os links do TDN sobre o assunto:
Funções genéricas
Abaixo o código fonte utilizado para os testes:
//Bibliotecas
#Include "Protheus.ch"
/*/{Protheus.doc} zBanco
Exemplo de manipulação de Banco de Dados via AdvPL
@author Atilio
@since 15/11/2015
@version 1.0
@example
u_zBanco()
/*/
User Function zBanco()
Local aArea := GetArea()
Local aAreaB1 := SB1->(GetArea())
Local cMens := ""
//Se a tabela já estiver posicionada
If Select("SB1") > 0
MsgStop("Tabela SB1 já está aberta!", "Atenção")
EndIf
//Selecionando a tabela de produtos
DbSelectArea("SB1")
SB1->(DbSetOrder(1)) // B1_FILIAL+B1_COD
SB1->(DbGoTop())
//Posicionando no produto de código F00002
If SB1->(DbSeek(FWxFilial("SB1") + "F00002"))
Alert(SB1->B1_DESC)
EndIf
//Agora, percorro todos os registros e adiciono a descrição em uma variável
SB1->(DbGoTop())
While !SB1->(EoF())
cMens += Alltrim(SB1->B1_DESC)+";"+Chr(13)+Chr(10)
SB1->(DbSkip())
EndDo
//Mostrando a mensagem
Aviso('Atenção', cMens, {'OK'}, 03)
RestArea(aAreaB1)
RestArea(aArea)
Return
/*
O ideal de usar referências:
Modo Errado:
DbSelectArea("SB1")
While ! EoF()
//Tratamentos para o relatório....
DbSelectArea("SB2")
//Pega o saldo do produto
DbSkip()
EndDo
Modo Certo:
DbSelectArea("SB1")
DbSelectArea("SB2")
//Referencia a tabela de produtos
While ! SB1->(EoF())
//Tratamentos para o relatório....
DbSelectArea("SB2")
//Pega o saldo do produto
SB1->(DbSkip())
EndDo
*/
Se quiser fazer o download desse código ou do conteúdo mostrado na vídeo aula, acesse nosso GitHub pelo link github.com/dan-atilio/AdvPL (Exemplos > Vídeo Aulas > 008 – Manipulação de Banco de Dados).
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Salve, salve Daniel Atilio! Tudo bem?
Primeiramente parabéns pelas aulas e sua didática.
Gostaria só de fazer uma pergunta, talvez seja até boba, mas é uma curiosidade.
Existe a possibilidade de executar o codigo fonte de manipulação de banco de dados direto pelo devstudio, sem a necessidade de abrir o sigamdi e executar o formulas ou o lançamentos padrão no p12?
Eu sei que tem como por exemplo testar variaveis de codigo fonte colocando o nome da função no lugar do sigamdi la barra de debug.
Att.
Grande Marcelo, tudo bem graças a Deus e você?
Sim, existe uma forma, primeiro precisamos entender, o motivo de conseguir testar apenas dentro do Protheus aberto (Fórmulas / Lançamento Padrão / etc). O Protheus quando você abre ele, ele carrega a base para utilizar o dicionário de campos (SX2 e SX3), índices (SIX), parâmetros (SX6), gatilhos (SX7), tipo de conexão com o banco (DBAccess), usuários (SIGAPSS), profile dentre tantas outras coisas.
Por isso que a conexão com o banco já estaria “pré-carregada”, e você poderia usar tranquilamente. Portanto, para usar direto no debug uma função que usa banco, você precisa “pré-carregar” essas informações, e para isso, você precisa usar o comando RPCSetEnv no começo do seu fonte, por exemplo:
//Se a SX2 não estiver carregada, o Protheus não foi aberto (SIGAMDI, SIGAADV, etc) If Select("SX2") == 0 //Preparamos o ambiente para a empresa 01, filial 0101, usuário XPTO, senha XPTO123 e o módulo do estoque RPCSetType(3) RPCSetEnv("01", "0101", "XPTO", "XPTO123", "SIGAEST") EndIfColocando esse comando, logo no começo da sua user function, ele vai “pré-carregar”, simulando como se você tivesse aberto o Protheus manualmente. Se quiser ver um exemplo, segue o link – https://terminaldeinformacao.com/2016/03/15/tela-de-autenticacao-customizada-protheus/
Ressalto que para telas, o mesmo acontece quando usamos grid.
Um grande abraço.
Grande Dan Atilio!!!!
Que legal essa função, nao conhecia essa opção. Vivendo e aprendendo com quem sabe.
Muito obrigado pelo esclarecimento!
Grande abraço e fique com Deus.
Eu que agradeço Marcelo.
Um grande abraço jovem.