Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Expandir
titleWARNING - TCSetField - Invalid field XXX on {|X| IF(X[X] <> "X", TCSETFIELD(XXX,X[1],X[2],X[3],X[4]),NIL)}

Explicação

Esse erro acontece quando a função "TcSetField" recebeu um tamanho maior que suporta.

  • Customização nos fontes
  • Customização no dicionário (gatilho/estrutura da tabela/campo)


Tópicos de Análise (com tickets de exemplo)

Deck of Cards
startHiddenfalse
effectDuration0.5
idCusto Médio
effectTypehorizontal
loopCardstrue
Card
defaulttrue
id#19278994
label#19278994

Erro

Expandir
titleVer erro

Para ver o erro completo, abra o ticket: https://totvssuporte.zendesk.com/agent/tickets/19278994

Bloco de código
firstline1
titleTrecho
linenumberstrue
THREAD ERROR ([7388], Leandro Henrique, DESKTOP-FRPSSCH)   07/02/2024   17:16:29
: WARNING - TCSetField - Invalid field len: 20  on {|X| IF(X[2] <> "C", TCSETFIELD(CCURSOR3,X[1],X[2],X[3],X[4]),NIL)}(MATA461.PRX) 01/12/2023 15:19:53 line : 1119


Tópicos de Análise

Expandir
title1 - Visualizar validações

: WARNING - TCSetField - Invalid field len: 20 on {|X| IF(X[2] <> "C", TCSETFIELD(CCURSOR3,X[1],X[2],X[3],X[4]),NIL)}(MATA461.PRX) 01/12/2023 15:19:53 line : 1119

Ou seja:

  • Função a ser analisada: TCSetField
  • Suposto Erro: Invalid field len: 20
  • Trecho: {|X| IF(X[2] <> "C", TCSETFIELD(CCURSOR3, X[1], X[2], X[3], X[4]), NIL)}


Expandir
title2 - Estudar a função

Função 1 a ser estudada:


A documentação do TCSetField está aqui: TCSetField


Sintaxe: TCSetField( < cAlias >, < cField >, < cType >, [ nSize ], [ nPrecision ] )

  • nSize especifica a quantidade total de dígitos de um campo "N", e seu valor deve estar entre 1 e 18. Caso o valor não esteja nesse intervalo, será apresentada a mensagem de erro fatal: "WARNING - TCSetField - Invalid field len: nSize".


Linha no fonte:

  • aEval(SC9->(dbStruct()), {|x| If(x[2] <> "C", TcSetField(cCursor3,x[1],x[2],x[3],x[4]),Nil)})


A linha está validando, se a posição x[2] não for Caractere, pode-se utilizar a função TCSetField() pois ela não espera Caractere no elemento "nSize".

  • O x[3] é o elemento nSize na função TCSetField na linha do fonte.




Função 2 a ser estudada:


Tudo está dentro da função aEval: AEVal


Sintaxe: AEval( < aArray >, < bBlock >, [ nStart ], [ nCount ] )

  • aArray = Indica o array que será lido.
  • bBlock = Indica o bloco de código que será executado para cada elemento encontrado.


aArray = SC9->(dbStruct())

bBlock = {|x| If(x[2] <> "C", TcSetField(cCursor3,x[1],x[2],x[3],x[4]),Nil)}




Função 3 a ser estudada:


É utilizado a função dbStruct(): DBStruct como primeira posição da função aEval.


