Explicação do erroEsse erro acontece qual é alterado a estrutura de dicionário padrão do Protheus, ou foi realizado um filtro de rotina invalido, seja: - Ordem de campos (X3_ORDEM)
- Estrutura de campos (Dados da tabela SX3)
- Estrutura de gatilhos (Dados da tabela SX6)
- Estrutura de perguntes (Dados da tabela SX1)
- Filtros com sintaxe errada (nas telas na pesquisa)
Tópicos de Análise (com tickets de exemplo) Deck of Cards |
---|
startHidden | false |
---|
effectDuration | 0.5 |
---|
id | Custo Médio |
---|
effectType | horizontal |
---|
loopCards | true |
---|
| Card |
---|
default | true |
---|
id | #17597701 |
---|
label | #17597701 |
---|
| Erro Expandir |
---|
| Bloco de código |
---|
firstline | 1 |
---|
title | Trecho |
---|
linenumbers | true |
---|
| THREAD ERROR ([22385], Robson, LAPTOP-IOFSC6N4) 02/08/2023 18:23:20
invalid macro source (SSYacc0105e: Error token failed, no valid token):({|a,b,c| FWInitCpo(a,b,c),xRet:=(@!),FWCloseCpo(a,b,c,.T.),xRet }) on FWBUILDFEATURE(PROTHEUSFUNCTIONMVC.PRX) 04/04/2023 15:05:10 line : 5520 |
Para ver o erro completo, abra o ticket. |
Tópicos de Análise Expandir |
---|
| Expandir |
---|
title | 1 - Avaliar o retorno dentro da primeira função |
---|
| Note que na linha 2, no valor do atributo "xRet" há o retorno "@!" indicando que isso foi o que o sistema recebeu e, depois houve o erro: Bloco de código |
---|
firstline | 1 |
---|
title | Trecho |
---|
linenumbers | true |
---|
| THREAD ERROR ([22385], Robson, LAPTOP-IOFSC6N4) 02/08/2023 18:23:20
invalid macro source (SSYacc0105e: Error token failed, no valid token):({|a,b,c| FWInitCpo(a,b,c),xRet:=(@!),FWCloseCpo(a,b,c,.T.),xRet }) on FWBUILDFEATURE(PROTHEUSFUNCTIONMVC.PRX) 04/04/2023 15:05:10 line : 5520
|
Trecho exato: ![](/download/thumbnails/781196626/image2023-8-3_13-44-14.png?version=1&modificationDate=1691081054660&api=v2)
Sabemos então, que o conteúdo (variável/pergunte/campo/filtro) que gerou o erro possui o formato "@!".
|
Expandir |
---|
title | 2 - Procurar em cada função da pilha, indícios do que gerou o erro (pergunte/campo/tabela/filtro) |
---|
| Bloco de código |
---|
firstline | 1 |
---|
title | Trecho |
---|
linenumbers | true |
---|
| Called from FORMVIEWFIELD(PROTHEUSFUNCTIONMVC.PRX) 04/04/2023 15:05:10 line : 1004
Called from FORMSTRUTABLE(PROTHEUSFUNCTIONMVC.PRX) 04/04/2023 15:05:10 line : 433
Called from FWFORMSTRUCT(PROTHEUSFUNCTIONMVC.PRX) 04/04/2023 15:05:10 line : 3985
Called from FWMBROWSE:LOADCOLUMNS(FWMBROWSE.PRW) 04/04/2023 15:05:10 line : 1796
Called from FWMBROWSE:ACTIVATE(FWMBROWSE.PRW) 04/04/2023 15:05:10 line : 562
Called from FWMARKBROWSE:ACTIVATE(FWMARKBROWSE.PRW) 04/04/2023 15:05:10 line : 267
Called from FWMARKBROWSE(MSLIB.PRW) 04/04/2023 15:05:10 line : 10784
Called from MARKBROWSEF(MSLIB.PRW) 04/04/2023 15:05:10 line : 5783
Called from MARKBROW(MSLIB.PRW) 04/04/2023 15:05:10 line : 5763
Called from MATA500(MATA500.PRX) 17/03/2022 18:01:27 line : 129
Called from __EXECUTE(APLIB090.PRW) 04/04/2023 15:05:08 line : 721
Called from MDIEXECUTE(APLIB260.PRW) 04/04/2023 15:05:08 line : 924 |
A - Buscando pela função da primeira pilha "FORMVIEWFIELD(PROTHEUSFUNCTIONMVC.PRX)", obtemos: Bloco de código |
---|
firstline | 1 |
---|
title | Trecho |
---|
linenumbers | true |
---|
| STACK FWFORMSTRUCT(PROTHEUSFUNCTIONMVC.PRX) 04/04/2023 15:05:10
Param 1: NTYPE(N) : 3
Param 2: CALIASSX2(C) : SC6
Param 3: BSX3(U) : NIL
Param 4: LVIEWUSADO(L) : .F.
Param 5: LVIRTUAL(L) : .T.
Param 6: LFILONVIEW(L) : .F.
Param 7: CPROGRAM(C) : MATA500
Local 1: NTYPE(N) :3
Local 2: CALIASSX2(C) :SC6
Local 3: BSX3(U) :NIL
Local 4: LVIEWUSADO(L) :.F.
Local 5: LVIRTUAL(L) :.T.
Local 6: LFILONVIEW(L) :.F.
Local 7: CPROGRAM(C) :MATA500
Local 8: AAUX(A) :
Local 9: OSTRUCT(U) :NIL |
Conseguimos extrair: - O programa onde deu o erro é o MATA500 pelo parâmetro 7.
- A tabela do erro posicionada é a tabela SC6 pelo parâmetro 2.
B - Buscando pela segunda função da pilha "FORMVIEWFIELD(PROTHEUSFUNCTIONMVC.PRX)", obtemos: Bloco de código |
---|
firstline | 1 |
---|
title | Trecho |
---|
linenumbers | true |
---|
| STACK FORMSTRUTABLE(PROTHEUSFUNCTIONMVC.PRX) 04/04/2023 15:05:10
Param 1: CALIASSX2(C) : SC6
Param 2: BSX3(U) : NIL
Param 3: LVIEWUSADO(L) : .F.
Param 4: LVIRTUAL(L) : .T.
Param 5: LFILONVIEW(L) : .F.
Param 6: NTYPE(N) : 3
Local 1: CALIASSX2(C) :SC6
Local 2: BSX3(U) :NIL
Local 3: LVIEWUSADO(L) :.F.
Local 4: LVIRTUAL(L) :.T.
Local 5: LFILONVIEW(L) :.F.
Local 6: NTYPE(N) :3
Local 7: AAREA(A) :
Local 8: AAUX(A) :
Local 9: AGROUPS(A) :
Local 10: ARETORNO(A) :
Local 11: CAUX(C) :
Local 12: LHASXXA(L) :.F.
Local 13: LOLDSET(L) :.F.
Local 14: LUSADO(L) :.T.
Local 15: LUSADOMODEL(L) :.T.
Local 16: NPOS(N) :0
Local 17: NX(N) :0
Local 18: NY(N) :0
Local 19: CQUERY(C) :INSERT INTO dbo.##TMPSC00_122 (X3_CAMPO) SELECT XAM_FIELD FROM XAM010 XAM WHERE XAM.XAM_FIELD IN (SELECT SX3.X3_CAMPO FROM SX3010 SX3 WHERE SX3.X3_ARQUIVO = 'SC6' AND SX3.D_E_L_E_T_ = ' ' ) AND XAM.XAM_ANONIM = '1' AND XAM.D_E_L_E_T_=' ' AND NOT EXISTS (SELECT XAMSUB.R_E_C_N_O_ FROM XAM010 XAMSUB WHERE XAMSUB.XAM_FIELD = XAM.XAM_FIELD AND XAMSUB.XAM_ANONIM = '2' AND XAMSUB.D_E_L_E_T_=' ') ORDER BY XAM_FIELD
Local 20: CALIASQ(C) :SCGN0000ED
Local 21: LINDB(L) :.T.
Local 22: LEMPTYBSX3(L) :.T.
Local 23: LRETCACHE(L) :.F.
Local 24: LLOCSX2(L) :.F.
Local 25: AMDLFIELDS(A) :
Local 26: AVIEWFIELDS(A) :
Local 27: ARETURN(U) :NIL
Local 28: NLENX3(N) :10
Local 29: CX3CBOXANONYM(C) :SELECT XAM_FIELD FROM XAM010 XAM WHERE XAM.XAM_FIELD IN (SELECT SX3.X3_CAMPO FROM SX3010 SX3 WHERE SX3.X3_ARQUIVO = 'SC6' AND SX3.D_E_L_E_T_ = ' ' ) AND XAM.XAM_ANONIM = '1' AND XAM.D_E_L_E_T_=' ' AND NOT EXISTS (SELECT XAMSUB.R_E_C_N_O_ FROM XAM010 XAMSUB WHERE XAMSUB.XAM_FIELD = XAM.XAM_FIELD AND XAMSUB.XAM_ANONIM = '2' AND XAMSUB.D_E_L_E_T_=' ') ORDER BY XAM_FIELD
Local 30: BSEEKANONYM(B) :{|CFIELD| (CANONYMALIAS)->(DBSEEK(CFIELD))}
Local 31: LTEMPTABLE(L) :.T.
Local 32: CANONYMALIAS(C) :SCGN0000EF |
Conseguimos extrair: - A tabela do erro posicionada é a tabela SC6 pelo parâmetro 1.
C - Buscando pela terceira função da pilha "FORMVIEWFIELD(PROTHEUSFUNCTIONMVC.PRX)", obtemos: Bloco de código |
---|
firstline | 1 |
---|
title | Trecho |
---|
linenumbers | true |
---|
| STACK FORMVIEWFIELD(PROTHEUSFUNCTIONMVC.PRX) 04/04/2023 15:05:10
Param 1: CALIASALT(C) : SCGN0000ED
Local 1: CALIASALT(C) :SCGN0000ED
Local 2: ARETORNO(A) :
Local 3: NMAXLENCOMBO(N) :0
Local 4: NINITCBOX(N) :0
Local 5: NX(N) :0
Local 6: ACOMBO(A) :
Local 7: ATMP(A) :
Local 8: BPICTVAR(U) :NIL
Local 9: CX3CBOX(C) : |
Conseguimos extrair:
D - Buscando pela quarta função da pilha "FWBUILDFEATURE(PROTHEUSFUNCTIONMVC.PRX)", obtemos: Bloco de código |
---|
firstline | 1 |
---|
title | Trecho |
---|
linenumbers | true |
---|
| STACK FWBUILDFEATURE(PROTHEUSFUNCTIONMVC.PRX) 04/04/2023 15:05:10
Param 1: NTIPO(N) : 4
Param 2: CEXPRADVPL(C) : @!
Local 1: NTIPO(N) :4
Local 2: CEXPRADVPL(C) :@!
Local 3: CAUX(C) :FWInitCpo(a,b,c),xRet:=(@!),FWCloseCpo(a,b,c,.T.),xRet
Local 4: XRET(U) :NIL |
OBSERVAÇÃO: De longe, a pilha mais clara até agora, mostra o cabeçalho do erro e o formato do retorno do erro "@!", o erro está aqui, mas não foi clareado para nós onde exatamente. Conseguimos extrair: - A validação do erro
- O formato do retorno do erro ("xRet")
E - Buscando pela quinta função da pilha "STACK { | E | ERRORDIALOG( E )}", obtemos: Bloco de código |
---|
firstline | 1 |
---|
title | Trecho |
---|
linenumbers | true |
---|
| Param 1: E(O) : O
Local CodeBlock 1: E(O) :O |
Conseguimos extrair:
F - Buscando pela sexta função da pilha "STACK { | E | ERRORDIALOG( E ) }(APLIB240.PRW)", obtemos: Bloco de código |
---|
firstline | 1 |
---|
title | Trecho |
---|
linenumbers | true |
---|
| Param 1: E(O) : O
Local 1: E(O) :O
Local 2: LINSIGA(L) :.T.
Local 3: CMSG(U) :NIL
Local 4: NI(U) :NIL
Local 5: CX(U) :NIL
Local 6: CERROR(U) :NIL
Local 7: LSKIPERROR(L) :.F.
Local 8: AOBJLOG(A) :
Local 9: NX(U) :NIL
Local 10: URETURN(U) :NIL |
Conseguimos extrair:
E - Buscando pela sétima função da pilha "ERRORDLG(APLIB240.PRW)", obtemos: Bloco de código |
---|
firstline | 1 |
---|
title | Trecho |
---|
linenumbers | true |
---|
| Param 1: E(O) : O
Local CodeBlock 1: E(O) :O |
Conseguimos extrair:
OBSERVAÇÃO: Nesse caso, a análise das pilhas foi importante para nos certificar que o erro estava no formato (@!) e na tabela (SC6) no processo da rotina (MATA500), mas o erro específico não foi localizado ainda.
|
Expandir |
---|
title | 3 - Localizar a última tabela olhada pelo sistema antes do erro |
---|
| No error.log digite " **", ou seja, espaço-asterisco-asterisco e procure. Irá aparecer onde o documento levar, a ultima parada do sistema, importante para localizar o que ele foi gravar e não conseguiu. Obtemos esse resultado: Bloco de código |
---|
firstline | 1 |
---|
title | Trecho |
---|
linenumbers | true |
---|
| _SC00; Rdd:TOPCONN; Alias:SCGN0000EF; Filter :; Recno:5000; Total Recs:0; Order:1
Index (0) :**SC0001 X3_CAMPO
Field 1: X3_CAMPO(C) : |
OBSERVAÇÃO: Nesse caso, não foi útil para nós, pois a última parada foi em uma tabela temporária "**SC0001", seguimos analisando. |
Expandir |
---|
title | 4 - Localizar campo na tabela SX3 |
---|
| Simboliza o último campo visto pelo sistema antes do erro, ao procurar no error.log por "SX3" temos: Bloco de código |
---|
firstline | 1 |
---|
title | Trecho |
---|
linenumbers | true |
---|
| SX3010; Rdd:TOPCONN; Alias:SX3; Filter :; Recno:112953; Total Recs:166831; Order:1
Index (0) :**SX30101 X3_ARQUIVO+X3_ORDEM
Index (1) :SX30102 X3_CAMPO
Index (2) :SX30103 X3_GRPSXG+X3_ARQUIVO+X3_ORDEM
Index (3) :SX30104 X3_ARQUIVO+X3_FOLDER+X3_ORDEM
Index (4) :SX30105 X3_ARQUIVO+X3_IDXFLD+X3_CAMPO
Field 1: X3_ARQUIVO(C) :SC6
Field 2: X3_ORDEM(C) :AC
Field 3: X3_CAMPO(C) :C6_SOLCOM
Field 4: X3_TIPO(C) :C
Field 5: X3_TAMANHO(N) :6
Field 6: X3_DECIMAL(N) :0
Field 7: X3_TITULO(C) :Num. Solicit
Field 8: X3_TITSPA(C) :Num. Solicit
Field 9: X3_TITENG(C) :Req.No.
Field 10: X3_DESCRIC(C) :Número da Solicitação de
Field 11: X3_DESCSPA(C) :Numero de Solicitud de
Field 12: X3_DESCENG(C) :Number of Request of
Field 13: X3_PICTURE(C) :@!
Field 14: X3_VALID(C) :
Field 15: X3_USADO(C) :x x x x x x x x x x x x x x x x
Field 16: X3_RELACAO(C) :
Field 17: X3_F3(C) :
Field 18: X3_NIVEL(N) :1
Field 19: X3_RESERV(C) : x
Field 20: X3_CHECK(C) F :
Field 21: X3_TRIGGER(C) :
Field 22: X3_PROPRI(C) :
Field 23: X3_BROWSE(C) :
Field 24: X3_VISUAL(C) :
Field 25: X3_CONTEXT(C) :
Field 26: X3_OBRIGAT(C) :
Field 27: X3_VLDUSER(C) :
Field 28: X3_CBOX(C) :
Field 29: X3_CBOXSPA(C) :
Field 30: X3_CBOXENG(C) :
Field 31: X3_PICTVAR(C) :
Field 32: X3_WHEN(C) :
Field 33: X3_INIBRW(C) :
Field 34: X3_GRPSXG(C) :
Field 35: X3_FOLDER(C) :
Field 36: X3_PYME(C) :S
Field 37: X3_CONDSQL(C) :
Field 38: X3_CHKSQL(C) :
Field 39: X3_IDXSRV(C) :N
Field 40: X3_ORTOGRA(C) :
Field 41: X3_IDXFLD(C) :N
Field 42: X3_TELA(C) :
Field 43: X3_PICBRV(C) :
Field 44: X3_AGRUP(C) :
Field 45: X3_POSLGT(C) :1
Field 46: X3_MODAL(C) :2 |
Conseguimos extrair: - O campo possui o formato do erro "@!"
- O campo é padrão e tem suas informações (campos da SX3) no padrão.
- O campo que antecede erro está na SC6.
- O campo está com a ordem errada (X3_ORDEM = AC)
Pela natureza do campo, o pedido de venda proveniente veio de uma solicitação de compras, podemos ver qual valor ele carregava no sistema procurando por "C6_SOLCOM", temos: Bloco de código |
---|
firstline | 1 |
---|
title | Trecho |
---|
linenumbers | true |
---|
| Field 137: C6_SOLCOM(C) : |
Nesse caso do erro, então, ele estava vazio no momento.
Após visualizar o campo, temos de verificar pois já podem ser a causa do erro: - É padrão?
- Os campos da SX3 estão no padrão?
- O campo está na ordenação (X3_ORDEM) certa?
Nessa etapa pode ser comparado o seu ambiente com o do cliente.
|
Expandir |
---|
title | 4 - Localizar parâmetro na tabela SX6 |
---|
| Simboliza o último parâmetro visto pelo sistema antes do erro, ao procurar no error.log por "SX6" temos: Bloco de código |
---|
firstline | 1 |
---|
title | Trecho |
---|
linenumbers | true |
---|
| SX6010; Rdd:TOPCONN; Alias:SX6; Filter :; Recno:9266; Total Recs:10702; Order:1
Index (0) :**SX60101 X6_FIL+X6_VAR
Field 1: X6_FIL(C) :
Field 2: X6_VAR(C) :MV_USAX3BR
Field 3: X6_TIPO(C) :C
Field 4: X6_DESCRIC(C) :Se "S" indica que nao será validado o X3_USADO do
Field 5: X6_DSCSPA(C) :"S" indica que no se validara el X3_USADO del
Field 6: X6_DSCENG(C) :When "S", the X3_USADO assigned to the field will
Field 7: X6_DESC1(C) :campo para exibicao no browse.
Field 8: X6_DSCSPA1(C) :campo para exhibicion en el browse.
Field 9: X6_DSCENG1(C) :not be validated for displaying in the browser.
Field 10: X6_DESC2(C) :
Field 11: X6_DSCSPA2(C) :
Field 12: X6_DSCENG2(C) :
Field 13: X6_CONTEUD(C) :S
Field 14: X6_CONTSPA(C) :S
Field 15: X6_CONTENG(C) :S
Field 16: X6_PROPRI(C) :S
Field 17: X6_PYME(C) :S
Field 18: X6_VALID(C) :
Field 19: X6_INIT(C) :
Field 20: X6_DEFPOR(C) :S
Field 21: X6_DEFSPA(C) :S
Field 22: X6_DEFENG(C) :S
Field 23: X6_EXPDEST(C) :1 |
Conseguimos extrair: - O último parâmetro olhado pelo sistema foi o MV_USAX3BR
- Está no padrão
- Os campos do parâmetro estão no padrão
- O valor do parâmetro está "Default" no padrão
OBSERVAÇÃO: Logo, a provável causa do erro não é esse parâmetro. |
Expandir |
---|
title | 4 - Localizar pergunte na tabela SX1 |
---|
| Simboliza o último pergunte visto pelo sistema antes do erro, ao procurar no error.log por "SX1" temos: Bloco de código |
---|
firstline | 1 |
---|
title | Trecho |
---|
linenumbers | true |
---|
| SX1010; Rdd:TOPCONN; Alias:SX1; Filter :; Recno:32746; Total Recs:55784; Order:1
Index (0) :**SX10101 X1_GRUPO+X1_ORDEM
Index (1) :SX10102 X1_IDFIL+X1_ORDEM
Field 1: X1_GRUPO(C) :MTA510
Field 2: X1_ORDEM(C) :01
Field 3: X1_PERGUNT(C) :Taxa deflacao ICMS ?
Field 4: X1_PERSPA(C) :¿Tasa Deflac. ICMS ?
Field 5: X1_PERENG(C) :ICMS Deflation Rate ?
Field 6: X1_VARIAVL(C) :mv_ch5
Field 7: X1_TIPO(C) :N
Field 8: X1_TAMANHO(N) :5
Field 9: X1_DECIMAL(N) :2
Field 10: X1_PRESEL(N) :0
Field 11: X1_GSC(C) :G
Field 12: X1_VALID(C) :
Field 13: X1_VAR01(C) :mv_par01
Field 14: X1_DEF01(C) :
Field 15: X1_DEFSPA1(C) :
Field 16: X1_DEFENG1(C) :
Field 17: X1_CNT01(C) : 0.00
Field 18: X1_VAR02(C) :
Field 19: X1_DEF02(C) :
Field 20: X1_DEFSPA2(C) :
Field 21: X1_DEFENG2(C) :
Field 22: X1_CNT02(C) :
Field 23: X1_VAR03(C) :
Field 24: X1_DEF03(C) :
Field 25: X1_DEFSPA3(C) :
Field 26: X1_DEFENG3(C) :
Field 27: X1_CNT03(C) :
Field 28: X1_VAR04(C) :
Field 29: X1_DEF04(C) :
Field 30: X1_DEFSPA4(C) :
Field 31: X1_DEFENG4(C) :
Field 32: X1_CNT04(C) :
Field 33: X1_VAR05(C) :
Field 34: X1_DEF05(C) :
Field 35: X1_DEFSPA5(C) :
Field 36: X1_DEFENG5(C) :
Field 37: X1_CNT05(C) :
Field 38: X1_F3(C) :
Field 39: X1_PYME(C) :S
Field 40: X1_GRPSXG(C) :
Field 41: X1_HELP(C) :
Field 42: X1_PICTURE(C) :
Field 43: X1_IDFIL(C) :
SXK010; Rdd:TOPCONN; Alias:SXK; Filter :; Recno:5000; Total Recs:0; Order:2
Index (0) :SXK0101 XK_GRUPO+XK_SEQ+XK_IDUSER
Index (1) :**SXK0102 XK_IDUSER+XK_GRUPO+XK_SEQ
Field 1: XK_GRUPO(C) :
Field 2: XK_SEQ(C) :
Field 3: XK_IDUSER(C) :
Field 4: XK_CONTEUD(C) :
Field 5: XK_FORM(C) : |
Conseguimos extrair: - O último parâmetro olhado pelo sistema foi do grupo "MTA510", de ordenação 1.
- Está no padrão
- Os campos do parâmetro estão no padrão
- O valor do parâmetro está "Default" no padrão
OBSERVAÇÃO: Logo, a provável causa do erro não é esse pergunte. |
|
Expandir |
---|
title | 4 - Localizar pergunte na tabela SX1 |
---|
| Simboliza as customizações ativadas pelo sistema antes do erro ocorrer, basta procuramos pelos valores "XX6_CODFUN" e "XX7_CODFUN", fazendo isso temos: Bloco de código |
---|
firstline | 1 |
---|
title | Trecho |
---|
linenumbers | true |
---|
| XX6010; Rdd:TOPCONN; Alias:XX6; Filter :; Recno:15; Total Recs:23; Order:1
Index (0) :**XX60101 XX6_CODFUN+XX6_TYPE
Index (1) :XX60102 XX6_DESC+XX6_CODFUN
Field 1: XX6_CODFUN(C) :A097APRF
Field 2: XX6_TYPE(C) :1
Field 3: XX6_DESC(C) :Automaticamente adicionado pelo sistema.-29/08/2022
XX7010; Rdd:TOPCONN; Alias:XX7; Filter :; Recno:15; Total Recs:23; Order:1
Index (0) :**XX70101 XX7_CODFUN+XX7_TYPE+XX7_FILIAL
Index (1) :XX70102 XX7_TYPE+XX7_CODFUN+XX7_FILIAL
Field 1: XX7_CODFUN(C) :A097APRF
Field 2: XX7_TYPE(C) :1
Field 3: XX7_FILIAL(C) :
Field 4: XX7_STATUS(C) :1
Field 5: XX7_DEFRET(C) : |
Conseguimos extrair: - A customização não tem a ver com os fontes do erro.
OBSERVAÇÃO: Logo, a provável causa do erro não é esse ponto de entrada "A097APRF". |
Resultado pós análise/interação
|
|
|