programação_advpl2_p10_2009

Embed Size (px)

Citation preview

Todos os direitos reservados.0800 709 8100 totvs.com PPR RO OG GR RA AM MA A O OAADDVVPPLL IIII

Todos os direitos reservados.0800 709 8100 totvs.com 1.OBJETIVOS DO CURSO........................................................................................ 6 2.MDULO 04: DESENVOLVENDO APLICAES EM ADVPL................................... 7 3.A LINGUAGEM ADVPL....................................................................................... 7 4.ESTRUTURA DE UM PROGRAMA ADVPL ............................................................. 9 2.1reas de um Programa ADVPL.............................................................................. 12 5.DECLARAO E ATRIBUIO DE VARIVEIS ....................................................... 15 2.2Tipo de Dados.............................................................................................................. 15 2.3Declarao de variveis............................................................................................ 16 2.4Escopo de variveis.................................................................................................... 17 2.5Entendendo a influncia do escopo das variveis ......................................... 23 6.REGRAS ADICIONAIS DA LINGUAGEM ADVPL.................................................... 24 2.6Palavras reservadas.................................................................................................... 24 2.7Pictures de formatao disponveis..................................................................... 25 7.PROGRAMAS DE ATUALIZAO......................................................................... 26 2.8Modelo1() ou AxCadastro()..................................................................................... 27 2.9Mbrowse()...................................................................................................................... 30 2.9.1AxFunctions()................................................................................................................ 37 2.9.2FilBrowse() ..................................................................................................................... 39 2.9.3EndFilBrw()..................................................................................................................... 39 2.9.4PesqBrw() ....................................................................................................................... 40 2.9.5BrwLegenda () .............................................................................................................. 40 2.10MarkBrowse() ............................................................................................................... 44 2.10.1Funes de Apoio....................................................................................................... 45 2.11Modelo2() ...................................................................................................................... 50 2.11.1Componentes de uma tela no formato Modelo 2......................................... 50 2.11.2Estrutura de um programa utilizando a Modelo2()....................................... 58 2.11.3Funo Modelo2() ...................................................................................................... 73 2.12Modelo3() ...................................................................................................................... 77 2.12.1Estrutura de um programa utilizando a Modelo3()....................................... 81 2.12.2Funo Modelo3() ...................................................................................................... 92 8.ARQUIVOS E NDICES TEMPORRIOS ................................................................. 97 Programao ADVPL II e Guia de RefernciaPgina 3 2.13Utilizao de arquivos e ndices temporrios.................................................. 97 2.14Funes para manipulao de arquivos e ndices temporrios................ 97 2.14.1CriaTrab() ....................................................................................................................... 97 2.14.2dbUseArea() .................................................................................................................. 97 2.14.3IndRegua() ..................................................................................................................... 98 2.15Funes Auxiliares para Arquivos de Trabalho e Temporrios ................. 99 9.RELATRIOS NO GRFICOS ........................................................................... 103 2.16Funes Utilizadas para Desenvolvimento de Relatrios..........................103 2.16.1SetPrint() ......................................................................................................................103 2.16.2SetDefault() .................................................................................................................104 2.16.3RptStatus()...................................................................................................................105 2.16.4CABEC().........................................................................................................................106 2.16.5RODA() ..........................................................................................................................107 2.16.6Pergunte()....................................................................................................................107 2.16.7AjustaSX1() ..................................................................................................................107 2.16.8PutSX1() ........................................................................................................................109 2.17Estrutura de Relatrios Baseados na SetPrint() .............................................111 10.MANIPULAO DE ARQUIVOS I ....................................................................... 123 2.18Gerao e leitura de arquivos em formato texto .........................................123 2.18.11 Famlia de funes de gravao e leitura de arquivos texto..............124 2.18.22 Famlia de funes de gravao e leitura de arquivos texto..............136 11.OFICINA DE PROGRAMAO I ......................................................................... 142 2.19Interfaces com sintaxe clssica............................................................................142 2.20Rguas de processamento....................................................................................146 2.20.1RptStatus()...................................................................................................................146 2.20.2Processa().....................................................................................................................151 2.20.3MsNewProcess(). .......................................................................................................155 2.20.4MsAguarde(). ..............................................................................................................159 2.20.5MsgRun()......................................................................................................................161 2.21ListBox() ........................................................................................................................164 2.21.1ListBox simples ..........................................................................................................164 2.21.2ListBox mltiplas colunas.......................................................................................167 2.22ScrollBox()....................................................................................................................171 2.23ParamBox() ..................................................................................................................176 MDULO 05: INTRODUO A ORIENTAO OBJETOS.......................................... 184 Pgina 4Programao ADVPL II e Guia de Referncia12.CONCEITOS DE ORIENTAO OBJETOS .......................................................... 184 2.24Definies.................................................................................................................... 184 2.25Conceitos Bsicos..................................................................................................... 187 2.26O Modelo de Objetos (OMT)............................................................................... 189 2.26.1Objetos e Classes ..................................................................................................... 189 2.26.2Atributos...................................................................................................................... 190 2.26.3Operaes e Mtodos............................................................................................ 191 2.26.4Sugestes de desenvolvimento.......................................................................... 192 13.ORIENTAO A OBJETOS EM ADVPL .............................................................. 193 2.27Sintaxe e operadores para orientao a objetos ......................................... 193 2.28Estrutura de uma classe de objetos em ADVPL............................................ 196 2.29Implementao dos mtodos de uma classe em ADVPL ......................... 197 MDULO 06: ADVPL ORIENTADO OBJETOS I .................................................... 203 14.COMPONENTES DA INTERFACE VISUAL DO ADVPL........................................... 203 2.30Particularidades dos componentes visuais..................................................... 211 2.30.1Configurando as cores para os componentes .............................................. 211 15.APLICAES COM A INTERFACE VISUAL DO ADVPL.......................................... 212 2.31Captura de informaes simples (Multi-Gets) .............................................. 213 2.31.1Enchoice().................................................................................................................... 214 2.31.2MsMGet()..................................................................................................................... 216 2.32Captura de mltiplas informaes (Multi-Lines) .......................................... 219 2.32.1MsGetDB()................................................................................................................... 220 2.32.2MsGetDados()............................................................................................................ 225 2.32.3MsNewGetDados()................................................................................................... 230 2.33Barras de botes....................................................................................................... 242 2.33.1EnchoiceBar() ............................................................................................................. 243 2.33.2TBar()............................................................................................................................. 245 2.33.3ButtonBar .................................................................................................................... 247 2.33.4Imagens pr-definidas para as barras de botes ........................................ 251 APNDICE.............................................................................................................. 252 BOAS PRTICAS DE PROGRAMAO ....................................................................... 252 16.ARREDONDAMENTO....................................................................................... 252 17.UTILIZAO DE IDENTAO............................................................................ 253 Programao ADVPL II e Guia de RefernciaPgina 5 18.CAPITULAO DE PALAVRAS-CHAVE............................................................... 254 2.34Palavras em maisculo........................................................................................... 255 19.UTILIZAO DA NOTAO HNGARA............................................................. 256 20.TCNICAS DE PROGRAMAO EFICIENTE .......................................................... 256 GUIA DE REFERNCIA RPIDA: FUNES E COMANDOS ADVPL........................ 269 Converso entre tipos de dados ............................................................................................ 269 Matemticas................................................................................................................................... 272 Anlise de variveis ..................................................................................................................... 276 Manipulao de arrays............................................................................................................... 277 Manipulao de blocos de cdigo........................................................................................ 288 Manipulao de strings ............................................................................................................. 291 Manipulao de data / hora .................................................................................................... 306 Manipulao de variveis numricas.................................................................................... 314 Manipulao de arquivos.......................................................................................................... 318 Manipulao de arquivos e ndices temporrios............................................................. 350 Manipulao de bases de dados............................................................................................ 352 Controle de numerao seqencial ...................................................................................... 400 Validao 401 Manipulao de parmetros do sistema............................................................................. 404 Controle de impresso............................................................................................................... 407 Controle de processamentos................................................................................................... 421 Utilizao de recursos do ambiente ERP............................................................................. 434 Componentes da interface visual........................................................................................... 465 Interfaces de cadastro................................................................................................................ 473 Interfaces visuais para aplicaes .......................................................................................... 477 Recursos das interfaces visuais............................................................................................... 480 Pgina 6Programao ADVPL II e Guia de Referncia 1.Objetivos do Curso Objetivos especficos do curso: Aofinaldocursootreinandodeverterdesenvolvidoosseguintesconceitos, habilidades e atitudes: a) Conceitos a serem aprendidos estruturas para implementao de relatrios e programas de atualizao estruturas para implementao de interfaces visuais princpios do desenvolvimento de aplicaes orientadas a objetos b) Habilidades e tcnicas a serem aprendidas desenvolvimento de aplicaes voltadas ao ERP Protheus anlise de fontes de mdia complexidade desenvolvimento de aplicaes bsicas com orientao a objetos c) Atitudes a serem desenvolvidas adquirirconhecimentosatravsdaanlisedosfuncionalidades disponveis no ERP Protheus; estudar a implementao de fontes com estruturas orientadas a objetos em ADVPL; embasar a realizao de outros cursos relativos a linguagem ADVPL Programao ADVPL II e Guia de RefernciaPgina 7 2.MDULO 04: Desenvolvendo aplicaes em ADVPL 3.A linguagem ADVPL ALinguagemADVPLteveseuincioem1994,sendonaverdadeumaevoluona utilizao de linguagens no padro xBase pela MicrosigaSoftware S.A. (Clipper, Visual ObjectsedepoisFiveWin).ComacriaodatecnologiaProtheus,eranecessriocriar uma linguagem que suportasse opadro xBase para a manuteno de todoo cdigo existentedosistemadeERPSigaAdvanced.Foi,ento,criadaalinguagemchamada Advanced Protheus Language. OADVPLumaextensodopadroxBasedecomandosefunes,operadores, estruturas de controle de fluxo e palavras reservadas, contando tambm com funes e comandos disponibilizados pela Microsiga que a torna uma linguagem completa para a criao de aplicaes ERP prontas para a Internet. Tambm uma linguagem orientada a objetos e eventos, permitindo ao programador desenvolver aplicaes visuais e criar suas prprias classes de objetos. Quandocompilados,todososarquivosdecdigotornam-seunidadesdeinteligncia bsicas, chamados APOs (de Advanced Protheus Objects). Tais APOs so mantidos em umrepositrioecarregadosdinamicamentepeloPROTHEUSServerparaaexecuo. Como no existe a linkedio, ou unio fsica do cdigo compilado a um determinado mduloouaplicao,funescriadasemADVPLpodemserexecutadasemqualquer ponto do ambiente Advanced Protheus. OcompiladoreointerpretadordalinguagemADVPLoprprioservidorPROTHEUS (PROTHEUSServer),eexisteumambientevisualparadesenvolvimentointegrado (PROTHEUSIDE) onde o cdigo pode ser criado, compilado e depurado. OsprogramasemADVPLpodemcontercomandosoufunesdeinterfacecomo usurio.Deacordocomtalcaracterstica,taisprogramassosubdivididosnas seguintes categorias: Programao Com Interface Prpria com o Usurio Nesta categoria entram os programas desenvolvidos para serem executados atravs do terminalremotodoProtheus:oProtheusRemote.OProtheusRemoteaaplicao encarregadadainterfaceedainteraocomousurio,sendoquetodoo processamento do cdigo em ADVPL, o acesso ao banco de dados e o gerenciamento de conexes efetuado no Protheus Server. O Protheus Remote o principal meio de acesso a execuo de rotinas escritas em ADVPL no Protheus Server, e por isso permite executarqualquertipodecdigo,tenhaeleinterfacecomousurioouno.Porm, Pgina 8Programao ADVPL II e Guia de Referncianestacategoria,soconsideradosapenasosprogramasquerealizamalgumtipode interface remota utilizando o protocolo de comunicao do Protheus. Podem-se criar rotinas para a customizao do sistema ERP Microsiga Protheus, desde processosadicionaisatrelatrios.Agrandevantagemaproveitartodooambiente montadopelosmdulosdoERPMicrosigaProtheus.Porm, comoADVPL,possvel at mesmo criar toda uma aplicao, ou mdulo, desde o comeo. Todo o cdigo do sistema ERP Microsiga Protheus escrito em ADVPL. Programao Sem Interface Prpria com o Usurio Asrotinascriadasseminterfacesoconsideradasnestacategoriaporquegeralmente tm uma utilizao mais especfica do que um processo adicional ou um relatrio novo. TaisrotinasnotminterfacecomousurioatravsdoProtheusRemote,equalquer tentativa nesse sentido (como a criao de uma janela padro) ocasionar uma exceo emtempodeexecuo.Estasrotinassoapenasprocessos,ouJobs,executadosno ProtheusServer.Algumasvezes,ainterfacedestasrotinasficaacargodeaplicaes externas,desenvolvidasemoutraslinguagens,quesoresponsveisporiniciaros processosnoservidorProtheusatravsdosmeiosdisponveisdeintegraoe conectividade no Protheus. De acordo com a utilizao e com o meio de conectividade utilizado, estas rotinas so subcategorizadas assim: EProgramao por Processos RotinasescritasemADVPLpodemseriniciadascomoprocessosindividuais(sem interface)noProtheusServeratravsdeduasmaneiras:Iniciadasporoutrarotina ADVPLatravsdachamadadefunescomoStartJob()ouCallProc()ouiniciadas automaticamentenainicializaodoProtheusServer(quandopropriamente configurado). EProgramao de RPC AtravsdeumabibliotecadefunesdisponvelnoProtheus(umaAPIde comunicao), podem-se executar rotinas escritas em ADVPL diretamente no Protheus Server,atravsdeaplicaesexternasescritasemoutraslinguagens.Istooquese chama de RPC (de Remote Procedure Call, ou Chamada de Procedimentos Remota). OservidorProtheustambmpodeexecutarrotinasemADVPLemoutrosservidores ProtheusatravsdeconexoTCP/IPdireta,utilizandooconceitodeRPC.Domesmo modo, aplicaes externas podemrequisitar aexecuo de rotinas escritas em ADVPL atravs de conexo TCP/IP direta. Programao ADVPL II e Guia de RefernciaPgina 9 EProgramao Web O Protheus Server pode tambm ser executado como um servidor Web, respondendo a requisiesHTTP.Nomomentodestasrequisies,podeexecutarrotinasescritasem ADVPLcomoprocessosindividuais,enviandooresultadodasfunescomoretorno dasrequisiesparaoclienteHTTP(comoporexemplo,umBrowserdeInternet). Qualquer rotina escrita em ADVPL que no contenha comandos de interface pode ser executadaatravsderequisiesHTTP.OProtheuspermiteacompilaodearquivos HTML contendo cdigo ADVPL embutido. So os chamados arquivos ADVPL ASP, para a criao de pginas dinmicas. EProgramao TelNet TelNet parte da gama de protocolos TCP/IP que permite a conexo a um computador remotoatravsdeumaaplicaoclientedesteprotocolo.OPROTHEUSServerpode emular um terminal TelNet, atravs da execuo de rotinas escritas em ADVPL. Ou seja, pode-seescreverrotinasADVPLcujainterfacefinalserumterminalTelNetouum coletor de dados mvel. 4. Estrutura de um Programa ADVPL Umprogramadecomputadornadamaisdoqueumgrupodecomandos logicamente dispostos com o objetivo de executar determinada tarefa. Esses comandos so gravados em um arquivo texto que transformado em uma linguagem executvel porumcomputadoratravsdeumprocessochamadocompilao.Acompilao substitui os comandos de alto nvel (que os humanos compreendem) por instrues de baixo nvel (compreendida pelo sistema operacional em execuo no computador). No casodoADVPL,noosistemaoperacionaldeumcomputadorqueirexecutaro cdigo compilado, mas sim, o Protheus Server. Dentrodeumprograma,oscomandosefunesutilizadosdevemseguirregrasde sintaxe da linguagem utilizada. Caso contrrio, o programa ser interrompido por erros. Os erros podem ser de compilao ou de execuo. Errosdecompilaosoaquelesencontradosnasintaxequenopermitemqueo arquivo de cdigo do programa seja compilado. Podem ser comandos especificados de forma errnea, utilizao invlida de operadores, etc.. Errosdeexecuosoaquelesqueacontecemdepoisdacompilao,quandoo programa est sendo executado. Podem ocorrer por inmeras razes, mas geralmente se referem s funes no existentes, ou variveis no criadas ou inicializadas, etc.. Pgina 10Programao ADVPL II e Guia de RefernciaLinhas de Programa Aslinhasexistentesdentrodeumarquivotextodecdigodeprogramapodemser linhas de comando, linhas de comentrio ou linhas mistas. ELinhas de Comando Linhasdecomandopossuemoscomandosouinstruesqueseroexecutadas.Por exemplo: Local nCnt Local nSoma := 0 For nCnt := 1 To 10 nSoma += nCnt Next nCnt ELinhas de Comentrio Linhasdecomentriopossuemumtextoqualquer,masnosoexecutadas.Servem apenasparadocumentaoeparatornarmaisfciloentendimentodoprograma. Existem trs formas de se comentar linhas de texto. A primeira delas utilizar o sinal de * (asterisco) no comeo da linha: * Programa para clculo do total * Autor: Microsiga Software S.A. * Data: 2 de outubro de 2001 Todas as linhas iniciadas com um sinal de asterisco so consideradas como comentrio. Pode-seutilizarapalavraNOTEoudoissmbolosdaletra"e"comercial(&&)para realizarafunodosinaldeasterisco.Porm,todasestasformasdecomentriode linhassoobsoletaseexistemapenasparacompatibilizaocomopadroxBase.A melhor maneira de comentar linhas em ADVPL utilizar duas barras transversais: // Programa para clculo do total // Autor: Microsiga Software S.A. // Data: 2 de outubro de 2001 Outra forma de documentar textos utilizar as barras transversais juntamente com o asterisco, podendo-se comentar todo um bloco de texto sem precisar comentar linha a linha: /* Programa para clculo do total Autor: Microsiga Software S.A. Data: 2 de outubro de 2001 Programao ADVPL II e Guia de RefernciaPgina 11 */ Todo o texto encontrado entre a abertura (indicada pelos caracteres /*) e o fechamento (indicada pelos caracteres */) considerado como comentrio. ELinhas Mistas OADVPLtambmpermitequeexistamlinhasdecomandocomcomentrio.Isto possvel adicionando-se as duas barras transversais (//) ao final da linha de comando e adicionando-se o texto do comentrio: Local nCnt Local nSoma := 0// Inicializa a varivel com zero para a soma For nCnt := 1 To 10 nSoma += nCnt Next nCnt ETamanho da Linha Assimcomoalinhafsica,delimitadapelaquantidadedecaracteresquepodeser digitado no editor de textos utilizado, existe uma linha considerada linha lgica. A linha lgica, aquela considerada para a compilao como uma nica linha de comando. A princpio, cada linha digitada no arquivo texto diferenciada aps o pressionamento datecla.Ouseja,alinhalgica,alinhafsicanoarquivo.Porm,algumas vezes, por limitao fsica do editor de texto ou por esttica, pode-se "quebrar" a linha lgicaemmaisdeumalinhafsicanoarquivotexto.Istoefetuadoutilizando-seo sinal de ponto-e-vrgula (;). If !Empty(cNome) .And. !Empty(cEnd) .And. ; !Empty(cTel).And. !Empty(cFax) .And. ; !Empty(cEmail) GravaDados(cNome,cEnd,cTel,cFax,cEmail) Endif Neste exemplo existe uma linha de comando para a checagem das variveis utilizadas. Comoalinhatorna-semuitogrande,pode-sedivid-laemmaisdeumalinhafsica utilizando o sinal de ponto-e-vrgula. Se um sinal de ponto-e-vrgula for esquecido nas duasprimeiraslinhas,duranteaexecuodoprogramaocorrerumerro,poisa segundalinhafsicaserconsideradacomoumasegundalinhadecomandona compilao. E durante a execuo esta linha no ter sentido. Pgina 12Programao ADVPL II e Guia de Referncia 2.1reas de um Programa ADVPL Apesardenoserumalinguagemdepadresrgidoscomrelaoestruturado programa, importante identificaralgumas de suas partes.Considere o programa de exemplo abaixo:

#include protheus.ch /* +===========================================+ | Programa: Clculo do Fatorial | | Autor : Microsiga Software S.A. | | Data: 02 de outubro de 2001 | +===========================================+ */ User Function CalcFator()

Local nCnt Local nResultado := 1// Resultado do fatorial Local nFator := 5 // Nmero para o clculo

// Clculo do fatorial For nCnt := nFator To 1 Step -1 nResultado *= nCnt Next nCnt

// Exibe o resultado na tela, atravs da funo alert Alert("O fatorial de " + cValToChar(nFator) + ; " " + cValToChar(nResultado))

// Termina o programa Return A estrutura de um programa ADVPL composta pelas seguintes reas: Erea de Identificao -Declarao dos includes -Declarao da funo -Identificao do programa Erea de Ajustes Iniciais -Declarao das variveis ECorpo do Programa -Preparao para o processamento Programao ADVPL II e Guia de RefernciaPgina 13 -Processamento Erea de Encerramento rea de Identificao Estaumareaquenoobrigatriaededicadadocumentaodoprograma. Quandoexistente,contmapenascomentriosexplicandoasuafinalidade,datade criao,autor,etc.,eaparecenocomeodoprograma,antesdequalquerlinhade comando. O formato para esta rea no definido. Pode-se colocar qualquer tipo de informao desejada e escolher a formatao apropriada. #include protheus.ch

