IN CIGAM Integrador: mudanças entre as edições

De CIGAM WIKI
 
(30 revisões intermediárias pela mesma usuária não estão sendo mostradas)
Linha 3: Linha 3:
[[Integrador]] > [[IN_CIGAM Integrador|Integrador padrão]]
[[Integrador]] > [[IN_CIGAM Integrador|Integrador padrão]]


Quando aplicações consumirem dados do CIGAM — seja por meio dos serviços disponibilizados ou pela camada de objetos do banco de dados — deverão informar os parâmetros de '''data e hora''' referentes ao controle de gravação dos registros. Dessa forma, será possível '''filtrar apenas os registros alterados''' a partir da data e hora especificadas.<br>
Quando aplicações consomem dados do CIGAM — seja por meio dos serviços disponibilizados ou pela camada de objetos do banco de dados — é necessário informar os parâmetros de '''data e hora''' utilizados no controle de gravação dos registros. Dessa forma, é possível filtrar apenas os registros que foram alterados a partir da data e hora informadas.
Caso esses parâmetros não sejam informados, '''todos os dados''' do respectivo cadastro serão retornados.<br>
 
O CIGAM '''não realiza controle por flags de leitura ou integração'''. Caso esse tipo de controle seja necessário, ele deverá ser implementado pelas aplicações de terceiros em suas próprias tabelas.<br>
Caso esses parâmetros não sejam informados, o sistema retornará '''todos os dados do cadastro correspondente'''.
<br>
 
Para integrações, recomenda-se informar os '''parâmetros correspondentes à chave única''' do cadastro, permitindo assim a obtenção de dados de um único registro específico, quando necessário.<br>
O CIGAM '''não realiza controle por flags de leitura ou integração'''. Caso esse tipo de controle seja necessário, ele deverá ser implementado pelas aplicações de terceiros em suas próprias tabelas.
O '''controle de acesso''' é feito por meio do parâmetro de '''PIN''', que será detalhado mais adiante.<br>
 
<br>
Em integrações, recomenda-se também informar os parâmetros correspondentes à '''chave única do cadastro''', permitindo a obtenção de um registro específico quando necessário.<br>
Quando aplicações de terceiros '''enviam dados para o CIGAM''', essas informações são registradas na '''tabela de integração''', desde que sejam aceitas pelo sistema. A '''importação e o processamento''' dos dados só ocorrerão quando o '''programa específico da Aplicação de Importação''' for executado.<br>
O '''controle de acesso''' é realizado por meio do parâmetro '''PIN''', que será detalhado posteriormente.
Caso algum dado não seja aceito, '''nenhum registro será inserido''' na tabela de integração, e será retornada ao chamador '''uma mensagem de erro''' contendo o código e a descrição do problema.<br>
 
<br>
Quando aplicações de terceiros '''enviam dados para o CIGAM''', as informações são registradas na '''tabela de integração''', desde que sejam aceitas pelo sistema. A importação e o processamento desses dados ocorrerão somente quando o programa específico da '''Aplicação de Importação''' for executado.
Para o '''controle de existência de registros''', as camadas de consulta disponibilizam '''uma lista contendo apenas os campos-chave''' de todos os registros existentes na tabela. Essa lista permite que a aplicação de terceiros '''compare com sua base local''' e identifique registros que foram excluídos no CIGAM.<br>
 
<br>
Caso algum dado não seja aceito, '''nenhum registro será inserido na tabela de integração'''. Nessa situação, será retornada ao sistema chamador uma '''mensagem de erro contendo o código e a descrição do problema'''.
Se a tabela possuir '''um grande volume de registros''' ou se ocorrerem '''muitas exclusões''', é possível criar uma '''trigger''' para consumir o respectivo serviço a cada exclusão.<br>
 
No entanto, é importante destacar que '''o uso de triggers pode impactar negativamente a performance da aplicação''', especialmente quando acionadas por requisições de webservices.
Para o controle de existência de registros, as camadas de consulta disponibilizam '''uma lista contendo apenas os campos-chave de todos os registros existentes na tabela'''. Essa lista permite que a aplicação de terceiros compare essas informações com sua base local e identifique registros que tenham sido '''excluídos no CIGAM'''.
 
Se a tabela possuir um grande volume de registros ou ocorrerem muitas exclusões, pode-se optar pela criação de uma '''trigger''' para consumir o respectivo serviço a cada exclusão realizada.
 
No entanto, é importante considerar que o uso de '''triggers pode impactar negativamente a performance da aplicação''', especialmente quando acionadas por requisições de '''webservices'''.


= Serviços disponíveis =
= Serviços disponíveis =


== Compras ==
== Compras ==
*[[IN_CadastroRequisicaoMaterial.integrador|CadastroRequisicaoMaterial.integrador]]
:*[[IN_CadastroRequisicaoMaterial.integrador|CadastroRequisicaoMaterial.integrador]]
*[[IN_CadastroItemRequisicaoMaterial.integrador|CadastroItemRequisicaoMaterial.integrador]]
:*[[IN_CadastroItemRequisicaoMaterial.integrador|CadastroItemRequisicaoMaterial.integrador]]
*[[IN_CadastroGradeRequisicaoMaterial.integrador|CadastroGradeRequisicaoMaterial.integrador]]
:*[[IN_CadastroGradeRequisicaoMaterial.integrador|CadastroGradeRequisicaoMaterial.integrador]]
*[[IN_EfetivacaoRequisicaoMaterial.integrador|EfetivacaoRequisicaoMaterial.integrador]]
:*[[IN_EfetivacaoRequisicaoMaterial.integrador|EfetivacaoRequisicaoMaterial.integrador]]
*[[IN_CadastroSolicitacaoMaterial.integrador|CadastroSolicitacaoMaterial.integrador]]
:*[[IN_CadastroSolicitacaoMaterial.integrador|CadastroSolicitacaoMaterial.integrador]]
*[[IN_CadastroItemSolicitacaoMaterial.integrador|CadastroItemSolicitacaoMaterial.integrador]]
:*[[IN_CadastroItemSolicitacaoMaterial.integrador|CadastroItemSolicitacaoMaterial.integrador]]
*[[IN_CadastroGradeSolicitacaoMaterial.integrador|CadastroGradeSolicitacaoMaterial.integrador]]
:*[[IN_CadastroGradeSolicitacaoMaterial.integrador|CadastroGradeSolicitacaoMaterial.integrador]]
*[[IN_CadastroPreNota.integrador|CadastroPreNota.integrador]]
:*[[IN_CadastroPreNota.integrador|CadastroPreNota.integrador]]
*[[IN_CadastroNotaFiscal.integrador|CadastroNotaFiscal.integrador]]
:*[[IN_CadastroNotaFiscal.integrador|CadastroNotaFiscal.integrador]]
*[[IN_CadastroOrdemCompra.integrador|CadastroOrdemCompra.integrador]]
:*[[IN_CadastroOrdemCompra.integrador|CadastroOrdemCompra.integrador]]
*[[IN_CadastroItemOrdemCompra.integrador|CadastroItemOrdemCompra.integrador]]
:*[[IN_CadastroItemOrdemCompra.integrador|CadastroItemOrdemCompra.integrador]]


== Configurador ==
== Configurador ==
*[[IN_CadastroCaracteristica.integrador|CadastroCaracteristica.integrador]]
:*[[IN_CadastroCaracteristica.integrador|CadastroCaracteristica.integrador]]
*[[IN_CadastroCaracteristicaConfigurador.integrador|CadastroCaracteristicaConfigurador.integrador]]
:*[[IN_CadastroCaracteristicaConfigurador.integrador|CadastroCaracteristicaConfigurador.integrador]]
*[[IN_CadastroConfigurador.integrador|CadastroConfigurador.integrador]]
:*[[IN_CadastroConfigurador.integrador|CadastroConfigurador.integrador]]
*[[IN_CadastroConfiguradorProduto.integrador|CadastroConfiguradorProduto.integrador]]
:*[[IN_CadastroConfiguradorProduto.integrador|CadastroConfiguradorProduto.integrador]]
*[[IN_CadastroConteudoCaracteristica.integrador|CadastroConteudoCaracteristica.integrador]]
:*[[IN_CadastroConteudoCaracteristica.integrador|CadastroConteudoCaracteristica.integrador]]
*[[IN_CadastroIdentificador.integrador|CadastroIdentificador.integrador]]
:*[[IN_CadastroIdentificador.integrador|CadastroIdentificador.integrador]]


== Estoque ==
== Estoque ==
*[[IN_CadastroBalanco.integrador|CadastroBalanco.integrador]]
:*[[IN_CadastroBalanco.integrador|CadastroBalanco.integrador]]
*[[IN_CadastroCaracteristicasMateriaisTg.integrador|CadastroCaracteristicasMateriaisTg.integrador]]
:*[[IN_CadastroCaracteristicasMateriaisTg.integrador|CadastroCaracteristicasMateriaisTg.integrador]]
*[[IN_CadastroCaracValidasParametros.integrador|CadastroCaracValidasParametros.integrador]]
:*[[IN_CadastroCaracValidasParametros.integrador|CadastroCaracValidasParametros.integrador]]
*[[IN_CadastroCentroArmazenagem.integrador|CadastroCentroArmazenagem.integrador]]
:*[[IN_CadastroCentroArmazenagem.integrador|CadastroCentroArmazenagem.integrador]]
*[[IN_CadastroClassificacaoFiscal.integrador|CadastroClassificacaoFiscal.integrador]]
:*[[IN_CadastroClassificacaoFiscal.integrador|CadastroClassificacaoFiscal.integrador]]
*[[IN_CadastroComplementoMaterial.integrador|CadastroComplementoMaterial.integrador]]
:*[[IN_CadastroComplementoMaterial.integrador|CadastroComplementoMaterial.integrador]]
*[[IN_CadastroEspecif1.integrador|CadastroEspecif1.integrador]]
:*[[IN_CadastroEspecif1.integrador|CadastroEspecif1.integrador]]
*[[IN_CadastroEspecif2.integrador|CadastroEspecif2.integrador]]
:*[[IN_CadastroEspecif2.integrador|CadastroEspecif2.integrador]]
*[[IN_CadastroEspecif3.integrador|CadastroEspecif3.integrador]]
:*[[IN_CadastroEspecif3.integrador|CadastroEspecif3.integrador]]
*[[IN_CadastroEspecif4.integrador|CadastroEspecif4.integrador]]
:*[[IN_CadastroEspecif4.integrador|CadastroEspecif4.integrador]]
*[[IN_CadastroEspecif5.integrador|CadastroEspecif5.integrador]]
:*[[IN_CadastroEspecif5.integrador|CadastroEspecif5.integrador]]
*[[IN_CadastroEspecif6.integrador|CadastroEspecif6.integrador]]
:*[[IN_CadastroEspecif6.integrador|CadastroEspecif6.integrador]]
*[[IN_CadastroGradeMovimento.integrador|CadastroGradeMovimento.integrador]]
:*[[IN_CadastroGradeMovimento.integrador|CadastroGradeMovimento.integrador]]
*[[IN_CadastroGradePadrao.integrador|CadastroGradePadrao.integrador]]
:*[[IN_CadastroGradePadrao.integrador|CadastroGradePadrao.integrador]]
*[[IN_CadastroGrupos.integrador|CadastroGrupos.integrador]]
:*[[IN_CadastroGrupos.integrador|CadastroGrupos.integrador]]
*[[IN_CadastroInventarioEstoque.integrador|CadastroInventarioEstoque.integrador]]
:*[[IN_CadastroInventarioEstoque.integrador|CadastroInventarioEstoque.integrador]]
*[[IN_CadastroInventarioItens.integrador|CadastroInventarioItens.integrador]]
:*[[IN_CadastroInventarioItens.integrador|CadastroInventarioItens.integrador]]
*[[IN_CadastroListaMateriais.integrador|CadastroListaMateriais.integrador]]
:*[[IN_CadastroListaMateriais.integrador|CadastroListaMateriais.integrador]]
*[[IN_CadastroMateriais.integrador|CadastroMateriais.integrador]]
:*[[IN_CadastroMateriais.integrador|CadastroMateriais.integrador]]
*[[IN_CadastroMateriaisTg.integrador|CadastroMateriaisTg.integrador]]
:*[[IN_CadastroMateriaisTg.integrador|CadastroMateriaisTg.integrador]]
*[[IN_CadastroMovimento.integrador|CadastroMovimento.integrador]]
:*[[IN_CadastroMovimento.integrador|CadastroMovimento.integrador]]
*[[IN_CadastroMovimentoEstoque.integrador|CadastroMovimentoEstoque.integrador]]
:*[[IN_CadastroMovimentoEstoque.integrador|CadastroMovimentoEstoque.integrador]]
*[[IN_CadastroNumeracaoGrade.integrador|CadastroNumeracaoGrade.integrador]]
:*[[IN_CadastroNumeracaoGrade.integrador|CadastroNumeracaoGrade.integrador]]
*[[IN_CadastroParametrosPlanejamento.integrador|CadastroParametrosPlanejamento.integrador]]
:*[[IN_CadastroParametrosPlanejamento.integrador|CadastroParametrosPlanejamento.integrador]]
*[[IN_CadastroRegraFiscal.integrador|CadastroRegraFiscal.integrador]]
:*[[IN_CadastroRegraFiscal.integrador|CadastroRegraFiscal.integrador]]
*[[IN_CadastroRegraParametrosPlanejamento.integrador|CadastroRegraParametrosPlanejamento.integrador]]
:*[[IN_CadastroRegraParametrosPlanejamento.integrador|CadastroRegraParametrosPlanejamento.integrador]]
*[[IN_CadastroSubGrupos.integrador|CadastroSubGrupos.integrador]]
:*[[IN_CadastroSubGrupos.integrador|CadastroSubGrupos.integrador]]
*[[IN_CadastroUnidadeMedida.integrador|CadastroUnidadeMedida.integrador]]
:*[[IN_CadastroUnidadeMedida.integrador|CadastroUnidadeMedida.integrador]]
*[[IN_CadastroPosicaoEstoque.integrador|CadastroPosicaoEstoque.integrador]]
*[[IN_ModificarPesosEVolume.integrador|ModificarPesosEVolume.integrador]]


