Pular para o conteúdo principal

Postagens

Mostrando postagens de 2013

Protheus: Alterando a tela de login

Muitos analistas e usuários, não gostam da tela de login "BY YOU more business... " do Protheus. Que tal mudar tudo, colocando sua logomarca, slogan e outros elementos, deixando esta tela inicial, com a cara de sua empresa? Bom, para isto funcionar, siga EXATAMENTE os passos abaixo: 1) Baixe os arquivos, no link abaixo, e edite-os da maneira que achar melhor, trocando as imagens da Coca Cola , pelas imagens de sua empresa (não altere o tamanho, nem o tipo do arquivo): • LINK PARA BAIXAR OS ARQUIVOS 2) Abra o Windows Explorer e crie uma pasta com o nome telalogin ,  dentro de sua pasta RDMAKE. C opie para dentro desta pasta telalogin , os arquivos de imagem baixados e editados conforme o passo 1. 3) Abra o IDE e compile para autenticar (logar). 4) No seu projeto, crie uma pasta com o mesmo nome da pasta criada no passo 2, ou seja: telalogin . 5) Ainda no IDE, clique com o botão direito na pasta telalogin (para selecioná-la). Agora clique com o botão esqu

Modo de edição

Desde a versão 8.11, ao clicar com o botão direito do mouse sobre o título de uma coluna do aCols, pode-se escolher editar os dados por linha ou por célula , ou seja, em formato de planilha ou formulário. O problema é que, os usuários, fazem esta alteração sem querer! Para parar com esta confusão, desative esta opção de escolha do modo de edição, configurando o parâmetro MV_GETDADL para .F. . • Veja também: Parâmetro MV_ENCHOLD

Retirando acentos

Às vezes, por exemplo quando vamos gravar contas de e-mail, não queremos que o usuário digite acentos. Para "estes momentos", use a função  FwNoAccent( ) . Veja o exemplo abaixo: user function fTiraAcent ()    cString := "Você não pôde tomar café hoje."    cString := FwNoAccent ( cString )    alert ( cString ) return •  Veja também: Função SplitPath()

SplitPath - Dividindo um path

Exemplo SplitPath Quando trabalhamos, acessando arquivos, as vezes precisamos de detalhes destes. A ADVPL, possui a função SplitPath que já divide um path em: drive, path, nome do arquivo e extensão. Segue um exemplo: user function fDividePath()     Local cPatharq := "C:\TEMP\DOC\DOCUMENTO.TXT"     Local cDrive, cDir, cArq, cExt    SplitPath( cPatharq, @cDrive, @cDir, @cArq, @cExt )    msgalert(cDrive +chr(10)+ cDir +chr(10)+ cArq +chr(10)+ cExt, "Função SplitPath " ) return • Veja também: Somando strings

Testar erro na execução de uma query

É importante testar erros, antes de executar uma query, para evitar erros de execução. Uma boa maneira é testar o retorno da função  TCSQLEXEC() . A query abaixo, tem um erro proposital, para que a janela com o erro apareça : user function fTestaQry ()     dbselectarea ( "SA1" )    cSql := "SELECT * FRO SA1010"    nQueryRet := TCSQLEXEC ( cSql )     if nQueryRet < 0       return msgstop ( "ERRO NA QUERY: "  + chr(10) + TCSQLError ())     endif return •  Veja também: Tabelas customizadas. Quantas?

Configurando o Totvs Smart Client na inicialização

Para ficar registrado, seguem os parâmetros para configurar a inicialização do TOTVS Smart Client : C(Connection) Nome da seção de conexão, que será usada, para a conexão ao Totvs Application Server(TotvsAppServer). E(Environment) Nome da seção do ambiente , no (INI do Server), que será utilizada para definições gerais. L(Log File) No diretório de execução do Totvs Smart Client, é gerado um arquivo de log para não conformidades que ocorram no Totvs Smart Client (antes que este se conecte com o Totvs Application Server). Este arquivo é gerado com o nome de Totvs Smart Client. M(AllowMultiSession) Permite múltiplas instâncias cópias do Totvs Smart Client na mesma máquina. No modo default não permite multiplas sessões. P(Main Program) Identifica o programa (APO) inicial. Q(Quiet) Indica que o Totvs Smart Client não deverá mostrar o Splash (imagem de Apresentação) e a tela de id

O parâmetro MV_ENCHOLD

Nas versões anteriores do Protheus, as telas (ver Enchoice), usavam um layout com no máximo duas colunas de campos. Atualmente o layout exibe os campos com lado a lado, ocupando toda a tela. O responsável por estes dois tipos de layout, é o parâmetro MV_ENCHOLD . Veja na imagem abaixo, o resultado quando usamos este parâmetro com os valores 1 ou 2: Entre no configurador, localize o parâmetro MV_ENCHOLD , mude o valor e faça o teste. • Veja também: Modo de edição (célula / linha)

Usando TFolder

Usar janelas com abas, dependendo da situação, pode ser inevitável. Segue um exemplo, usando TFolder : #include "TOTVS.CH" user function fFuncao1()     define dialog oDialogo title "Exemplo de TFolder" from 180,180 to 550,700 pixel     // Cria a Folder        aTFolder := { "Aba 01" , "Aba 02" , "Aba 03" }    oTFolder := tfolder():new( 0,0,aTFolder,,oDialogo,,,,.t.,,260,184 )     // Insere dois tget na aba 1    oSay:= tsay():new(1,2,{|| "Campo: " }, oTFolder:aDialogs[1],,,,,,.t.,CLR_RED,CLR_WHITE,96,9)    cTGet1 := "Campo TGet 01"    oTGet1 := tget():new( 1,25,{||cTGet1},oTFolder:aDialogs[1],96,9,;               "" ,,0,,,.f.,,.t.,,.f.,,.f.,.f.,,.f.,.f.,,cTGet1,,,, )    cTGet2 := "Campo TGet 02"    oTGet2 := tget():new( 20,25,{||cTGet2},oTFolder:aDialogs[1],96,9,;               "" ,,0,,,.f.,,.t.,,.f.,,.f.,.f.,,.f.,.f.,,cTGet2,,,, )     // Insere um t