/* +==========================================+ | Programa: Clculo do Fatorial| | Autor : Microsiga Software S.A.| | Data: 02 de outubro de 2001| +==========================================+ */ User Function CalcFator() Opcionalmentepodem-seincluirdefiniesdeconstantesutilizadasnoprogramaou incluso de arquivos de cabealho nesta rea. rea de Ajustes Iniciais Nestareageralmentesefazemosajustesiniciais,importantesparaocorreto funcionamentodoprograma.Entreosajustesseencontramdeclaraesdevariveis, inicializaes,aberturadearquivos,etc..ApesardoADVPLnoserumalinguagem rgidaeasvariveispoderemserdeclaradasemqualquerlugardoprograma, aconselhvelfaz-lonestareavisandotornarocdigomaislegvelefacilitara identificao de variveis no utilizadas. Local nCnt Local nResultado := 0// Resultado do fatorial Local nFator := 10 // Nmero para o clculo Pgina 14Programao ADVPL II e Guia de RefernciaCorpo do Programa nestareaqueseencontramaslinhasdecdigodoprograma.ondeserealizaa tarefanecessriaatravsdaorganizaolgicadestaslinhasdecomando.Espera-se que as linhas de comando estejam organizadas de tal modo que no final desta rea o resultado esperado seja obtido, seja ele armazenado em um arquivo ou em variveis de memria, pronto para ser exibido ao usurio atravs de um relatrio ou na tela. // Clculo do fatorial For nCnt := nFator To 1 Step -1 nResultado *= nCnt Next nCnt Apreparaoparaoprocessamentoformadapeloconjuntodevalidaese processamentos necessrios antes da realizao do processamento em si. Avaliandooprocessamentodoclculodofatorialdescritoanteriormente,pode-se definirqueavalidaoinicialaserrealizadaocontedodavarivelnFator,poisa mesma determinar a correta execuo do cdigo. // Clculo do fatorial nFator := GetFator()// GetFator funo ilustrativa na qual a varivel recebe a informao do usurio. If nFator = '"+mv_par01+"' " cFiltro += ".And. E2_FORNECE = '"+mv_par03+"' " cFiltro += ".And. E2_TIPO = '"+Dtos(mv_par05)+"' " Pgina 116Programao ADVPL II e Guia de RefernciacFiltro += ".And. Dtos(E2_VENCTO) = '"+mv_par01+"' " cQuery += "AND E2_FORNECE = '"+mv_par03+"' " cQuery += "AND E2_TIPO = '"+Dtos(mv_par05)+"' " cQuery += "AND E2_VENCTO =mv_par01)","SA2",; "" ,"" ,"","",""}) AADD(aP,{"Tipo de","C",3,0,"G","","05" ,"" ,"" ,"","",""}) AADD(aP,{"Tipo ate","C",3,0,"G","(mv_par04>=mv_par03)","05" ,"" ,; "" ,"","",""}) AADD(aP,{"Vencimento de","D",8,0,"G","","" ,"" ,"" ,"","",""}) AADD(aP,{"Vencimento ate","D",8,0,"G","(mv_par06>=mv_par05)","" ,; "" ,"" ,"","",""}) AADD(aP,{"Aglutinar pagto.de fornec.","N",1,0,"C","","",; "Sim","No","","",""}) AADD(aP,{"Abrir planilha MS-Excel" ,"N",1,0,"C","","",; "Sim","No","","",""}) AADD(aHelp,{"Informe o cdigo do fornecedor.","inicial."}) AADD(aHelp,{"Informe o cdigo do fornecedor.","final."}) AADD(aHelp,{"Tipo de ttulo inicial."}) AADD(aHelp,{"Tipo de ttulo final."}) AADD(aHelp,{"Digite a data do vencimento inicial."}) AADD(aHelp,{"Digite a data do vencimento final."}) AADD(aHelp,{"Aglutinar os ttulos do mesmo forne-",; "cedor totalizando seus valores."}) AADD(aHelp,{"Ser gerada uma planilha para ",; "MS-Excel, abrir esta planilha?"}) For i:=1 To Len(aP) cSeq := StrZero(i,2,0) cMvPar := "mv_par"+cSeq cMvCh:= "mv_ch"+IIF(i , [ nAtributo ] ) EParmetros: cArquivoNome do arquivo a ser criado, podendo ser especificado um pacote (patch) absoluto ou relativo, para criar arquivos no ambiente local ( Remote ) ou no Servidor, respectivamente . nAtributoAtributos do arquivo a ser criado (Vide Tabela de atributos abaixo). Caso no especificado, o DEFAULT FC_NORMAL. ERetorno: Numrico A funo retornar o Handle do arquivo para ser usado nas demais funes de manuteno de arquivo. O Handle ser maior ou igual a zero. Caso no seja possvel criar o arquivo, a funo retornar o handle -1 , e ser possvel obter maiores detalhes da ocorrncia atravs da funo FERROR() . 2.18.1.2FWRITE() Funo que permite a escrita em todo ou em parte do contedo do buffer, limitando a quantidadedeBytesatravsdoparmetronQtdBytes.Aescritacomeaapartirda posiocorrentedoponteirodearquivos,eafunoFWRITEretornaraquantidade realdebytesescritos.AtravsdasfunesFOPEN(),FCREATE(),ouFOPENPORT(), podemosabriroucriarumarquivoouabrirumaportadecomunicao,paraoqual sero gravados ou enviados os dados do buffer informado. Por tratar-se de uma funo demanipulaodecontedobinrio,sosuportadosnaStringcBuffertodosos caracteres da tabela ASCII, inclusive caracteres de controle (ASC 0 , ASC 12 , ASC 128 , etc.). Pgina 126Programao ADVPL II e Guia de RefernciaCaso acontea alguma falha na gravao, a funo retornar um nmero menor que o nQtdBytes.Nestecaso,afunoFERROR()podeserutilizadaparadeterminaroerro especficoocorrido.Agravaonoarquivorealizadaapartirdaposioatualdo ponteiro, que pode ser ajustado atravs das funes FSEEK() , FREAD() ou FREADSTR(). ESintaxe: FWRITE ( < nHandle > , < cBuffer > , [ nQtdBytes ] ) EParmetros: nHandle o manipulador de arquivo ou device retornado pelas funes FOPEN(), FCREATE(), ou FOPENPORT(). cBuffer a cadeia de caracteres a ser escrita no arquivo especificado. O tamanho desta varivel deve ser maior ou igual ao tamanho informado em nQtdBytes (caso seja informado o tamanho). nQtdBytes indica a quantidade de bytes a serem escritos a partir da posio corrente do ponteiro de arquivos. Caso seja omitido, todo o contedo de escrito. ERetorno: NumricoFWRITE() retorna a quantidade de bytes escritos na forma de um valor numrico inteiro.Casoovalorretornadosejaiguala,aoperaofoibem sucedida. Caso o valor de retorno seja menor que ou zero, ou o disco estcheioouocorreuoutroerro.Nestecaso,utilizeafunoFERROR()para obter maiores detalhes da ocorrncia. 2.18.1.3FCLOSE() Funo de tratamento de arquivos de baixo nvel utilizada para fechar arquivos binrios eforarqueosrespectivosbuffersdoDOSsejamescritosnodisco.Casoaoperao falhe,FCLOSE()retornafalso(.F.).FERROR()pode,ento,serusadoparadeterminara razo exata da falha. Por exemplo, ao tentar usar FCLOSE() com um handle (tratamento dadoaoarquivopelosistemaoperacional)invlidoretornafalso(.F.)eFERROR() retornaerro6doDOS,invalidhandle.ConsulteFERROR()paraobterumalista completa dos cdigos de erro. Nota: Esta funo permite acesso de baixo nvel aos arquivos e dispositivos do DOS. Ela deve ser utilizada com extremo cuidado e exige que se conhea a fundo o sistema operacional utilizado. ESintaxe: FCLOSE ( < nHandle > ) EParmetros: nHandle Handle do arquivo obtido previamente atravs de FOPEN() ou FCREATE(). Programao ADVPL II e Guia de RefernciaPgina 127 ERetorno: LgicoRetornafalso(.F.)seocorreumerroenquantoosbuffersestosendoescritos; do contrrio, retorna verdadeiro (.T.). 2.18.1.4FSEEK() Funo que posiciona o ponteiro do arquivo para as prximas operaes de leitura ou gravao.AsmovimentaesdeponteirossorelativasnOrigemquepodeteros seguintes valores, definidos em fileio.ch: ETabelaA:Origemaserconsideradaparaamovimentaodoponteirode posicionamento do Arquivo. OrigemConstate(fileio.ch)Operao 0FS_SETAjusta a partir do inicio do arquivo. (Default). 1FS_RELATIVEAjuste relativo a posio atual do arquivo. 2FS_ENDAjuste a partir do final do arquivo. ESintaxe: FSEEK ( < nHandle > , [ nOffSet ] , [ nOrigem ] ) EParmetros: nHandleManipulador obtido atravs das funes FCREATE, FOPEN. nOffSetnOffSetcorrespondeaonmerodebytesnoponteirodeposicionamentodo arquivoasermovido.Podeserumnmeropositivo,zeroounegativo,aser considerado a partir do parmetro passado em nOrigem. nOrigemIndica a partir de qual posio do arquivo, o nOffset ser considerado. ERetorno: NumricoFSEEK() retorna a nova posio do ponteiro de arquivo com relao ao incio do arquivo(posio0)naformadeumvalornumricointeiro.Estevalornoleva emcontaaposiooriginaldoponteirodearquivosantesdaexecuoda funo FSEEK(). 2.18.1.5FOPEN() Funo de tratamento de arquivo de baixo nvel que abre um arquivo binrio existente para que este possa ser lido e escrito, dependendo do argumento . Toda vez que houver um erro na abertura do arquivo, FERROR() pode ser usado para retornar o cdigodeerrodoSistemaOperacional.Porexemplo,casooarquivonoexista, FOPEN()retorna-1eFERROR()retorna2paraindicarqueoarquivonofoi encontrado. Veja FERROR() para uma lista completa dos cdigos de erro. Pgina 128Programao ADVPL II e Guia de RefernciaCaso o arquivo especificado seja aberto, o valor retornado o handle (manipulador) do Sistema Operacional para o arquivo. Este valor semelhante a um alias no sistema de banco de dados, e ele exigido para identificar o arquivo aberto para as outras funes detratamentodearquivo.Portanto,importantesempreatribuirovalorquefoi retornado a uma varivel para uso posterior, como mostra o exemplo desta funo. ESintaxe: FOPEN ( < cArq > , [ nModo ] ) EParmetros: cArqNome do arquivo a ser aberto que inclui o pacote, caso haja um. nModoMododeacessoDOSsolicitadoqueindicacomooarquivoabertodeveser acessado.OacessodeumadascategoriasrelacionadasnatabelaAeas restries de compartilhamento relacionada na Tabela B. O modo padro zero, somenteparaleitura,comcompartilhamentoporCompatibilidade.Ao definirmosomododeacesso,devemossomarumelementodaTabelaAcom um elemento da Tabela B. ERetorno: NumricoFOPEN()retornaohandledearquivoabertonafaixadezeroa65.535.Caso ocorra um erro, FOPEN() retorna -1. 2.18.1.6FREAD() Funo que realiza a leitura dos dados a partir um arquivo aberto, atravs de FOPEN(), FCREATE()e/ouFOPENPORT(),earmazenaosdadoslidosporreferncianobuffer informado. FREAD()leratonmerodebytesinformadoemnQtdBytes;casoaconteaalgum erroouoarquivochegueaofinal,FREAD()retornarumnmeromenorqueo especificadoemnQtdBytes.FREAD()lnormalmentecaracteresdecontrole(ASC128, ASC0,etc.)elapartirdaposioatualdoponteiroatualdoarquivo,quepodeser ajustado ou modificado pelas funes FSEEK() , FWRITE() ou FREADSTR(). AvarivelStringaserutilizadacomobufferdeleituradevesersemprepr-alocadae passada como referncia. Caso contrrio, os dados no podero ser retornados. ESintaxe: FREAD ( < nHandle > , < cBuffer > , < nQtdBytes > ) Programao ADVPL II e Guia de RefernciaPgina 129 EParmetros: nHandle o manipulador (Handle) retornado pelas funes FOPEN(), FCREATE(), FOPENPORT(), que faz referncia ao arquivo a ser lido. cBuffer o nome de uma varivel do tipo String , a ser utilizada como buffer de leitura, onde os dados lidos devero ser armazenados. O tamanho desta varivel deve ser maior ou igual ao tamanho informado em nQtdBytes.Esta varivel deve ser sempre passada como referncia. (@ antes do nome da varivel), caso contrrio os dados lidos no sero retornados. nQtdBytesDefine a quantidade de bytes que devem ser lidas do arquivo a partir posicionamento do ponteiro atual. ERetorno: NumricoQuantidades de bytes lidos. Caso a quantidade seja menor que a solicitada, isto indica erro de leitura ou final de arquivo. Verifique a funo FERROR() para mais detalhes. Exemplo: Gerao de arquivo TXT, utilizando a primeira famlia de funes #include "protheus.ch" /*/ +------------------------------------------------------------------------- | Programa | GeraTXT | Autor | SERGIO FUZINAKA | Data || +------------------------------------------------------------------------- | Descrio| Gera o arquivo TXT, a partir do Cadastro de Clientes +------------------------------------------------------------------------- | Uso| Curso ADVPL| +------------------------------------------------------------------------- /*/ User Function GeraTXT() //+--------------------------------+ //| Declarao de Variveis| //+--------------------------------+ Local oGeraTxt Private cPerg:= "EXPSA1" Private cAlias:= "SA1" //CriaSx1(cPerg) Pgina 130Programao ADVPL II e Guia de Referncia//Pergunte(cPerg,.F.) dbSelectArea(cAlias) dbSetOrder(1) //+-----------------------------------+ //| Montagem da tela de processamento.| //+-----------------------------------+ DEFINE MSDIALOG oGeraTxt TITLE OemToAnsi("Gerao de Arquivo Texto") ; FROM 000,000 TO 200,400 PIXEL @ 005,005 TO 095,195 OF oGeraTxt PIXEL @ 010,020 Say " Este programa ira gerar um arquivo texto, conforme os parame- "; OF oGeraTxt PIXEL @ 018,020 Say " tros definidospelo usurio,com os registros do arquivo de "; OF oGeraTxt PIXEL @ 026,020 Say " SA1 " OF oGeraTxt PIXEL DEFINE SBUTTON FROM 070, 030 TYPE 1 ; ACTION (OkGeraTxt(),oGeraTxt:End()) ENABLE OF oGeraTxt DEFINE SBUTTON FROM 070, 070 TYPE 2 ; ACTION (oGeraTxt:End()) ENABLE OF oGeraTxt DEFINE SBUTTON FROM 070, 110 TYPE 5 ; ACTION (Pergunte(cPerg,.T.)) ENABLE OF oGeraTxt ACTIVATE DIALOG oGeraTxt CENTERED Return Nil Exemplo (continuao): /*/ +------------------------------------------------------------------------- | Funo| OKGERATXT | Autor | SERGIO FUZINAKA | Data | | +------------------------------------------------------------------------- | Descrio| Funo chamada pelo boto OK na tela inicial de processamento. | | | Executa a gerao do arquivo texto. | +------------------------------------------------------------------------- /*/ Programao ADVPL II e Guia de RefernciaPgina 131 Static Function OkGeraTxt //+----------------------------------------------------------------------- //| Cria o arquivo texto //+----------------------------------------------------------------------- Private cArqTxt := "\SYSTEM\EXPSA1.TXT" Private nHdl:= fCreate(cArqTxt) If nHdl == -1 MsgAlert("O arquivo de nome "+cArqTxt+" no pode ser executado! Verifique os parmetros.","Ateno!") Return Endif // Inicializa a rgua de processamento Processa({|| RunCont() },"Processando...") Return Nil /*/ +------------------------------------------------------------------------ | Funo| RUNCONT| Autor | SERGIO FUZINAKA | Data | | +------------------------------------------------------------------------- | Descrio| Funo auxiliar chamada pela PROCESSA.A funo PROCESSA | || monta a janela com a rgua de processamento. | +------------------------------------------------------------------------- /*/ Static Function RunCont Local cLin dbSelectArea(cAlias) dbGoTop() ProcRegua(RecCount()) // Numero de registros a processar While (cAlias)->(!EOF()) //Incrementa a rgua IncProc() Pgina 132Programao ADVPL II e Guia de RefernciacLin := (cAlias)->A1_FILIAL cLin += (cAlias)->A1_COD cLin += (cAlias)->A1_LOJA cLin += (cAlias)->A1_NREDUZ cLin += STRZERO((cAlias)->A1_MCOMPRA*100,16) // 14,2 cLin += DTOS((cAlias)->A1_ULTCOM)//AAAAMMDD cLin += CRLF Exemplo (continuao): //+-------------------------------------------------------------------+ //| Gravao no arquivo texto. Testa por erros durante a gravao da| //| linha montada.| //+-------------------------------------------------------------------+ If fWrite(nHdl,cLin,Len(cLin)) != Len(cLin) If !MsgAlert("Ocorreu um erro na gravao do arquivo."+; "Continua?","Ateno!") Exit Endif Endif (cAlias)->(dbSkip()) EndDo // O arquivo texto deve ser fechado, bem como o dialogo criado na funo anterior fClose(nHdl) Return Nil NotequeparaageraodoarquivoTXTforamutilizadas,basicamente,as funesFCreate,FWriteeFCloseque,respectivamente,geraoarquivo, adicionadadosefechaoarquivo. Noexemplo,oformatoestabelecido pela concatenao dos dados na varivel cLin a qual utilizada na gravao dos dados.Para a leitura de dados TXT sero utilizada as funes FOpen e FRead. Exemplo: Leitura de arquivo TXT, utilizando a primeira famlia de funes #Include "protheus.ch" Programao ADVPL II e Guia de RefernciaPgina 133 /*/ +----------------------------------------------------------------------- | Programa | LeTXT| Autor | SERGIO FUZINAKA | Data | | +----------------------------------------------------------------------- | Descrio| Leitura de arquivo TXT | +----------------------------------------------------------------------- | Uso| Curso ADVPL| +----------------------------------------------------------------------- /*/ User Function LeTXT() //+-------------------------------------------------------------------+ //| Declarao de Variveis | //+-------------------------------------------------------------------+ Local cPerg:= "IMPSA1" Local oLeTxt Private cAlias := "SA1" //CriaSx1(cPerg) //Pergunte(cPerg,.F.) Exemplo (continuao): dbSelectArea(cAlias) dbSetOrder(1) //+-------------------------------------------------------------------+ // Montagem da tela de processamento | //+-------------------------------------------------------------------+ DEFINE MSDIALOG oLeTxt TITLE OemToAnsi("Leitura de Arquivo Texto"); FROM 000,000 TO 200,400 PIXEL @ 005,005 TO 095,195 OF oLeTxt PIXEL Pgina 134Programao ADVPL II e Guia de Referncia@ 10,020 Say " Este programa ira ler o contedo de um arquivo texto, conforme"; OF oLeTxt PIXEL @ 18,020 Say " os parmetros definidos pelo usurio, com os registros do arquivo"; OF oLeTxt PIXEL @ 26,020 Say " SA1" OF oLeTxt PIXEL DEFINE SBUTTON FROM 070, 030 TYPE 1 ; ACTION (OkLeTxt(),oLeTxt:End()) ENABLE OF oLeTxt DEFINE SBUTTON FROM 070, 070 TYPE 2 ; ACTION (oLeTxt:End()) ENABLE OF oLeTxt DEFINE SBUTTON FROM 070, 110 TYPE 5 ; ACTION (Pergunte(cPerg,.T.)) ENABLE OF oLeTxt ACTIVATE DIALOG oLeTxt CENTERED Return Nil /*/ +------------------------------------------------------------------------- | Funo| OKLETXT| Autor | SERGIO FUZINAKA | Data | | +------------------------------------------------------------------------- | Descrio| Funo chamada pelo boto OK na tela inicial de processamento| || Executa a leitura do arquivo texto| +------------------------------------------------------------------------- /*/ Static Function OkLeTxt() //+-------------------------------------------------------------------+ //| Abertura do arquivo texto | //+-------------------------------------------------------------------+ Private cArqTxt := "\SYSTEM\EXPSA1.TXT" Private nHdl:= fOpen(cArqTxt,68) If nHdl == -1 MsgAlert("O arquivo de nome "+cArqTxt+" no pode ser aberto! Verifique os parmetros.","Ateno!") Return Programao ADVPL II e Guia de RefernciaPgina 135 Endif // Inicializa a rgua de processamento Processa({|| RunCont() },"Processando...") Return Nil /*/ +------------------------------------------------------------------------ | Funo| RUNCONT| Autor | SERGIO FUZINAKA | Data | | +------------------------------------------------------------------------- | Descrio| Funo auxiliar chamada pela PROCESSA.A funo PROCESSA | || monta a janela com a rgua de processamento. | +------------------------------------------------------------------------- /*/ Static Function RunCont Local nTamFile:= 0 Local nTamLin := 56 Local cBuffer:= "" Local nBtLidos := 0 Local cFilSA1:= "" Local cCodSA1:= "" Local cLojaSA1:= "" //1234567890123456789012345678901234567890123456789012345678901234567890 //00000000010000000002000000000300000000040000000005000000000600000000070 //FFCCCCCCLLNNNNNNNNNNNNNNNNNNNNVVVVVVVVVVVVVVVVDDDDDDDD //A1_FILIAL - 01, 02 - TAM: 02 //A1_COD- 03, 08 - TAM: 06 //A1_LOJA- 09, 10 - TAM: 02 //A1_NREDUZ- 11, 30 - TAM: 20 //A1_MCOMPRA- 31, 46 - TAM: 14,2 //A1_ULTCOM- 47, 54 - TAM: 08 nTamFile := fSeek(nHdl,0,2) fSeek(nHdl,0,0) cBuffer:= Space(nTamLin) // Varivel para criao da linha do registro para leitura ProcRegua(nTamFile) // Numero de registros a processar While nBtLidos < nTamFile Pgina 136Programao ADVPL II e Guia de Referncia //Incrementa a rgua IncProc() // Leitura da primeira linha do arquivo texto nBtLidos += fRead(nHdl,@cBuffer,nTamLin) cFilSA1 := Substr(cBuffer,01,02) //- 01, 02 - TAM: 02 cCodSA1:= Substr(cBuffer,03,06) //- 03, 08 - TAM: 06 cLojaSA1:= Substr(cBuffer,09,02) //- 09, 10 - TAM: 02 While .T. IF dbSeek(cFilSA1+cCodSA1+cLojaSA1) cCodSA1 := SOMA1(cCodSA1) Loop Else Exit Endif Enddo Exemplo (continuao): dbSelectArea(cAlias) RecLock(cAlias,.T.) (cAlias)->A1_FILIAL:= cFilSA1//- 01, 02 - TAM: 02 (cAlias)->A1_COD:= cCodSA1//- 03, 08 - TAM: 06 (cAlias)->A1_LOJA := cLojaSA1 //- 09, 10 - TAM: 02 (cAlias)->A1_NREDUZ := Substr(cBuffer,11,20) //- 11, 30 - TAM: 20 (cAlias)->A1_MCOMPRA:= Val(Substr(cBuffer,31,16))/100 //- 31, 46 - TAM: 14,2 (cAlias)->A1_ULTCOM := STOD(Substr(cBuffer,47,08)) //- 47, 54 - TAM: 08 MSUnLock() EndDo // O arquivo texto deve ser fechado, bem como o dialogo criado na funo anterior. fClose(nHdl) Return Nil 2.18.22 Famlia de funes de gravao e leitura de arquivos texto 2.18.2.1FT_FUSE() Programao ADVPL II e Guia de RefernciaPgina 137 FunoqueabreoufechaumarquivotextoparausodasfunesFT_F*.Asfunes FT_F* so usadas para ler arquivos texto, onde as linhas so delimitadas pela seqncia decaracteresCRLFouLF(*)eotamanhomximodecadalinha1022bytes.O arquivo aberto em uma rea de trabalho, similar usada pelas tabelas de dados. ESintaxe: FT_FUSE ( [ cTXTFile ] ) EParmetros: cTXTFileCorrespondeaonomedoarquivoTXTaseraberto.Casoonomenoseja passado, e j exista um arquivo aberto. o mesmo fechado. ERetorno: NumricoA funo retorna o Handle de controle do arquivo. Em caso de falha de abertura, a funo retornar -1 2.18.2.2FT_FGOTOP() Afunotemcomoobjetivomoveroponteiro,queindicaaleituradoarquivotexto, para a posio absoluta especificada pelo argumento . ESintaxe: FT_FGOTO ( < nPos > ) EParmetros: nPosIndicaaposioquesercolocadooponteiroparaleituradosdadosno arquivo. 2.18.2.3FT_FLASTREC() Funo que retorna o nmero total de linhas do arquivo texto aberto pela FT_FUse. As linhas so delimitadas pela seqncia de caracteresCRLF o LF. ESintaxe: FT_FLASTREC( ) EParmetros: Nenhum() ERetorno: NumricoRetornaaquantidadedelinhasexistentesnoarquivo.Casooarquivoesteja vazio, ou no exista arquivo aberto, a funo retornar 0 (zero). Pgina 138Programao ADVPL II e Guia de Referncia 2.18.2.4FT_FEOF() Funoqueretornaverdadeiro(.t.)seoarquivotextoabertopelafunoFT_FUSE() estiverposicionadonofinaldoarquivo,similarfuno EOF()utilizadaparaarquivos de dados. ESintaxe: FT_FEOF( ) EParmetros: Nenhum() ERetorno: LgicoRetornatruecasooponteirodoarquivotenhachegadoaofinal;falsecaso contrrio. 2.18.2.5FT_FREADLN() Funoque retornaumalinhadetextodoarquivoabertopelaFT_FUse.Aslinhasso delimitadaspelaseqnciadecaracteresCRLF(chr(13)+chr(10)),ouapenasLF( chr(10 ), e o tamanho mximo de cada linha 1022 bytes. ESintaxe: FT_FREADLN( ) EParmetros: Nenhum() ERetorno: CaracterRetornaalinhainteiranaqualestposicionadooponteiroparaleiturade dados. Programao ADVPL II e Guia de RefernciaPgina 139 2.18.2.6FT_FSKIP() FunoquemoveoponteirodoarquivotextoabertopelaFT_FUSE()paraaprxima linha, similar ao DBSKIP() usado para arquivos de dados. ESintaxe: FT_FSKIP ( [ nLinhas ] ) EParmetros: nLinhasnLinhas corresponde ao nmero de linhas do arquivo TXT ref. movimentao do ponteiro de leitura do arquivo. ERetorno Nenhum() 2.18.2.7FT_FGOTO() Funoutilizadaparamoveroponteiro,queindicaaleituradoarquivotexto,paraa posio absoluta especificada pelo argumento . ESintaxe: FT_FGOTO ( < nPos > ) EParmetros: nPosIndicaaposioquesercolocadooponteiroparaleituradosdadosno arquivo. ERetorno: Nenhum() 2.18.2.8FT_FRECNO() A funo tem o objetivo de retornar a posio do ponteiro do arquivo texto. AfunoFT_FRecnoretornaaposio correntedoponteirodoarquivotextoaberto pela FT_FUse. ESintaxe: FT_FRECNO ( ) EParmetros: Nenhum() ERetorno: CaracterRetorna a posio corrente do ponteiro do arquivo texto. Pgina 140Programao ADVPL II e Guia de RefernciaExemplo: Leitura de arquivo TXT, utilizando a segunda famlia de funes #Include "Protheus.ch" /*/ +------------------------------------------------------------------------- | Programa | LeArqTXT| Autor | Robson Luiz| Data || +------------------------------------------------------------------------- | Descrio | Leitura de arquivo TXT| +------------------------------------------------------------------------- | Uso | Curso ADVPL|+------------------------------------------------------------------------/*/ User Function LeArqTxt() Private nOpc:= 0 Private cCadastro := "Ler arquivo texto" Private aSay:= {} Private aButton := {} AADD( aSay, "O objetivo desta rotina e efetuar a leitura em um arquivo texto" ) AADD( aButton, { 1,.T.,{|| nOpc := 1,FechaBatch()}}) AADD( aButton, { 2,.T.,{|| FechaBatch() }} ) FormBatch( cCadastro, aSay, aButton ) If nOpc == 1 Processa( {|| Import() }, "Processando..." ) Endif Return Nil //+------------------------------------------- //| Funo - Import() //+------------------------------------------- Static Function Import() Local cBuffer:= "" Local cFileOpen:= "" Local cTitulo1 := "Selecione o arquivo" Local cExtens:= "Arquivo TXT | *.txt" /*** Programao ADVPL II e Guia de RefernciaPgina 141 * _________________________________________________________ * cGetFile(,,,,,) * * - Expresso de filtro * - Titulo da janela * - Numero de mascara default 1 para *.Exe * - Diretrio inicial se necessrio * - .F. boto salvar - .T. boto abrir * - Mascara de bits para escolher as opes de visualizao do objeto * (prconst.ch) */ cFileOpen := cGetFile(cExtens,cTitulo1,,cMainPath,.T.) If !File(cFileOpen) MsgAlert("Arquivo texto: "+cFileOpen+" no localizado",cCadastro) Return Endif FT_FUSE(cFileOpen)//ABRIR FT_FGOTOP() //PONTO NO TOPO ProcRegua(FT_FLASTREC()) //QTOS REGISTROS LER While !FT_FEOF()//FACA ENQUANTO NAO FOR FIM DE ARQUIVO IncProc() // Capturar dados cBuffer := FT_FREADLN() //LENDO LINHA

