Histórico da Página
...
Atualmente cada produto (ex.: Logix, Datasul, Protheus e RM) tem seu próprio ferramental de de/para, ou seja conjunto de tabelas e funções que permitem gravar valores de de/para referente a um determinado produto.
Bloco de código | ||||
---|---|---|---|---|
| ||||
Tabela VDP_DPARA_GERAL |
...
TABELA_ |
...
DPARA CHAR(18) |
...
CAMPO_ |
...
DPARA CHAR(150) |
...
CARACTER_ |
...
LOGIX CHAR(150) |
...
SISTEMA_ |
...
INTEGR CHAR(20) |
...
CARACTER_INTEGR CHAR(150) |
Este ferramental de de/para que cada produto possui, armazena as informações relativas a si mesmo, ou seja código 50 do sistema externo corresponde ao código 23 da tabela empresa, campo cod_empresa.
...
Por isso, ficou definido que deverá existir para cada campo que possua um InternalId, um nome único entre todos os produtos. Este nome será sempre “Nome da Mensagem”.
Bloco de código | ||
---|---|---|
|
...
- InternalId para a mensagem City: City. |
...
- InternalId para a mensagem CustomerVendor: CustomerVendor. |
Informações | ||
---|---|---|
| ||
Este padrão é válido para o retorno do de/para por parte do aplicativo destino. Nos casos em que é necessário trafegar na mensagem um InternalId que representa uma chave estrangeira, o padrão adotado deve ser Nome da Mensagem + "InternalId", conforme descrito mais adiante. |
...
Para permitir que o ferramental do EAI reconheça que estes dois campos pertencem a uma mesma chave estrangeira City, é necessário incluir uma tag de documentação <InternalIdName>, conforme o exemplo abaixo:
Bloco de código | ||||
---|---|---|---|---|
| ||||
<xs:element name="OriginCityInternalId" type="xs:string" minOccurs="0" maxOccurs="1"> |
...
<xs:annotation> |
...
<xs:appinfo> |
...
<InternalIdName>CityInternalId</InternalIdName> |
...
</xs:appinfo> |
...
<xs:documentation>InternalId do OriginCityCode</xs:documentation> |
...
</xs:annotation> |
...
</xs:element> |
...
<xs:element name="DestinationCityInternalId" type="xs:string" minOccurs="0" maxOccurs="1"> |
...
<xs:annotation> |
...
<xs:appinfo> |
...
<InternalIdName>CityInternalId</InternalIdName> |
...
</xs:appinfo> |
...
<xs:documentation>InternalId do DestinationCityCode</xs:documentation> |
...
</xs:annotation> |
...
</xs:element> |
Esta mesma regra vale para quando o campo da chave estrangeira, por qualquer motivo, não tem um nome idêntico ao padrão “Mensagem”+InternalId, não necessariamente precisa existir dois campos com a mesma fonte de informação na mesma mensagem.
Bloco de código | ||
---|---|---|
|
...
Mensagem Order
...
Mensagem Order Campos VendorCode e VendorInternalId |
Este campo receberá apenas códigos de fornecedor (Vendor), apesar de que a mensagem de origem da chave seja CustomerVendor.
...
Desta forma, o campo VendorInternalId na mensagem deve ter declarado o InternalIdName para o valor CustomerVendorInternalId.
Bloco de código | ||
---|---|---|
|
...
| |||
<xs:element name="VendorInternalId" type="xs:string" minOccurs="0" maxOccurs="1"> |
...
<xs:annotation> |
...
<xs:appinfo>
<InternalIdName>CustomerVendorInternalId</InternalIdName>
...
<xs:appinfo> <InternalIdName>CustomerVendorInternalId</InternalIdName> </xs:appinfo> |
...
<xs:documentation>InternalId do VendorCode</xs:documentation> |
...
</xs:annotation> |
...
</xs:element> |
O uso do <InternalIdName> somente será necessário nos casos em que o nome do campo da InternalId não respeita exatamente o padrão “Mensagem” + InternalId. Ou seja, se o nome do campo na mensagem for CityInternalId, não é necessário informar o <InternalIdName>.
...
Esta tag deverá estar localizada logo abaixo dos campos da mensagem, que fazem parte da sua composição.
Exemplo:
Bloco de código | ||
---|---|---|
| ||
Em XML
...
Bloco de código | ||
---|---|---|
| ||
<Code>123</Code> |
...
<InternalId>23|123</InternalId> |
Toda mensagem de evento (quando for UpSert) deverá conter em seu conteúdo de retorno <ReturnContent> campos de InternalId para armazenar a chave interna do gerador do evento e a chave interna gerada no recebedor do evento. A necessidade disso é para que o recebedor da mensagem de evento e o gerador da mensagem de evento tenham conhecimento da chave interna gerada em cada produto. O fluxo abaixo exemplifica este funcionamento, para o cenário de inclusão de um novo Cliente.
...
Desta forma, na tag <ReturnContent> da mensagem as seguintes tags deverão ser criadas:
Bloco de código | ||
---|---|---|
| ||
O ListOfInternalIdType está definido em um arquivo a parte ../types/ListOfInternalId_1_000.xsd e está estruturado conforme o exemplo abaixo.
Em XML
Bloco de código | ||
---|---|---|
| ||
Como este retorno representa a resposta de uma mensagem enviada, deve-se entender a tag <Origin> como a InternalId do produto que enviou a mensagem (a origem), e <Destination> como a InternalId do produto que foi o destino da mensagem.
...
A utilização da InternalId se aplica também para chaves estrangeiras. Porém, neste caso a regra é que para cada Tag que representar uma chave estrangeira também exista uma Tag InternalId correspondente.
Bloco de código | ||
---|---|---|
|
...
Mensagem Warehouse
Code
Description
Mensagem Item
Code
InternalId
Description
Status
RegisterDate
WarehouseCode
Mensagem Warehouse Code Description Mensagem Item Code InternalId Description Status RegisterDate WarehouseCode WarehouseInternalId |
Assim a InternalId de chave estrangeira terá o mesmo nome da tag normal – Warehouse para WarehouseCode – mas usando o termo InternalId em vez de Code.
...
Em qualquer posição que ocorra (sendo chave primária ou estrangeira), a tag InternalId sempre será uma tag type=”xs:string” sem tamanho definido.
Bloco de código | ||
---|---|---|
|
...
| |||
<xs:element name="WarehouseInternalId" type="xs:string"> |
...
<xs:annotation> |
...
<xs:documentation>InternalId do WarehouseCode</xs:documentation> |
...
</xs:annotation> |
...
</xs:element> |
Para a chave estrangeira o adapter também deverá dar prioridade em resolver o relacionamento pela InternalId. Ou seja, ao receber uma mensagem de Item (seguindo o exemplo), este deve primeiro consultar no seu ferramental de de/para se existe registro correspondente para o WarehouseInternaId recebido, pois este valor já irá fornecer a chave completa correspondente no produto.
...
Exemplo em pseudocódigo (consulte o manual de cada produto para conhecer as funções reais):
Bloco de código | ||
---|---|---|
| ||
Adapter da |
...
mensagem Item AdapterItem.Get_InternalId(cod_empresa, cod_filial, item) |
...
Retorna Empresa + “|” + Filial + “|” + Código |
...
Uso: AdapterItem.Get_InternalId(50,10,123456) = |
...
“50|10|123456” |
...
AdapterItem.Get_InternalId_Value(InternalId, Campo) |
...
Retorna <retorna o valor correspondente a posição de “Campo”> |
...
Uso: AdapterItem.Get_InternalId_Value(“50|10|123456”,”cod_empresa”) == “123456” |