Pictures (máscaras) de campos

As máscaras começam sempre com @

Use @R para gravar apenas números (excluir caracteres ex. ponto, vírgula, barras) no banco.

Exemplo para um campo de CPF:

@R 999.999.999-99 // Onde 9 significa qualquer caractere numérico.

Segue a tabela com todos os parâmetros possíveis (retirada do TDN):

Caractere Descrição

A

Permite somente caracteres  alfa.

N

Permite somente caracteres  alfa e número.

X

Permite qualquer caractere

9

Permite dígitos de qualquer tipo incluído sinal

#

Permite dígitos, sinais e espaços para qualquer tipo de dado

L

Permite apenas Y,N, T e F

Y

Permite apenas Y,N

!

Converte caracteres alfa em maiúscula

$

Exibe o sinal de dólar

.

Exibe um ponto decimal

,

Exibe uma virgula

R

Insere caracteres  mais não salva no campo de dado.

Para campos numéricos que contenham decimal, é obrigatório o uso do @E seguido da máscara com pontos e vírgulas invertidos (padrão americano), exemplo:

@E 99,999,999.99 // os pontos e as vírgulas serão invertidos na visualização

Os separadores de milhar são opcionais. E lembre-se de casar o número de caracteres numéricos da máscara com o tamanho real do campo quando estiver criando ou alterando no configurador.

 

Informações retiradas do TDN: https://goo.gl/EPs2Ro

Permissões para TDS aplicar patchs e editar appserver.ini

Adicione as cláusulas abaixo no AppServer.ini do serviço Protheus para que seja possível aplicar patchs e editar o INI do server diretamente pelo Totvs Developer Studio.

[TDS]
AllowApplyPatch=*
AllowEdit=*

Esse asterisco indica que qualquer TDS em qualquer máquina, que tenha feito conexão com  o servidor, poderá aplicar patchs ou editar o INI. Mas é possível inserir apenas os IPs que você desejar permitir, separados por vírgula.

Veja a documentação completa sobre cada uma dessas cláusulas no TDN:

AllowApplyPatch: https://goo.gl/JuaKBh
AllowEdit: https://goo.gl/RIaI7A

Como travar/bloquear pergunta para o usuário

Quando o sistema carrega perguntas ao entrar em uma rotina ou quando você as acessa através do F12, pressione F1 para descobrir o código do Grupo de Pergunta que você deseja configurar. Em seguida, siga os passos abaixo:

  1. Acessar o modulo CONFIGURADOR; (Programa inicial= SIGACFG)
  2. Clicar em USUARIO / SENHAS / CONFIG. PERGUNTAS;
  3. Clicar na opção Incluir;
  4. Informe o Grupo de Pergunta;
  5. Informe o Usuário ou o Grupo de Usuário;
  6. Selecione a Pergunta desejada e clique na tecla Delete do seu teclado;
  7. Informe o valor desejado no campo Conteúdo;
  8. Clique em Confimar.

Retirado do TDN: https://goo.gl/bgpFEV

Chamar Static Function no aRotina

Segue exemplo de como chamar uma Static Function no vetor aRotina:

Private bVisuali := {|| fCad(2) }
Private bIncluir := {|| fCad(3) }
Private bAlterar := {|| fCad(4) }
Private bExcluir := {|| fCad(5) } 
Private bFirmar :=  {|| fFirmar() } 
Private bImprime := {|| fImprime() }
 
Private aRotina := {{"Pesquisar"  , "AxPesqui"       , 0 , 1 },;
                    {"Visualizar" , "Eval(bVisuali)" , 0 , 2 },;
                    {"Incluir"    , "Eval(bIncluir)" , 0 , 3 },;
                    {"Alterar"    , "Eval(bAlterar)" , 0 , 4 },;
                    {"Excluir"    , "Eval(bExcluir)" , 0 , 5 },;
                    {"Firmar"     , "Eval(bFirmar)"  , 0 , 6 },;
                    {"Imprimir"   , "Eval(bImprime)" , 0 , 7 }}

Neste exemplo as funções fCad, fFirmar e fImprime são estáticas.

Status de Transmissão no TSS

nfe1Segue os status de transmissão no TSS (TOTVS SERVICE SPED) relacionados às tabelas SPED050 e SPED052.

Status NF-e (tabela SPED050)
[1] NFe Recebida
[2] NFe Assinada
[3] NFe com falha no schema XML
[4] NFe transmitida
[5] NFe com problemas
[6] NFe autorizada
[7] Cancelamento

