- Entidade: Clientes
- Tipo código: Ao sincronizar
- Código:
' valida se há alguma coisa alterada
Select Case changedItems.First.baseType
' valida se o objeto alterado foi a entidade de clientes, cujo nome na base de dados é Cl e daí o ClVO. Pode consultar o nome na base de dados de cada entidade no dicionário de dados
Case GetType(ClVO)
' cria um objeto do tipo ClVO vazio
Dim item as ClVO = Nothing
'identifica se o campo CODPOST foi alterado
Dim itemChanged = changedItems.getChangedItemByField(item, "codpost")
'se foi alterado então vamos analisar o conteudo
If itemChanged IsNot Nothing then
' numa regra de negócio do tipo "AoSincronizar" o objeto masterVO contém os dados do registo alterado. Neste caso vamos validar se o utilizador já preencheu 7 ou 8 digitos
if masterVO.codpost.trim.length>=7 and masterVO.codpost.trim.length<=8
dim mcodpost as string=""
if masterVO.codpost.trim.length=7 and masterVO.codpost.substring(4,1)<>"-"
mcodpost= masterVO.codpost.trim
else
if masterVO.codpost.trim.length=8 and masterVO.codpost.substring(4,1)="-"
mcodpost=masterVO.codpost.substring(0,4)+masterVO.codpost.substring(5,3)
end if
end if
' vamos chamar a API de códigos postais PT API - https://www.duminio.com/ptcp/ para obter os dados do código introduzido
Dim url = String.Format("https://api.duminio.com/ptcp/v2/ptapi610813c4d15a62.33494622/"+mcodpost.trim)
Dim request As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
request.Method = WebRequestMethods.Http.Get
request.ContentType = "application/x-www-form-urlencoded"
'colocamos a resposta numa variável
Dim response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
If response IsNot Nothing Then
Dim responseContent = New StreamReader(response.GetResponseStream()).ReadToEnd()
' se a resposta é curta signifca que deu erro ou o código postal introduzido não foi encontrado
if responseContent.tostring.length<80
listMsg.Add(New MsgInfo("Código postal inválido ou serviço desligado. Deve ser no formato XXXXYYY ou XXXX-YYY." ))
else
'se a resposta é válida, dado que a resposta é em JSON criamos um objeto, arrays de objetos, com todos os dados da resposta
Dim webObj = fastJSON.JSON.ToObject(Of Object)(responseContent)
If webObj IsNot Nothing Then
' da resposta retiramos o valor do item Localidade do primeiro objeto
dim local = webObj(0).item("Localidade")
If local IsNot Nothing Then
listMsg.Add(New MsgInfo("Localidade atualizada para «"+local+"»"))
' com o masterVO atualizamos o campo da localidade
masterVO.local=local.tostring
' e colocamos o código postal no formato correto caso tenha sido introduzido com 7 digitos
masterVO.codpost=mcodpost.substring(0,4)+"-"+mcodpost.substring(4,3)
end if
end if
end if
end if
end if
end if
end select
Por último, basta adicionar esta regra ao seu add-on para que esta funcionalidade fique ativada no ecrã de clientes.
Inicialmente, deve ser criado na bilioteca de servidor, o código da função genérica:
- Nome: codpost
- Código: Código genérico que retorna a localidade de um dado código postal
' todas as bibliotecas devem estar dentro de uma "Class"
class codpost
' função que vai retornar a localidade de um código postal
public shared function codpost(mcodpost as string) as string
' variável com a localidade
dim retval as string=""
' valida o tamonho do texto escrito, se já é um código postal com o tamanho certo. Pode ser 7 digitos seguidos ou 8 digitos com o traço a seguir aos 4 primeiros
if mcodpost.trim.length=7 and mcodpost.substring(4,1)<>"-"
mcodpost=mcodpost.trim
else
if mcodpost.trim.length=8 and mcodpost.substring(4,1)="-"
mcodpost=mcodpost.substring(0,4)+mcodpost.substring(5,3)
end if
end if
' vamos chamar a API de códigos postais PT API - https://www.duminio.com/ptcp/ para obter os dados do código introduzido
Dim url = String.Format("https://api.duminio.com/ptcp/v2/ptapi610813c4d15a62.33494622/"+mcodpost.trim)
Dim request As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
request.Method = WebRequestMethods.Http.Get
request.ContentType = "application/x-www-form-urlencoded"
'colocamos a resposta numa variável
Dim response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
If response IsNot Nothing Then
Dim responseContent = New StreamReader(response.GetResponseStream()).ReadToEnd()
' se a resposta é curta significa que deu erro ou o código postal introduzido não foi encontrado
if responseContent.tostring.length<80
retval="ERR"
else
'se a resposta é válida, dado que a resposta é em JSON criamos um objeto, arrays de objetos, com todos os dados da resposta
Dim webObj = fastJSON.JSON.ToObject(Of Object)(responseContent)
If webObj IsNot Nothing Then
' da resposta retiramos o valor do item Localidade do primeiro objeto
dim local = webObj(0).item("Localidade")
If local IsNot Nothing Then
retval=local.tostring
end if
end if
end if
end if
return retval
end function
end class
Depois de guradadas as alterações efetudas, este código estará pronto a ser chamado através de uma regra de negócio no ecrã de fornecedores. Para criar esta regra de negócio, deve navegar até às Regras de negócio, e criar um registo com as seguintes características:
- Entidade: Fornecedores
- Tipo de Código: Ao Sincronizar
' valida se há alguma coisa alterada
Select Case changedItems.First.baseType
' valida se o objeto alterado foi a entidade de fornecedores, cujo nome na base de dados é Fl e daí o FlVO. Pode consultar o nome na base de dados de cada entidade no dicionário de dados
Case GetType(FlVO)
' cria um objeto do tipo FlVO vazio
Dim item as FlVO = Nothing
'identifica se o campo CODPOST foi alterado
Dim itemChanged = changedItems.getChangedItemByField(item, "codpost")
'se foi alterado então vamos analisar o conteudo
If itemChanged IsNot Nothing then
' numa regra de negócio do tipo "AoSincronizar" o objeto masterVO contém os dados do registo alterado. Neste caso vamos validar se o utilizador já preencheu 7 ou 8 digitos
if masterVO.codpost.trim.length>=7 and masterVO.codpost.trim.length<=8
' vamos correr a biblioteca de servidor que chama a API a partir de um código postal
dim mlocal as string = u8882_Space.codpost.codpost(masterVO.codpost.trim)
' se a resposta for ERR significa que algo correu mal
If mlocal="ERR"
' adicionamos uma mensagem para informar o utilizador
listMsg.Add(New MsgInfo("Código postal inválido ou serviço desligado. Deve ser no formato XXXXYYY ou XXXX-YYY." ))
else
' se a função da biblioteca retornou um valor então vamos preencher
if mlocal<>""
' adicionamos uma mensagem para informar o utilizador do sucesso da operação
listMsg.Add(New MsgInfo("Localidade atualizada para «"+mlocal+"»"))
' com o masterVO atualizamos o campo da localidade
masterVO.local=mlocal
' e colocamos o código postal no formato correto caso tenha sido introduzido com 7 digitos
if masterVO.codpost.trim.length=7
masterVO.codpost=masterVO.codpost.substring(0,4)+"-"+masterVO.codpost.substring(4,3)
end if
end if
end if
end if
end if
end select
Ao seu add-on (cujo plano mínimo tem de ser o plano Advanced), pode adicionar a regra de negócio e a biblioteca de servidor, e com isto ter esta funcionalidade a funcionar no ecrã de fornecedores.
Com esta estratégia, poderiamos agora, criar regras para qualquer ecrã que tenha os campos de código postal e localidade, usando sempre a mesma função genérica que está na biblioteca, ao invés de ter que repetir todo esse código.