Vídeo Aula – AdvPL 012 – Consultas SQL

Olá pessoal…

Na vídeo aula de hoje, vou falar um pouco consultas SQL utilizando ADVPL (exemplo de Embedded SQL e TCQuery).


Abaixo o exemplo de Embedded SQL:

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zEmbedd
Exemplo de utilização do Embedded SQL
@author Atilio
@since 29/11/2015
@version 1.0
	@example
	u_zEmbedd()
/*/

User Function zEmbedd()
	Local aArea := GetArea()
	
	//Construindo a consulta
	BeginSql Alias "SQL_SB1"
		//COLUMN F3_ENTRADA AS DATE //Deve se usar isso para transformar o campo em data  
		Select	
			B1_COD,
			B1_DESC
		FROM
			%table:SB1% SB1 
		WHERE
			SB1.%notDel%
			AND B1_MSBLQL != '1'			
	EndSql   
	
	//Percorrendo os registros
	While ! SQL_SB1->(EoF())
		ConOut("# SQL_SB1: " + SQL_SB1->B1_COD + "|" + SQL_SB1->B1_DESC)
	
		SQL_SB1->(DbSkip())
	EndDo
	
	SQL_SB1->(DbCloseArea())
	RestArea(aArea)
Return

Abaixo o código fonte do TCQuery:

//Bibliotecas
#Include "Protheus.ch"
#Include "TopConn.ch"

//Constantes
#Define STR_PULA		Chr(13) + Chr(10)

/*/{Protheus.doc} zTCQuery
Exemplo de manipulação de query via AdvPL
@author Atilio
@since 29/11/2015
@version 1.0
	@example
	u_zTCQuery()