Retorno:

  • aRet - Retorna um array com a estrutura dos campos. Cada elemento é um subarray contendo nome, tipo, tamanho e decimais.
  • Essa função é utilizada para recuperar a estrutura da tabela corrente. Esse mesmo array é usado para criar a tabela, por exemplo através da função DBCreate.
  • É retornado um array bidimensional onde cada linha corresponde a um campo da estrutura e cada coluna a seguinte informação:

    Posição

    Tipo

    Tamanho

    Descrição

    1

    C

    10 bytes

    Contém o nome do campo da tabela.

    2

    C

    1 byte

    Contém o tipo do campo da tabela. Pode ser: "C" (Caractere), "N" (Numérico), "L" (Lógico), "D" (Data) ou "M" (Memo).

    3

    N

    -

    Contém o tamanho do campo.

    4

    N

    -

    Contém a quantidade de casas decimais que o campo pode armazenar, desde que o campo seja do tipo "N". Para os demais tipos, esta informação retorna sempre com 0 (zero).

  • A informação retornada na terceira coluna do array, correspondendo ao tamanho do campo, está condicionada ao tipo do campo.

    Tipo

    Descrição

    C

    O tamanho retornado corresponde ao tamanho de string máxima que pode ser armazenado na coluna.

    D

    É retornado sempre 8 bytes.

    L

    É retornado sempre 1 byte.

    M

    É retornado sempre 10 bytes. Observação: É importante lembrar que, este valor é retornado por compatibilidade e não corresponde a capacidade real de armazenamento da coluna. O tamanho máximo de armazenamento de uma coluna do tipo "M" está condicionada ao driver RDD utilizado.

    N

    Juntamente com o valor retornado na quarta posição, quantidade de decimais, informa a capacidade de armazenamento de valores numéricos no campo.



Conclusão:

  • 0 O erro está que o campo recebeu um valor que não está no intervalo de 1 e 18.
  • 1 Está tudo sendo lido e executado dentro da função eVal que executa comandos para um bloco de código.
  • 2 A primeira posição está o Array lido com a função DbStruct(), posição 3: Contém o tamanho do campo.
  • 3 A segunda posição está sendo executado dentro do bloco de código a partir do conteúdo do Array lido, a função TCSetField().
  • 4 A função TCSetField() não está aceitando o parâmetro passado, pego pela posição 3 na função DbStruct() 

É necessário saber qual campo nessa posição e de qual tabela eventualmente pode estar sendo atribuido.

Expandir
title3 - Procurar o valor e tabela possível com o erro

Voltando um pouco mais acima no fonte.

Na linha acima há o trecho:

  •     dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQrySC9),cCursor3,.F.,.T.)


Documentação da função dbUseArea: DBUseArea


Sintaxe: DBUseArea( [ lNewArea ], [ cDriver ], < cFile >, < cAlias >, [ lShared ], [ lReadOnly ] )


A posição 3 da função pega a tabela a ser aberta.

A posição 4 da função pega o nome dado ao ALIAS da tabela para ser interpretado pelo AdvPL.



Conclusão:

  • Algum campo da tabela SC9 possui o X3_PICTURE ou o X3_TAMANHO maior que 18 ou menor que 1. (Sendo esse campo com erro do Tipo (X3_TIPO) "N" ou "D").

Resultado pós análise/interação

-



...

true
Expandir
titleErros específicos

Página: https://tdn.totvs.com/x/7hszJg




Expandir
titleArgument_error_in_function_Len()_on_CRIAVAR

Causa

O retorno do erro ocorre quando inserido no inicializador padrão de um determinado campo, um conteúdo não válido com relação a tipagem do campo. 

A maioria dos casos onde ocorre este erro estão relacionados a campos do tipo caractere que recebe um inicializador padrão numérico.

Solução

Para solucionar o problema, retire a opção do inicializador padrão, uma vez  que no dicionário padrão não há validação ou coloque a informação entre aspas (" ")

Processo:

  • Acessar o ambiente Configurador - SIGACFG;
  • Atualizações - Base de Dados - Dicionário - Base de Dados - Dicionário de Dados;
  • Localize a tabela correspondente, editar;
  • Localize o campo, editar;
  • Folder Opções - Inicializador Padrão;
  • Retire o conteúdo ou insira a tratativa necessária para para sanar o retorno. 
  • Salve o campo, salve a alteração da tabela, atualize o dicionário de dados, reinicie o Smartclient e realize novamente o processo.

(aviso) Importante: A ocorrência "argument_error_in_function_Len()_on_CRIAVAR" pode ocorrer em qualquer processo do Protheus em que o conteúdo do inicializador padrão divergir do conteúdo que o campo foi configurado para receber.

Expandir
titleNão foi possível resolver o conflito de agrupamento entre "Latin1_General_BIN" e "Latin1_General_CI_AS" na operação equal to.