Status de Cancelamento/Inutilização (tabela SPED050)
[1] NFe Recebida
[2] NFe Cancelada
[3] NFe com falha de cancelamento/inutilização

Status Mail (tabela SPED050) 
[1] A transmitir
[2] Transmitido
[3] Bloqueio de transmissao – cancelamento/inutilização

Status do Lote (tabela SPED052)
[1] Lote transmitido
[2] Lote recebido com sucesso
[3] Lote com erro

Exportar planilha do Excel usando FWMsExcel

exportexcelOlá meus amigos. A seguir, informações para exportarmos planilha do Excel de uma maneira mais profissional.

O objeto FWMsExcel fornece métodos para criação de arquivo XML compatível com as versões do MS Excel 2003, superiores e alternativos. Com ele é possível criar abas, tabelas, e colunas. Manipular cores e fontes inclusive.

Segue um exemplo muito simples de exportação para planilha do Excel utilizando o objeto FWMsExcel:

Local cArquivo  := "RELAT_FINANC.XLS"
Local oExcelApp := Nil
Local cPath     := "C:\WINDOWS\TEMP\"
Local nTotal    := 0
Local oExcel
Local oExcelApp

aColunas := {}
aLocais := {} 
oBrush1 := TBrush():New(, RGB(193,205,205))
 
// Verifica se o Excel está instalado na máquina
 
If !ApOleClient("MSExcel")

    MsgAlert("Microsoft Excel não instalado!")
    Return

EndIf

oExcel  := FWMSExcel():New()
cAba    := "Contas a Receber"
cTabela := "Titulos"

// Criação de nova aba 
oExcel:AddworkSheet(cAba)

// Criação de tabela
oExcel:AddTable (cAba,cTabela)

// Criação de colunas 
oExcel:AddColumn(cAba,cTabela,"Dt.Emissao" ,1,4,.F.) 
oExcel:AddColumn(cAba,cTabela,"Prefixo"    ,2,1,.F.) 
oExcel:AddColumn(cAba,cTabela,"Titulo"     ,2,1,.F.) 
oExcel:AddColumn(cAba,cTabela,"Parcela"    ,2,1,.F.) 
oExcel:AddColumn(cAba,cTabela,"Valor"      ,3,2,.T.) 

While !SE1->(Eof())
 
    // Criação de Linhas 
    oExcel:AddRow(cAba,cTabela, { DtoC(SE1->E1_EMISSAO) ,;
                                  SE1->PREFIXO ,; 
                                  SE1->TITULO ,; 
                                  SE1->PARCELA ,; 
                                  SE1->E1_VALOR })

    SE1->(dbSkip())

End