cMsg := "Filial: " +SubStr(cBuffer,01,02) + Chr(13)+Chr(10) cMsg += "Cdigo: " +SubStr(cBuffer,03,06) + Chr(13)+Chr(10) cMsg += "Loja: " +SubStr(cBuffer,09,02) + Chr(13)+Chr(10) cMsg += "Nome fantasia: " +SubStr(cBuffer,11,15) + Chr(13)+Chr(10) cMsg += "Valor: " +SubStr(cBuffer,26,14) + Chr(13)+Chr(10) cMsg += "Data: "+SubStr(cBuffer,40,08) + Chr(13)+Chr(10) MsgInfo(cMsg)

FT_FSKIP() //prximo registro no arquivo txt EndDo Exemplo (continuao): FT_FUSE() //fecha o arquivo txt MsgInfo("Processo finalizada") Pgina 142Programao ADVPL II e Guia de RefernciaReturn Nil Exerccio 15 Desenvolver uma rotina que realize a exportao dos itensmarcados no cadastro de clientes para um arquivo TXT em um diretrio especificado pelo usurio. Exerccio 16 Desenvolverumarotinaquerealizeaimportaodosdadosdeclientescontidos em um arquivo TXT, sendo o mesmo selecionado pelo usurio. 11.Oficina de programao I 2.19Interfaces com sintaxe clssica AsintaxeconvencionalparadefiniodecomponentesvisuaisdalinguagemADVPL depende diretamente do include especificado no cabealho do fonte. Os dois includes disponveis para o ambiente ADVPL Protheus so: ERWMAKE.CH:permiteautilizaodasintaxeCLIPPERnadefiniodos componentes visuais. EPROTHEUS.CH: permite a utilizao da sintaxe ADVPL convencional, a qual um aprimoramento da sintaxe CLIPPER,com a incluso de novos atributos para os componentes visuais disponibilizados no ERP Protheus. Para ilustrar a diferena na utilizao destes dois includes, seguem abaixo as diferentes definies para o componentes Dialog e MsDialog: Exemplo 01 Include Rwmake.ch #include rwmake.ch @ 0,0 TO 400,600 DIALOG oDlg TITLE "Janela em sintaxe Clipper" ACTIVATE DIALOG oDlg CENTERED Exemplo 02 Include Protheus.ch Programao ADVPL II e Guia de RefernciaPgina 143 #include protheus.ch DEFINE MSDIALOG oDlg TITLE "Janela em sintaxe ADVPL "FROM 000,000 TO 400,600 PIXEL ACTIVATE MSDIALOG oDlg CENTERED Ambasassintaxesproduziroomesmoefeitoquandocompiladase executadasnoambienteProtheus.Mas,deveserutilizadaeasintaxe ADVPL atravs do uso do include PROTHEUS.CH Oscomponentesdainterfacevisualqueserotratadosnestetpico,utilizandoa sintaxe clssica da linguagem ADVPL so: BUTTON() CHECKBOX() COMBOBOX() FOLDER() MSDIALOG() MSGET() RADIO() SAY() SBUTTON() Executar o fonte DIALOG_OBJETOS.PRW e avaliar a definio dos componentes utilizados utilizando a sintaxe clssica. BUTTON() Sintaxe @ nLinha,nColuna BUTTON cTexto SIZEnLargura,nAltura UNIDADE OF oObjetoRef ACTION AO Descrio DefineocomponentevisualButton,quepermiteainclusodebotesde operaonateladainterface,osquaisserovisualizadossomentecomum texto simples para sua identificao. CHECKBOX() Sintaxe@ nLinha,nColuna CHECKBOX oCheckBox VAR VARIAVEL PROMPT cTexto Pgina 144Programao ADVPL II e Guia de RefernciaWHEN WHEN UNIDADE OF oObjetoRef SIZE nLargura,nAltura MESSAGE cMensagem Descrio DefineocomponentevisualCheckBox,oqualpermiteautilizaodauma marcaparahabilitarounoumaopoescolhida,sendoestamarca acompanhadadeumtextoexplicativo.DiferedoRadioMenupoiscada elemento do check nico, mas o Radio permite a utilizao de uma lista junto com um controle de seleo. COMBOBOX() Sintaxe @ nLinha,nColuna COMBOBOX VARIAVEL ITEMS AITENS SIZE nLargura,nAltura UNIDADE OF oObjetoRef Descrio DefineocomponentevisualComboBox,oqualpermiteseleodeumitem dentro de uma lista de opes de textos simples no formato de um vetor. FOLDER() Sintaxe @ nLinha,nColuna FOLDER oFolder OF oObjetoRef PROMPT &cTexto1,,&cTextoX PIXEL SIZE nLargura,nAltura Descrio DefineocomponenteVisualFolder,oqualpermiteainclusodediversos Dialogsdentrodeumamesmainterfacevisual.Umfolderpodeserentendido comoumarraydedialogs,aondecadapainelrecebe seus componentesetem seus atributos definidos independentemente dos demais. MSDIALOG() Sintaxe DEFINE MSDIALOG oObjetoDLG TITLE cTitulo FROM nLinIni,nColIni TO nLiFim,nColFim OF oObjetoRef UNIDADE Descrio Define o componente MSDIALOG(), o qual utilizado como base para os demais componentesdainterfacevisual,poisumcomponenteMSDIALOG()uma janela da aplicao. MSGET() Sintaxe @nLinha,nColunaMSGETVARIAVELSIZEnLargura,nAlturaUNIDADEOF oObjetoRef F3 cF3 VALID VALID WHEN WHEN PICTURE cPicture Descrio DefineocomponentevisualMSGET,oqualutilizadoparacapturade informaes digitveis na tela da interface. RADIO() Sintaxe @ nLinha,nColuna RADIO oRadio VAR nRadio 3D SIZE nLargura,nAltura cItem1,cItem2,...,cItemX OF oObjetoRef UNIDADE ON CHANGE CHANGE ON CLICK CLICK Descrio Define o componente visual Radio, tambm conhecido como RadioMenu, o qual seleo de uma opo ou de mltiplas opes atravs de uma marca para os Programao ADVPL II e Guia de RefernciaPgina 145 itensexibidosdeumalista.DiferedocomponenteCheckBox,poiscada elementodechecksemprenico,eoRadiopodeconterumoumais elementos. Pgina 146Programao ADVPL II e Guia de RefernciaSAY() Sintaxe @ nLinha, nColuna SAY cTextoSIZE nLargura,nAltura UNIDADE OF oObjetoRef Descrio Define o componente visual SAY, oqual utilizado para exibio de textos em uma tela de interface. SBUTTON() Sintaxe DEFINE SBUTTON FROMnLinha, nColunaTYPEN ACTION AOSTATUS OF oObjetoRef Descrio DefineocomponentevisualSButton,quepermiteainclusodebotesde operaonateladainterface,osquaisserovisualizados,dependendoda interfacedosistemaERPutilizada,somentecomumtextosimplesparasua identificao, ou com uma imagem (BitMap) pr-definido. 2.20Rguas de processamento Osindicadoresdeprogressoourguasdeprocessamentodisponveisnalinguagem ADVPL que sero abordados neste material so: RPTSTATUS() PROCESSA() MSNEWPROCESS() MSAGUARDE() MSGRUN() 2.20.1RptStatus() Rgua de processamento simples, com apenas um indicador de progresso, utilizada no processamento de relatrios do padro SetPrint(). ESintaxe: RptStatus(bAcao, cMensagem) ERetorno: Nil Programao ADVPL II e Guia de RefernciaPgina 147 EParmetros: bAcao Bloco de cdigo que especifica a ao que ser executada com o acompanhamento da rgua de processamento. cMensagem Mensagem que ser exibida na rgua de processamento durante a execuo. Aparncia Exemplo: Funo RPTStatus() e acessrias /*/ +------------------------------------------------------------------------- | Funo| GRPTSTATUS | Autor | ROBSON LUIZ| Data ||+------------------------------------------------------------------------- | Descrio| Programa que demonstra a utilizao das funes RPTSTATUS()| || SETREGUA() E INCREGUA() | +------------------------------------------------------------------------- | Uso | Curso ADVPL | +------------------------------------------------------------------------- /*/ User Function GRptStatus() Local aSay:= {} Local aButton := {} Local nOpc:= 0 Local cTitulo := "Exemplo de Funes" Local cDesc1:= "Este programa exemplifica a utilizao da funo Processa() em conjunto" Local cDesc2:= "com as funes de incremento ProcRegua() e IncProc()" Pgina 148Programao ADVPL II e Guia de Referncia Private cPerg := "RPTSTA" CriaSX1() Pergunte(cPerg,.F.) AADD( aSay, cDesc1 ) AADD( aSay, cDesc2 ) AADD( aButton, { 5, .T., {|| Pergunte(cPerg,.T. )}} ) AADD( aButton, { 1, .T., {|| nOpc := 1, FechaBatch() }} ) AADD( aButton, { 2, .T., {|| FechaBatch()}} ) FormBatch( cTitulo, aSay, aButton ) If nOpc 1 Return Nil Endif RptStatus( {|lEnd| RunProc(@lEnd)}, "Aguarde...","Executando rotina.", .T. ) Return Nil Exemplo: Funes acessrias da RPTStatus() /*/ +----------------------------------------------------------------------------- | Funo| RUNPROC| Autor | ROBSON LUIZ| Data ||+----------------------------------------------------------------------------- | Descrio| Funo de processamento executada atravs da RPTSTATUS()| +----------------------------------------------------------------------------- | Uso | Curso ADVPL | +----------------------------------------------------------------------------- /*/ Static Function RunProc(lEnd) Local nCnt := 0 dbSelectArea("SX5") dbSetOrder(1) Programao ADVPL II e Guia de RefernciaPgina 149 dbSeek(xFilial("SX5")+mv_par01,.T.) While !Eof() .And. X5_FILIAL == xFilial("SX5") .And. X5_TABELA A1_COD) If Li > 60 2.20.2Processa() Rgua de processamento simples, com apenas um indicador de progresso, utilizada no processamento de rotinas. ESintaxe: Processa(bAcao, cMensagem) ERetorno:Nil Pgina 152Programao ADVPL II e Guia de Referncia EParmetros: bAcao Bloco de cdigo que especifica a ao que ser executada com o acompanhamento da rgua de processamento. cMensagem Mensagem que ser exibida na rgua de processamento durante a execuo. Aparncia Exemplo: Funo PROCESSA() e acessrias /*/ +------------------------------------------------------------------------- | Funo| GPROCES1 | Autor | ROBSON LUIZ| Data | |+------------------------------------------------------------------------- | Descrio| Programa que demonstra a utilizao das funes PROCESSA() | || PROCREGUA() E INCPROC() | +------------------------------------------------------------------------- | Uso | Curso ADVPL | +------------------------------------------------------------------------- /*/ User Function GProces1() Local aSay:= {} Local aButton := {} Local nOpc:= 0 Local cTitulo := "Exemplo de Funes" Local cDesc1:= "Este programa exemplifica a utilizao da funo Processa()" Local cDesc2:= " em conjunto com as funes de incremento ProcRegua() e" Programao ADVPL II e Guia de RefernciaPgina 153 Local cDesc3:= " IncProc()" Exemplo (continuao): Private cPerg := "PROCES" CriaSX1() Pergunte(cPerg,.F.) AADD( aSay, cDesc1 ) AADD( aSay, cDesc2 ) AADD( aButton, { 5, .T., {|| Pergunte(cPerg,.T. )}} ) AADD( aButton, { 1, .T., {|| nOpc := 1, FechaBatch() }} ) AADD( aButton, { 2, .T., {|| FechaBatch()}} ) FormBatch( cTitulo, aSay, aButton ) If nOpc 1 Return Nil Endif Processa( {|lEnd| RunProc(@lEnd)}, "Aguarde...","Executando rotina.", .T. ) Return Nil /*/ +------------------------------------------------------------------------- | Funo| RUNPROC| Autor | ROBSON LUIZ| Data ||+------------------------------------------------------------------------- | Descrio| Funo de processamento executada atravs da PROCRSSA() | +------------------------------------------------------------------------- | Uso | Curso ADVPL | +----------------------------------------------------------------------- /*/ Static Function RunProc(lEnd) Local nCnt := 0 dbSelectArea("SX5") Pgina 154Programao ADVPL II e Guia de RefernciadbSetOrder(1) dbSeek(xFilial("SX5")+mv_par01,.T.) dbEval( {|x| nCnt++ },,{||X5_FILIAL==xFilial("SX5").And.X5_TABELA 60 ... Programao ADVPL II e Guia de RefernciaPgina 155 INCPROC() AfunoIncProc()utilizadaparaincrementarvalornarguadeprogressocriada atravs da funo Processa() ESintaxe: IncProc(cMensagem) EParmetros: cMensagemMensagemqueserexibidaeatualizadanarguadeprocessamentoacada execuodafunoIncProc(),sendoqueataxadeatualizaodainterface controlada pelo Binrio. ERetorno: Nenhum() Exemplo: ... dbSelectArea("SA1") dbGoTop() SetProc(LastRec()) While !Eof() IncProc(Avaliando cliente:+SA1->A1_COD) If Li > 60 ... 2.20.3MsNewProcess(). Rguadeprocessamentodupla,possuindodoisindicadoresdeprogresso independentes, utilizada no processamento de rotinas. ESintaxe: MsNewProcess():New(bAcao, cMensagem) ERetorno: oProcess objeto do tipo MsNewProcess() EParmetros: bAcao Bloco de cdigo que especifica a ao que ser executada com o acompanhamento da rgua de processamento. cMensagem Mensagem que ser exibida na rgua de processamento durante a execuo. Aparncia Pgina 156Programao ADVPL II e Guia de Referncia Programao ADVPL II e Guia de RefernciaPgina 157 EMtodos: Activate()Inicia a execuo do objeto MsNewProcess instanciado. SetRegua1()Define a quantidade de informaes que sero demonstradas pelo indicador de progresso superior. Parmetro: nMaxProc IncRegua1()Incrementa em uma unidade o indicador de progresso superior, o qual ir demonstrar a evoluo do processamento de acordo com a quantidade definida pelo mtodo SetRegua1(). Parmetro: cMensagem SetRegua2()Define a quantidade de informaes que sero demonstradas pelo indicador de progresso inferior. Parmetro: nMaxProc IncRegua2()Incrementa em uma unidade o indicador de progresso inferior, o qual ir demonstrar a evoluo do processamento de acordo com a quantidade definida pelo mtodo SetRegua2(). Parmetro: cMensagem Exemplo: Objeto MsNewProcess() e mtodos acessrios /*/ +------------------------------------------------------------------------- | Funo| GPROCES2 | Autor | ROBSON LUIZ| Data ||+------------------------------------------------------------------------- | Descrio| Programa que demonstra a utilizao do objeto MsNewProcess()| || e seus mtodos IncReguaX() e SetReguaX() | +------------------------------------------------------------------------- | Uso | Curso ADVPL | +------------------------------------------------------------------------- /*/ User Function GProces2() Private oProcess := NIL oProcess := MsNewProcess():New({|lEnd| RunProc(lEnd,oProcess)}; "Processando","Lendo...",.T.) oProcess:Activate() Pgina 158Programao ADVPL II e Guia de RefernciaReturn Nil /*/ +------------------------------------------------------------------------- | Funo| RUNPROC| Autor | ROBSON LUIZ| Data | |+------------------------------------------------------------------------ | Descrio| Funo de processamento executada atravs da MsNewProcess()| +------------------------------------------------------------------------- | Uso | Curso ADVPL| +------------------------------------------------------------------------- /*/ Static Function RunProc(lEnd,oObj) Local i := 0 Local aTabela := {} Local nCnt := 0

