Passo a passo: | Os LPs 610 e 620 são destinados a contabilização de itens do Documento de Saída (SD2) e do cabeçalho do Documento de Saída (SF2), logo os ponteiros de tabelas estarão nestes registros, assim, o ponteiramento de qualquer outra tabela deve ser feito através de uma sintaxe.
Os Lançamento Padronizados podem ser ajustados de acordo com a regra necessária para a contabilização, podendo inclusive serem utilizadas funções em seus campos macro executáveis, logo podem ser consultados registros de outras tabelas através de funções como a "Posicione", que retorna o dado desejado, ou através de uma "Função de usuário" que em seu retorno devolva a informação a ser processada.
Apontando para outras tabelas (On Line / Off Line) Os LPs criados com sintaxes apontadas para as tabelas SD2 e SF2 podem ser usados tanto na contabilização On Line e quanto Off Line. Para apontamento de outras tabelas (ex. SF3 e SFT), quando a execução for Off Line, no momento da execução da contabilização On Line, as tabelas podem não estar gravadas ainda, impedindo que a regra do Lançamento Padronizado colete as informações. Portanto, para cada uso (on line e off line) pode existir a necessidade de criar sintaxes diferentes. Um exemplo usando a contabilização do campo "Crd.Pres." (FT_CRDPRES), que é o campo de Crédito Presumido de ICMS gravado na tabela de itens fiscais (SFT)
Deck of Cards |
---|
id | Contabilização Impostos |
---|
| Card |
---|
| O LP do item da NF é o 610, que posiciona a tabela SD2. A tabela equivalente na parte fiscal é a tabela SFT.
Considerando que a tabela SFT é criada após a gravação da NF, isto é, não há mais ponteiramento na Contabilização da NF, será necessário buscar a informação pelo calculo e não pelo campo gravado.
Mesmo o registro SFT não existindo ainda, o fluxo da MATXFIS já foi iniciado no momento e pode ser feita a mesma chamada da função fiscal no LP para o retorno do valor, neste caso a MAFISRET.
A função MAFISRET() está preparada para receber dois parâmetros em sua chamada, sendo: 1. O número da linha da nota que está sendo processada; 2. O identificador do campo/imposto que estaria sendo processado, neste caso a referência do Credito Presumido é LF_CRDPRES. Bloco de código |
---|
| MaFisRet(Val(SD2->D2_ITEM), "LF_CRDPRES") |
Aviso |
---|
| O campo "Item" (D2_ITEM) é um campo caractere de tamanho 2, logo para pedidos com mais de 99 itens o conteúdo desse se torna alfanumérico e a conversão fornecida pela função VAL() não irá atender. Neste caso teria que ser realizada a lógica reversa do processo de SOMA1() ou configurado o parâmetro MV_NUMITEM com o limite de 99 itens por nota.
Caso haja necessidade de lógica reversa em torno da função SOMA1, é necessário realizar o tratamento através de uma User Function, sendo necessária a atuação de um analista programador. |
|
Card |
---|
label | Exclusão da NF (sempre On Line) |
---|
| Na exclusão do documento de saída (LP 620), devemos adotar outra forma de trabalho, isso por que neste ponto, os tributos não estão sendo calculados e a linha SFT do documento que está sendo excluído já existe.
Neste caso, pode ser utilizada a função Posicione(), esta irá localizar a linha SFT referente ao item da nota e retornar o dado do campo FT_CRDPRES.
O uso do comando Posicione() recebe quatro parâmetros (Documentação), sendo:
1. Tabela onde a busca será feita; 2. Índice (composição de dados da busca) utilizado para localizar o registro; 3. Expressão identificadora da linha desejada; 4. Campo do dado desejado. Neste caso como vamos buscar um dado da SFT, um exemplo de Sintaxe que podemos utilizar é: Bloco de código |
---|
| Posicione('SFT', 1, xFilial('SFT') + 'S' + SD2->D2_SERIE + SD2->D2_DOC + SD2->D2_CLIENTE + SD2->D2_LOJA + SD2->D2_ITEM + ' ' + SD2->D2_COD, 'FT_CRDPRES') |
Onde, cada parâmetro, detalhados abaixo, respectiva de um dos quatro a serem usados no posicione (na sintaxe são separadas por vírgula):
1. SFT \\ Tabela onde a busca será feita 2. 1 \\ Índice utilizado para localizar o registro 3. xFilial('SFT') + 'S' + SD2->D2_SERIE + SD2->D2_DOC + SD2->D2_CLIENTE + SD2->D2_LOJA + SD2->D2_ITEM + ' ' + SD2→D2_COD \\ Expressão 4. FT_CRDPRES \\ Campo do dado desejado Aviso |
---|
| Importante observar que na ‘expressão identificadora da linha desejada’ (parâmetro 3) existem dois dados pré-definidos:
• ‘S’ indicativo de que buscamos a informação de uma nota de saída na SFT e; • ‘ ‘, este é a inclusão de dois espaços vazios na expressão, os quais são necessários pois o dado anterior (D2_ITEM) por padrão possui o tamanho 2, enquanto o item da tabela SFT, FT_ITEM possui tamanho 4, já que recebe dados de outras tabelas como da SD1, onde o D1_ITEM possui o tamanho 4. |
Sobre o tamanho do campo, é possível usar também a sintaxe abaixo (já alterada para o tamanho do campo) Bloco de código |
---|
| Posicione('SFT', 1, xFilial('SFT') + 'S' + SD2->D2_SERIE + SD2->D2_DOC + SD2->D2_CLIENTE + SD2->D2_LOJA + SD2->D2_ITEM + ' ' + ' ' + SD2->D2_COD, 'FT_CRDPRES') |
|
Card |
---|
label | Contabilização Off Line |
---|
| A chamada da MAFISRET somente funciona na execução online, pois os processos de cálculo devem estar iniciados, o que não ocorre na contabilização offline, já que lá não ocorre cálculo de imposto.
Para o processo offline pode ser utilizada a mesma sintaxe da exclusão, pois o registro SFT já foi gerado e pode então ser consultado: Bloco de código |
---|
| Posicione('SFT', 1, xFilial('SFT') + 'S' + SD2->D2_SERIE + SD2->D2_DOC + SD2->D2_CLIENTE + SD2->D2_LOJA + SD2->D2_ITEM + ' ' + ' ' + SD2->D2_COD, 'FT_CRDPRES') |
|
Card |
---|
label | Caso queira usar On Line e Off Line |
---|
| Se não houver tratamento, será gerado error.log, uma vez que na Contabilização On Line não poderá usar na sintaxe a tabela SFT e na OFF line a função MAFISRET porque a NF já está gravada.
Existe a função IsInCallStack que verifica na pilha de chamada, a existência de determinada função na pilha de chamadas. Sendo assim é possível sua utilização para identificar se a execução está sendo feita pelo processo de geração da nota ou pela própria rotina de contabilização: Bloco de código |
---|
| Iif(IsInCallStack("CTBANFS"),POSICIONE(),MAFISRET()) |
Neste exemplo o IsInCallStack identifica se a função CTBANFS está na pilha de chamadas, se estiver executa o Posicione(), se não executa o MaFisRet().
Neste exemplo usamos apenas as funções Posicione e MaFisRet sem os seus parâmetros, apenas para apresentar o comportamento, porém ao montar a sintaxe para testar informe a expressão inteira.
|
|
Aviso |
---|
| - O exemplo acima foi para contabilizar somente o campo FT_CRDPRES. Cada campo das tabelas SFT e SF3 podem ter tratamentos diferentes, portanto, será necessário consultar o suporte Livros Fiscais para entender como é feito o calculo e quais campos são gravados;
- Verifique se o mesmo calculo fiscal possui gravação nas tabelas SD2 e SF2. Se houver o calculo, basta criar uma sintaxe padrão dos LPs 610 e 630, uma vez que estas tabelas estão posicionadas no LP
- LP 610: Para trazer o valor do ICMS solidário, por exemplo, é possível usar somente a sintaxe SD2->D2_ICMSRET, tanto para On Line quanto para Off Line;
- LP 620: Para trazer o valor do ICMS, por exemplo, é possível usar a sintaxe SF2->F2_VALICM, tanto para On Line quanto para Off Line;
- O exemplo que usamos do campo de Crédito Presumido de ICMS,no início desta documentação, só é gravado na tabela SFT, portanto, não é possível usar da forma simples como descrevemos o uso nas tabelas SD2 e SF2.
|
|