Vídeo Aula – AdvPL 008 – Manipulação de Banco de Dados

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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

4 Responses

  1. Marcelo Cecilio da Silva disse:

    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.

    • Dan_Atilio disse:

      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")
      EndIf
      

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

  2. Marcelo disse:

    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.

Deixe uma resposta

Terminal de Informação