aTabela := {{"00",0},{"13",0},{"35",0},{"T3",0}} dbSelectArea("SX5") cFilialSX5 := xFilial("SX5") dbSetOrder(1) For i:=1 To Len(aTabela) dbSeek(cFilialSX5+aTabela[i,1]) While !Eof() .And. X5_FILIAL+X5_TABELA == cFilialSX5+aTabela[i,1] If lEnd Exit Endif nCnt++ dbSkip() End aTabela[i,2] := nCnt nCnt := 0 Next ioObj:SetRegua1(Len(aTabela)) For i:=1 To Len(aTabela) If lEnd Exit Endif oObj:IncRegua1("Lendo Tabela: "+aTabela[i,1]) dbSelectArea("SX5") dbSeek(cFilialSX5+aTabela[i,1]) oObj:SetRegua2(aTabela[i,2]) Programao ADVPL II e Guia de RefernciaPgina 159 While !Eof() .And. X5_FILIAL+X5_TABELA == cFilialSX5+aTabela[i,1] oObj:IncRegua2("Lendo chave: "+X5_CHAVE) If lEnd Exit Endif dbSkip() End Next i Return 2.20.4MsAguarde(). Indicador de processamento sem incremento. ESintaxe: Processa(bAcao, cMensagem, cTitulo) ERetorno:Nil EParmetros: bAcao Bloco de cdigo que especifica a ao que ser executada com o acompanhamento da rgua de processamento. cMensagem Mensagem que ser exibida na rgua de processamento durante a execuo. cTituloTtulo da janela da rgua de processamento. Aparncia Exemplo: MSAguarde() /*/ +------------------------------------------------------------------------- | Funo| GMSAGUARDE | Autor | ROBSON LUIZ | Data ||+------------------------------------------------------------------------- | Descrio| Programa que demonstra a utilizao das funes MSAGUARDE()| Pgina 160Programao ADVPL II e Guia de Referncia|| e MSPROCTXT() | +------------------------------------------------------------------------- | Uso | Curso ADVPL | +------------------------------------------------------------------------- /*/ USER FUNCTION GMsAguarde() PRIVATE lEnd := .F. MsAguarde({|lEnd| RunProc(@lEnd)},"Aguarde...","Processando Clientes",.T.) RETURN /*/ +------------------------------------------------------------------------- | Funo| RUNPROC| Autor | ROBSON LUIZ| Data | |+------------------------------------------------------------------------- | Descrio| Funo de processamento| +------------------------------------------------------------------------- | Uso | Curso ADVPL | +------------------------------------------------------------------------- /*/ STATIC FUNCTION RunProc(lEnd) dbSelectArea("SX5") dbSetOrder(1) dbGoTop() While !Eof() If lEnd MsgInfo(cCancel,"Fim") Exit Endif MsProcTxt("Tabela: "+SX5->X5_TABELA+" Chave: "+SX5->X5_CHAVE) dbSkip() End RETURN Programao ADVPL II e Guia de RefernciaPgina 161 2.20.5MsgRun(). Indicador de processamento sem incremento. ESintaxe: Processa(cMensagem, cTitulo, bAcao) ERetorno:Nil Pgina 162Programao ADVPL II e Guia de Referncia EParmetros: cMensagemMensagem que ser exibida na rgua de processamento durante a execuo. cTituloTtulo da janela da rgua de processamento. bAcao Bloco de cdigo que especifica a ao que ser executada com o acompanhamento da rgua de processamento. Aparncia Exemplo: MSGRun() /*/ +------------------------------------------------------------------------- | Funo| GMSGRUN| Autor | ROBSON LUIZ|Data ||+------------------------------------------------------------------------- | Descrio| Programa que demonstra a utilizao das funes MSGRUN() || e DBEVAL() | +------------------------------------------------------------------------- | Uso | Curso ADVPL | +------------------------------------------------------------------------- /*/ USER FUNCTION GMsgRun() LOCAL nCnt := 0 dbSelectArea("SX1") dbGoTop() MsgRun("Lendo arquivo, aguarde...","Ttulo opcional",{|| dbEval({|x| nCnt++}) }) MsgInfo("Ufa!!!, li "+AllTrim(Str(nCnt))+" registros",FunName()) RETURN Programao ADVPL II e Guia de RefernciaPgina 163 Pgina 164Programao ADVPL II e Guia de Referncia 2.21ListBox() AsintaxeclssicadalinguagemADVPLpermitequeocomponentevisualListBox implemente dois tipos distintos de objetos: ELista simples: lista de apenas uma coluna no formato de um vetor, a qual no necessita da especificao de um cabealho. EListacomcolunas:listacomdiversascolunasquenecessitadeumcabealho no formato de um aHeader (array de cabealho). 2.21.1ListBox simples ESintaxe: @nLinha,nColunaLISTBOXoListboxVARnListaITEMSaListaSIZE nLargura,nAltura OF oObjetoRef UNIDADE ON CHANGE CHANGE EParmetros: nLinha,nColunaPosio do objeto ListBox em funo da janela em que ele ser definido. oListBoxObjeto ListBox que ser criado. nListaVarivel numrica que contm o nmero do item selecionado no ListBox. aListaVetor simples contendo as strings que sero exibidas no ListBox. nLargura,nAlturaDimenses do objeto ListBox. oObjetoRefObjeto dialog no qual o componente ser definido. UNIDADEUnidade de medida das dimenses: PIXEL. CHANGEFuno ou lista de expresses que ser executada na seleo de um item do ListBox. Programao ADVPL II e Guia de RefernciaPgina 165 EAparncia: Exemplo: LISTBOX como lista simples #include "protheus.ch" /*/ +------------------------------------------------------------------------- | Funo| LISTBOXITE | Autor | ROBSON LUIZ|Data ||+------------------------------------------------------------------------- | Descrio| Programa que demonstra a utilizao do LISTBOX() como lista | || simples. | +------------------------------------------------------------------------- | Uso | Curso ADVPL | +------------------------------------------------------------------------- /*/ User Function ListBoxIte() Local aVetor := {} Local oDlg := Nil Local oLbx := Nil Local cTitulo:= "Consulta Tabela" Local nChave := 0 Local cChave := "" dbSelectArea("SX5") Pgina 166Programao ADVPL II e Guia de RefernciadbSetOrder(1) dbSeek(xFilial("SX5")) CursorWait() //+-----------------------------------------+ //| Carrega o vetor conforme a condio | //+-----------------------------------------+ While !Eof() .And. X5_FILIAL == xFilial("SX5") .And. X5_TABELA=="00" AADD( aVetor, Trim(X5_CHAVE)+" - "+Capital(Trim(X5_DESCRI)) ) dbSkip() End CursorArrow() If Len( aVetor ) == 0 Aviso( cTitulo, "No existe dados a consultar", {"Ok"} ) Return Endif //+-----------------------------------------------+ //| Monta a tela para usurio visualizar consulta | //+-----------------------------------------------+ DEFINE MSDIALOG oDlg TITLE cTitulo FROM 0,0 TO 240,500 PIXEL @ 10,10 LISTBOX oLbx VAR nChave ITEMS aVetor SIZE 230,95 OF oDlg PIXEL oLbx:bChange := {|| cChave := SubStr(aVetor[nChave],1,2) } DEFINE SBUTTON FROM 107,183 TYPE 14 ACTION LoadTable(cChave) ENABLE OF oDlg DEFINE SBUTTON FROM 107,213 TYPE1 ACTION oDlg:End() ENABLE OF oDlg ACTIVATE MSDIALOG oDlg CENTER Return Exemplo: LISTBOX como lista simples funes acessrias /*/ +------------------------------------------------------------------------- | Funo| LISTBOXITE | Autor | ROBSON LUIZ |Data | |+------------------------------------------------------------------------- | Descrio| Funo que carrega os dados da tabela selecionada em um| || listbox. | Programao ADVPL II e Guia de RefernciaPgina 167 +------------------------------------------------------------------------- | Uso | Curso ADVPL | +------------------------------------------------------------------------- /*/ STATIC FUNCTION LoadTable(cTabela) LOCAL aTabela := {} LOCAL oDlg := NIL LOCAL oLbx := NIL dbSelectArea("SX5") dbSeek(xFilial("SX5")+cTabela) //+------------------------------------------------------------- //| O vetor pode receber carga de duas maneiras, acompanhe...| //+------------------------------------------------------------- //| Utilizando While/End | //+------------------------------------------------------------- dbEval({|| AADD(aTabela,{X5_CHAVE,Capital(X5_DESCRI)})},,{|| X5_TABELA==cTabela}) If Len(aTabela)==0 Aviso( "FIM", "Necessrio selecionar um item", {"Ok"} ) Return Endif DEFINE MSDIALOG oDlg TITLE "Dados da tabela selecionada" FROM 300,400 TO 540,900 PIXEL @ 10,10 LISTBOX oLbx FIELDS HEADER "Tabela", "Descrio" SIZE 230,095 OF oDlg PIXELoLbx:SetArray( aTabela ) oLbx:bLine := {|| {aTabela[oLbx:nAt,1],aTabela[oLbx:nAt,2]} } DEFINE SBUTTON FROM 107,213 TYPE 1 ACTION oDlg:End() ENABLE OF oDlg ACTIVATE MSDIALOG oDlg RETURN 2.21.2ListBox mltiplas colunas ESintaxe: Pgina 168Programao ADVPL II e Guia de Referncia@nLinha,nColunaLISTBOXoListboxFIELDSHEADERHeader1,,HeaderX SIZE nLargura,nAltura OF oObjetoRef UNIDADE Programao ADVPL II e Guia de RefernciaPgina 169 EParmetros: nLinha,nColunaPosio do objeto ListBox em funo da janela em que ele ser definido. oListBoxObjeto ListBox que ser criado. nListaVarivel numrica que contm o nmero do item selecionado no ListBox. Header1,...,HeaderXStrings identificando os ttulos das colunas do Grid. nLargura,nAlturaDimenses do objeto ListBox. oObjetoRefObjeto dialog no qual o componente ser definido. UNIDADEUnidade de medida das dimenses: PIXEL. CHANGEFuno ou lista de expresses que ser executada na seleo de um item do ListBox. EMtodos: SetArray()Mtodo o objeto ListBox que define qual array contm os dados que sero exibidos no grid. EAtributos: bLineAtributo do objeto ListBox que vincula cada linha,coluna do array, com cada cabealho do grid. EAparncia: Pgina 170Programao ADVPL II e Guia de RefernciaExemplo: LISTBOX com grid #include protheus.ch /*/ +------------------------------------------------------------------------- | Funo| LIST_BOX | Autor | ROBSON LUIZ |Data | |+------------------------------------------------------------------------- | Descrio| Programa que demonstra a utilizao de um LISTBOX() com| || grid. | +------------------------------------------------------------------------- | Uso | Curso ADVPL | +------------------------------------------------------------------------- /*/ User Function List_Box() Local aVetor := {} Local oDlg Local oLbx Local cTitulo := "Cadastro de Bancos" Local cFilSA6 dbSelectArea("SA6") dbSetOrder(1) cFilSA6 := xFilial("SA6") dbSeek(cFilSA6) // Carrega o vetor conforme a condio. While !Eof() .And. A6_FILIAL == cFilSA6 AADD( aVetor, { A6_COD, A6_AGENCIA, A6_NUMCON, A6_NOME, A6_NREDUZ, A6_BAIRRO, A6_MUN } ) dbSkip() End // Se no houver dados no vetor, avisar usurio e abandonar rotina. If Len( aVetor ) == 0 Aviso( cTitulo, "No existe dados a consultar", {"Ok"} ) Return Endif Programao ADVPL II e Guia de RefernciaPgina 171 // Monta a tela para usurio visualizar consulta. DEFINE MSDIALOG oDlg TITLE cTitulo FROM 0,0 TO 240,500 PIXEL // Primeira opo para montar o listbox. @ 10,10 LISTBOX oLbx FIELDS HEADER ; "Banco", "Agencia", "C/C", "Nome Banco", "Fantasia", "Bairro", "Municpio" ; SIZE 230,95 OF oDlg PIXEL oLbx:SetArray( aVetor ) oLbx:bLine := {|| {aVetor[oLbx:nAt,1],; aVetor[oLbx:nAt,2],; aVetor[oLbx:nAt,3],; aVetor[oLbx:nAt,4],; aVetor[oLbx:nAt,5],; aVetor[oLbx:nAt,6],; aVetor[oLbx:nAt,7]}} Exemplo (continuao):