== Faturamento ==
== Faturamento ==
*[[IN_CancelamentoNotaFiscal.integrador|CancelamentoNotaFiscal.Integrador]]
:*[[IN_CancelamentoNotaFiscal.integrador|CancelamentoNotaFiscal.Integrador]]
*[[IN_CadastroCondicaoPagamento.integrador|CadastroCondicaoPagamento.Integrador]]
:*[[IN_CadastroCondicaoPagamento.integrador|CadastroCondicaoPagamento.Integrador]]
<!--*[[IN_CadastroControlePedido.integrador|CadastroControlePedido.Integrador]]
<!--:*[[IN_CadastroControlePedido.integrador|CadastroControlePedido.Integrador]]
*[[IN_CadastroGradePedido.integrador|CadastroGradePedido.Integrador]]-->
:*[[IN_CadastroGradePedido.integrador|CadastroGradePedido.Integrador]]-->
*[[IN_CadastroItensPedido.integrador|CadastroItensPedido.Integrador]]
:*[[IN_CadastroItensPedido.integrador|CadastroItensPedido.Integrador]]
<!--*[[IN_CadastroMapaResumo.integrador|CadastroMapaResumo.Integrador]]-->
<!--:*[[IN_CadastroMapaResumo.integrador|CadastroMapaResumo.Integrador]]-->
*[[IN_CadastroNotaFiscal.integrador|CadastroNotaFiscal.Integrador]]
:*[[IN_CadastroNotaFiscal.integrador|CadastroNotaFiscal.Integrador]]
*[[IN_CadastroPedidos.integrador|CadastroPedidos.Integrador]]
:*[[IN_CadastroPedidos.integrador|CadastroPedidos.Integrador]]
*[[IN_CadastroPrazoPagamento.integrador|CadastroPrazoPagamento.Integrador]]
:*[[IN_CadastroPrazoPagamento.integrador|CadastroPrazoPagamento.Integrador]]


== Financeiro ==
== Financeiro ==
*[[IN_CadastroContaGerencial.integrador|CadastroContaGerencial.integrador]]
:*[[IN_CadastroContaGerencial.integrador|CadastroContaGerencial.integrador]]
*[[IN_CadastroContasFinanceiras.integrador|CadastroContasFinanceiras.integrador]]
:*[[IN_CadastroContasFinanceiras.integrador|CadastroContasFinanceiras.integrador]]
*[[IN_CadastroContratos.integrador|CadastroContratos.integrador]]
:*[[IN_CadastroContratos.integrador|CadastroContratos.integrador]]
*[[IN_CadastroHistoricos.integrador|CadastroHistoricos.integrador]]
:*[[IN_CadastroHistoricos.integrador|CadastroHistoricos.integrador]]
*[[IN_CadastroLancamentos.integrador|CadastroLancamentos.integrador]]
:*[[IN_CadastroLancamentos.integrador|CadastroLancamentos.integrador]]
*[[IN_CadastroObjetoContrato.integrador|CadastroObjetoContrato.integrador]]
:*[[IN_CadastroObjetoContrato.integrador|CadastroObjetoContrato.integrador]]
<!--*[[IN_CadastroParcelaPadraoContrato.integrador|CadastroParcelaPadraoContrato.integrador]]
<!--:*[[IN_CadastroParcelaPadraoContrato.integrador|CadastroParcelaPadraoContrato.integrador]]
*[[IN_CadastroParcelasContrato.integrador|CadastrosParcelaContrato.integrador]]-->
:*[[IN_CadastroParcelasContrato.integrador|CadastrosParcelaContrato.integrador]]-->
*[[IN_CadastroPortadores.integrador|CadastroPortadores.integrador]]
:*[[IN_CadastroPortadores.integrador|CadastroPortadores.integrador]]
*[[IN_CadastroTipoPagamento.integrador|CadastroTipoPagamento.integrador]]
:*[[IN_CadastroTipoPagamento.integrador|CadastroTipoPagamento.integrador]]
<!--== Fiscal ==
<!--== Fiscal ==
*[[IN_CadastroFaixasImposto.integrador|CadastroFaixasImposto.integrador]]-->
:*[[IN_CadastroFaixasImposto.integrador|CadastroFaixasImposto.integrador]]-->


== Genérico ==
== Genérico ==
<!--*[[IN_Notificacao.integrador|Notificacao.integrador]]
<!--:*[[IN_Notificacao.integrador|Notificacao.integrador]]
*[[IN_Arquivos.integrador|Arquivos.integrador]]
:*[[IN_Arquivos.integrador|Arquivos.integrador]]
*[[IN_Email.integrador|Email.integrador]]
:*[[IN_Email.integrador|Email.integrador]]
*[[IN_CadastroEmpresaComissao.integrador|CadastroEmpresaComissao.integrador]]
:*[[IN_CadastroEmpresaComissao.integrador|CadastroEmpresaComissao.integrador]]
*[[IN_CadastroRegiaoMercado.integrador|CadastroRegiaoMercado.integrador]]
:*[[IN_CadastroRegiaoMercado.integrador|CadastroRegiaoMercado.integrador]]
*[[IN_CadastroTiposEmpresa.integrador|CadastroTiposEmpresa.integrador]]
:*[[IN_CadastroTiposEmpresa.integrador|CadastroTiposEmpresa.integrador]]
-->
-->
*[[IN_CadastroCategoriasTg.integrador|CadastroCategoriasTg.integrador]]
:*[[IN_CadastroAcompanhamento.integrador|CadastroAcompanhamento.integrador]]
*[[IN_CadastroColaboradores.integrador|CadastroColaboradores.integrador]]
:*[[IN_CadastroCategoriasTg.integrador|CadastroCategoriasTg.integrador]]
*[[IN_CadastroContatosEmpresas.integrador|CadastroContatosEmpresas.integrador]]
:*[[IN_CadastroColaboradores.integrador|CadastroColaboradores.integrador]]
*[[IN_CadastroControleTg.integrador|CadastroControleTg.integrador]]
:*[[IN_CadastroContatosEmpresas.integrador|CadastroContatosEmpresas.integrador]]
*[[IN_CadastroElementosTg.integrador|CadastroElementosTg.integrador]]
:*[[IN_CadastroControleTg.integrador|CadastroControleTg.integrador]]
*[[IN_CadastroEmpresas.integrador|CadastroEmpresas.integrador]]
:*[[IN_CadastroElementosTg.integrador|CadastroElementosTg.integrador]]
*[[IN_CadastroEnderecosCobrancaEmpresas.integrador|CadastroEnderecosCobrancaEmpresas.integrador]]
:*[[IN_CadastroEmpresas.integrador|CadastroEmpresas.integrador]]
*[[IN_CadastroEnderecosEntregaEmpresas.integrador|CadastroEnderecosEntregaEmpresas.integrador]]
:*[[IN_CadastroEnderecosCobrancaEmpresas.integrador|CadastroEnderecosCobrancaEmpresas.integrador]]
*[[IN_CadastroEstados.integrador|CadastroEstados.integrador]]
:*[[IN_CadastroEnderecosEntregaEmpresas.integrador|CadastroEnderecosEntregaEmpresas.integrador]]
*[[IN_CadastroMunicipios.integrador|CadastroMunicipios.integrador]]
:*[[IN_CadastroEstados.integrador|CadastroEstados.integrador]]
*[[IN_CadastroObservacaoEmpresa.integrador|CadastroObservacaoEmpresa.integrador]]
:*[[IN_CadastroMunicipios.integrador|CadastroMunicipios.integrador]]
*[[IN_CadastroPaises.integrador|CadastroPaises.integrador]]
:*[[IN_CadastroObservacaoEmpresa.integrador|CadastroObservacaoEmpresa.integrador]]
*[[IN_CadastroRegraDesconto.integrador|CadastroRegraDesconto.integrador]]
:*[[IN_CadastroPaises.integrador|CadastroPaises.integrador]]
*[[IN_CadastroTabelaPreco.integrador|CadastroTabelaPreco.integrador]]
:*[[IN_CadastroRegraDesconto.integrador|CadastroRegraDesconto.integrador]]
*[[IN_CadastroTipoOperacao.integrador|CadastroTipoOperacao.integrador]]
:*[[IN_CadastroTabelaPreco.integrador|CadastroTabelaPreco.integrador]]
*[[IN_Log.integrador|Log.integrador]]
:*[[IN_CadastroTipoOperacao.integrador|CadastroTipoOperacao.integrador]]
:*[[IN_Log.integrador|Log.integrador]]


== Projetos ==
== Projetos ==
* [[IN_CadastroProjeto.integrador|CadastroProjeto.integrador]]
:* [[IN_CadastroProjeto.integrador|CadastroProjeto.integrador]]
* [[IN_CadastroTipoProjeto.integrador|CadastroTipoProjeto.integrador]]
:* [[IN_CadastroTipoProjeto.integrador|CadastroTipoProjeto.integrador]]
{{VoltarInicio}}


= Estrutura dos registros =
= Estrutura dos registros =
A '''tabela de integração''' é onde devem ser inseridos os registros a serem posteriormente importados pelo CIGAM.<br>
A '''tabela de integração''' é onde devem ser inseridos os registros a serem posteriormente importados pelo CIGAM.
Todos os tipos de cadastros utilizam essa mesma tabela, e um campo chamado <code>Tipo</code> identifica qual rotina de importação será responsável por processar cada registro.<br>
 
<br>
Todos os tipos de cadastros utilizam essa mesma tabela. Para identificar qual rotina de importação será responsável pelo processamento de cada registro, é utilizado o campo <code>Tipo</code>.
'''Exemplos de valores para o campo Tipo:'''
 
'''Alguns exemplos de valores para esse campo são:'''
:* <code>MATCAD</code> - Cadastro de materiais
:* <code>MATCAD</code> - Cadastro de materiais
:* <code>EMPCAD</code> - Cadastro de empresas
:* <code>EMPCAD</code> - Cadastro de empresas
Essa tabela possui um '''grande número de campos''', projetados para acomodar diferentes tipos de cadastros do CIGAM.<br>
Essa tabela possui um grande número de campos, projetados para atender às necessidades de diferentes tipos de cadastros do CIGAM. Entretanto, apenas os campos <code>ID</code> e <code>Tipo</code> são indexados, garantindo melhor desempenho nas consultas essenciais.
Entretanto, '''somente os campos de <code>ID</code> e <code>Tipo</code> são indexados''', garantindo melhor desempenho nas consultas essenciais.


'''Camada de Serviços'''
<font size=4>'''Camada de Serviços'''</font>
: A '''camada de serviços''' funciona como '''porta de entrada''' para as integrações. <br> Para cada tipo de cadastro/registro, existe '''um serviço específico'''. <br> Além dos parâmetros próprios de cada rotina, esses serviços incluem o parâmetro <code>PIN</code>, utilizado para identificar o usuário ou aplicação responsável pela requisição.


'''Controle de Status dos Registros'''
A '''camada de serviços''' atua como porta de entrada para as integrações com o CIGAM.
: Na tabela de integração existe um '''campo de controle de status''', utilizado para gerenciar o processamento dos registros. <br> Quando há relacionamento '''máster-detalhe''', o controle é feito no '''registro máster'''.
: Esse controle é necessário para evitar que o programa de importação execute enquanto os dados ainda estão sendo inseridos. <br> Assim, o '''status do registro máster só é liberado após todos os registros de detalhe terem sido incluídos''', garantindo consistência.
: Outra estratégia possível é a de o '''programa de integração inserir o registro máster por último''', assegurando também a integridade dos dados no momento da importação.


