Criando um Validador TISS usando PHP
Neste posto irei ensinar como criar um validador TISS de arquivos XML no padrão TISS da ANS, usando o PHP e banco de dados MySQL. Com o validador será possível validar os arquivos TISS e arquivos do monitoramento TISS.
Obs.: Vou escrever um passo a passo, mas é necessário ter noções básicas da linguagem PHP e banco MySQL.
Vou dividir o post nas seguintes etapas;
1ª Etapa -Criar o formulário HTML para envio do arquivo e seleção da versão
2ª Etapa – Verificar a estrutura do arquivo (que é a comparação com o arquivo XSD da ANS)
3ª Etapa – Validação dos dados do arquivo conforme a codificação da TUSS (Apenas para arquivos TISS)
4ª Etapa – Disponibilização dos arquivos para download e dica de instalação
E é claro, você poderá personalizar conforme a sua necessidade.
Antes de começarmos baixe os arquivos do padrão TISS no site da ANS, usando o link http://www.ans.gov.br/prestadores/tiss-troca-de-informacao-de-saude-suplementar, conforme os prints abaixo, ou clique aqui para baixar o último arquivo disponível (Componente de Comunicação 03.03.03)
Obs.: baixe todas as versões que queira utilizar no seu validador.
Usaremos também o arquivo bootstrap.min.css do Bootstrap (framework web CSS/JavaScript), baixe também neste link (https://getbootstrap.com) (deixarei no final todos os arquivos para download)
Iniciando o projeto crie a estrutura de pastas abaixo.
As pastas devem ser criadas no seu servidor httpd(Apache/IIS), dentro do diretório (www).
-validador-tiss (pasta principal)
–css
–xml (diretório para upload dos arquivos xml enviados)
–tiss (diretório com os arquivos baixados no site da ANS para validação TISS)
–tiss/03_03_03
–tiss/03_03_01
–tiss/03_02_02
–tiss/03_02_01
–tiss/03_02_00
1ª Etapa
Agora vamos criar nosso formulário para envio do arquivo e salvar com o nome index.php
Arquivo index.php
Observe que action do formulário aponta para (validar_arquivo.php), e temos um select para as versões dos XML.
<head>
<meta charset=”UTF-8″>
<title>Validador TISS</title>
<link rel=”stylesheet” href=”css/bootstrap.min.css“>
</head>
<body>
<div class=”container”>
<h1 >Validador TISS</h1>
<a class=”btn btn-lg ” href=”#seu-site” role=”button”>Validador de arquivos XML no padrão TISS</a>
<br>
<form id=”upload” name=”upload” enctype=”multipart/form-data” method=”post” action=”validar_arquivo.php“>
<div class=”form-group”>
<label for=”versao” class=”control-label”>Selecione a versão:</label>
<select name=”versao” class=”form-control”>
<option value=”tissV3_03_03.xsd” selected>TISS – 03.03.03</option>
<option value=”tissV3_03_02.xsd” >TISS – 03.03.02</option>
<option value=”tissV3_03_01.xsd” >TISS – 03.03.01</option>
<option value=”tissV3_03_00.xsd” >TISS – 03.03.00</option>
<option value=”tissV3_02_02.xsd” >TISS – 03.02.02</option>
<option value=”tissV3_02_01.xsd” >TISS – 03.02.01</option>
<option value=”tissV3_02_00.xsd” >TISS – 03.02.00</option>
<option value=”tissMonitoramentoV3_03_03“>Monitoramento TISS – 03.03.03</option>
<option value=”tissMonitoramentoV3_03_02“>Monitoramento TISS – 03.03.02</option>
<option value=”tissMonitoramentoV3_03_01“>Monitoramento TISS – 03.03.01</option>
<option value=”tissMonitoramentoV3_03_00“>Monitoramento TISS – 03.03.00</option>
<option value=”tissMonitoramentoV3_02_02“>Monitoramento TISS – 03.02.02</option>
<option value=”tissMonitoramentoV3_02_01“>Monitoramento TISS – 03.02.01</option>
<option value=”tissMonitoramentoV3_02_00“>Monitoramento TISS – 03.02.00</option>
</select>
</label>
</div>
<div class=”form-group”>
<label for=”arquivo_xml” class=”control-label”>Selecione o arquivo (XML) para validação</label>
<input id=”arquivo_xml” name=”arquivo_xml” type=”file” class=”form-control-file” placeholder=”Selecione o arquivo XML para validaçaõ…” />
</div>
<button type=”submit” class=”btn btn-primary”>Validar Arquivo</button>
</form>
</div>
</body>
A página ficará com o layout abaixo;
Agora copie todos os arquivos que baixou no site da ANS e coloque dentro da pasta (tiss), ficando da seguinte forma:
tiss/03_03_03
tiss/03_03_02
tiss/03_03_01
tiss/03_03_00
tiss/03_02_02
tiss/03_02_01
tiss/03_02_00
2ª Etapa
Crie um arquivo com o nome function_erros_xml.php
<?php function display_xml_error($error, $xml) { //$return = $xml[$error->line - 1] . "\n"; //$return .= str_repeat('-', $error->column) . "^\n"; $return = $xml[$error->line - 1] . ""; //$return .= str_repeat('-', $error->column) . ""; $return .= str_repeat('', $error->column) . ""; switch ($error->level) { case LIBXML_ERR_WARNING: $return .= "Warning $error->code: "; break; case LIBXML_ERR_ERROR: $return .= "Error $error->code: "; break; case LIBXML_ERR_FATAL: $return .= "Fatal Error $error->code: "; break; } $return .= trim($error->message) . " Linha: $error->line" . " Coluna: $error->column"; // if ($error->file) { // $return .= " Arquivo: $error->file"; // } //return "$return\n\n-----\n\n"; return "$return"; }
Nesta etapa vamos criar o arquivo para receber os dados do formulário, que será responsável pelo upload do arquivo, leitura e comparação com o XSD(arquivo copiado acima do site da ANS)
Arquivo validar_arquivo.php
vamos criar a estrutura HTML básica do nosso arquivo.
Com o código acima teremos o seguinte layout
Verificamos se foi realizado envio do formulário e obtendo a versão selecionada usando um IF
<?php /** * Validador TISS * * Validador de arquivos XML no padrão TISS * * @author Fabiano Bento <eu@fabianobento.com.br> * @link http://fabianobento.com.br/ * * @version 1.1 */ global $_VT; $_VT['diretorio_tiss'] = 'tiss/'; //diretorio dos arquivos XSD $_VT['diretorio_upload'] = "xml/"; //diretório para salvarmos os arquivos enviados $_VT['ds_arquivo'] = date('Y-m-d-H-i-s'); //variavel para cocatermos ao nome do arquivo if( (isset($_POST['versao'])) && ( $_FILES['arquivo_xml']['name'] != '') ) { //Declaramos as variáveis enviadas pelo método POST $versao_arquivo = $_POST['versao']; $nome_arquivo = basename($_FILES['arquivo_xml']['name']); //Agora criamos um CASE para verificar, validar a escolha de versão e pegarmos o diretório dos arquivos XSD da TISS. switch ($versao_arquivo) { //TISS - 03.03.03 case "tissV3_03_03.xsd": $versao_arquivo_txt = 'TISS 3.03.03'; $versao = '03_03_03/tissV3_03_03.xsd'; break; //TISS - 03.03.01 case "tissV3_03_01.xsd": $versao_arquivo_txt = 'TISS 3.03.01'; $versao = '03_03_01/tissV3_03_01.xsd'; break; //TISS - 03.02.02 case "tissV3_02_02.xsd": $versao_arquivo_txt = 'TISS 3.02.02'; $versao = '03_02_02/tissV3_02_02.xsd'; break; //TISS - 03.02.01 case "tissV3_02_01.xsd": $versao_arquivo_txt = 'TISS 3.02.01'; $versao = '03_02_01/tissV3_02_01.xsd'; break; //TISS - 03.02.00 case "tissV3_02_00.xsd": $versao_arquivo_txt = 'TISS 3.02.00'; $versao = '03_02_00/tissV3_02_00.xsd'; break; } //agora faremos o upload do arquivo para o diretório (xml) $uploadfile = $_VT['diretorio_upload'] . $_VT['ds_arquivo'] . '_' . basename($_FILES['arquivo_xml']['name']); //copia o arquivo do computador para o servidor if(!move_uploaded_file($_FILES['arquivo_xml']['tmp_name'], $uploadfile)){ echo "falha ao carregar arquivo!"; }else { echo "Arquivo enviado com sucesso. Iniciando análise..."; echo "Versão Selecionada: ". $versao_arquivo_txt ." Arquivo: ". $nome_arquivo.""; }
Após o upload do arquivo fazemos a comparação com o XSD usando a classe DomDocument
Nesta etapa vamos analisar se o arquivo XML enviado está de acordo com a estrutura do XSD. Pegamos a versão selecionada no formulário, o arquivo no diretório onde foi feito o upload e a comparação. Em seguida armazenamos todos os erros (se houver) em uma variável. E como resultado se o arquivo está de acordo o padrão ou não e quais erros encontrados.
O código abaixo deverá ser incluído abaixo do comentário “aqui vai o código da validação da estrutura”
libxml_use_internal_errors(true); /* Cria um novo objeto da classe DomDocument */ $objDom = new DomDocument(); /* Carrega o arquivo XML */ $objDom->load($uploadfile); /* Tenta validar os dados utilizando o arquivo XSD */ // seleciona a versao correspondente $versao_tiss = $_VT['diretorio_tiss'] . $versao; if (!$objDom->schemaValidate($versao_tiss)) { /** * Se não foi possível validar, capturamos * todos os erros em um array */ $arrayAllErrors = libxml_get_errors(); /**/ $xmlstr = $objDom->load($uploadfile); $doc = simplexml_load_string($xmlstr); $xml = explode("\n", $xmlstr); require_once('function_erros_xml.php'); if (!$doc) { $errors = libxml_get_errors(); echo "Arquivo inválido: O arquivo não segue a estrutura definida pela ANS."; echo "
“; $i = 0; foreach ($errors as $error) { // exibe todos os erros identados um por linha $i++; echo “Inconsistência: $i
“; echo display_xml_error($error, $xmls); echo ”
“; } libxml_clear_errors(); } } else { /* XML validado! */ echo ”
Resultado Final
Estrutura: XML obedece às regras definidas no arquivo XSD definidos pela ANS!
“; }
/* Agora apagamos o arquivo enviado */
unlink(uploadfile); }else {
echo “Arquivo não selecionado!”;
}
?>
3ª Etapa
Esta etapa não é obrigatória, mas é a cereja do bolo, digo validador =), pois através desta parte podemos fazer a validação dos dados contidos dentro de cada TAG do XML, ou seja, se os códigos de procedimentos e tabelas estão seguindo o padrão TUSS determinado pela ANS.
Utilizaremos o banco de dados MySQL, pois precisamos armazenar os dados da codificação TUSS. Para criar e configurar o banco você pode usar qualquer programa, segue alguns; MySQL WorkBench, MySQL Front, PHPMyAdmin(Na hospedagem do site).
Vou dividir esta etapa nas seguintes partes(A, B, C, D, E, F);
A-Criação do banco de dados
B-Tabelas do banco
C-Importando os dados para as tabelas
D-Criando as rotinas no banco (functions / procedures)
E-Conexão com o banco de dados MySQL
F-Alteração no arquivo validar_arquivo.php para fazer a leitura dos dados
Vamos começar!
Não vou ficar detalhando(explicando) cada comando SQL, basicamente iremos criar as tabelas conforme a estrutura de representação da ANS/TUSS.
A – Criação do banco de dados
1 | CREATE DATABASE validador |
B – Criação das tabelas que serão utilizadas
Observe que junto defini o atributo cd_termo como chave para indexação dos dados, assim temos otimização na leitura/busca.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | -- -- Estrutura da tabela `tabela_18_diaria_taxa_gase` -- CREATE TABLE IF NOT EXISTS `tabela_18_diaria_taxa_gase` ( `NR_SEQUENCIA` INT(11) NOT NULL AUTO_INCREMENT, `CD_TERMO` CHAR(8) NOT NULL, `DS_TERMO` VARCHAR(300) NOT NULL, `DS_TERMO_DETALHADO` text, `DT_INICIO_VIGENCIA` DATE NOT NULL, PRIMARY KEY (`NR_SEQUENCIA`), KEY `CD_TERMO` (`CD_TERMO`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Estrutura da tabela `tabela_19_opme` -- CREATE TABLE IF NOT EXISTS `tabela_19_opme` ( `NR_SEQUENCIA` INT(11) NOT NULL AUTO_INCREMENT, `CD_TERMO` CHAR(8) NOT NULL, `DS_TERMO` VARCHAR(4000) NOT NULL, `DS_REF_FABRICANTE` VARCHAR(4000) DEFAULT NULL, `DS_FABRICANTE` VARCHAR(4000), `DT_INICIO_VIGENCIA` DATE NOT NULL, PRIMARY KEY (`NR_SEQUENCIA`), KEY `CD_TERMO` (`CD_TERMO`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Estrutura da tabela `tabela_20_medicamento` -- CREATE TABLE IF NOT EXISTS `tabela_20_medicamento` ( `NR_SEQUENCIA` INT(11) NOT NULL AUTO_INCREMENT, `CD_TERMO` CHAR(8) NOT NULL, `DS_TERMO` VARCHAR(300) NOT NULL, `DS_APRESENTACAO` text, `DS_LABORATORIO` text, `DT_INICIO_VIGENCIA` DATE NOT NULL, PRIMARY KEY (`NR_SEQUENCIA`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Estrutura da tabela `tabela_22_procedimentos` -- CREATE TABLE IF NOT EXISTS `tabela_22_procedimentos` ( `NR_SEQUENCIA` INT(11) NOT NULL AUTO_INCREMENT, `CD_TERMO` CHAR(8) NOT NULL, `DS_TERMO` VARCHAR(300) NOT NULL, `DS_TERMO_DETALHADO` text NOT NULL, `DT_INICIO_VIGENCIA` DATE NOT NULL, PRIMARY KEY (`NR_SEQUENCIA`), KEY `CD_TERMO` (`CD_TERMO`), KEY `CD_TERMO_2` (`CD_TERMO`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Estrutura da tabela `tabela_24_cbo` -- CREATE TABLE IF NOT EXISTS `tabela_24_cbo` ( `NR_SEQUENCIA` INT(11) NOT NULL AUTO_INCREMENT, `NR_SEQ_VERSAO_TISS` INT(11) NOT NULL, `CD_TERMO` VARCHAR(20) NOT NULL, `DS_TERMO` VARCHAR(300) NOT NULL, `DT_VIGENCIA` DATE NOT NULL, PRIMARY KEY (`NR_SEQUENCIA`), KEY `CD_TERMO` (`CD_TERMO`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=144 ; -- -------------------------------------------------------- -- -- Estrutura da tabela `tiss_versao` -- CREATE TABLE IF NOT EXISTS `tiss_versao` ( `NR_SEQUENCIA` INT(11) NOT NULL AUTO_INCREMENT, `CD_VERSAO` VARCHAR(20) NOT NULL, `CD_VERSAO_MASCARA` VARCHAR(40) NOT NULL, `DT_VERSAO` DATE NOT NULL, PRIMARY KEY (`NR_SEQUENCIA`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; -- -- Extraindo dados da tabela `tiss_versao` -- INSERT INTO `tiss_versao` (`NR_SEQUENCIA`, `CD_VERSAO`, `CD_VERSAO_MASCARA`, `DT_VERSAO`) VALUES (1, '030200', '03.02.00', '2016-01-26'), (2, '030201', '03.02.01', '2016-02-10'), (3, '030202', '03.02.02', '2016-05-01'), (4, '030300', '03.03.00', '2016-06-01'), (5, '030301', '03.03.01', '2016-10-01'), (6, '030302', '03.03.02', '2017-04-10'), (7, '030303', '03.03.03', '2018-01-01'); |
C – Importando os dados para as tabelas
Baixe os arquivos para importar os dados nas tabelas. Para iniciar o download, clique sobre os nomes de cada tabela.
-> tabela_20_medicamento
-> tiss_versao
Execute/importe os arquivos utilizando seu programa de gerenciamento de banco de dados recomendo o( WorkBench) é rápido e gera bons logs, se for instalar junto com seu site, utilize o PHPmyAdmin para importar(pois também é eficiente e rápido(se for online).
Dica: Caso esteja utilizando algum pacote de instalação como o Wampserver, Easyphp, entre outros, será necessário ajustar a configuração do MySQL para importar grandes arquivos SQL. Encontre no diretório de instalação dos arquivos;
MySQL -> my.ini
max_allowed_packet = 512M (ou 1024M)
read_buffer_size = 1024K (ou 2048K)
PHP -> php.ini
max_input_time = 1800 (ou 2600)
memory_limit = 128M (ou 256M)
(D) Criação da View e Function MySQL para consulta
Vamos criar uma function para fazer a consulta e comparação se determinado código do procedimento/material/medicamento/opme, existe nas tabelas da TUSS/TISS, lembrando que vamos comparar de acordo a tabela do arquivo (5 brasíndice, simpro, 00 própria)
Como temos várias tabelas separadas, Procedimentos, taxas, materiais, medicamentos vamos criar uma VIEW para unir e facilitar a consuta.
DROP VIEW IF EXISTS `tabela_tiss_tuss`$ CREATE VIEW `tabela_tiss_tuss` AS SELECT 22 AS `cd_tabela`,`a`.`CD_TERMO` AS `cd_termo`,`a`.`DS_TERMO` AS `ds_termo` FROM `tabela_22_procedimento` `a` UNION ALL SELECT 18 AS `cd_tabela`,`a`.`CD_TERMO` AS `cd_termo`,`a`.`DS_TERMO` AS `ds_termo` FROM `tabela_18_diaria_taxa_gase` `a` UNION ALL SELECT 19 AS `cd_tabela`,`a`.`CD_TERMO` AS `cd_termo`,`a`.`DS_TERMO` AS `ds_termo` FROM `tabela_19_opme` `a` UNION ALL SELECT 5 AS `05`,`a`.`NUM_TISS` AS `num_tiss`,CONCAT(`a`.`MED_DESC`,`a`.`APR_DESC`) AS `ds_item` FROM `tabela_brasindice` `a`$ DELIMITER ;
Criação da Function – O objetivo da function é verificar se o procedimento, taxa, mat/med existe na tabela indicada.
DELIMITER $ USE `validador`$ DROP FUNCTION IF EXISTS `obter_se_item_existe`$ CREATE DEFINER=`fabiano_wcyppjs`@`%` FUNCTION `obter_se_item_existe`( st_tipo_item_e CHAR(3), cd_tabela_e INT(11), cd_item_e INT(11) ) RETURNS VARCHAR(50) CHARSET latin1 DETERMINISTIC BEGIN DECLARE st_item_existe_r VARCHAR(150); IF (cd_tabela_e IS NOT NULL) THEN IF (cd_item_e IS NOT NULL) THEN SELECT IFNULL(MAX(p.cd_termo),0), INTO st_item_existe_r FROM tabela_tiss_tuss p WHERE p.cd_termo = cd_item_e AND p.cd_tabela = cd_tabela_e ; END IF; END IF; RETURN st_item_existe_r; END$ DELIMITER ;
(E) – Conexão com o banco de dados
Agora vamos criar o arquivo de conexão com o banco de dados, para consultar os dados importados, será um arquivo bem simples.
conectadb.inc.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | <?php //chamaremos a classe de "conexão" class conexao { //declaração das variáveis e informações de conexão com o banco var $host_mysql = "localhost"; // Nome ou IP do Servidor var $user_mysql = "root"; // Usuário do Servidor MySQL var $senha_mysql = ""; // Senha do Usuário MySQL var $db_mysql = "validador"; // Nome do seu Banco de Dados function conecta(){ $this->link = @mysql_connect($this->host,$this->user,$this->senha); // Conecta ao Banco de Dados if(!$this->link){ // Caso ocorra um erro, exibe uma mensagem com o erro print "Ocorreu um Erro na conexão MySQL:"; print "<b>".mysql_error()."</b>"; die(); }elseif(!mysql_select_db($this->dbase,$this->link)){ // Seleciona o banco após a conexão // Caso ocorra um erro, exibe uma mensagem com o erro print "Ocorreu um Erro em selecionar o Banco:"; print "<b>".mysql_error()."</b>"; die(); } } function sql_query($query){ $this->conecta(); $this->query = $query; if($this->resultado = mysql_query($this->query)){ $this->desconecta(); return $this->resultado; }else{ // Caso ocorra um erro, exibe uma mensagem com o Erro print "Ocorreu um erro ao executar a Query MySQL: <b>ERRO INTERNO</b>"; //$query print "<br><br>"; print "Erro no MySQL: <b>".mysql_error()."</b>"; die(); $this->desconecta(); } } function desconecta(){ return mysql_close($this->link); } } |
(F)Alteração no arquivo validar_arquivo.php
Agora vamos fazer as alterações em nosso arquivo chamado “validar_arquivo.php”, com a chamada da conexão com o banco e comparação.
4ª Etapa – Instalação e Configuração
Você pode fazer a instalação do Validador TISS em qualquer computador rede local, usando o (Apache, PHP, MySQL), para facilitar a instalação e configuração utilize os famosos pacotes que já são pré configurado.
Obs.: Usando sua rede local, instale apenas em 1 computador e acesse a partir do navegador (ip local) http://192.168.1.xxx/validador
Ou instale junto ao site da sua empresa (criando o diretório chamado (validador) http://seu-site.com/validador
Windows (Qualquer versão) – WAMP, EASY PHP, XAMMP,
Linux – CentOS/RedHat (Instale os pacotes usando o comando #yum -y install httpd php php-mysql mysqld mysql-server
Fabiano, muito bom o seu artigo, porém ainda falta alguns trechos de código, por exemplo não foi informado o arquivo: function_erros_xml.php e também a alteração a ser feita no arquivo: validar_arquivo.php
pode passar o restante do código?
Olá Franklin,
Atualizei o Post, a function_erros_xml.php está no início da 2ª Etapa.
Muito bom Fabiano.
Faltando agora apenas o validar_arquivo.php da etapa 3 (F).
Ótimo artigo Fabiano, parabéns!!!
Poderia passar o link dos Arquivos por favor Amigo?
Iria me ajudar muito… Desde já agradeço!
Bom dia Bento, ótimo tutorial.
Alguns links de download não estão funcionando.
Abcs
Os links para downloads foram corrigidos.
Pode disponibilizar a página validar_arquivo.php atualizada?
Pedro, o conteúdo foi atualizado.
Boa noite Bento, Parabéns pelo seu trabalho!
Você pode me enviar o projeto completo do validador que está rodando no seu site?
Não conseguir implementar a totalidade do tutorial porque não localizei a Alteração no arquivo validar_arquivo.php.
Olá, os arquivos estão disponíveis no blog no final do post.
Olá Bento, por favor, pode disponilizar todos os arquivos?
Quero aprender e implementar essa solução.
Olá, todos os arquivos já estão disponíveis no artigo do blog.
Bom dia. Estou tentando baixar alguns arquivos e os links estão quebrados. Vc poderia disponibilizar esse excelente material no git por exemplo? Desde já, agradeço.
Olá Mauricio, os arquivos estão disponíveis no artigo do blog basta copiar.
Oi Fabiano. Parabéns pelo script.
Gostaria de pedir que vc disponibilizasse o projeto para download.
Não estou conseguindo algumas tabelas sql (a tabela_20_medicamento.sql e a tabela_brasindice.sql estão faltando no tutorial)…
Poderia mandar o projeto pra gente baixar?????
Obrigado
Olá Fabricio, os dados estão na publicação.
Os links estão fora do ar novmaente
Olá Maicon, os dados estão na publicação.