// Segunda opo para monta o listbox /* oLbx := TWBrowse():New(10,10,230,95,,aCabecalho,,oDlg,,,,,,,,,,,,.F.,,.T.,,.F.,,,) oLbx:SetArray( aVetor ) oLbx:bLine := {|| aEval(aVetor[oLbx:nAt],{|z,w| aVetor[oLbx:nAt,w] } ) } */ DEFINE SBUTTON FROM 107,213 TYPE 1 ACTION oDlg:End() ENABLE OF oDlg ACTIVATE MSDIALOG oDlg CENTER Return 2.22ScrollBox() OScrollBoxoobjetoutilizadoparapermitirqueumdialogexibabarrasderolagem verticaiseHorizontais.Algumasaplicaescomobjetosdefinemautomaticamenteo ScrollBox, tais como: EEnchoice() ou MsMGet() ENewGetDados() EListBox() QuandodefinidoumobjetoScrollBox,osdemaiscomponentesdajaneladevero referenciar este objeto e no mais o objeto dialog. DestaformaoScrollBoxatribudoaumobjetodialog,eoscomponentesao ScrollBox. Pgina 172Programao ADVPL II e Guia de Referncia QMsDialog() ScrollBox() QScrollBox() Componentes Visuais Programao ADVPL II e Guia de RefernciaPgina 173 ESintaxe: @nLinha,nColunaSCROLLBOXoScrollBoxHORIZONTALVERTICALSIZE nLargura,nAltura OF oObjetoRef BORDER EParmetros: nLinha,nColunaPosio do objeto ScrollBox em funo da janela em que ele ser definido. oScrollBoxObjeto ScrollBox que ser criado. HORIZONTALParmetro que quando definido habilita a rgua de rolagem horizontal. VERTICALParmetro que quando definido habilita a rgua de rolagem vertical. nLargura,nAlturaDimenses do objeto ScrollBox. oObjetoRefObjeto dialog no qual o componente ser definido. BORDER Parmetro que quando definido habilita a exibio de uma borda de delimitao do ScrollBox em relao a outros objetos. EAparncia: Pgina 174Programao ADVPL II e Guia de RefernciaExemplo: Utilizao de mltiplos ScrollBoxes #INCLUDE "PROTHEUS.CH" /*/ +------------------------------------------------------------------------ | Funo| SCROLL()| Autor | ROBSON LUIZ |Data | |+------------------------------------------------------------------------ | Descrio| Programa que demonstra como montar uma enchoice apenas | || com variveis, incluindo o recurso de rolagem. | +------------------------------------------------------------------------ | Uso | Curso ADVPL | +------------------------------------------------------------------------ /*/ USER FUNCTION Scroll() LOCAL oDlg := NIL LOCAL oScroll := NIL LOCAL oLbx1 := NIL LOCAL oLbx2 := NIL LOCAL bGet := NIL LOCAL oGet := NIL LOCAL aAIIPM := {} LOCAL aTitulo := {} LOCAL nTop := 5 LOCAL nWidth := 0 LOCAL cGet := "" LOCAL cPict := "" LOCAL cVar := "" LOCAL n := 0 PRIVATE cTitulo := "Consulta Parcelamento" PRIVATE aSay := {} PRIVATE cProcesso,cPrefixo,cTipo,cCliente,cLoja,cNome,cCGC PRIVATE dData,nTotal,nUFESP,cStatus,cCond cProcesso := "P00001" cPrefixo:= "UNI" cTipo := "MAN" cCliente:= "000001" Programao ADVPL II e Guia de RefernciaPgina 175 cLoja := "01" cNome := "JOSE DA SILVA SANTOS SOARES" cCGC:= "00.000.000/0001-91" dData := "26/03/03" nTotal:= 5922.00 nUFESP:= 1000.00 cStatus := "Z" cCond := "001" // Vetor para os campos no Scrooll Box //+-------------------------------------+ //| aSay[n][1] - Titulo| //| aSay[n][2] - Tipo| //| aSay[n][3] - Tamanho | //| aSay[n][4] - Decimal | //| aSay[n][5] - Contedo/Varivel | //| aSay[n][6] - Formato | //+-------------------------------------+ AADD(aSay,{"Processo","C",06,0,"cProcesso" ,"@!"}) AADD(aSay,{"Prefixo" ,"C",03,0,"cPrefixo","@!"}) AADD(aSay,{"Tipo","C",03,0,"cTipo" ,"@!"}) AADD(aSay,{"Cliente" ,"C",06,0,"cCliente","@!"}) AADD(aSay,{"Loja","C",02,0,"cLoja" ,"@!"}) AADD(aSay,{"Nome","C",30,0,"cNome" ,"@!"}) AADD(aSay,{"CNPJ/CPF","C",14,0,"cCGC","@!"}) AADD(aSay,{"Dt.Processo" ,"D",08,0,"dData" ,"@!"}) AADD(aSay,{"Total R$","N",17,2,"nTotal","@!"}) AADD(aSay,{"Total UFESP" ,"N",17,2,"nUFESP","@!"}) AADD(aSay,{"Status","C",01,0,"cStatus" ,"@!"}) AADD(aSay,{"Cond.Pagto","C",03,0,"cCond" ,"@!"}) // Vetor para List Box AADD(aAIIPM,{"1234","DCD9815","26/03/03"}) AADD(aAIIPM,{"1234","DCD9815","26/03/03"}) AADD(aAIIPM,{"1234","DCD9815","26/03/03"}) // Vetor para List Box AADD(aTitulo,{"A","26/03/03","26/03/03","1.974,00","100,00"}) AADD(aTitulo,{"A","26/03/03","26/03/03","1.974,00","100,00"}) AADD(aTitulo,{"A","26/03/03","26/03/03","1.974,00","100,00"}) DEFINE MSDIALOG oDlg TITLE cTitulo FROM 122,0 TO 432,600 OF oDlg PIXEL @ 013,002 TO 154,192 LABEL "Parcelamento"OF oDlg PIXEL @ 013,195 TO 082,298 LABEL "Ttulos" OF oDlg PIXEL @ 083,195 TO 154,298 LABEL "AIIPM" OF oDlg PIXEL