Causa

Error : 468 (37000) (RC=-1) - [Microsoft][ODBC SQL Server Driver][SQL Server]Não foi possível resolver o conflito de agrupamento entre "Latin1_General_BIN" e "Latin1_General_CI_AS" na operação equal to. ( From tMSSQLConnection::GetQueryFile )

Este não é um erro relacionado ao Protheus e suas rotinas e sim, um problema que ocorre devido a um conflito de collation* entre dois databases (database onde esta os dados do Protheus x database de sistema "TempDB").

*Collation - É o mapa de caracteres utilizados em seu database. 

O database criado para armazenar as tabelas do Microsiga Protheus possui o mapa de caracteres "Latin_General_BIN" e o database de sistema "TempDB" possui o collation "Latin_General_CI_AS".

Solução

  • Opção 1) Alterar o Tipo do Agrupamento configurado no Banco de Dados.

Realizar a conversão do banco de dados de sistema "TEMPDB - Ex. SQL Server" para a collation "Latin_General_BIN (Padrão Protheus)

  • Opção 2) Atualize o ambiente com o último DBAccess , Build e LIB disponibilizados no Portal do Cliente (Havendo dificuldade, contate nosso Suporte Framework).

As novas atualizações de tecnologia do Protheus já contemplam tratamento para converter os caracteres e evitar as diferenças entre as Collations.

Expandir
titleIncorrect syntax near "X"

Causa

O erro ocorre ,por que, ao tentar executar uma query do lançamento padrão para a contabilização, o Banco de Dados está recebendo conteúdo de gravação com caractere especial (' " # @ $ % ¨! & *).

A informação a ser gravada contendo caracteres especiais na sua composição, interfere na codificação e na gravação de banco de dados, no caso de uso de apostrofo (') por exemplo,  o banco entenderá que a query finalizou seu bloco de instruções, sendo que o que vier após isso, fica caracterizado como erro de sintaxe.

Solução

1) Identifique o campo que está trazendo o caractere especial.

2) Retire o caractere especial da informação, assim não terá problemas para a gravação no Banco de Dados.

3) Em último caso, utilizar um execblock no lançamento padrão, para poder tratar caracteres especiais. Em caso de dúvidas sobre esse processo, contate nossa equipe de Atendimento Advpl para melhor orientação.

Expandir
titleErro No Inicializador Padrão do Campo A1_VM_MARC

Causa

O erro ocorre ao excluir um cliente (MATA030),onde, o sistema apresenta três mensagens de erro informando que:

  1. INITTER - Erro no conteúdo do Inicializador Padrão: Campo. (Marcação)
  2. INITTER - Erro no conteúdo do Inicializador Padrão: Campo: A1_VM_MARC
  3. MA030TEMPV - Cliente não poderá ser excluído. Flial "x".

A mensagem relacionada a inconsistência no inicializador padrão do campo A1_VM_MARC ocorre ,por que, o campo A1_COD_MARC, possui a chamada do A1_VM_MARC.

Solução

1) Identifique o campo que está trazendo o caractere especial.

2) Retire o caractere especial da informação, assim não terá problemas para a gravação no Banco de Dados.

3) Em último caso, utilizar um execblock no lançamento padrão, para poder tratar caracteres especiais. Em caso de dúvidas sobre esse processo, contate nossa equipe de Atendimento Advpl para melhor orientação.

Ex: A1_COD_MARC = Ordem 20 / A1_VM_MARC = ordem 21

Expandir
titleType mismatch on compare on MAPVL2SF2(MATA461.PRX) 06/06/2017 13:55:06 line : 5218 com uso do mv_horarmt

Causa

O erro refere-se a um tipo incompatível que está sendo utilizado para comparação na função MAPVL2SF2.

A função em questão, tem uma variável do tipo caractere que recebe a informação passada pelo parâmetro MV_HORARMT, que também é do tipo caractere. Todavia, essa variável está recebendo uma informação do tipo numérica , conforme o trecho do erro:
 

