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.
Existe algo parecido para o TCSQLExec, Insert, Update e Delete?
Bom dia Izaias, como assim?
Qual é a sua ideia? Existem as rotinas padrões do AdvPL, como RecLock, DbDelete, etc…
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
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.