'''Consulta à Tabela de Integração'''
Para cada tipo de cadastro/registro, existe um '''serviço específico''' responsável pelo recebimento e tratamento das informações. Além dos parâmetros próprios de cada rotina, esses serviços também incluem o parâmetro <code>PIN</code>, utilizado para identificar o usuário ou a aplicação responsável pela requisição.
: Existe um '''webservice de listagem''' da tabela de integração, que permite '''filtrar registros por''':
 
<font size=4>'''Controle de Status dos Registros'''</font>
 
A tabela de integração possui um '''campo de controle de status''', utilizado para gerenciar o processamento dos registros.
 
Quando existe relacionamento '''máster-detalhe''', o controle de status é realizado no registro '''máster'''. Esse mecanismo evita que o programa de importação seja executado enquanto os dados ainda estão sendo inseridos.
 
Dessa forma, o status do registro máster só é liberado após a inclusão de todos os registros de detalhe, garantindo a '''consistência das informações'''.
 
Outra estratégia possível é que o programa de integração insira o '''registro máster por último''', assegurando também a integridade dos dados no momento da importação.
 
<font size=4>'''Consulta à Tabela de Integração'''</font>
 
Existe um '''webservice de listagem da tabela de integração''' que permite consultar os registros utilizando diferentes filtros, como:
:* '''ID''' da tabela
:* '''ID''' da tabela
:* '''Data de inclusão''' do registro
:* '''Data de inclusão''' do registro
:* '''Tipo''' de registro
:* '''Tipo''' de registro
:* Ou combinações desses filtros
:* Combinações desses filtros
: Esse serviço auxilia as aplicações de terceiros a '''verificar se um determinado registro já foi importado''', permitindo um controle mais eficiente dos dados integrados.
 
Esse serviço auxilia aplicações de terceiros a verificar se um determinado registro '''já foi importado''', permitindo um controle mais eficiente dos dados integrados.


== Validação de parâmetros ==
== Validação de parâmetros ==
Durante a requisição de um serviço, caso '''algum parâmetro obrigatório não seja informado''', o sistema retornará '''uma mensagem de erro''' indicando o '''nome do parâmetro ausente'''.<br>
Durante a requisição de um serviço, caso algum '''parâmetro obrigatório''' não seja informado, o sistema retornará uma '''mensagem de erro''' indicando o nome do parâmetro ausente.
<br>
 
Se houver '''mais de um parâmetro obrigatório faltando''', todos os nomes serão listados na mesma mensagem, facilitando a identificação e correção pela aplicação integradora.<br>
Quando houver mais de um parâmetro obrigatório não informado, todos os nomes serão listados na '''mesma mensagem''', facilitando a identificação e a correção pela aplicação integradora.
<br>
 
Para parâmetros que possuem '''dependência de outro parâmetro''', será exibido '''um asterisco (<*>) após o nome'''.<br>
Para parâmetros cuja obrigatoriedade depende do preenchimento de outro campo, será exibido um asterisco (<*>) após o nome do parâmetro.<br>
Essa marcação sinaliza que a obrigatoriedade está condicionada ao preenchimento de outro campo relacionado.
Essa marcação indica que o parâmetro se torna obrigatório '''apenas quando o campo relacionado for informado'''.
{{VoltarInicio}}
 
== Tabela de Integração e Log ==
'''Tabelas envolvidas:'''
*<b>Tabela de Integração:</b> <code>%GEINTEGRADOR%</code>
*<b>Tabela de Log de Integração:</b> <code>%GEINTEGRADORLOG%</code>
 
Todas as alterações de dados enviadas ao CIGAM permanecem registradas na '''tabela de integração''' até serem processadas pela '''Aplicação de Integração'''.
 
Quando o Webservice recebe uma requisição, ele valida inicialmente todos os parâmetros informados. Caso algum parâmetro seja inválido, o sistema retorna um '''erro ao usuário''' e '''nenhum registro é inserido''' nas tabelas de integração ou de log.
 
Se os parâmetros forem válidos, o registro é inserido na '''tabela de integração''' e o Webservice retorna uma '''mensagem de sucesso''' ao usuário. Nesse momento ainda não é gerado log.
 
Posteriormente, quando o programa da '''Aplicação de Integração''' executa e importa o registro da tabela de integração, é criado um '''registro correspondente na tabela de log''', contendo:
* os dados importados
* o usuário logado no CIGAM responsável pela importação
* a data e hora da execução
 
Após o processamento, o registro é '''removido da tabela de integração'''.
 
Na tabela de log existe um campo que indica se o registro foi '''importado''' ou '''recusado'''. Caso seja recusado, também são armazenados o '''código e a mensagem de erro''', evitando que registros com erro permaneçam na tabela de integração.
 
Quando registros pendentes são liberados posteriormente, essa ação também gera '''registro na tabela de log'''. Caso seja tentada a liberação de um registro inexistente, o sistema retorna um erro e '''nenhum log é gerado'''.


== Tabela de integração e log ==
Não é realizada validação para identificar se um registro já foi liberado anteriormente, pois isso exigiria controle adicional de registros correlatos.
        <p align="justify" style="margin-left: 0.32in; text-indent: 0.45in; margin-bottom: 0.08in; font-weight: normal; line-height: 150%;">
 
*'''Tabelas envolvidas:'''<br/>
As tabelas de '''integração''' e '''log''' possuem '''campos com nomes genéricos''', utilizados para atender diferentes cadastros e rotinas do CIGAM. Por esse motivo, a consulta e inclusão de dados devem ser realizadas '''por meio das camadas responsáveis do sistema''', que apresentam os campos com as nomenclaturas adequadas para cada cadastro.
**<b>Integração </b> %GEINTEGRADOR%<br/>
 
**<b>Log de integração </b> %GEINTEGRADORLOG% <br/>
Existe ainda uma '''tela on-line''' em  '''Genéricos → Pesquisas → Rotinas''' que permite ao usuário, administrador ou DBA consultar os registros da tabela de log.
<br/>
 
Todas as alterações de dados requisitadas para o CIGAM ficarão na tabela de integração até seu processamento pela Aplicação de Integração. Sempre que uma das camadas alterarem os dados dessa tabela será adicionada uma linha da tabela de log.<br/>
A tabela de log '''não possui índices por padrão''', visando melhor desempenho. Caso o volume de dados se torne elevado, índices podem ser criados conforme necessidade do ambiente.
Como a tabela de integração e log possuem campos com nomes genéricos a qualquer cadastro ou rotina do CIGAM, a consulta bem como a inclusão de dados deverá ser feita pelas respectivas camadas as quais apresentarão os nomes dos campos adequadamente.<br/>
 
As tabelas de integração e log ficarão em um banco separado. Esse banco será acesso pelo Database CIGAM_INTEGRA em aplicações do CIGAM e pela Aplicação de
Também não são gerados logs para '''consultas de dados''' realizadas no sistema.
                Integração (componente CGIntegrador.ecf)<br/>
 
Se o banco de dados for diferente ao utilizado pelo CIGAM (inclusive se mudar apenas o database/usuário), deve-se informar uma <i>connection string</i> chamada INTEGRACAO no arquivo de configuração.<br/>
A limpeza da tabela de log pode ser realizada conforme a necessidade do administrador do banco de dados, mantendo apenas registros de um determinado número de dias. Essa limpeza é '''manual''', por segurança.
<br/>
 
Também deve ser informado o banco de dados nessa nova conexão no parâmetro providerName.<br/>
<font size=4>'''Banco de dados de integração'''</font>
        &nbsp;&nbsp;&nbsp;<u><b>Exemplo:</u></b><br/>
 
        &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;add name=&quot;CIGAM&quot; connectionString=&quot;Server=servidor;Database=BD;User ID=USER;Password=SENHA;<br/>
As tabelas de '''integração e log''' ficam armazenadas em '''um banco de dados separado'''. Esse banco é acessado:
      &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;add name=&quot;INTEGRACAO&quot; connectionString=&quot;Server=servidor;Database=BD;User ID=USER;Password=SENHA;&quot; providerName=&quot;02&quot;/&gt;<br/>
* Pelas aplicações do CIGAM, por meio do '''Database''' <code>CIGAM_INTEGRA</code>
<br/>
* Pela '''Aplicação de Integração''' (componente <code>CGIntegrador.ecf</code>)
O código de banco de dados do CIGAM deve ser informado na configuração BANCO_DADOS da aplicação.<br/>
 
        &nbsp;&nbsp;&nbsp;<u><b>Exemplo:</u></b><br/>
Caso o banco de dados de integração seja diferente do banco utilizado pelo CIGAM — inclusive quando houver apenas mudança de '''database''' ou '''usuário''' — deve ser configurada uma '''connection string''' chamada '''INTEGRACAO''' no arquivo de configuração da aplicação.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;add key=&quot;BANCO_DADOS&quot; value=&quot;03&quot; /&gt;</p>
 
<br/>
Também é necessário informar o banco de dados dessa nova conexão no parâmetro '''providerName'''.
Para registrar requisições provenientes de aplicativos de terceiros, é necessário utilizar o parâmetro chamado CGREQUISICAOWS. Já para registrar requisições de serviços específicos, deve-se empregar o parâmetro CGREQUISICAOWS_ seguido do tipo de registro desejado. Por exemplo, para registrar requisições relacionadas a cadastros de notas fiscais, o parâmetro seria GREQUISICAOWS_CADNF1.<br/>
 
* Exemplo de aplicabilidade dentro do arquivo web.config na sessão settings ou quando existir, diretamente no arquivo settings.config:<br/>
'''Exemplo:'''
    <add key="CGREQUISICAOWS" value="C:\cigam\Temp\"/><br/>
 
    <add key="CGREQUISICAOWS_CADNF1" value="C:\cigam\Temp\NF\"/><br/>
  <font color="blue">&lt;add</font> <font color="Goldenrod">name</font>=<font color="green">"CIGAM"</font>  <font color="Goldenrod">connectionString</font>=<font color="green">"Server=servidor;Database=BD;User ID=USER;Password=SENHA;"</font> <font color="blue">/&gt;</font>
Caso não seja necessário gravar nenhuma requisição em arquivo, nenhum dos parâmetros mencionados acima deve ser utilizado.<br/>
 
  <font color="blue">&lt;add</font>  <font color="Goldenrod">name</font>=<font color="green">"INTEGRACAO"</font>  <font color="Goldenrod">connectionString</font>=<font color="green">"Server=servidor;Database=BD;User ID=USER;Password=SENHA;"</font>  <font color="Goldenrod">providerName</font>=<font color="green">"02"</font> <font color="blue">/&gt;</font>
 
O '''código do banco de dados do CIGAM''' deve ser informado na configuração '''BANCO_DADOS''' da aplicação.
 
'''Exemplo:'''
 
  <font color="blue">&lt;add</font> <font color="Goldenrod">key</font>=<font color="green">"BANCO_DADOS"</font> <font color="Goldenrod">value</font>=<font color="green">"03"</font> <font color="blue">/&gt;</font>
 
<font size=4>'''Registro de requisições'''</font>
 
Para registrar requisições provenientes de '''aplicações de terceiros''', deve-se utilizar o parâmetro '''CGREQUISICAOWS'''.
 
Caso seja necessário registrar requisições apenas de serviços específicos, utiliza-se o parâmetro '''CGREQUISICAOWS_''' seguido do '''tipo de registro''' correspondente.
 
Por exemplo, para registrar requisições relacionadas ao '''cadastro de notas fiscais''', o parâmetro seria: <code>GREQUISICAOWS_CADNF1</code>.
 
Esses parâmetros devem ser configurados no arquivo '''web.config''', na seção '''settings''', ou diretamente no arquivo '''settings.config''', quando existir.
 
'''Exemplo de configuração:'''
 
  <font color="blue">&lt;add</font> <font color="Goldenrod">key</font>=<font color="green">"CGREQUISICAOWS"</font> <font color="Goldenrod">value</font>=<font color="green">"C:\cigam\Temp\"</font> <font color="blue">/&gt;</font>
 
  <font color="blue">&lt;add</font>  <font color="Goldenrod">key</font>=<font color="green">"CGREQUISICAOWS_CADNF1"</font> <font color="Goldenrod">value</font>=<font color="green">"C:\cigam\Temp\NF\"</font> <font color="blue">/&gt;</font>
 
Caso não seja necessário registrar requisições em arquivos, '''nenhum desses parâmetros precisa ser configurado'''.
{{VoltarInicio}}