Lendo arquivos XML

Mesmo antes, e desde que começamos a tratar notas fiscais eletrônicas(NFe) no Protheus, ocasionalmente, existe a necessidade de acessar dados, nos "nodes" de arquivos XML. No exemplo abaixo, foram lidos o conteúdo dos campos xNome (nome do destinatário) e dEmi (data de emissão), num .XML de uma nota fiscal eletrônica : # include "rwmake.ch" # include "xmlxfun.ch" user function fLexml ()     local cError := cWarning := cDestinatario := cDataEmissao := "" ,;          cNomearq := "\NFE\XML\nomearquivonotafiscal.xml" ,;            oNotaxml := xmlparserfile ( cNomearq, "" , @ cError, @ cWarning )     if cError # "" .or. cWarning # ""       alert ( "Erro: " + cError + "  -  Aviso: " + cWarning )     else       cDestinatario := alltrim( oNotaxml :_nfeProc:_NFe:_infNFe:_dest:_xNome:Text)       cDataEmissao   := alltrim( oNotaxml :_nfeProc:_NF

Barras de progresso

Segue um exemplo de como fazer barra de progresso, para ilustrar processos mais longos. Para isto, use  as funções  Processa , Procregua e Incproc . O exemplo abaixo, funciona. É só testar: # include "rwmake.ch" user function fFuncao1()    cRBSFQSQL := changequery( "SELECT COUNT(A1_COD) AS NREGISTRO FROM SA1010 WHERE A1_NOME LIKE 'A%'" )    dbusearea(.t., 'TOPCONN' , tcgenqry(,,cRBSFQSQL), 'TMPSA1' , .f., .t.)     if .not. TMPSA1->( eof ())       processa ( {|| u_fFuncao2( TMPSA1->NREGISTRO ) }, "Titulo" , "Processando aguarde..." , .f.)     endif    dbclosearea( "TMPSA1" ) return nil user function fFuncao2(nRegistros)     local cRegistros := ""     procregua (nRegistros)    cRBSFQSQL := changequery( "SELECT A1_COD, A1_NOME FROM SA1010 WHERE A1_NOME LIKE 'A%'" )    dbusearea(.t., 'TOPCONN' , tcgenqry(,,cRBSFQSQL), 'TMPSA2' , .f., .t.)

Language / Idioma

Prezados amigos, de outros países, que acessam este blog, Já está disponível, um Gadget para traduzir nossos textos para :  Português, Espanhol e Inglês. Queridos amigos, en otros países, el acceso a este blog, Ya está disponible, un Gadget para traducir nuestros textos para :  Portugués, Español e Inglés. Dear friends, from other countries, accessing this blog, Is already available, a Gadget to translate our texts for : Portuguese, Spanish and English.

Somando Strings

Se houver necessidade de somar strings sem ter que convertê-las, use a função somastr() . Para usar, a sintaxe é a seguinte: somastr(cVal1 , cVal2 ) , onde cVal1 e cVal2 são string's numéricas que você quer somar. Segue um exemplo: cStr1 := "500" cStr2 := "800" cSoma := somastr ( cStr1, cStr2 ) O resultado, guardado em cSoma será "1300" .

Usando o TOTVSMNTLIC

Use o TOTVSMNTLIC para abrir o License Server Monitor . Com ele, você pode monitorar os tipos de licenças existentes bem como quantas e quais já foram consumidas. Para executá-lo, chame o Smartclient sem nenhum parâmetro, e  digite  TOTVSMNTLIC  no campo 'Programa inicial' e clique Ok.

Executando rotinas ao abrir um módulo

Para executar uma rotina ao abrir um módulo do Protheus, basta você criar uma função com o nome do módulo . No exemplo abaixo, é mostrada uma mensagem ao entrar no módulo financeiro: user function SIGAFIN()    msgalert( "Entrou no módulo Financeiro." ) return nil Faça o teste, e experimente também com outros módulos ( SIGALOJA, SIGAFAT e SIGAEST ).

Usando Listbox

O nome do objeto é tComboBox , mas combo, vem de 'combinação', que no caso deveria permitir digitar no campo, e escolher numa lista, ao mesmo tempo. Como o campo criado por este tComboBox não permite digitar nada, eu o chamo de Listbox. Segue um exemplo, de como fazer listbox usando ADVPL: static function MinhaCombo() local nRBachou, aRBfil:={}, aRBfil2:={} private oDiag01, cCodfil, cOz4Cod @ 0, 0 to 300, 480 dialog oDiag01 title "Exemplo de Listbox" @ 5, 5 say "Filial:" dbselectarea("OZ4") OZ4->(dbgotop()) do while .not. OZ4->(eof()) nRBachou := aScan(aRBfil2, OZ4->OZ4_CODIGO) if nRBachou = 0 aadd(aRBfil2, OZ4->OZ4_CODIGO +" "+ OZ4->OZ4_DESC) endif OZ4->(dbskip()) enddo aRBfil := asort(aRBfil2) cOz4Cod := aRBfil[1] oCombo := tComboBox():new(5,60,{|u|if(pcount()>0,cOz4Cod:=u,cOz4Cod)},aRBfil,100,20,oDiag01,,{||fRBaltera(