//scrollbox Pgina 176Programao ADVPL II e Guia de Referncia @ 019,006 SCROLLBOX oScroll HORIZONTAL VERTICAL SIZE 131,182 OF oDlg BORDER For n:=1 TO Len(aSay) bGet := &("{|| '"+aSay[n][1]+"'}") cVar := aSay[n][5] cGet:= "{|u| IIF(PCount()>0,"+cVar+":=u,"+cVar+")}" cPict := aSay[n][6]

TSay():New(nTop,5,bGet,oScroll,,,.F.,.F.,.F.,.T.,,,; GetTextWidth(0,Trim(aSay[n][1])),15,; .F.,.F.,.F.,.F.,.F.) oGet:=TGet():New(nTop-2,40,&cGet,oScroll,,7,cPict,,,,,.F.,,.T.,; ,.F.,,.F.,.F.,,.T.,.F.,,(cVar),,,,.T.) nTop+=11 Next n

//listbox ttulos @ 019,199 LISTBOX oLbx1 FIELDS HEADER ; "Parcela","Vencto","Vencto.Real","Valor R$","Qtd.UFESP"; COLSIZES 21,24,33,63,100; SIZE 095,059 OF oDlg PIXEL oLbx1:SetArray( aTitulo ) oLbx1:bLine := {||{aTitulo[oLbx1:nAt,1],aTitulo[oLbx1:nAt,2],; aTitulo[oLbx1:nAt,3],aTitulo[oLbx1:nAt,4],aTitulo[oLbx1:nAt,5]}}