==Registros correlatos ==
==Registros correlatos ==
        <p align="justify" style="margin-left: 0.32in; text-indent: 0.45in; margin-bottom: 0.08in; font-weight: normal; line-height: 150%;">
A tabela de integração pode conter '''registros correlatos''' ainda pendentes de importação. Um exemplo comum ocorre nas relações '''pedido → itens → grade do item'''.
A tabela de integração poderá ter registros correlatos pendentes de importações, como por exemplo, pedidos versus itens versus grade do item. Neste caso quando o pedido for importado será feita uma verificação se existem itens para esse pedido. Da mesma forma, quando o item do pedido for importado será verificado se existe grade do item. Nesse ponto, somente os registros com status liberado serão avaliados e importados/recursados.<br/>
 
Os registros correlatos que não estão liberados, não serão tratados e, portanto jamais serão reavaliados. Para evitar registros perdidos na tabela de integração, será
Nesse cenário, quando o '''pedido''' for importado, o sistema verificará se existem '''itens vinculados''' a esse pedido. Da mesma forma, durante a importação de um '''item do pedido''', será verificada a existência de '''registros de grade do item''' associados.
                executada uma rotina de limpeza que irá excluir os registros com ID correlato cujo registro máster não esteja mais pendente de importação. Essa exclusão registrará um log específico.</p>
 
Nesse processo, '''somente os registros com status liberado''' serão avaliados e poderão ser '''importados ou recusados'''.
 
Registros correlatos que '''não estiverem liberados''' não serão processados naquele momento e, consequentemente, '''não serão reavaliados posteriormente'''. Para evitar que registros permaneçam indevidamente na tabela de integração, será executada uma '''rotina de limpeza'''.
 
Essa rotina tem como objetivo '''excluir registros com ID correlato cujo registro máster já não esteja mais pendente de importação'''. Cada exclusão realizada por essa rotina será registrada em '''log específico''', garantindo o rastreamento das operações efetuadas.


== Segurança ==
== Segurança ==
<!--atualizado em out/2025-->
As aplicações de terceiros não utilizam o '''cadastro de usuários''' nem os '''direitos do CIGAM''', pois não possuem meios adequados para gerenciar essas informações.
As aplicações de terceiros '''não utilizam o cadastro de usuários nem os direitos do CIGAM''', pois não têm como gerenciar adequadamente essas informações.<br>
A autenticação e o controle de acesso são realizados através de '''PINs''' e da '''chave de criptografia (CHAVE_CRYPTA)''' definidos no arquivo de configurações do ambiente do Web Service (seção <code><appSettings></code>).


'''📌 PIN'''
A autenticação e o controle de acesso são realizados através de '''PINs''' e da '''chave de criptografia (CHAVE_CRYPTA)''', definidos no arquivo de configuração do ambiente do Web Service, na seção <code><appSettings></code>.
: O '''PIN''' é utilizado para identificar quem está realizando a requisição e definir os serviços disponíveis para cada integração.
 
: Ele deve ser configurado no arquivo de ambiente do Web Service.
'''📌 <font size=4>PIN</font>'''
: No exemplo abaixo, as requisições que utilizarem o PIN <code>XW@#25Qo</code> terão acesso apenas aos serviços <code>CADMAT</code> e <code>CADEMP</code>.
: O '''PIN''' é utilizado para identificar quem está realizando a requisição e determinar quais serviços estarão disponíveis para cada integração. Esse parâmetro deve ser configurado no arquivo de configuração do Web Service.
: Os demais PINs <code>@#0Q1o2</code>, <code>W#12@Abfg</code> e <code>20020004</code> não possuem restrições definidas e podem acessar todos os serviços:
:No exemplo a seguir, requisições que utilizarem o PIN <code>XW@#25Qo</code> terão acesso apenas aos serviços <code>CADMAT</code> e <code>CADEMP</code>. Os demais PINs (<code>@#0Q1o2</code>, <code>W#12@Abfg</code> e <code>20020004</code>) não possuem restrições definidas e, portanto, podem acessar todos os serviços.


   <span style="color:blue">&lt;appSettings&gt;</span>
   <span style="color:blue">&lt;appSettings&gt;</span>
Linha 210: Linha 276:
   <span style="color:blue">&lt;/appSettings&gt;</span>
   <span style="color:blue">&lt;/appSettings&gt;</span>


:💡 '''Recomendação:''' Defina PINs com '''alta complexidade''' para reforçar a segurança das informações trafegadas entre os sistemas.
:💡 '''Recomendação:''' Defina PINs com '''alto nível de complexidade''', contribuindo para aumentar a segurança das informações trafegadas entre os sistemas.


'''📌 CHAVE_CRYPTA'''
'''📌 <font size=4>CHAVE_CRYPTA</font>'''
: A '''CHAVE_CRYPTA''' é utilizada para '''criptografar e descriptografar dados sensíveis''' transmitidos entre o CIGAM e aplicações externas, garantindo a confidencialidade e integridade da comunicação.
: A '''CHAVE_CRYPTA''' é utilizada para '''criptografar e descriptografar dados sensíveis''' transmitidos entre o CIGAM e aplicações externas, garantindo a confidencialidade e integridade da comunicação.
: Essa chave também deve ser configurada no <code><appSettings></code> do ambiente do Web Service:
: Essa chave também deve ser configurada no <code><appSettings></code> do ambiente do Web Service.


   <span style="color:blue">&lt;appSettings&gt;</span>
   <span style="color:blue">&lt;appSettings&gt;</span>
Linha 224: Linha 290:
:* A alteração da chave deve ser coordenada em todos os pontos de integração.
:* A alteração da chave deve ser coordenada em todos os pontos de integração.
:* '''Mantenha a chave em sigilo''' e compartilhe somente com equipes autorizadas.
:* '''Mantenha a chave em sigilo''' e compartilhe somente com equipes autorizadas.
{{VoltarInicio}}


<!--
= Requisição e resposta dos Webservices =
Não será utilizado o cadastro de usuário nem de direitos do CIGAM, até porque as aplicações de terceiros não podem controlar adequadamente esses dados.<br/>
Os webservices do CIGAM suportam as tecnologias '''SOAP''' e '''REST/JSON'''.<br>
O PIN irá identificar quem está fazendo a requisição e deve estar inserido no arquivo de configurações do ambiente do Web Service (seção &lt;appSettings&gt;).<br/>
Na utilização do padrão '''REST/JSON''', os parâmetros devem ser enviados por '''POST''', e o '''nome do método''' deve ser informado diretamente na URL da requisição. As respostas dos serviços também podem ser obtidas em ambos os formatos.
Conforme exemplo abaixo, as requisições com o PIN <XW@#25Qo> podem utilizar os serviços &lsquo;CADMAT&rsquo; e &lsquo;CADEMP&rsquo;. Os demais <@#0Q1o2>, <W#12@Abfg> e <20020004> podem utilizar todos os serviços, pois não há restrição atribuída a eles.<br/>
 
* <u><b>Exemplo:</u></b><br/>
Quando o retorno do serviço contiver '''mais de um registro''', a exportação será realizada utilizando '''duas coleções (objetos)''': uma para as '''colunas''' e outra para os '''dados'''. Nesse formato, as colunas recebem cabeçalhos identificadores (por exemplo: '''c1''', '''c2''', '''c3'''...), que são utilizados como referência pelos registros retornados.
** &lt;appSettings&gt;<br/>
 
** &lt;add key=&quot;pin&quot; value=&quot;XW@#25Qo;@#0Q1o2;W#12@Abfg;20020004&quot;/&gt;
Existe ainda a opção '''EXPORT_HEADERS''', que pode ser configurada no arquivo de configuração do ambiente do Web Service (seção <code><appSettings></code>). Essa opção define se a exportação deverá utilizar sempre os '''cabeçalhos de colunas''', independentemente da quantidade de registros retornados.
*** É indicado que o valor do PIN tenha uma complexidade alta visando a segurança das informações contidas nos ambientes integrados<br/>
 
**&lt;add key=&quot;XW@#25Qo&quot; value=&quot;CADMAT;CADEMP&quot;/&gt;
'''Exemplo de configuração:'''
-->
 
  <font color="blue">&lt;appSettings&gt;</font>
  &nbsp;&nbsp;<font color="blue">&lt;add</font> <font color="Goldenrod">key</font>=<font color="green">"EXPORT_HEADERS"</font> <font color="Goldenrod">value</font>=<font color="green">"N"</font> <font color="blue">/&gt;</font>
  <font color="blue">&lt;/appSettings&gt;</font>
 
Essa configuração também pode ser incluída no arquivo '''Settings'''.
 
Quando o '''nome da coluna no banco de dados''' for diferente do '''nome utilizado no CIGAM/CGData''', a coleção de nomes de colunas incluirá uma '''tag adicional''' contendo essa identificação.
 
Campos que ainda não possuem nome definido (por exemplo: '''Campo31''', '''Campo32''') não serão exportados. A exceção são os campos de usuário, identificados por nomes iniciados com <code>Usr</code>.
 
No formato '''JSON''', é necessário atribuir explicitamente ambas as propriedades, pois não é possível definir um valor diretamente na tag principal como ocorre no '''XML'''. Nesses casos, o '''apelido da coluna''' será informado na propriedade <code>db_alias</code>.


= Requisição e resposta dos Webservices =
Em ambos os formatos, o '''primeiro nó da estrutura''' corresponde ao valor da '''tradução do Nome Lógico da tabela exportada'''.<br>
<p align="justify" style="margin-left: 0.32in; text-indent: 0.45in; margin-bottom: 0.08in; font-weight: normal; line-height: 150%;">
As '''colunas''' são agrupadas na coleção <code>col</code>, enquanto os '''dados dos registros''' são agrupados na coleção <code>reg</code>.<br>
Serão suportadas as tecnologias SOAP e Rest/JSon sendo que nessa segunda opção os parâmetros devem ser enviados por POST e o nome do método junto na URL. As respostas dos serviços
Todos os dados são retornados utilizando '''codificação UTF-8'''.
                também estarão disponíveis nessas duas tecnologias.<br/>
Quando o retorno contiver mais de um registro, a exportação será feita com duas coleções (objetos), uma para as colunas e outra para os dados. Neste caso as colunas ganham cabeçalhos
                nomeados para referenciar os dados (c1, c2...).<br/>
A opção EXPORT_HEADERS pode ser inserida no arquivo de configurações do ambiente do Web Service (seção &lt;appSettings&gt;) para indicar se a exportação deve ocorrer
                sempre usando os cabeçalhos ou não, independentemente da quantidade de registros.<br/>
    &nbsp;&nbsp;&nbsp; <u><b>Exemplo:</u></b><br/>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;appSettings&gt;<br/>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add key=&quot;EXPORT_HEADERS&quot; value=&quot;N&quot;/&gt;<br/>
É possível incluir no arquivo Settings.<br/>
Quando o nome da coluna da tabela no banco de dados for diferente do nome utilizado no CIGAM/CGData, na coleção dos nomes de colunas existirá uma tag com essa identificação.<br/>
Não serão exportados campos ainda não nomeados (exemplo: Campo31, Campo32...). Exceção: Campos de usuário que são os iniciados com nome <Usr>.<br/>
No formato JSON será necessário atributar ambas as propriedades, pois não há como colocar um valor para a tag principal como no XML. Neste caso, o apelido da coluna deverá ficar na tag
                <db_alias>.<br/>
Como primeiro nó da árvore, em ambos os formatos será utilizado o valor da tradução do Nome Lógico da tabela exportada. As colunas serão agrupadas na coleção
                <col> e os campos de cada registro na coleção <reg>. Os dados serão formatados com decodificação UTF-8.<br/>
    &nbsp;&nbsp;&nbsp; <u><b>Exemplos de resposta:</u></b><br/>