STACK MAPVL2SF2(MATA461.PRX) 06/06/2017 13:55:06
Local 30: CHORARMT(N) :2

 Veja que a variável CHORARMT, é definida como caractere, devido a letra C no início de seu nome, mas a informação que chega para ela vem entre parênteses como numérico (N), gerando incompatibilidade para a comparação de informações que variável precisa receber e o que está recebendo.

Solução

Para solucionar a questão, coloque a informação do parâmetro MV_HORARMT entre aspas duplas ("), indicando que a informação em questão é do tipo caractere: MV_HORARMT="2"

 Ticket referência : #1065455

Expandir
titleArray out of bounds ( 0 of 112 ) on A410NFORIG(MATV410A.PRW)

O erro array out of bounds ( 0 of 112 ) on A410NFORIG(MATV410A.PRW) ocorre ao tentar realizar uma devolução de compra.

O erro de array ocorre sempre que os campos C6_NFORI e/ou C6_SERIORIG:

  • Não existem no SX3;
  • Não estão marcados como usados;
  • Estão com o nível alterado;
  • Não estão disponíveis para o módulo acessado.
Expandir
titleVariable Does Not Exist ADE_GRUPO

Ao tentar incluir, alterar ou visualizar um teleatendimento na rotina TMKA503A sistema apresenta o seguinte error.log: variable does not exist ADE_GRUPO

Essa ocorrência esta relacionada ao modelo de atendimento informado no cadastro do grupo de atendimento na aba Teleatendimento.

No modelo atual a tabela que esta sendo referenciada e diferente a tabela padrão do sistema ADE. Com isso ao tentar validar um campo na query do modelo de atendimento sistema não o encontra e gera a ocorrência acima.

Solução, alterar o modelo informado no grupo de atendimento e colocar as tabelas corretas ou criar um novo modelo de atendimento.

Segue link da Faq para auxiliar na configuração ideal para o teleatendimento: https://tdn.totvs.com/x/3dJoE

Expandir
titleThe field X do reference to folder: X, but It not exist on FWFORMFIELD:PREPAREFIELDS(FWFORMFIELD.PRW)

The field X do reference to folder: X, but It not exist / O campo X refira à pasta: X, mas não existe. on FWFORMFIELD:PREPAREFIELDS(FWFORMFIELD.PRW)

O arquivo error.log está indicando que o processamento faz referência ao campo em questão (Neste Exemplo, U5_FUNCAO), o qual não está sendo localizado em sua Base.

Isso porque, o Dicionário de Dados está fornecendo uma localização inválida para o campo. É necessário verificar no Dicionário de Dados SX3 a coluna X3_FOLDER (Pasta)

Para corrigir indique um Folder / Pasta válido para o campo (X3_FOLDER). Ou seja, um número de Aba que realmente existe no formulário em que essa Tabela é acionada.

Exemplo:

O campo pertence à Tabela SU5 - Contatos que é alimentada através da rotina TMKA070

O campo U5_FUNCAO está com X3_FOLDER indicando Aba 5; porém, no Cadastro de Contatos não há Aba 5 (existem apenas 4 Abas no cadastro)

default

Aviso
titleImportante
Dica
titleImportante
Deck of Cards
startHiddenfalse
effectDuration0.5
idCusto Médio
effectTypehorizontal
loopCardstrue
Card
defaulttrue
idPor escopo
labelPor escopo
Deck of Cards
startHiddenfalse
effectDuration0.5
iddentro
effectTypehorizontal
loopCardstrue

Card
defaulttrue
idRotinas
labelRotinas
Page Tree
rootFAQs - Faturamento Protheus
searchBoxtrue



Card
defaulttrue
idIntegrações
labelPortais e Integrações
Page Tree
rootFAQs - Faturamento Protheus
searchBoxtrue





label

Card
defaulttrue
id
Rotinas
Geral
Page Tree
rootFAQs - Faturamento Protheus
searchBoxtrue

Card
true
idErros e Helps
labelErros e Helps
Page Tree
rootFAQs - Faturamento Protheus
searchBoxtrue

Card
defaulttrue
idGeral
labelGeral
Page Tree
rootFAQs - Faturamento Protheus
searchBox