Além de oferecer 100% de ferramentas e serviços personalizados, nossa equipe tem o foco na alavancagem do seu negócio, informando e auxiliando sua expansão.
Nota revisada em 24/06/2010.
Esta nota deve ser considerada técnica para a maioria do público.
Os serviços de Nota Fiscal eletrônica, normalmente feitos por chamadas
do tipo webservice (SOAP), podem requerer que os conteúdos em XML
sejam assinados digitalmente.
Recentemente, adicionamos o controle de certificados digitais no AICS e
publicamos a rotina que assina documentos PDF digitalmente. Esta
rotina permite, sem nenhum módulo adicional, gerar documentos e
assiná-los digitalmente pelo sistema.
Nesta atualização do sistema, adicionamos o recurso de assinatura de
arquivos XML. Por exemplo, arquivos gerados para Nota Fiscal
Eletrônica precisam ser assinados. A rotina pode ser chamada por
script e ela MODIFICA o arquivo XML adicionando uma assinatura
a ele (faça uma cópia antes de chamá-la):
Function XMLSign(FileToSign, CertFile, Password, NodeToSign, URI:String):boolean
Onde,
FileToSign -> Nome completo do arquivo XML que deve ser assinado
CertFile -> Caminho do certificado, pode ser um certificado da máquina
instalado no Windows (peça exemplos do que informar a esta chamada)
Password -> Senha do certificado quando em arquivo
NodeToSign ->Nome do nó facultativo a assinar, senão será o documento
URI -> Identificador da assinatura, pode ser em branco
Esta nota pode ser considerada altamente técnica por alguns
usuários.
Na montagem de acessos a dados, os scripts podem utilizar
comandos do tipo TableExecSQL e os nomes dos cursores
passam a ser simples Strings. As atribuições são também
super simples e encapsulam possíveis falhas nas atribuições.
Entretanto, o AICS permite a criação de objetos de acessos
a dados tipo TADOQuery. Estes objetos podem representar
objetos tipo ADO ou outros tipos de objetos de acessos a
dados, depende apenas da versão do AICS utilizada.
Pois bem, no primeiro caso, os comandos de atribuição de
valores são do tipo SetString, SetFloat, SetDateTime etc. Mas,
estes comandos de atribuição requerem o uso de cursores
escondidos a partir dos alias atribuídos em comandos
TableExecSql. Se os cursores forem reais, pode-se atribuir
valores com a sintaxe Cursor.fieldbyname('nome do campo').as...
Onde, o as... pode ser AsString, AsFloat etc. Este comando
NÃO está imune a erros, isto é, se houver um erro no seu
código ou outra falha, o script poderá ser interrompido.
Ainda, se o cursor estiver fechado e for do tipo parâmetros
dinâmicos, a atribuição é ainda mais complicada. Visando
facilitar e encapsular estes comandos, a BF publicou as
atribuições internas que o AICS dispõe aos scripts dos
usuários, relacionados a seguir:
Procedure SetFloatDS(Cursor:DelphiTDataSet;Coluna:string;Valor:Double)
Procedure SetStringDS(Cursor:DelphiTDataSet;Coluna, Valor:string)
Procedure SetIntegerDS(Cursor:DelphiTDataSet;Coluna:string; Valor:longint)
Procedure SetDateTimeDS(Cursor:DelphiTDataSet;Coluna:string; Valor:Double)
Procedure SetLogicalDS(Cursor:DelphiTDataSet;Coluna:string; Valor:boolean)
A grande vantagem destes comandos está em não gerarem erros
e, ainda, os cursores podem ser do tipo aberto (em edição) ou
fechados (com parâmetros).
Recentemente, a Byte Factory adicionou recursos de gerenciamento
de certificados digitais ao AICS. Esta gestão aplica-se, por enquanto,
à assinatura de documentos PDF. Documentos PDF que podem
ser gerados automaticamente pelo sistema, por exemplo.
Entretanto, este recurso de assinaturas pode ser altamente útil no
quotidiano de nossos clientes. Por exemplo, pode-se criar serviços
de rede de assinatura automática a partir de "hot-folders". O AICS
pode ser o ERP mais completo que existe, mas pode complementar
outros serviços de forma inimaginável!
Depende da sua imaginação.
A sintaxe da função de assinatura digital por script é:
Function PDFSign(FileToSign, CertFile, Password:String):boolean
Onde,
FileToSign -> Arquivo PDF que será assinado (o arquivo será modificado,
logo, faça uma cópia se deseja preservar um original sem assinatura)
CertFile -> Caminho para o arquivo do certificado digital (facultativo, se
ausente, o AICS usará o certificado associado ao login atual)
Password -> Se o arquivo de certificado for informado, aqui deverá ser
passada a senha correspondente (senha do certificado e não a senha do
login ou do AICS, cuidado com isso)
É uma característica que facilita a gestão das regras de negócios
em relatórios em geral. O evento Antes de Imprimir, caso
retorne falso (false, por script), passa a fechar a janela do
relatório.
É claro que nada impede que seu evento apresente mensagens
ao usuário explicando o porquê do mesmo não poder ser
impresso.
Por favor, considere esta nota como altamente técnica.
O modelo de scripts do AICS isola rotinas para cada objeto instanciado,
isso permite que um ambiente seja montado para cada tela aberta do sistema,
o que gera segurança entre as regras para cada estrutura.
Entretanto, alguns problemas podem surgir desta característica, tais como:
- Alguns trechos de códigos são replicados em estruturas diferentes,
mesmo desempenhando a mesma função
- Grandes estruturas de objetos precisam ser montados na estrutura principal
para estarem disponíveis para execução a qualquer momento, mesmo que
nunca sejam executados
O primeiro item pode gerar uma complicação na gestão das regras e o
segundo pode gerar lentidão na entrada de algumas telas (máximo de 1
ou 2 segundos), porém, pode gerar maior ocupação de memória do que
o efetivamente necessário à sessão. Ainda, o item 2 pode gerar cópias de
objetos que poderiam ser únicos entre sessões abertas ao mesmo tempo.
Para resolver estes 2 problemas, criamos uma estrutura virtual denominada
STORED que poderá receber procedimentos completos na forma de "programa",
por exemplo, cada procedimento deverá ser completo e independente. Um
exemplo de um procedimento simples seria:
begin
Mostra('Este é um procedimento simples, '+webfields('nome'));
end.
Note que a rotina é completa e não tem visibilidade de qualquer outra
entidade que a executou, é um procedimento autônomo. Portanto, os
procedimentos criados sob a estrutura STORED devem ser chamados
com a nova rotina:
Function ExecStored(Event,Parameter:string):boolean
Por exemplo, poderíamos criar o procedimento acima num evento com
nome "Aviso", neste caso, a chamada em qualquer local do AICS do
procedimento acima e já com o parâmetro, seria simplesmente:
ExecStored('Aviso','nome=Manoel');
O interessante deste modelo é que não haverá cópias do mesmo
procedimento em execução simultânea, isso minimiza o gasto de
recursos do sistema e deixa os procedimentos mais rápidos.
O AICS possui a característica de montar as pesquisas automaticamente, mas
este processo pode ser complexo em alguns casos de tabelas mestre-detalhe e
com ligação cruzada.
Para facilitar este tipo de filtro mais complexo, no centro de informações, para
cada tabela, existe a opção Ativar opção filhos das colunas na aba Avançado.
Esta opção estava, basicamente, sendo válida para relatórios e não para
pesquisas. As pesquisas estavam mais "abertas". Nesta atualização do AICS,
esta opção deverá estar LIGADA e, nas colunas das tabelas filhas, a opção
Exibir em filhos na aba Opções de apresentação deverá também estar
ligada.
Esta nota é altamente técnica e destina-se aos usuários avançados
que utilizam Scripts dentro do BF AICS.
Em algumas aplicações, a existência de repetição de trechos de rotinas
pode ser inevitável. Nem que isso seja devido ao ambiente de cada uma,
pode ser improdutivo apenas declarar as rotinas genéricas na tabela
GLOBAL. Com o objetivo de otimizar as rotinas e, ao mesmo tempo,
evitar repetição, adicionamos uma diretiva de inclusão no pré-processador
do AICS com a seguinte sintaxe:
{$include TABELA.EVENTO}
Por exemplo, se incluirmos a linha:
{$include CADASTRO.ENTRAR}
Em qualquer outra tabela (com certeza não a do CADASTRO, pois este
trecho já estará lá), as rotinas e declareções estarão presentes na montagem
final.
Pelo Centro de Informações do BF AICS, é muito simples definir
um gráfico do tipo XY. Crie uma vista e associe as colunas X e Y.
Na tela na qual a vista está associada, escolha o gráfico na mesma
lista de relatórios e clique no botão de gráfico na barra de ferramentas
do menu de impressão.
Nesta atualização do sistema, permitimos que sejam selecionadas
mais do que uma coluna Y. Por exemplo, pode-se montar uma vista
que conta o nr de fornecedores e clientes por estado. Nas colunas
nr de fornecedores e nr de clientes, marcamos com a opção Y do
gráfico. A coluna do estado vai no X. Qdo o gráfico for emitido,
ele mostrará, para cada estado, a quantidade de clientes e fornecedores
ao mesmo tempo.
A partir deste exemplo, fica fácil expandir e saber que, para qualquer
informação do sistema, fica agora fácil definir gráficos de N curvas
visando comparação visual sem ter que criar um gráfico externo ao
AICS.
Esta nota pode ser considerada altamente técnica por
alguns usuários do BF AICS.
Tanto pelo módulo Comercial quanto pelo módulo Assistência
Ténica, existe o atalho para geração de NFs. A NF gerada já
disparava o evento associado à gravação da NOTA. Esta
chamada facilita e integra as regras fiscais.
Nesta atualização do sistema, o evento Após Gravar também
está sendo disparado. Com isso, a integração das regras pela
tela do Fiscal e pela geração automática ficam ainda maiores.
Esta nota pode ser considerada altamente técnica por alguns
usuários.
O BF AICS dispõe de uma rotina simples para geração de OPs,
cuja sintaxe é:
Function GeraOP(Cod_Res,Netcod:String;Quant:Double):Double
Entretanto, com o novo recurso de Engenharia integrada ao Comercial,
a possibilidade de se gerar uma OP sobre as novas tabelas da
Engenharia editada precisou ser criada. Portanto, a nova rotina
para criação mais aberta de OPs passou a ser:
Function GeraOPAdv(Cod_Res,Netcod:String;Quant:Double;TabProc,TabMat:String):Double
Onde, TabProc e TabMat são os nomes dos cursores que contém a
"receita" que deverá ser produzida. TabProc é equivalente à tabela
ESTPROCOP e TabMat à tabela ESTELABOP. Quando esta
rotina for utilizada para gerar OPs das Engenharias específicas dos
pedidos, basta chamá-la já com os dados selecionados relacionados
às tabelas PEDESTELABOP e PEDESTPROCOP, que contém,
para fins de geração de OPs, as mesmas colunas das tabelas anteriores.