<center><table style="width:85%" "line-height:100%">
'''Exemplo de resposta em XML e JSON'''
<center>
<table style="width:85%" "line-height:100%">
   <tr>
   <tr>
     <td><b>XML</b></td>
     <td><b> &nbsp;XML</b></td>
     <td><b>JSON</b></td>
     <td><b> &nbsp;JSON</b></td>
   </tr>
   </tr>
   <tr>
   <tr>
     <td>
     <td valign="top">
    <pre><esmateri>
  <font color="blue">&lt;esmateri&gt;</font>
      <col>
    <font color="blue">&lt;col&gt;</font>
        <cd_material>c1</cd_material>
      <font color="blue">&lt;cd_material&gt;</font>c1<font color="blue">&lt;/cd_material&gt;</font>
        <descricao>c2</descricao>
      <font color="blue">&lt;descricao&gt;</font>c2<font color="blue">&lt;/descricao&gt;</font>
        <valor_imposto>c3</valor_imposto>
      <font color="blue">&lt;valor_imposto&gt;</font>c3<font color="blue">&lt;/valor_imposto&gt;</font>
      </col>
    <font color="blue">&lt;/col&gt;</font>
      <reg>
    <font color="blue">&lt;reg&gt;</font>
        <c1>001</c1>
      <font color="blue">&lt;c1&gt;</font>001<font color="blue">&lt;/c1&gt;</font>
        <c2>Material Teste 1</c2>
      <font color="blue">&lt;c2&gt;</font>Material Teste 1<font color="blue">&lt;/c2&gt;</font>
        <c3>10</c3>
      <font color="blue">&lt;c3&gt;</font>10<font color="blue">&lt;/c3&gt;</font>
      </reg>
    <font color="blue">&lt;/reg&gt;</font>
      <reg>
    <font color="blue">&lt;reg&gt;</font>
        <c1>002</c1>
      <font color="blue">&lt;c1&gt;</font>002<font color="blue">&lt;/c1&gt;</font>
        <c2>Material Teste 2</c2>
      <font color="blue">&lt;c2&gt;</font>Material Teste 2<font color="blue">&lt;/c2&gt;</font>
        <c3>20</c3>
      <font color="blue">&lt;c3&gt;</font>20<font color="blue">&lt;/c3&gt;</font>
      </reg>
    <font color="blue">&lt;/reg&gt;</font>
  </esmateri>
  <font color="blue">&lt;/esmateri&gt;</font>
 
 
 
 
 
 
 
    </td>


    <td valign="top">
  <font color="blue">{</font>
    <font color="black">"col"</font>: [
      <font color="blue">{</font>
        <font color="black">"cd_empresa"</font>: <font color="green">"c1"</font>,
        <font color="black">"descricao"</font>: <font color="green">"c2"</font>,
        <font color="black">"valor_imposto"</font>: <font color="blue">{</font>
          <font color="black">"db_column"</font>: <font color="green">"campo3"</font>,
          <font color="black">"db_alias"</font>: <font color="green">"c3"</font>
        <font color="blue">}</font>
      <font color="blue">}</font>
    ],
    <font color="black">"esmateri"</font>: [
      <font color="blue">{</font>
        <font color="black">"c1"</font>: <font color="green">"001"</font>,
        <font color="black">"c2"</font>: <font color="green">"Material Teste 1"</font>,
        <font color="black">"c3"</font>: <font color="green">"10"</font>
      <font color="blue">}</font>,
      <font color="blue">{</font>
        <font color="black">"c1"</font>: <font color="green">"002"</font>,
        <font color="black">"c2"</font>: <font color="green">"Material Teste 2"</font>,
        <font color="black">"c3"</font>: <font color="green">"20"</font>
      <font color="blue">}</font>
    ]
  <font color="blue">}</font>
    </td>
</tr>
</table>
</center>


Para validar estruturas no formato JSON, pode-se utilizar ferramentas de validação online, como o JSONLint em http://jsonlint.com.
{{VoltarInicio}}
== Tipos especiais ==
Alguns dados utilizam '''formatos específicos''' nas requisições e respostas dos serviços. Esses formatos variam conforme o tipo de dado e a tecnologia utilizada (XML ou JSON).
<center>
<table width="90%" border="0" cellspacing="0" cellpadding="10" style="line-height:200%;">
<tr valign="top">
<td style="background:#d9d9d9;" width="80"><b>Tipo do dado</b></td>
<td style="background:#d9d9d9;" width="71"><b>Formato</b></td>
<td style="background:#d9d9d9;" width="184"><b>Máscara</b></td>
<td style="background:#d9d9d9;" width="99"><b>Exemplo</b></td>
<td style="background:#d9d9d9;" width="89"><b>Onde</b></td>
</tr>
<tr valign="top" style="background:#ffffff;">
<td>Data</td>
<td>XML</td>
<td>DateTime (conforme ambiente em que o Serviço está rodando)</td>
<td>01-jan-2013</td>
<td>Requisição</td>
</tr>
<tr valign="top" style="background:#f2f2f2;">
<td>Data</td>
<td>XML</td>
<td>dd/mm/yyyy</td>
<td>01/01/2013</td>
<td>Resposta</td>
</tr>
<tr valign="top" style="background:#ffffff;">
<td>Data</td>
<td>JSON</td>
<td>dd/mm/yyyy<br>ou<br>dd-mmm-yyyy</td>
<td>01/12/2013<br>ou<br>01-dec-2013</td>
<td>Requisição e Resposta</td>
</tr>


<tr valign="top" style="background:#f2f2f2;">
<td>Booleano</td>
<td>XML</td>
<td>Bool (conforme tipagem)</td>
<td>True</td>
<td>Requisição</td>
</tr>


<tr valign="top" style="background:#ffffff;">
<td>Booleano</td>
<td>XML</td>
<td>True<br>ou<br>False</td>
<td>True<br>ou<br>False</td>
<td>Resposta</td>
</tr>


<tr valign="top" style="background:#f2f2f2;">
<td>Booleano</td>
<td>JSON</td>
<td>TRUE, True, true<br>ou<br>FALSE, False, false</td>
<td>True<br>ou<br>false</td>
<td>Requisição</td>
</tr>


</pre></td>
<tr valign="top" style="background:#ffffff;">
<td>Booleano</td>
<td>JSON</td>
<td>True<br>ou<br>False</td>
<td>True<br>ou<br>False</td>
<td>Resposta</td>
</tr>


    <td>