If !Empty(oExcel:aWorkSheet)

    oExcel:Activate()
    oExcel:GetXMLFile(cArquivo)
 
    CpyS2T("\SYSTEM\"+cArquivo, cPath)

    oExcelApp := MsExcel():New()
    oExcelApp:WorkBooks:Open(cPath+cArquivo) // Abre a planilha
    oExcelApp:SetVisible(.T.)

EndIf

Veja mais sobre o objeto FWMsExcel no TDN:
http://tdn.totvs.com/display/public/mp/FWMsExcel

Usando TCLink para conectar a outra base de dados

php-db-connection

Olá meus amigos! Andei um pouco sumido, mas vou me esforçar em continuar postando conteúdo por aqui. Vamos falar de conexão com outros bancos de dados de dentro do Protheus.

Com as funções AdvConnection(), TCLink() e TcSetConn() podemos nos conectar a outras bases de dados através do DBAccess (TopConnect). Lembrando que primeiramente temos que seguir a configuração padrão que é criar a conexão ODBC no servidor onde está instalado o DBAccess e depois configurar no próprio DBMonitor como já fazemos com a base Protheus.

No nosso fonte, bastará alternar entre os bancos de dados para realizar consultas e comandos SQLs. Veja abaixo um exemplo simples para se conectar a um banco que chamamos de GRUPOBI onde o DBAccess se encontra no mesmo servidor da aplicação escutando na porta 7890.

Local cConexao    := SuperGetMV("MV_XXCON01", .F., "MSSQL/GRUPOBI")
Local cServerAddr := SuperGetMV("MV_XXCON02", .F., "localhost")
Local nPort       := Val(SuperGetMV("MV_XXCON03", .F., "7890"))

If Type("_nTopProtheus") == "U"

    Public _nTopProtheus

    _nTopProtheus := AdvConnection() // obtém o ID da conexão atual

EndIf

If Type("_nTopGrupoBI") == "U"

    Public _nTopGrupoBI

    MsgRun("Conectando a Grupo BI...","Conexão",;
        {|| _nTopGrupoBI := TcLink(cConexao,cServerAddr,nPort) })

    If _nTopGrupoBI < 0

        MsgAlert("Não foi possível se conectar com Grupo BI. "+;
                 "Essa falha pode ocorrer devido ao número de licenças excedidas. "+;
                 "Tente mais tarde ou contate o administrador do sistema.")

        Return .F.

    EndIf

EndIf

TcSetConn(_nTopGrupoBI) // Utilize essa função para alternar entre as conexões

Você precisará de permissão para criação de tabelas no banco, pois o Protheus criará automaticamente nesta base as seguintes tabelas de controle do DBAccess: TOP_PARAM, TOP_SP, TOP_VIRTUALIDX, TOP_FIELD e TOP_IDXSTATS.

Vejam mais informações no TDN: http://tdn.totvs.com/display/tec/TCSetConn

Protheus 11.8 DEMO atualizado em 26/08/2015

Estou disponibilizando dois downloads do Protheus 11.8 atualizado até 26/08/2015 para simulação, desenvolvimento e estudo, conforme a Totvs permite, operando na empresa 99-Teste com 2 acessos no DBAccess (Top Connect). Os arquivos estão compactados em RAR5, por isso você precisa ter uma versão atualizada do seu descompactador.

Pastas Protheus e Protheus_Data

Podem ser utilizadas para uma nova instalação do Protheus.

Link para download: https://goo.gl/x0aC6U (722 MB)

Máquina Virtual

Máquina virtual com Windows XP SP2 + SQL Server + Protheus funcionando como serviço. É uma máquina virtual para o Oracle VirtualBox.

Atualização do post em 28/03/2017: pessoal, percebi que realmente fazer o download no Mega está complicado. Então segue aqui o link de download da máquina virtual pelo Google Drive, o arquivo está dividido em partes de 1 GB. Tive vários problemas pra conseguir isso mas funcionou, porém ficou maior a maquina virtual. Mas enfim, funciona.

Link para download no Google Drive: https://goo.gl/XM6Vh9 (10 arquivos RAR em partes totalizando 10 GB)

Link para download no Mega: https://goo.gl/hLf0H1 (5,06 GB)

Baixe o Oracle VirtualBox nesse link: https://www.virtualbox.org/wiki/Downloads

Screenshots da máquina virtual

vm_tela1

vm_tela2

vm_tela3

vm_tela4

vm_tela5

Controle de Semáforo no Protheus

O controle de semáforo no Protheus é feito utiizando-se duas funções:

LockByName (para criar um semáforo)
http://tdn.totvs.com/pages/releaseview.action?pageId=6814894

UnlockByName (para liberar o semáforo criado)
http://tdn.totvs.com/pages/releaseview.action?pageId=6814897

O conceito é o seguinte. Quando for iniciar a rotina verifique se pode criar um semáforo dessa forma:

If !LockByName("NOME_DA_SUA_ROTINA",.F.,.F.,.T.)
    MsgAlert("Rotina está sendo executada por outro usuário.")
    Return
EndIf

Ao final da rotina desative o semáforo. Senão não vai conseguir rodar mais a rotina. Dessa forma:

UnLockByName("NOME_DA_SUA_ROTINA",.F.,.F.,.T.)

Em caso de queda de conexão e travamento dos semáforos, existe a pasta semaforo no Protheus_Data. Será necessário parar o serviço, apagar os arquivos e iniciar novamente o serviço. Isso resolve qualquer problema de semáforos padrões do sistema inclusive.

Essa dica foi enviada pelo amigo, consultor e programador Bruno Sobral, que pediu para não colocar os créditos, mas eu sou teimoso. Abraços 😉

Problema ao restaurar backup no SQL Server

Algumas vezes pode ocorrer um problema muito chato ao restaurar um backup no SQL Server. É quando, após a restauração, o status do banco de dados permanece (restaurando) ou (restoring) e o SQL Server não permite nenhuma operação nessa base. Pesquisei na internet e descobri que o problema pode ocorrer no término da criação do arquivo de log. É um bug, mas a restauração foi bem sucedida. Encontrei uma solução extremamente simples para desbloquear o banco de dados. Acesse o Management Studio, conecte ao SQL Server, e execute o seguinte comando SQL:

RESTORE DATABASE NOME_DO_BANCO WITH RECOVERY

Pronto. Problema solucionado.