quarta-feira, 7 de junho de 2017

Alinhamento em janelas com a propriedade do ALIGN

Quem nunca sofreu com alinhamentos em janelas do Protheus, porém um simples comando vai fazer você mudar o seu conceito em relação a esse assunto,  esse é a propriedade ALIGNque vai nos esquecer as complexos malabarismos de coordenadas do MsAdvSize ou FWGetDialogSize.
Então vamos lá com as opções:

Alinhar preenchendo em todo o conteúdo da Janela ou Painel onde estiver
CONTROL_ALIGN_ALLCLIENT
Alinhar ao Topo
CONTROL_ALIGN_TOP 
Alinhar ao Rodapé
CONTROL_ALIGN_BOTTOM
Alinhar à Esquerda
CONTROL_ALIGN_LEFT
Alinha à Direita
CONTROL_ALIGN_RIGHT
Não utiliza alinhamento
CONTROL_ALIGN_NONE 

Vale ressaltar que o exemplo foi reduzido apenas, para que fosse demostrado o uso dos ALIGN, e o uso deverá ser adaptado de acordo coma sua necessidade.














Um detalhe importante que nesse exemplo até utilizei coordenadas, porém se tivesse deixado o MSNewGetDados  com os campos zerados o resultado seria o mesmo.

oMSNewGet := MsNewGetDados():New( 0,0,0,0, nOpc,
 "U_VLDLINHA()" , "AllwaysTrue", "",;

aAltFields,, nCont , "AllwaysTrue", "", "AllwaysTrue", oWin02, aHeaderEx, aColsEx)
oMSNewGet:oBrowse:Align := CONTROL_ALIGN_ALLCLIENT

Boa sorte na nova forma de alinhamentos sem uso de coordenadas.

terça-feira, 8 de novembro de 2016

TDS erro Failed to create the Java Virtual Machine

Em breve montarei um tutorial completo de como instalar e configurar o TDS, mas desde já vou adiantar um erro que sempre ocorre quando preciso instalar um novo TDS e geralmente para os iniciantes ele dá um certo trabalho para resolver, então vamos lá...


Para corrigir esse erro, basta ir no arquivo de configuração do TDS geralmente com este nome e edita-lo.
Altere os parâmetros:
-Xms40m
-XX:MaxPermSize=256M

Para:
-Xms100m
-XX:MaxPermSize


Agora é só abrir o TDS e ele não apresentará o erro do Java.


Espero ter ajudado com esse post, em breve um tutorial completo da instalação e configuração do Totvs Developer Studio.


sexta-feira, 16 de setembro de 2016

Rotina de devolução através da nota fiscal de entrada MATA103

Em um post parado como rascunho desde 2016, eu me deparei com um erro simples mas que me custou um tempo para encontrar a solução, o erro era esse abaixo:

HELP: A410UNIDIF
Por se  tratar  de  uma  Nota  Fiscal
deDevolução, o  valor  unitário  deve
serigual ao da Nota Fiscal de Origem.

Tabela SF1 15/09/2016 17:31:55
Numero               - F1_DOC       :=          
Serie                - F1_SERIE     :=    
Tipo da Nota         - F1_TIPO      := D
Fornecedor           - F1_FORNECE   := 009535
Loja                 - F1_LOJA      := 01
DT Emissao           - F1_EMISSAO   := 15/09/2016
Form. Prop.          - F1_FORMUL    := S
Espec.Docum.         - F1_ESPECIE   := NF   
Vlr.Frete            - F1_FRETE     := 0
Vlr.Seguro           - F1_SEGURO    := 0
Vlr.Despesas         - F1_DESPESA   := 0
--------------------------------------------------------------------------------
Tabela SD1 15/09/2016 17:31:55
Erro no Item   1
--------------------------------------------------------------------------------
Item NF              - D1_ITEM      := 0001
Produto              - D1_COD       := XXXXXXXXX      
Quantidade           - D1_QUANT     := 500
Vlr.Unitario         - D1_VUNIT     := 1.69689
Vlr.Total            - D1_TOTAL     := 848.45
Desconto             - D1_VALDESC   := 0
Vlr. Frete           - D1_VALFRE    := 0
Vlr. Seguro          - D1_SEGURO    := 0
Vlr. Despesa         - D1_DESPESA   := 0
Aliq. IPI            - D1_IPI       := 15
Armazem              - D1_LOCAL     := XX
Tipo Entrada         - D1_TES       := 999
Cod. Fiscal          - D1_CF        := 9999 
Unidade              - D1_UM        := MT
Lote                 - D1_LOTECTL   := 999999999999
Sub-Lote             - D1_NUMLOTE   :=       
Valid. Lote          - D1_DTVALID   := 09/06/2016
Potencia Lot         - D1_POTENCI   := 0
Data Fabric.         - D1_DFABRIC   := 09/06/2016
Docto. Orig.         - D1_NFORI     := 999999999
Serie Orig.          - D1_SERIORI   := 0  
It.Doc Orig.         - D1_ITEMORI   := 01
ICMS Solid.          - D1_ICMSRET   := 258.03
                     - D1RECNO      := 99999
Erro -->  Inconsistencia na Linha de Itens
--------------------------------------------------------------------------------
Ocorria que quando uma nota de devolução era emitida com base em uma nota de saída, gerava um erro no gatilho de arredondamento, pois no SD2 o valor unitário tem 5 casas decimais enquanto na SD1 era esperado 8 casas decimais e ai ocorria a critica de valor diferente da nota de origem.
A solução encontrada foi remover do gatilho da D1_VUNIT sequência 001, por uma função customizada, e na função testar se era proveniente da rotina de devolução e se for não executar a função ROUND do ADVPL.
Veja como ficou a solução na imagem abaixo:

Se você já teve esse problema e resolveu com outra solução, comente abaixo, quanto mais conhecimento melhor, etc
Até o próximo post...

segunda-feira, 23 de abril de 2012

Acentuando no Protheus

No Protheus existe a possíbilidade de se trabalhar com palavras acentuada, apenas alterando um parametro, o MV_ACENTO de 'N' para 'S', desta forma as palavras que forem acentuadas serão aprentadas desta forma dentro de sistema.

quarta-feira, 18 de janeiro de 2012

Cadastro de funções ADVPL

FWDirRemove( cDir, nType, lComplete, lKillFiles )

Função para remover diretórios, com a vantagem de remover somente o ultimo nível ou todo o caminho.

cDir                   Diretório a ser removido
lComplete          Remove todo o caminho (.T.) ou apenas o ultimo nível (.F.)
lKillFiles             Remove os arquivos antes de tentar remover o diretório




FWMakeDir( cDir, lShowMsg )

Função para criar diretório com seus subdiretórios, com a vantagem de criar todo o caminho.

cDir                    Diretório a ser criado
lShowMsg          Exibe ou não mensagem caso não consiga criar o diretório




FwNoAccent( cString )

Retira acentos de uma string

cString                 String a ser retirado os acentos

Exemplo:

cString := 'O avião não pôde aterrissar de manhã'
cString := FwNoAccent( cString )
// Retorna : 'O aviao nao pode aterrissar de manha'




FWGetSX5( cTable, cKey )

Função de retorno dos campos de uma tabela no SX5

cTable                  Tabela para pesquisa no SX5. Parâmetro obrigatório.
cKey                    Chave da tabela SX5. Parâmetro opcional.
                             Se não passar nada retorna todos os registros da tabela passada.

Retorna:
[1] X5_FILIAL
[2] X5_TABELA
[3] X5_CHAVE
[4] X5Descri()



FWEmpLoad( lAll )

Função que carrega as empresas que o usuário logado tem acesso.

lAll                        Se .T. retorna todas as empresas, se .F. retorna empresas que o usuário logado tem acesso

Retorna a[n][1] = Código da empresa
                a[n][2] = Nome da empresa
                a[n][3] = Código da filial
                a[n][4] = Nome da filial




FWEmpName( cEmp )

Função que retorna o nome da empresa

cEmp                    Código da empresa




FWFilName( cEmp, cFil )

Função que retorna o nome da filial

cEmp                    Código da empresa
cFil                        Código da filial




FWTabPref( cCampo )

Retorna o prefixo da tabela a partir do nome de um campo

cCampo               Nome do Campo

Exemplo:

cPref := FWTabPref( 'A1_COD'  )  // Retorna 'SA1'
cPref := FWTabPref( 'AA1_COD' )  // Retorna 'AA1'
cPref := FWTabPref( 'XPTO'    )  // Retorna ''




FWX2Nome( cTable )

Função que retorna a descrição de uma tabela no dicionário conforme idioma

cTable                  Tabela que se deseja obter a descrição

Exemplo:

cNome := FWX2Nome( "SA1" )




FWAliasInDic( cAlias )

Esta função Indica se um determinado alias esta presente no dicionário de dados

cAlias                   Alias da tabela do dicionário de dados




FWTimeStamp( nType, dDate, cTime )

Cria um timestamp

nType                   Tipo do timestamp
                                               1 - Formato aaaammddhhmmss
                                               2 - Formato dd/mm/aaaa-hh:mm:ss
                                               3 - Formato UTC aaaa-mm-ddThh:mm:ss-+Time Zone
dDate                   Data a ser usada. O padrão é a data atual
cTime                   Hora a ser usada. O padrão é a hora atual




FWTxt2Array( cString, nSize, lBreak )

Gerar array conforme string quebrando por linha respeitando a quebra de palavras

cString                 String a ser quebrada
nSize                     Tamanho máximo das strings a serem geradas
lBreak                  Respeita CRLF da string original

Exemplo
cString := 'Minha terra tem palmeiras, onde canta o sabia'

aString := FWTxt2Array( cString, 15)

/*
Retorna
[1] -> 'Minha terra'
[2] -> 'tem palmeiras,'
[3] -> 'onde canta o'
[4] -> 'sabia'
*/




FWVetByDic( aVetor, cTable, lItens, nCpoPos )

Função ordenar um vetor conforme o dicionário para uso em, por exemplo, em rotinas de MSExecAuto

aVetor                 Vetor a ser ordenado
cTable                  Referencia da tabela do Dicionário
lItens                    .T. é um vetor de itens / .F. não é um vetor de itens
nCpoPos             Posição da coluna onde está o nome do campo

Exemplo:

aVetor := {}
aAdd( aVetor, { 'A1_EST' , 'SP'                   , NIL } )
aAdd( aVetor, { 'A1_NOME', 'CLIENTE FULANO DE TAL', NIL } )
aAdd( aVetor, { 'A1_COD' , '000001'               , NIL } )

aVetor := FWVetByDic( aVetor, 'SA1' )

/*
// Retorna
{ 'A1_COD' , '000001'               , NIL }
{ 'A1_NOME', 'CLIENTE FULANO DE TAL', NIL }
{ 'A1_EST' , 'SP'                   , NIL }
*/