/*/

User Function zTCQuery()
	Local aArea	:= GetArea()
	Local cQuery	:= ""
	
	//Montando a Consulta... Tentem evitar o SELECT * pois isso pode travar o TOPCONN
	cQuery := " SELECT "								+ STR_PULA
	cQuery += "   B1_COD AS CODIGO, "				+ STR_PULA
	cQuery += "   B1_DESC AS DESCRI "				+ STR_PULA
	cQuery += " FROM "								+ STR_PULA
	cQuery += "   "+RetSQLName("SB1")+" SB1 "		+ STR_PULA
	cQuery += " WHERE "								+ STR_PULA
	cQuery += "   SB1.D_E_L_E_T_ = '' "			+ STR_PULA
	cQuery += "   AND B1_MSBLQL != '1' "			+ STR_PULA
	cQuery := ChangeQuery(cQuery)
	
	//Executando consulta
	TCQuery cQuery New Alias "QRY_SB1"
	//TCSetField('QRY_SB1', 'CAMPO_DATA', 'D')
	
	//Percorrendo os registros
	While ! QRY_SB1->(EoF())
		ConOut("> QRY_SB1: " + QRY_SB1->CODIGO + "|" + QRY_SB1->DESCRI)
	
		QRY_SB1->(DbSkip())
	EndDo
	
	QRY_SB1->(DbCloseArea())
	RestArea(aArea)
Return

Se quiser fazer o download desses códigos ou do conteúdo mostrado na vídeo aula, acesse nosso GitHub pelo link github.com/dan-atilio/AdvPL (Exemplos > Vídeo Aulas > 012 – Consultas SQL).

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. Izaias Arruda disse:

    Existe algo parecido para o TCSQLExec, Insert, Update e Delete?

  2. Marcelo Cecilio da Silva disse:

    Salve, salve Daniel Atílio!!
    Boa tarde td bem?
    Seguinte precisei criar uma tela para alterar o fornecedor do pedido de compras usando o MSDIALOG, e consegui esse fonte procurando pela net. Mas a questão que estava mt lento para buscar as informações no banco, pois a questão é que o fonte estava usando funções de manipulação de dados como DbSelectArea, DbSeek e um While para percorrer os registro. Dai resolvi implementar uma função SQL para agilizar a consulta, onde cheguei até aqui nesta video aula de consulta sql e usei a consulta Embedded SQL e deu tudo certo. Mas a questão é que o fonte era só para fazer uma consulta no banco e trazer as informações pra tela, e eu preciso fazer uma alteração no banco. Ai que começou a surra, pois conheço pouco sobre o MSDIALOG. Eu gostaria de usar uma função estatica (ProcuraPed(cPed)) para trazer o pedido e trazer para tela o pedido e o fornecedor atual para a tela e outra função (AltFor(cFor)) para fazer a alteração do fornecedor e mostrar uma mensagem na tela tipo:

    MSGINFO(“Fornecedor alterado com sucesso para:” + STR_PULA + SQL_FOR->C7_FORNECE + STR_PULA + “Do Pedido: ” + cPed)

    Mas não consigo criar essa linha no MSDIALOG: ” ACTION (AltFor(cFor)) ENABLE OF oDlg ”

    Segue o fonte para entender:

    //Bibliotecas
    #INCLUDE “PROTHEUS.CH”

    //Constantes
    #Define STR_PULA Chr(13) + Chr(10)

    user function xConf()
    /*
    cUsrAux := “”
    cPswAux := “”

    //Montando uma seção, para empresa 01 e filial 0101, apenas para fazer o login
    //RPCSetType(3)
    //RPCSetEnv(“01”, “01”, “”, “”, “”)

    //Verificando se o login deu certo
    If u_zLogin(@cUsrAux, @cPswAux)
    if select(“SX2”) == 0
    //Limpando o ambiente atual e criando novamente
    RPCClearEnv()
    RPCSetType(3)
    RPCSetEnv(“01”, “01”, cUsrAux, cPswAux, “SIGACOM”)

    //Chamando rotinas abaixo
    //…
    EndIf
    EndIf
    */
    private cTitulo := “** Altera fornecedor do Pedido de compras **” //titulo da janela
    private cTexto := “Informe o Pedido” //Label
    private cTexto2 := “informe o novo Fornecedor” //Label
    private cPed := CriaVar(“C7_NUM”,.T.) //Cria variavel conforme tamanho na tabela sx3
    private cFor := CriaVAr(“C7_FORNECE”,.T.) //Cria variavel conforme tamanho na tabela sx3
    DEFINE MSDIALOG oDlg TITLE cTitulo FROM 000,000 TO 150,350 PIXEL //monta janela

    //posicionamento dos objetos

    @005,005 TO 050,160 OF oDlg PIXEL //borda interna
    @015,006 SAY cTexto SIZE 060,015 OF oDlg PIXEL //label
    @012,075 MSGET cPed SIZE 055,011 OF oDlg PIXEL //caixa de texto
    @025,006 SAY cTexto2 SIZE 060,015 OF oDlg PIXEL //Label
    @025,075 MSGET cFor SIZE 055,011 OF oDlg PIXEL //caixa de texto

    DEFINE SBUTTON FROM 050,025 TYPE 1;
    ACTION (ProcuraPed(cPed)) ENABLE OF oDlg
    DEFINE SBUTTON FROM 050,100 TYPE 2;
    ACTION (oDlg:End()) ENABLE OF oDlg //recebe opcao 0 e fecha, porem continua a execuçao

    // ACTION (AltFor(cFor)) ENABLE OF oDlg //Função para alterar o fornecedor do pedido selecionado na funçao ProcuraPed

    ACTIVATE MSDIALOG oDlg CENTERED

    RETURN

    static function ProcuraPed(cPed)
    Local aArea := GetArea()
    /* Local cTmp := “”
    DbSelectArea(“SC7”)
    SC7->(DbSetOrder(1))
    SC7->(DbGoTop())

    if SC7->(DbSeek(FWxFilial(“SC7”) + cPed))
    cTmp := C7_FORNECE
    MSGINFO(“Fornecedor atual do Pedido: ” + cPed + ” –>> ” + cTmp)
    EndIf

    SC7->(DbSkip())
    */
    BeginSql Alias “SQL_SC7”

    // update %table:SC7% set C7_FORNECE = %Exp:cFor% where C7_NUM = %Exp:cPed%

    Select C7_NUM,
    C7_FORNECE
    FROM %table:SC7% SC7
    WHERE C7_NUM = %Exp:cPed%

    EndSql
    MSGINFO(“Fornecedor atual do Pedido: ” + cPed + ” –>> ” + “>> ” + SQL_SC7->C7_FORNECE + ” <(DbSetOrder(1))
    SC7->(DbGoTop())
    if SC7->(DbSeek(FWxFilial(“SC7”) + cPed))

    MSGINFO(“Fornecedor alterado com sucesso para:” + STR_PULA + C7_FORNECE + STR_PULA + “Do Pedido: ” + cPed)
    Else

    Alert(” Erro!”)

    EndIf

    SC7->(DbSkip())
    */
    SQL_SC7->(DbCloseArea())
    RestArea(aArea)

    Return

    static function AltFor(cFor)

    Local aAreaf := GetArea()

    BeginSql Alias “SQL_FOR”

    update %table:SC7%
    set C7_FORNECE = %Exp:cFor%
    where C7_NUM = %Exp:cPed%

    EndSql

    MSGINFO(“Fornecedor alterado com sucesso para:” + STR_PULA + SQL_FOR->C7_FORNECE + STR_PULA + “Do Pedido: ” + cPed)

    SQL_FOR->(DbCloseArea())
    RestArea(aAreaf)

    return

    • Dan_Atilio disse:

      Boa noite Marcelo, tudo bem?
      Acho que talvez você teria que capturar o RecNo da SC7, e depois percorrer alterando.
      Ressalto que campos chaves são sensíveis e deve ser evitado a alteração neles.
      Caso queira, me adicione no skype, ai posso te ajudar a montar a funcionalidade.
      Um grande abraço.

Deixe uma resposta

Terminal de Informação