//listbox aiipm @ 089,199 LISTBOX oLbx2 FIELDS HEADER "AIIPM","Placa","Data Multa" ; COLSIZES 24,21,30 SIZE 095,061 OF oDlg PIXEL oLbx2:SetArray( aAIIPM ) oLbx2:bLine := {||{aAIIPM[oLbx2:nAt,1],aAIIPM[oLbx2:nAt,2],aAIIPM[oLbx2:nAt,3]}}

ACTIVATE MSDIALOG oDlg CENTER ON INIT EnchoiceBar(oDlg,{||oDlg:End()},{||oDlg:End()}) RETURN 2.23ParamBox() Implementaumateladeparmetros,quenonecessitadacriaodeumgrupode perguntas no SX1, e com funcionalidades que a Pergunte() no disponibiliza, tais como CheckBox e RadioButtons. CadacomponentedaParamBoxserassociadoaumparmetroPrivatedenominado MV_PARxx,deacordocomaordemdocomponentenatela.Osparmetrosda Programao ADVPL II e Guia de RefernciaPgina 177 ParamBoxpodemserutilizadosdeformaindependenteemumarotinaespecfica,ou complementando opes de uma rotina padro. Cuidados APARAMBOXdefineosparmetrosseguindooprincpiodasvariveis MV_PARxx. Caso ela seja utilizada em uma rotina em conjunto com parmetros padres (SX1 + Pergunte()) necessrio salvar os parmetros padres, chamar a Parambox(),salvaroretornodaParambox()emvariveisPrivateespecficas (MVPARBOXxx) e depois restaurar os parmetros padres, conforme o exemplo desta documentao. O objeto COMBO() da PARAMBOX() possui um problema em seu retorno: Caso o combo no seja selecionado, ele manter seu contedo como numrico, caso seja, ele receber o texto da opo e no o nmero da opo. O exemplo desta documentaoilustraotratamentodecdigonecessrioparaprotegera aplicao. AoutilizaraParamBoxemumafunoquetambmutilizeparmetros definidos pela funo Pergunte() deve-se: ESalvar e restaurar os MV_PARs da Pergunte() EDefinir variveis Private prprias para a ParamBox, as quais iro armazenar o contedo das MV_PARs que esta retorna. ESintaxe: ParamBox (aParamBox, cTitulo, aRet, bOk, aButtons, lCentered,; nPosx, nPosy, oMainDlg, cLoad, lCanSave, lUserSave) ERetorno: lOK indica se a tela de parmetros foi cancelada ou confirmada EParmetros: aParamBox Array de parmetros de acordo com a regra da ParamBox. cTituloTitulo da janela de parmetros. aRet Array que ser passado por referncia e retornado com o contedo de cada parmetro. bOk Bloco de cdigo para validao do OK da tela de parmetros aButtons Array contendo a regra para adio de novos botes (alm do OK e Cancelar) // AADD(aButtons,{nType,bAction,cTexto}) lCentered Se a tela ser exibida centralizada, quando a mesma no estiver vinculada a outra janela. nPosxPosio inicial -> linha (Linha final: nPosX+274). nPosyPosio inicial -> coluna (Coluna final: nPosY+445). oMainDlgCaso o ParamBox deva ser vinculado a uma outra tela. Pgina 178Programao ADVPL II e Guia de RefernciacLoad Nome do arquivo aonde as respostas do usurio sero salvas / lidas. lCanSaveSe as respostas para as perguntas podem ser salvas. lUserSaveSe o usurio pode salvar sua prpria configurao. EAparncia:Programao ADVPL II e Guia de RefernciaPgina 179 ERegras do array aParamBox: [1] Tipo do parmetro: Paracadatipodeparmetroasdemaisposiesdoarray variam de contedo conforme abaixo: 1 - MsGet [2] : Descrio [3] : String contendo o inicializador do campo[4] : String contendo a Picture do campo[5] : String contendo a validao [6] : Consulta F3 [7] : String contendo a validao When[8] : Tamanho do MsGet [9] : Flag .T./.F. Parmetro Obrigatrio? 2 - Combo [2] : Descrio [3] : Numrico contendo a opo inicial do combo[4] : Array contendo as opes do Combo [5] : Tamanho do ComboPgina 180Programao ADVPL II e Guia de Referncia[6] : Validao [7] : Flag .T./.F. Parmetro Obrigatrio? 3 - Radio [2] : Descrio [3] : Numrico contendo a opo inicial do Rdio[4] : Array contendo as opes do Rdio [5] : Tamanho do Rdio[6] : Validao [7] : Flag .T./.F. Parmetro Obrigatrio? 4 - CheckBox ( Com Say )[2] : Descrio [3] : Indicador Lgico contendo o inicial do Check[4] : Texto do CheckBox [5] : Tamanho do Rdio[6] : Validao [7] : Flag .T./.F. Parmetro Obrigatrio? 5 - CheckBox ( linha inteira )[2] : Descrio [3] : Indicador Lgico contendo o inicial do Check[4] : Tamanho do Rdio[5] : Validao [6] : Flag .T./.F. Parmetro Obrigatrio? 6 - File[2] : Descrio [3] : String contendo o inicializador do campo[4] : String contendo a Picture do campo[5] : String contendo a validao [6] : String contendo a validao When[7] : Tamanho do MsGet[8] : Flag .T./.F. Parmetro Obrigatrio ?[9] : Texto contendo os tipos de arquivoEx.: "Arquivos .CSV |*.CSV" [10]: Diretrio inicial do CGETFILE() [11]: Parmetros do CGETFILE() 7 - Montagem de expresso de filtro [2] : Descrio [3] : Alias da tabela [4] : Filtro inicial[5] : Opcional - Clusula When Boto Editar Filtro 8 - MsGet Password[2] : Descrio Programao ADVPL II e Guia de RefernciaPgina 181 [3] : String contendo o inicializador do campo[4] : String contendo a Picture do campo[5] : String contendo a validao [6] : Consulta F3 [7] : String contendo a validao When[8] : Tamanho do MsGet[9] : Flag .T./.F. Parmetro Obrigatrio? 9 - MsGet Say [2] : String Contendo o Texto a ser apresentado [3] : Tamanho da String [4] : Altura da String[5] : Negrito (lgico) Exemplo: Utilizao da ParamBox() #include protheus.ch /*/ +----------------------------------------------------------------------- | Funo| xParamBox | Autor | ROBSON LUIZ |Data ||+----------------------------------------------------------------------- | Descrio| Programa que demonstra a utilizao da PARAMBOX como | || forma alternativa de disponibilizar parmetros em um| | | processamento.| +----------------------------------------------------------------------- | Uso | Curso ADVPL | +----------------------------------------------------------------------- /*/ User Function xParamBox() Local aRet := {} Local aParamBox := {} Local aCombo := {"Janeiro","Fevereiro","Maro","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"} Local i:= 0 Private cCadastro := "xParambox" Pgina 182Programao ADVPL II e Guia de RefernciaAADD(aParamBox,{1,"Produto",Space(15),"","","SB1","",0,.F.}) AADD(aParamBox,{2,"Tipo de cliente",1,aCombo,50,"",.F.}) AADD(aParamBox,{3,"Mostra deletados",IIF(Set(_SET_DELETED),1,2),{"Sim","No"},50,"",.F.}) AADD(aParamBox,{4,"Marca todos ?",.F.,"Marque todos se necessrio for.",50,"",.F.}) AADD(aParamBox,{5,"Marca todos ?",.F.,50,"",.F.}) AADD(aParamBox,{6,"Qual arquivo",Space(50),"","","",50,.F.,; "Arquivo .DBF |*.DBF"}) AADD(aParamBox,{7,"Monte o filtro","SX5","X5_FILIAL==xFilial('SX5')"}) AADD(aParamBox,{8,"Digite a senha",Space(15),"","","","",80,.F.}) If ParamBox(aParamBox,"Teste Parmetros...",@aRet) For i:=1 To Len(aRet) MsgInfo(aRet[i],"Opo escolhida") NextEndif Return Exemplo: Protegendo os parmetros MV_PARs da Pergunte() em uso. #include "protheus.ch" /*/ +------------------------------------------------------------------------- | Funo| XPARBOX() | Autor | ARNALDO RAYMUNDO JR.|Data ||+------------------------------------------------------------------------- | Descrio| Funo utilizando a PARAMBOX() e protegendo os MV_PARs| || ativos do programa principal. | +------------------------------------------------------------------------- | Uso | Curso ADVPL| +------------------------------------------------------------------------ /*/ Static Function XPARBOX(cPerg) Programao ADVPL II e Guia de RefernciaPgina 183 Local aParamBox:= {} Local cTitulo:= "Transferncia para Operao" Local bOk:= {|| .T.} Local aButtons:= {}; Local aRet := {} Local nPosx; Local nPosy; Local nX := 0 Local cLoad:= "" Local lCentered := .T.; Local lCanSave := .F.; Local lUserSave := .F. Local aParamAtu := Array(4) // Salva as perguntas padres antes da chamada da ParamBox For nX := 1 to Len(aParamAtu) aParamAtu [nX]:= &("Mv_Par"+StrZero(nX,2)) Next nX AADD(aParamBox,{2,"Atualiza taxa de depreciao?", 2, {"Sim","No"}, 100,; "AllwaysTrue()",.T.}) ParamBox(aParamBox, cTitulo, aRet, bOk, aButtons, lCentered, nPosx, nPosy, /*oMainDlg*/ ,; cLoad, lCanSave, lUserSave) IF ValType(aRet) == "A" .AND. Len(aRet) == Len(aParamBox) For nX := 1 to Len(aParamBox) If aParamBox[nX][1] == 1 &("MvParBox"+StrZero(nX,2)) := aRet[nX] ElseIf aParamBox[nX][1] == 2 .AND. ValType(aRet[nX]) == "C" &("MvParBox"+StrZero(nX,2)) := aScan(aParamBox[nX][4],; {|x| Alltrim(x) == aRet[nX]}) ElseIf aParamBox[nX][1] == 2 .AND. ValType(aRet[nX]) == "N" &("MvParBox"+StrZero(nX,2)) := aRet[nX] EndifNext nX ENDIF // Restaura as perguntas padres apos a chamada da ParamBox For nX := 1 to Len(aParamAtu) &("Mv_Par"+StrZero(nX,2)) := aParamAtu[nX] Next nX Return Pgina 184Programao ADVPL II e Guia de RefernciaMDULO 05: INTRODUO A ORIENTAO OBJETOS 12. Concei t os de or i ent ao obj et os Otermoorientaoaobjetospressupeumaorganizaodesoftwareemtermosde coleodeobjetosdiscretosincorporandoestruturaecomportamentoprprios.Esta abordagem de organizao essencialmente diferente do desenvolvime