Por vezes, pode existir a necessidade de conseguir intercetar o momento de cópia de registos de um Add-on para a base de dados do cliente final, conhecidos no PHC GO como DataSets. Estes registos são geralmente registos de algum tipo de configuração necessária para que o Add-on possa funcionar corretamente (exemplo: séries de faturação específicas, templates de e-mail para servirem de base para o cliente final, entre outros).
Contudo, o Add-on poderá já estar instalado no cliente final, e tratando-se da instalação de uma nova versão desse mesmo Add-on, nesta situação, o registo de configuração que vem dentro do DataSet, também ele já existe na base de dados do cliente final, e até podem ter ocorridos alterações de alguns valores desse registos pelos utilizadores do cliente final.
É neste cenário que aparece a necessidade de aplicação de uma regra do tipo Ao instalar dataset de Add-on para que o programador de add-ons possa decidir se copia o registo de configuração que vem na nova versão do add-on, esmagando assim as alterações feitas anteriormente pelos utilizadores do cliente final, ou se deseja outro tipo de ação, como ignorar uma operação de cópia, preservando assim os dados que já existe na base de dados, ou outro tipo de operação mista como seja a atualização com dados anteriores e dados novos da nova versão do Add-on.
Nota
Além desta alteração simples e direta sobre um registo do dataset que está prestes a ser criado ou atualizado na base de dados da instalação do cliente final, o programador de Add-ons poderá utilizar qualquer outro código disponível no SDK dos Add-ons, para conseguir realizar outras operações necessárias nessa altura, como seja, verificar outro tipo de dados na base de dados; criar tarefas; criar outros registos adicionais; etc..
Assim, a regra do tipo
Ao instalar dataset de Add-on constitui um
evento que irá correr no momento da instalação ou upgrade do Add-on, quando este possui peças do tipo
Dataset, sendo que esse evento irá correr tantas vezes quanto o número de registos contidos dentro do
Dataset.
A assinatura deste evento recebe dois objetos, que serão dois registos da entidade que está selecionada no campo
Entidade do registo do evento (ecrã
Regras de negócio). O primeiro objeto
bdItemVO representa um possível registo que possa já existir na base de dados, mas que poderá ter o valor
Nothing indicando que o registo ainda não existe. O segundo objeto
addOnItemVO representa o registo que está dentro do add-on e que a aplicação se prepara para copiar para a base de dados do cliente final.
O controlo de como a aplicação irá tratar esta operação de cópia, será através da manipulação do valor do campo Operation de cada um dos VOs, ou simplesmente retornar uma mensagem de erro, que informa a aplicação para cancelar esta cópia em concreto, mas continuar com as seguintes caso exista.
Informação
Os valores que este campo pode conter são os seguintes:
Public Enum OperationEnum As Integer
None = 0
Inserted = 1
Updated = 2
Deleted = 3
End Enum
Para melhor entendimento sobre este tipo de evento, vamos mostrar alguns exemplos práticos aplicados em 2 tipos de cenários:CENÁRIO 1 - É a
primeira vez que se está a instalar o add-on XPTO que contém um registo no dataset da entidade
Artigos e Serviços (a referência
FRETE que internamente tem o
STSTAMP com o valor
1234), e na base de dados do cliente final, não existe nenhuma referência cujo
STSTAMP seja
1234, então nesse caso o comportamento expectável seria o registo ser copiado do add-on para a instalação do cliente final, isto porque ainda não existe na BD do cliente.
Atendendo que neste cenário será a
1ª vez que o cliente instala o add-on, a aplicação
copiará o registo de Artigos e Serviços do Dataset tal e qual como foi criado. Trata-se do comportamento default quando se instala pela 1ª vez o add-on. O valor do objeto
bdItemVO é
Nothing e o objeto
addOnItemVO contém o registo que será criado na BD do cliente.
Podemos no entanto, interceptar o momento deste evento e efectuar algumas validações. Por exemplo,
se o cliente já possui um artigo com referência
FRETE, a aplicação por defeito não permite que seja criado um segundo artigo com a mesma referência e convém neste caso tratar esta situação.
Assim, podemos optar por não copiar o registo do dataset ou alterar o nome do artigo para
FRETE_ADDON_XPTO para que assim seja criado na BD do cliente.
Exemplos:
( 1 ) Validar se já existe um artigo com a referência igual à referência do artigo que queremos introduzir na base de dados. Em caso afirmativo, não criar o registo.
Nome: Cópia de artigos para a BD do cliente
Entidade: Artigos e Serviços
Tipo de código: Ao instalar dataset de Add-on
Código:1 2 3 4 5 | If bdItemVO is Nothing If SDK.Query.ExistRecord(ST.getTableName,New FilterItem(ST.ref, Comparison.Equal, addOnItemVO.ref)) addOnItemVO.Operation = OperationEnum.None End if End if
|
Na
linha 1, primeiro validamos se o artigo já existe na base de dados. Se não existir, verificamos na
linha 2 se na base de dados do cliente já existe algum outro artigo com referência igual ao que tentaremos instalar.
Em caso afirmativo, a
linha 3 é executada, atribuindo o valor
None no
Operation do objeto
addOnItemVO, cancelando assim a instalação do registo.
( 2 ) Validar se já existe um artigo com a referência igual à referência do artigo que queremos introduzir na base de dados. No caso afirmativo, alterar a referência do artigo que será criado para
FRETE_ADDON_XPTO.
Nome: Cópia de artigos para a BD do cliente
Entidade: Artigos e Serviços
Tipo de código: Ao instalar dataset de Add-on
Código:1 2 3 4 5 | If bdItemVO is Nothing If SDK.Query.ExistRecord(ST.getTableName,New FilterItem(ST.ref, Comparison.Equal, addOnItemVO.ref)) addOnItemVO.ref = addOnItemVO.ref + "_ADDON_XPTO" End if End if |
Na
linha 1, primeiro validamos se o artigo já existe na base de dados. Se não existir, verificamos na
linha 2 se na base de dados do cliente já existe algum outro artigo com referência igual ao que tentaremos instalar.
No caso afirmativo, a
linha 3 é executada, atribuindo um novo valor de referência para o artigo que será criado na BD do cliente, de forma a não criar conflitos.
CENÁRIO 2 - Está a ser
instalada a versão 2 do mesmo add-on XPTO que continua a trazer no seu dataset o mesmo registo do artigo
FRETE, e na base de dados do cliente final também existe o registo que tinha sido copiado anteriormente, que mantém o valor
1234 no campo
STSTAMP, mas que entretanto o cliente já tinha mudado algum campo da ficha do artigo (exemplo: preencheu o
Preço de Venda 1 com o preço que lhe era mais conveniente).
Por defeito, neste caso o registo do dataset do Add-on não será criado (uma vez que já existe na base de dados), e o registo existente na BD do cliente manter-se-á tal qual como está.
No entanto, podemos optar atualizar um campo específico, ou até mesmo forçar a criação do registo do dataset, ou seja, esmagar as alterações que o cliente efectuou.
Exemplos:
( 1 ) Validar se o registo do dataset já foi instalado na BD do cliente. No caso afirmativo, atualizar apenas um campo específico.
Nome: Cópia de artigos para a BD do cliente
Entidade: Artigos e Serviços
Tipo de código: Ao instalar dataset de Add-on
Código:1 2 3 4 | If bdItemVO isNot Nothing andAlso bdItemVO.ststamp = '1234' bdItemVO.obs = addOnItemVO.obs bdItemVO.Operation = OperationEnum.Updated End if |
Na
linha 1, primeiro validamos se o artigo cujo stamp
1234 já existe na base de dados. Se existir, na
linha 2 vamos atualizar o seu campo
st.obs e na
linha 3 indicamos que o registo existente será atualizado.
De salientar, tal como o código está, a atualização do campo
st.obs apenas ocorrerá no registo cujo stamp é
1234 deste dataset. Outros registos existentes neste dataset não sofrerão esta alteração.
( 2 ) Validar se o registo do dataset já foi instalado na BD do cliente. No caso afirmativo, esmagar os dados, ou seja, substituir o registo do cliente pelo registo do dataset.
Nome: Cópia de artigos para a BD do cliente
Entidade: Artigos e Serviços
Tipo de código: Ao instalar dataset de Add-on
Código:1 2 3 4 | If bdItemVO isNot Nothing andAlso bdItemVO.ststamp = '1234' bdItemVO.Operation = OperationEnum.Deleted addOnItemVO.Operation = OperationEnum.Inserted End if |
Na
linha 1, primeiro validamos se o artigo cujo stamp
1234 já existe na base de dados. Se existir, na
linha 2 eliminamos o registo existente e na
linha 3 indicamos que o registo do dataset tem de ser instalado.
Veja aqui outro exemplo de aplicação deste tipo de regra.