<tr valign="top" style="background:#f2f2f2;">
      <pre>{
<td>Time</td>
      "col": [
<td>XML e JSON</td>
      {
<td>161050</td>
          "cd_empresa": "c1",
<td>161050</td>
          "descricao": "c2",
<td>Requisição e Resposta</td>
          "valor_imposto": {
          "db_column": "campo3",
          "db_alias": "c3"
      }
    }
    ],
      "esmateri": [
      {
          "c1": "001",
          "c2": "Material Teste 1",
          "c3": "10"
      },
      {
          "c1": "002",
          "c2": "Material Teste 2",
          "c3": "20"
    }
    ]</pre></td>
</tr>
</tr>
</table></center>


Existe um validador para o padr&atilde;o JSON em http://jsonlint.com </p>
<tr valign="top" style="background:#ffffff;">
<td>Numéricos</td>
<td>XML e JSON</td>
<td>Sem separador de milhar e com ponto (“.”) como separador decimal</td>
<td>150<br>120.00<br>1250.33222</td>
<td>Requisição e Resposta</td>
</tr>


== Tipos especiais ==
</table>
<p align="justify" style="margin-left: 0.32in; text-indent: 0.45in; margin-bottom: 0.08in; font-weight: normal; line-height: 150%;">
</center>
Alguns dados terão formatos especiais na requisições e respostas.<br/>
 
<br/>
'''<font color=size=4>Observações</font>'''
 
Quando o formato '''XML''' é utilizado, os valores enviados para parâmetros de tipos especiais são validados pelo próprio '''serviço SOAP''', que garante a tipagem correta do dado de entrada. Na exportação, os valores seguem o formato descrito na tabela anterior.


<center><table width="700" border="0" cellspacing="0" cellpadding="7">
Quando o formato '''JSON''' é utilizado, alguns cuidados adicionais são necessários:
<tr valign="top">
* '''Campos do tipo data''' devem ser enviados exatamente nos formatos indicados na tabela.
<td style="background: #d9d9d9;" width="80"><b>Tipo do dado</b></td>
* '''Campos booleanos''' devem receber o valor <code>true</code> (independentemente da capitalização) para representar verdadeiro. Qualquer outro valor será interpretado como '''false'''.
<td style="background: #d9d9d9;" width="71"><b>Formato</b></td>
<td style="background: #d9d9d9;" width="184"><b>M&aacute;scara</b></td>
<td style="background: #d9d9d9;" width="99"><b>Exemplo</b></td>
<td style="background: #d9d9d9;" width="89"><b>Onde</b></td>
</tr>
<tr valign="top">
    <td style="background: transparent;" width="80">Data</td>
<td style="background: transparent;" width="71">XML</td>
<td style="background: transparent;" width="184">DateTime (conforme ambiente em que o Servi&ccedil;o est&aacute; rodando)</td>
<td style="background: transparent;" width="99">01-jan-2013</td>
<td style="background: transparent;" width="89">Requisi&ccedil;&atilde;o</td>
</tr>
<tr valign="top">
<td style="background: transparent;" width="80">Data</td>
<td style="background: transparent;" width="71">XML</td>
<td style="background: transparent;" width="184">dd/mm/yyyy</td>
<td style="background: transparent;" width="99">01/01/2013</td>
<td style="background: transparent;" width="89">Resposta</td>
</tr>
<tr valign="top">
<td style="background: transparent;" width="80">Data</td>
<td style="background: transparent;" width="71">JSON</td>
<td style="background: transparent;" width="184">dd/mm/yyyy
ou
dd-mmm-yyyy</td>
<td style="background: transparent;" width="99">01/12/2013
ou
01-dec-2013</td>
<td style="background: transparent;" width="89">Requisi&ccedil;&atilde;o e Resposta</td>
</tr>
<tr valign="top">
<td style="background: transparent;" width="80">Booleano</td>
<td style="background: transparent;" width="71">XML</td>
<td style="background: transparent;" width="184">Bool (conforme tipagem)</td>
<td style="background: transparent;" width="99">True</td>
<td style="background: transparent;" width="89">Requisi&ccedil;&atilde;o</td>
</tr>
<tr valign="top">
<td style="background: transparent;" width="80">Booleano</td>
<td style="background: transparent;" width="71">XML</td>
<td style="background: transparent;" width="184">True
ou
False</td>
<td style="background: transparent;" width="99">True
ou
False</td>
<td style="background: transparent;" width="89">Resposta</td>
</tr>
<tr valign="top">
<td style="background: transparent;" width="80">Booleano</td>
<td style="background: transparent;" width="71">JSON</td>
<td style="background: transparent;" width="184">TRUE,True,true
ou
FALSE,False,false</td>
<td style="background: transparent;" width="99">True
ou
false</td>
<td style="background: transparent;" width="89">Requisi&ccedil;&atilde;o</td>
</tr>
<tr valign="top">
<td style="background: transparent;" width="80">Booleano</td>
<td style="background: transparent;" width="71">JSON</td>
<td style="background: transparent;" width="184">True
ou
False</td>
<td style="background: transparent;" width="99">True
ou
False</td>
<td style="background: transparent;" width="89">Resposta</td>
</tr>
<tr valign="top">
<td style="background: transparent;" width="80">Time</td>
<td style="background: transparent;" width="71">XML e JSON</td>
<td style="background: transparent;" width="184">161050</td>
<td style="background: transparent;" width="99">161050</td>
<td style="background: transparent;" width="89">Requisi&ccedil;&atilde;o e Resposta</td>
</tr>
<tr valign="top">
<td style="background: transparent;" width="80">Num&eacute;ricos</td>
<td style="background: transparent;" width="71">XML e JSON</td>
<td style="background: transparent;" width="184">Sem separador de milhar e com ponto (&ldquo;.&rdquo;) como separador decimal</td>
<td style="background: transparent;" width="99">150
120.00
1250.33222</td>
<td style="background: transparent;" width="89">Requisi&ccedil;&atilde;o e Resposta</td>
</tr>
</table></center>


Quando utilizar o formato XML, os valores enviados para parâmetros de tipos especiais, no serviço SOAP o próprio serviço garante o dado de entrada correto. Quando exportado irá seguir conforme a tabela anterior.<br/>
Para '''campos do tipo hora''', o formato utilizado considera '''24 horas''', sem o uso de dois pontos (:), seguindo o padrão '''HHMMSS'''.<br>
Quando utilizar o formato JSON, para os campos do tipo data o dado terá que vir no formato conforme a tabela anterior e para campos do tipo booleano terá que vir um “true” (não importando a capitalização) para que seja verdadeiro, pois para qualquer outra coisa será considerado como falso.<br/>
Exemplo: <code>161050</code> (16 horas, 10 minutos e 50 segundos).
Para campos de dados do tipo hora, terão o dia com 24 horas e sem dois pontos “:” (HHMMSS)</p>


== Configurações especiais do banco de dados ==
== Configurações especiais do banco de dados ==
Para que os serviços acessem corretamente os dados dos tipos '''Date''' e '''DateTime''', é necessário que a sessão com o banco de dados permita o uso de filtros de data no formato americano <code>dd-mmm-yyyy</code>.


<p align="justify" style="margin-left: 0.32in; text-indent: 0.45in; margin-bottom: 0.08in; font-weight: normal; line-height: 150%;">
Exemplos de datas nesse formato incluem <code>01-jan-2013</code>, <code>20-feb-2013</code> e <code>12-oct-2013</code>.
Para que os serviços acessem corretamente os dados do tipo Date e DateTime, é obrigatório que a sessão com o banco de dados permita a informação de filtros por datas no formato americano “dd-mmm-yyyy” Exemplo: 01-jan-2013, 20-feb-2013 e 12-oct-2013.
 
Para bancos de dados SQLServer essa parametrização já vem por padrão. <br/>
Nos bancos de dados '''Microsoft SQL Server''', essa configuração já é aplicada '''por padrão''', não sendo necessário realizar ajustes adicionais.
Para bancos de dados Oracle esse parâmetro pode variar de acordo com o idioma do Sistema Operacional no momento da instalação. Neste caso, verifique se o parâmetro de sessão “nls_language” está definido como “AMERICAN”. Esse valor pode ser ajustado no Registro do Windows para que todas as sessões sejam inicializadas dessa forma. Observar também se o Web Server que hospeda os serviços está com o modo 32bits/x86 habilitado, pois neste caso também é necessário ajustar os “nls_language” do Client32 do Oracle.</p>
 
Já em ambientes com '''Oracle Database''', esse parâmetro pode variar de acordo com o '''idioma do sistema operacional''' utilizado no momento da instalação. Nesses casos, é importante verificar se o parâmetro de sessão <code>nls_language</code> está configurado como <code>AMERICAN</code>.
 
Quando necessário, esse valor pode ser ajustado no Registro do Windows, garantindo que todas as sessões do banco sejam inicializadas com essa configuração.
 
Também é importante verificar se o '''Web Server''' que hospeda os serviços está executando em modo 32 bits (x86). Se esse modo estiver habilitado, será necessário configurar igualmente o parâmetro <code>nls_language</code> no '''Oracle Client 32 bits''', assegurando que as sessões utilizem o mesmo padrão de idioma e formatação de datas.
{{VoltarInicio}}


== Validação do Integrador pelo IIS ==
== Validação do Integrador pelo IIS ==
<p align="justify" style="margin-left: 0.32in; text-indent: 0.45in; margin-bottom: 0.08in; font-weight: normal; line-height: 150%;">
Primeiramente, para realizar a validação, é necessário acessar a '''pasta de instalação do Integrador (Webservices)''' e ajustar as configurações dos arquivos '''Settings.config''' e '''web.config'''.
  Primeiramente para essa validação, é preciso acessar a pastas de instalação do Integrador (Webservices) e ajustar as configurações dos arquivos Settings.config e web.config, lembrando de remover o @ que vem por default com a implementação:<br/>


[[Image: Integrador1.png|1000px|centro]]<br/>
É importante '''remover o caractere @''', que vem configurado por padrão na implementação.
 
'''Arquivos a ajustar:'''
* <code>Settings.config</code>
* <code>web.config</code>
 
 
[[Image: Integrador1.png|1000px|centro]]
<br/>
<br/>
[[Image: Integrador2.png|600px|centro]]<br/>
[[Image: Integrador2.png|600px|centro]]
<br/>
<br/>
Para o arquivo web.config deve ser ajustado os campos de ConnectionString "CIGAM" e "INTEGRACAO" que podem ser gerados pelo programa CGConnectionString que se encontra no CIGAM_INSTAL ou também ser utilizada a mesma string informada na API e Portais, lembrando que no ProviderName 02 é SQL Server e 03 Oracle. '''Importante criptografar a string de conexão.'''<br/>
 
'''<font size=4>Configuração do arquivo web.config</font>'''
 
No arquivo web.config, devem ser ajustados os campos da '''ConnectionString''':
* <code>CIGAM</code>
* <code>INTEGRACAO</code>
 
Essas strings de conexão podem ser geradas através do programa '''CGConnectionString''', localizado na pasta '''CIGAM_INSTAL''', ou pode ser utilizada a mesma '''ConnectionString já configurada na API e nos Portais'''.
 
Outro ponto importante é o campo '''ProviderName''', que identifica o tipo de banco de dados:
 
{| class="wikitable" style="width:40%; text-align:center; margin:auto;"
! ProviderName !! Banco de Dados
|-
| 02 || SQL Server
|-
| 03 || Oracle
|}
 
Após a configuração, é '''recomendado criptografar a string de conexão'''.
<br/>
<br/>
[[Image: Integrador5.png|750px|centro]]<br/>  
[[Image: Integrador5.png|750px|centro]]
<br/>
 
Em seguida é necessário criar a pasta Bin dentro da estrutura de instalação do integrador com as DLL's (encontradas no CIGAM_INSTAL):<br/>
 
    <li>CIGAM.Ambiente;
'''<font size=4>Criação da pasta Bin</font>'''
    <li>CIGAM.Extensions;
 
    <li>CIGAM.Sgbd;
Em seguida, é necessário criar a pasta '''Bin''' dentro da estrutura de instalação do Integrador.
    <li>CIGAM.Utils;
 
    <li>CIGAM.Webservices;<br/><br/>
Dentro dessa pasta devem ser adicionadas as seguintes '''DLLs''', encontradas em '''CIGAM_INSTAL''':
[[Image: Integrador7.png|750px|centro]]<br/>  
* <code>Cigam.Ambiente</code>
<br/>
* <code>Cigam.Extensions</code>
<br/>
* <code>Cigam.Sgbd</code>
    Feito isso, retornando ao IIS, no parte inferior é necessário alterar a forma de exibição para Content View, após isso selecionar o arquivo TesteBancoDados.ashx e clicar em Browse para abrir o navegador com a validação do Integrador.</p><br/>
* <code>Cigam.Utils</code>
* <code>Cigam.WebServices</code>
 
 
[[Image: Integrador7.png|750px|centro]]
 
 
'''<font size=4>Teste do Integrador no IIS</font>'''
 
Após concluir as etapas anteriores, acesse o '''IIS (Internet Information Services)'''.
 
No painel inferior, altere o modo de visualização para '''Content View'''.
 
Em seguida:
# Localize o arquivo '''TesteBancoDados.ashx'''.
# Selecione o arquivo.
# Clique em '''Browse'''.
 
O navegador será aberto exibindo a '''validação do Integrador''', confirmando que a conexão com o banco de dados está funcionando corretamente.
 
[[Image: Integrador6.png|900px|centro]]<br/>
[[Image: Integrador6.png|900px|centro]]<br/>
[[Image: Integrador8.png|900px|centro]]<br/>
[[Image: Integrador8.png|900px|centro]]<br/>
{{VoltarInicio}}


= Log =
= Aplicação de Integração =
<p align="justify" style="margin-left: 0.32in; text-indent: 0.45in; margin-bottom: 0.08in; font-weight: normal; line-height: 150%;">
A camada de serviços e/ou de banco de dados tem como responsabilidade '''garantir apenas que os dados sejam gravados na tabela de integração'''. A efetiva importação desses dados para o ERP CIGAM é realizada por um programa específico da aplicação de integração denominado [[GE_Integrador|Integrador]].
A tabela de log é praticamente uma cópia da tabela de integração com a adição dos campos para a data e hora da ocorrência/execução. O processo de criação e registro dos Logs será feito da seguinte forma:
 
    <ol type="a">
Quando um registro é enviado com o campo <code>statusRegistro</code> definido como '''Pendente''', ele permanece na tabela de integração e '''não será importado pelo ERP CIGAM''' até que seu status seja alterado para '''Liberado'''.
<li>O Webservice recebe a requisição e verifica se todos os parâmetros são válidos. Caso não sejam, retorna um erro ao usuário e não registra qualquer tipo de inserção na tabela de integração ou de log.</li>
    <li>Se os parâmetros passados para o webservice forem válidos, insere na tabela de integração, retorna uma mensagem e sucesso ao usuário sem registrar log.</li>
    <li>Quando o programa da aplicação de integração executar e importar o registro da tabela de integração, o log é criado com os dados importados (inclusive o usuário logado no CIGAM que fez a importação). Após isso, o registro da tabela de integração será apagado.</li>
    <li>No log é um campo para saber se o registro foi importado ou recusado. Caso recursado, armazena também o código e a mensagem de erro. Isso se faz necessário para que os registros com erro não fiquem na tabela de integração.</li><br/>
    <li>Após liberar os registros pendentes será registrado log. Se tentar liberar um registro inexistente será retornado um erro e não será registrado log. Não será testado se está sendo liberado um registro já liberado pois teria também que ser feito um controle para a liberação dos correlatos.</li></ol>
<br/>
Em <i>Genéricos/Pesquisas/Rotinas</i> existe uma tela on-line para que o usuário/administrador/DBA possa visualizar a tabela de Log.<br/>
A tabela de log não é indexada para ganho de performance. Se a tabela do log for grande, poderão ser criados os índices de acordo com as necessidades.<br/>
Não é gerado log sobre as consultas de dados efetuadas.<br/>
O log poderá ser limpo ou mantido apenas “n” dias conforme a necessidade do administrador do banco de dados (a limpeza será manual por segurança).</p>


= Aplicação de Integração =
A liberação desses registros pode ser realizada por meio do método <code>LiberarPendentes</code>, que altera o status permitindo que o Integrador processe o registro.
<p align="justify" style="margin-left: 0.32in; text-indent: 0.45in; margin-bottom: 0.08in; font-weight: normal; line-height: 150%;">
A camada de serviços e ou de banco de dados garantem “apenas” que o dado chegue até à tabela de integração. A importação dos dados é feita por um programa específico da aplicação de integração chamado [[GE_Integrador|Integrador]].</p>


Ao indicar statusRegistro igual a pendente o registro enviado não será integrado ao ERP CIGAM até que tenha seu status igual a liberado. Sendo possível sua liberação através do método LiberarPendentes. Também é possível criar o registro com o status Liberado sem a necessidade de requisitar um novo método para liberação.
Também é possível criar o registro diretamente com o status '''Liberado''', dispensando a necessidade de chamar posteriormente um método específico para liberação.


==Utilizando o retorno dos Serviços ==
==Utilizando o retorno dos Serviços ==
=== Xml ===
Os serviços disponibilizados podem retornar dados nos formatos '''XML''' ou '''JSON''', dependendo do protocolo utilizado. A manipulação dessas respostas pode ser feita utilizando classes utilitárias disponibilizadas pelo próprio CIGAM ou pelas bibliotecas padrão do .NET.
<p align="justify" style="margin-left: 0.32in; text-indent: 0.45in; margin-bottom: 0.08in; font-weight: normal; line-height: 150%;">
 
Os serviços que utilizam o protocolo SOAP, tem como retorno uma String no formato Xml, para melhor visualização destes dados, está disponível na classe “Xml”, do namespace Cigam.Utils, um método estático chamado “XmlStringToDataTable”. Este retorna um objeto do tipo System.Data.DataTable. Segue abaixo um exemplo de implementação.<br/>
=== XML ===
Os serviços que utilizam o protocolo '''SOAP''' retornam os dados em uma '''string no formato XML'''.
 
Para facilitar a manipulação dessas informações, está disponível na classe <code>Xml</code>, do namespace <code>Cigam.Utils</code>, o método estático <code>XmlStringToDataTable</code>, que converte o conteúdo XML retornado em um objeto do tipo <code>System.Data.DataTable</code>, permitindo trabalhar com os dados de forma estruturada.
 
'''Exemplo de utilização (Exemplo 1)'''
<br/>
<br/>
[[Arquivo:IN_001.jpg|580×267px|Exemplo 1]]
[[Arquivo:IN_001.jpg|580×267px|Exemplo 1]]
<br/><br/>
 
Também pode ser utilizada a classe XmlDocument, do namespace System.Xml para fazer a manipulação dos dados. Segue abaixo um exemplo de implementação.<br/>
 
Outra alternativa é utilizar a classe <code>XmlDocument</code>, do namespace <code>System.Xml</code>, que permite realizar a leitura e manipulação manual da estrutura do XML.
 
'''Exemplo de utilização (Exemplo 2)'''
<br/>
<br/>
[[Arquivo:IN 002.jpg|580×267px|Exemplo 2]]
[[Arquivo:IN 002.jpg|580×267px|Exemplo 2]]
<br/>


=== Json ===
=== JSON ===
Os serviços que utilizam o protocolo '''REST''' retornam os dados em uma '''string no formato JSON'''.
 
Para trabalhar com essas informações, está disponível a classe <code>JSonDocument</code>, no namespace <code>Cigam.Utils</code>. Essa classe interpreta automaticamente a string retornada e disponibiliza propriedades e métodos para manipulação dos dados.


Os serviços que utilizam o protocolo REST, tem como retorno uma String no formato JSon, para trabalhar com estes dados, está disponível a classe “JSonDocument” no namespace Cigam.Utils. Esta classe fornece a interpretação da string retornada além de propriedades e métodos para manipulação dos dados. Seguem abaixo exemplos de como instanciar e alimentar a classe.<br/>
'''Instanciando e alimentando a classe'''<br>
<br/>
:'''Exemplo 1'''
&nbsp;&nbsp;&nbsp;<b><u>Exemplo 1:</u></b><br/>
[[Arquivo:IN 003.jpg|580×267px|Exemplo 1]]
[[Arquivo:IN 003.jpg|580×267px|Exemplo 1]]
<br/>
<br/>
<br/>
:'''Exemplo 2'''
&nbsp;&nbsp;&nbsp;<b><u>Exemplo 2:</u></b><br/>
[[Arquivo:IN 004.jpg|580×267px|Exemplo 2]]
[[Arquivo:IN 004.jpg|580×267px|Exemplo 2]]
<br/>
<br/>
<br/>
:'''Exemplo 3'''
&nbsp;&nbsp;&nbsp;<b><u>Exemplo 3:</u></b><br/>
[[Arquivo:IN 005.jpg|580×267px|Exemplo 3]]
[[Arquivo:IN 005.jpg|580×267px|Exemplo 3]]
<br/><br/>
 
Esta classe também fornece uma propriedade contendo uma lista genérica que guarda objetos do tipo Cigam.Utils.JSonObject, e esta lista fornece informações sobre os registros da consulta, como o nome da coluna e o valor. Através desta classe também é possível obter o nome original das colunas, caso a consulta possua um cabeçalho de apelidos, ou saber se a consulta retornou exception, success ou query. Veja os exemplos abaixo:<br/>
 
&nbsp;&nbsp;&nbsp;<b><u>Exemplo 1:</u></b><br/>
'''<font size=4>Manipulação dos dados retornados</font>'''
 
A classe <code>JSonDocument</code> também disponibiliza uma '''lista genérica de objetos do tipo''' <code>Cigam.Utils.JSonObject</code>, que contém as informações de cada registro retornado na consulta, incluindo:
* nome da coluna
* valor do campo
 
Essa estrutura permite percorrer facilmente os dados retornados pelos serviços.
 
Além disso, através dessa classe é possível:
* obter o '''nome original das colunas''', quando a consulta utiliza cabeçalhos com apelidos
* identificar se o retorno da consulta foi <code>success</code>, <code>exception</code> ou <code>query</code>
 
'''Exemplo de acesso aos registros'''
:'''Exemplo 1'''
[[Arquivo:IN 006.jpg|580×267px|Exemplo 1]]
[[Arquivo:IN 006.jpg|580×267px|Exemplo 1]]
<br/>
<br/>
&nbsp;&nbsp;&nbsp;<b><u>Exemplo 2:</u></b><br/>
:'''Exemplo 2'''
<br/>
[[Arquivo:IN 007.jpg|580×267px|Exemplo 2]]
[[Arquivo:IN 007.jpg|580×267px|Exemplo 2]]
<br/>
{{VoltarInicio}}

Edição atual tal como às 15h20min de 9 de outubro de 2026

Voltar

Integrador > Integrador padrão

Quando aplicações consomem dados do CIGAM — seja por meio dos serviços disponibilizados ou pela camada de objetos do banco de dados — é necessário informar os parâmetros de data e hora utilizados no controle de gravação dos registros. Dessa forma, é possível filtrar apenas os registros que foram alterados a partir da data e hora informadas.

Caso esses parâmetros não sejam informados, o sistema retornará todos os dados do cadastro correspondente.

O CIGAM não realiza controle por flags de leitura ou integração. Caso esse tipo de controle seja necessário, ele deverá ser implementado pelas aplicações de terceiros em suas próprias tabelas.

Em integrações, recomenda-se também informar os parâmetros correspondentes à chave única do cadastro, permitindo a obtenção de um registro específico quando necessário.
O controle de acesso é realizado por meio do parâmetro PIN, que será detalhado posteriormente.

Quando aplicações de terceiros enviam dados para o CIGAM, as informações são registradas na tabela de integração, desde que sejam aceitas pelo sistema. A importação e o processamento desses dados ocorrerão somente quando o programa específico da Aplicação de Importação for executado.

Caso algum dado não seja aceito, nenhum registro será inserido na tabela de integração. Nessa situação, será retornada ao sistema chamador uma mensagem de erro contendo o código e a descrição do problema.

Para o controle de existência de registros, as camadas de consulta disponibilizam uma lista contendo apenas os campos-chave de todos os registros existentes na tabela. Essa lista permite que a aplicação de terceiros compare essas informações com sua base local e identifique registros que tenham sido excluídos no CIGAM.

Se a tabela possuir um grande volume de registros ou ocorrerem muitas exclusões, pode-se optar pela criação de uma trigger para consumir o respectivo serviço a cada exclusão realizada.

No entanto, é importante considerar que o uso de triggers pode impactar negativamente a performance da aplicação, especialmente quando acionadas por requisições de webservices.

Serviços disponíveis

Compras

Configurador

Estoque

Faturamento

Financeiro

Genérico

Projetos

Voltar ao início

Estrutura dos registros

A tabela de integração é onde devem ser inseridos os registros a serem posteriormente importados pelo CIGAM.

Todos os tipos de cadastros utilizam essa mesma tabela. Para identificar qual rotina de importação será responsável pelo processamento de cada registro, é utilizado o campo Tipo.

Alguns exemplos de valores para esse campo são:

  • MATCAD - Cadastro de materiais
  • EMPCAD - Cadastro de empresas

Essa tabela possui um grande número de campos, projetados para atender às necessidades de diferentes tipos de cadastros do CIGAM. Entretanto, apenas os campos ID e Tipo são indexados, garantindo melhor desempenho nas consultas essenciais.

Camada de Serviços

A camada de serviços atua como porta de entrada para as integrações com o CIGAM.

Para cada tipo de cadastro/registro, existe um serviço específico responsável pelo recebimento e tratamento das informações. Além dos parâmetros próprios de cada rotina, esses serviços também incluem o parâmetro PIN, utilizado para identificar o usuário ou a aplicação responsável pela requisição.

Controle de Status dos Registros

A tabela de integração possui um campo de controle de status, utilizado para gerenciar o processamento dos registros.

Quando existe relacionamento máster-detalhe, o controle de status é realizado no registro máster. Esse mecanismo evita que o programa de importação seja executado enquanto os dados ainda estão sendo inseridos.

Dessa forma, o status do registro máster só é liberado após a inclusão de todos os registros de detalhe, garantindo a consistência das informações.

Outra estratégia possível é que o programa de integração insira o registro máster por último, assegurando também a integridade dos dados no momento da importação.

Consulta à Tabela de Integração

Existe um webservice de listagem da tabela de integração que permite consultar os registros utilizando diferentes filtros, como:

  • ID da tabela
  • Data de inclusão do registro
  • Tipo de registro
  • Combinações desses filtros

Esse serviço auxilia aplicações de terceiros a verificar se um determinado registro já foi importado, permitindo um controle mais eficiente dos dados integrados.

Validação de parâmetros

Durante a requisição de um serviço, caso algum parâmetro obrigatório não seja informado, o sistema retornará uma mensagem de erro indicando o nome do parâmetro ausente.

Quando houver mais de um parâmetro obrigatório não informado, todos os nomes serão listados na mesma mensagem, facilitando a identificação e a correção pela aplicação integradora.

Para parâmetros cuja obrigatoriedade depende do preenchimento de outro campo, será exibido um asterisco (<*>) após o nome do parâmetro.
Essa marcação indica que o parâmetro se torna obrigatório apenas quando o campo relacionado for informado.

Voltar ao início

Tabela de Integração e Log

Tabelas envolvidas:

  • Tabela de Integração: %GEINTEGRADOR%
  • Tabela de Log de Integração: %GEINTEGRADORLOG%

Todas as alterações de dados enviadas ao CIGAM permanecem registradas na tabela de integração até serem processadas pela Aplicação de Integração.

Quando o Webservice recebe uma requisição, ele valida inicialmente todos os parâmetros informados. Caso algum parâmetro seja inválido, o sistema retorna um erro ao usuário e nenhum registro é inserido nas tabelas de integração ou de log.

Se os parâmetros forem válidos, o registro é inserido na tabela de integração e o Webservice retorna uma mensagem de sucesso ao usuário. Nesse momento ainda não é gerado log.

Posteriormente, quando o programa da Aplicação de Integração executa e importa o registro da tabela de integração, é criado um registro correspondente na tabela de log, contendo:

  • os dados importados
  • o usuário logado no CIGAM responsável pela importação
  • a data e hora da execução

Após o processamento, o registro é removido da tabela de integração.

Na tabela de log existe um campo que indica se o registro foi importado ou recusado. Caso seja recusado, também são armazenados o código e a mensagem de erro, evitando que registros com erro permaneçam na tabela de integração.

Quando registros pendentes são liberados posteriormente, essa ação também gera registro na tabela de log. Caso seja tentada a liberação de um registro inexistente, o sistema retorna um erro e nenhum log é gerado.

Não é realizada validação para identificar se um registro já foi liberado anteriormente, pois isso exigiria controle adicional de registros correlatos.

As tabelas de integração e log possuem campos com nomes genéricos, utilizados para atender diferentes cadastros e rotinas do CIGAM. Por esse motivo, a consulta e inclusão de dados devem ser realizadas por meio das camadas responsáveis do sistema, que apresentam os campos com as nomenclaturas adequadas para cada cadastro.

Existe ainda uma tela on-line em Genéricos → Pesquisas → Rotinas que permite ao usuário, administrador ou DBA consultar os registros da tabela de log.

A tabela de log não possui índices por padrão, visando melhor desempenho. Caso o volume de dados se torne elevado, índices podem ser criados conforme necessidade do ambiente.

Também não são gerados logs para consultas de dados realizadas no sistema.

A limpeza da tabela de log pode ser realizada conforme a necessidade do administrador do banco de dados, mantendo apenas registros de um determinado número de dias. Essa limpeza é manual, por segurança.

Banco de dados de integração

As tabelas de integração e log ficam armazenadas em um banco de dados separado. Esse banco é acessado:

  • Pelas aplicações do CIGAM, por meio do Database CIGAM_INTEGRA
  • Pela Aplicação de Integração (componente CGIntegrador.ecf)

Caso o banco de dados de integração seja diferente do banco utilizado pelo CIGAM — inclusive quando houver apenas mudança de database ou usuário — deve ser configurada uma connection string chamada INTEGRACAO no arquivo de configuração da aplicação.

Também é necessário informar o banco de dados dessa nova conexão no parâmetro providerName.

Exemplo:

 <add  name="CIGAM"  connectionString="Server=servidor;Database=BD;User ID=USER;Password=SENHA;" />
 
 <add  name="INTEGRACAO"  connectionString="Server=servidor;Database=BD;User ID=USER;Password=SENHA;"  providerName="02" />

O código do banco de dados do CIGAM deve ser informado na configuração BANCO_DADOS da aplicação.

Exemplo:

 <add key="BANCO_DADOS" value="03" />

Registro de requisições

Para registrar requisições provenientes de aplicações de terceiros, deve-se utilizar o parâmetro CGREQUISICAOWS.

Caso seja necessário registrar requisições apenas de serviços específicos, utiliza-se o parâmetro CGREQUISICAOWS_ seguido do tipo de registro correspondente.

Por exemplo, para registrar requisições relacionadas ao cadastro de notas fiscais, o parâmetro seria: GREQUISICAOWS_CADNF1.

Esses parâmetros devem ser configurados no arquivo web.config, na seção settings, ou diretamente no arquivo settings.config, quando existir.

Exemplo de configuração:

 <add  key="CGREQUISICAOWS" value="C:\cigam\Temp\" />
 
 <add  key="CGREQUISICAOWS_CADNF1" value="C:\cigam\Temp\NF\" />

Caso não seja necessário registrar requisições em arquivos, nenhum desses parâmetros precisa ser configurado.

Voltar ao início

Registros correlatos

A tabela de integração pode conter registros correlatos ainda pendentes de importação. Um exemplo comum ocorre nas relações pedido → itens → grade do item.

Nesse cenário, quando o pedido for importado, o sistema verificará se existem itens vinculados a esse pedido. Da mesma forma, durante a importação de um item do pedido, será verificada a existência de registros de grade do item associados.

Nesse processo, somente os registros com status liberado serão avaliados e poderão ser importados ou recusados.

Registros correlatos que não estiverem liberados não serão processados naquele momento e, consequentemente, não serão reavaliados posteriormente. Para evitar que registros permaneçam indevidamente na tabela de integração, será executada uma rotina de limpeza.

Essa rotina tem como objetivo excluir registros com ID correlato cujo registro máster já não esteja mais pendente de importação. Cada exclusão realizada por essa rotina será registrada em log específico, garantindo o rastreamento das operações efetuadas.

Segurança

As aplicações de terceiros não utilizam o cadastro de usuários nem os direitos do CIGAM, pois não possuem meios adequados para gerenciar essas informações.

A autenticação e o controle de acesso são realizados através de PINs e da chave de criptografia (CHAVE_CRYPTA), definidos no arquivo de configuração do ambiente do Web Service, na seção <appSettings>.

📌 PIN

O PIN é utilizado para identificar quem está realizando a requisição e determinar quais serviços estarão disponíveis para cada integração. Esse parâmetro deve ser configurado no arquivo de configuração do Web Service.
No exemplo a seguir, requisições que utilizarem o PIN XW@#25Qo terão acesso apenas aos serviços CADMAT e CADEMP. Os demais PINs (@#0Q1o2, W#12@Abfg e 20020004) não possuem restrições definidas e, portanto, podem acessar todos os serviços.
  <appSettings>
    <add key="pin" value="XW@#25Qo;@#0Q1o2;W#12@Abfg;20020004" />
    <add key="XW@#25Qo" value="CADMAT;CADEMP" />
  </appSettings>
💡 Recomendação: Defina PINs com alto nível de complexidade, contribuindo para aumentar a segurança das informações trafegadas entre os sistemas.

📌 CHAVE_CRYPTA

A CHAVE_CRYPTA é utilizada para criptografar e descriptografar dados sensíveis transmitidos entre o CIGAM e aplicações externas, garantindo a confidencialidade e integridade da comunicação.
Essa chave também deve ser configurada no <appSettings> do ambiente do Web Service.
  <appSettings>
    <add key="CHAVE_CRYPTA" value="MinhaChaveSegura123!" />
  </appSettings>
  • Todos os sistemas envolvidos na integração devem utilizar a mesma CHAVE_CRYPTA.
  • Caso as chaves estejam divergentes entre os ambientes, ocorrerão erros de descriptografia e falhas de comunicação.
  • A alteração da chave deve ser coordenada em todos os pontos de integração.
  • Mantenha a chave em sigilo e compartilhe somente com equipes autorizadas.

Voltar ao início

Requisição e resposta dos Webservices

Os webservices do CIGAM suportam as tecnologias SOAP e REST/JSON.
Na utilização do padrão REST/JSON, os parâmetros devem ser enviados por POST, e o nome do método deve ser informado diretamente na URL da requisição. As respostas dos serviços também podem ser obtidas em ambos os formatos.

Quando o retorno do serviço contiver mais de um registro, a exportação será realizada utilizando duas coleções (objetos): uma para as colunas e outra para os dados. Nesse formato, as colunas recebem cabeçalhos identificadores (por exemplo: c1, c2, c3...), que são utilizados como referência pelos registros retornados.

Existe ainda a opção EXPORT_HEADERS, que pode ser configurada no arquivo de configuração do ambiente do Web Service (seção <appSettings>). Essa opção define se a exportação deverá utilizar sempre os cabeçalhos de colunas, independentemente da quantidade de registros retornados.

Exemplo de configuração:

 <appSettings>
   <add key="EXPORT_HEADERS" value="N" />
 </appSettings>

Essa configuração também pode ser incluída no arquivo Settings.

Quando o nome da coluna no banco de dados for diferente do nome utilizado no CIGAM/CGData, a coleção de nomes de colunas incluirá uma tag adicional contendo essa identificação.

Campos que ainda não possuem nome definido (por exemplo: Campo31, Campo32) não serão exportados. A exceção são os campos de usuário, identificados por nomes iniciados com Usr.

No formato JSON, é necessário atribuir explicitamente ambas as propriedades, pois não é possível definir um valor diretamente na tag principal como ocorre no XML. Nesses casos, o apelido da coluna será informado na propriedade db_alias.

Em ambos os formatos, o primeiro nó da estrutura corresponde ao valor da tradução do Nome Lógico da tabela exportada.
As colunas são agrupadas na coleção col, enquanto os dados dos registros são agrupados na coleção reg.
Todos os dados são retornados utilizando codificação UTF-8.

Exemplo de resposta em XML e JSON

 XML  JSON
 <esmateri>
   <col>
     <cd_material>c1</cd_material>
     <descricao>c2</descricao>
     <valor_imposto>c3</valor_imposto>
   </col>
   <reg>
     <c1>001</c1>
     <c2>Material Teste 1</c2>
     <c3>10</c3>
   </reg>
   <reg>
     <c1>002</c1>
     <c2>Material Teste 2</c2>
     <c3>20</c3>
   </reg>
 </esmateri>
 
 
 
 
 
 
 
 {
   "col": [
     {
       "cd_empresa": "c1",
       "descricao": "c2",
       "valor_imposto": {
         "db_column": "campo3",
         "db_alias": "c3"
       }
     }
   ],
   "esmateri": [
     {
       "c1": "001",
       "c2": "Material Teste 1",
       "c3": "10"
     },
     {
       "c1": "002",
       "c2": "Material Teste 2",
       "c3": "20"
     }
   ]
 }

Para validar estruturas no formato JSON, pode-se utilizar ferramentas de validação online, como o JSONLint em http://jsonlint.com.

Voltar ao início

Tipos especiais

Alguns dados utilizam formatos específicos nas requisições e respostas dos serviços. Esses formatos variam conforme o tipo de dado e a tecnologia utilizada (XML ou JSON).

Tipo do dado Formato Máscara Exemplo Onde
Data XML DateTime (conforme ambiente em que o Serviço está rodando) 01-jan-2013 Requisição
Data XML dd/mm/yyyy 01/01/2013 Resposta
Data JSON dd/mm/yyyy
ou
dd-mmm-yyyy
01/12/2013
ou
01-dec-2013
Requisição e Resposta
Booleano XML Bool (conforme tipagem) True Requisição
Booleano XML True
ou
False
True
ou
False
Resposta
Booleano JSON TRUE, True, true
ou
FALSE, False, false
True
ou
false
Requisição
Booleano JSON True
ou
False
True
ou
False
Resposta
Time XML e JSON 161050 161050 Requisição e Resposta
Numéricos XML e JSON Sem separador de milhar e com ponto (“.”) como separador decimal 150
120.00
1250.33222
Requisição e Resposta

Observações

Quando o formato XML é utilizado, os valores enviados para parâmetros de tipos especiais são validados pelo próprio serviço SOAP, que garante a tipagem correta do dado de entrada. Na exportação, os valores seguem o formato descrito na tabela anterior.

Quando o formato JSON é utilizado, alguns cuidados adicionais são necessários:

  • Campos do tipo data devem ser enviados exatamente nos formatos indicados na tabela.
  • Campos booleanos devem receber o valor true (independentemente da capitalização) para representar verdadeiro. Qualquer outro valor será interpretado como false.

Para campos do tipo hora, o formato utilizado considera 24 horas, sem o uso de dois pontos (:), seguindo o padrão HHMMSS.
Exemplo: 161050 (16 horas, 10 minutos e 50 segundos).

Configurações especiais do banco de dados

Para que os serviços acessem corretamente os dados dos tipos Date e DateTime, é necessário que a sessão com o banco de dados permita o uso de filtros de data no formato americano dd-mmm-yyyy.

Exemplos de datas nesse formato incluem 01-jan-2013, 20-feb-2013 e 12-oct-2013.

Nos bancos de dados Microsoft SQL Server, essa configuração já é aplicada por padrão, não sendo necessário realizar ajustes adicionais.

Já em ambientes com Oracle Database, esse parâmetro pode variar de acordo com o idioma do sistema operacional utilizado no momento da instalação. Nesses casos, é importante verificar se o parâmetro de sessão nls_language está configurado como AMERICAN.

Quando necessário, esse valor pode ser ajustado no Registro do Windows, garantindo que todas as sessões do banco sejam inicializadas com essa configuração.

Também é importante verificar se o Web Server que hospeda os serviços está executando em modo 32 bits (x86). Se esse modo estiver habilitado, será necessário configurar igualmente o parâmetro nls_language no Oracle Client 32 bits, assegurando que as sessões utilizem o mesmo padrão de idioma e formatação de datas.

Voltar ao início

Validação do Integrador pelo IIS

Primeiramente, para realizar a validação, é necessário acessar a pasta de instalação do Integrador (Webservices) e ajustar as configurações dos arquivos Settings.config e web.config.

É importante remover o caractere @, que vem configurado por padrão na implementação.

Arquivos a ajustar:

  • Settings.config
  • web.config




Configuração do arquivo web.config

No arquivo web.config, devem ser ajustados os campos da ConnectionString:

  • CIGAM
  • INTEGRACAO

Essas strings de conexão podem ser geradas através do programa CGConnectionString, localizado na pasta CIGAM_INSTAL, ou pode ser utilizada a mesma ConnectionString já configurada na API e nos Portais.

Outro ponto importante é o campo ProviderName, que identifica o tipo de banco de dados:

ProviderName Banco de Dados
02 SQL Server
03 Oracle

Após a configuração, é recomendado criptografar a string de conexão.


Criação da pasta Bin

Em seguida, é necessário criar a pasta Bin dentro da estrutura de instalação do Integrador.

Dentro dessa pasta devem ser adicionadas as seguintes DLLs, encontradas em CIGAM_INSTAL:

  • Cigam.Ambiente
  • Cigam.Extensions
  • Cigam.Sgbd
  • Cigam.Utils
  • Cigam.WebServices



Teste do Integrador no IIS

Após concluir as etapas anteriores, acesse o IIS (Internet Information Services).

No painel inferior, altere o modo de visualização para Content View.

Em seguida:

  1. Localize o arquivo TesteBancoDados.ashx.
  2. Selecione o arquivo.
  3. Clique em Browse.

O navegador será aberto exibindo a validação do Integrador, confirmando que a conexão com o banco de dados está funcionando corretamente.



Voltar ao início

Aplicação de Integração

A camada de serviços e/ou de banco de dados tem como responsabilidade garantir apenas que os dados sejam gravados na tabela de integração. A efetiva importação desses dados para o ERP CIGAM é realizada por um programa específico da aplicação de integração denominado Integrador.

Quando um registro é enviado com o campo statusRegistro definido como Pendente, ele permanece na tabela de integração e não será importado pelo ERP CIGAM até que seu status seja alterado para Liberado.

A liberação desses registros pode ser realizada por meio do método LiberarPendentes, que altera o status permitindo que o Integrador processe o registro.

Também é possível criar o registro diretamente com o status Liberado, dispensando a necessidade de chamar posteriormente um método específico para liberação.

Utilizando o retorno dos Serviços

Os serviços disponibilizados podem retornar dados nos formatos XML ou JSON, dependendo do protocolo utilizado. A manipulação dessas respostas pode ser feita utilizando classes utilitárias disponibilizadas pelo próprio CIGAM ou pelas bibliotecas padrão do .NET.

XML

Os serviços que utilizam o protocolo SOAP retornam os dados em uma string no formato XML.

Para facilitar a manipulação dessas informações, está disponível na classe Xml, do namespace Cigam.Utils, o método estático XmlStringToDataTable, que converte o conteúdo XML retornado em um objeto do tipo System.Data.DataTable, permitindo trabalhar com os dados de forma estruturada.

Exemplo de utilização (Exemplo 1)
Exemplo 1


Outra alternativa é utilizar a classe XmlDocument, do namespace System.Xml, que permite realizar a leitura e manipulação manual da estrutura do XML.

Exemplo de utilização (Exemplo 2)
Exemplo 2

JSON

Os serviços que utilizam o protocolo REST retornam os dados em uma string no formato JSON.

Para trabalhar com essas informações, está disponível a classe JSonDocument, no namespace Cigam.Utils. Essa classe interpreta automaticamente a string retornada e disponibiliza propriedades e métodos para manipulação dos dados.

Instanciando e alimentando a classe

Exemplo 1

Exemplo 1

Exemplo 2

Exemplo 2

Exemplo 3

Exemplo 3


Manipulação dos dados retornados

A classe JSonDocument também disponibiliza uma lista genérica de objetos do tipo Cigam.Utils.JSonObject, que contém as informações de cada registro retornado na consulta, incluindo:

  • nome da coluna
  • valor do campo

Essa estrutura permite percorrer facilmente os dados retornados pelos serviços.

Além disso, através dessa classe é possível:

  • obter o nome original das colunas, quando a consulta utiliza cabeçalhos com apelidos
  • identificar se o retorno da consulta foi success, exception ou query

Exemplo de acesso aos registros

Exemplo 1

Exemplo 1

Exemplo 2

Exemplo 2

Voltar ao início