Autor Tópico: IMPORTAR CSV  (Lida 883 vezes)

gabrielemerich

  • Iniciante
  • **
  • Mensagens: 76
IMPORTAR CSV
« Online: Julho 12, 2016, 01:35:06 pm »
Pessoal boa tarde,
Gostaria que sempre que fosse importado uma arquivo csv, o algoritmo verificasse se já existem registros iguais, se existirem, ele adiciona somente os novos registros atualizando a tabela.
O algoritmo a seguir, faz o procedimento de importação porém o mesmo permite que os mesmos dados sejam importados, gravando os mesmos registros dentro do banco de dados.
Alguém tem uma solução pertinente?
Obrigado galera, grande abraço!

$caminho = $this->Ini->path_doc;
$arq = $caminho.'/'.{arquivo};

$delimitador = ',';
$cerca = '"';

$cadastrados=0;

// Abrir arquivo para leitura
$f = fopen($arq, 'r');
if ($f) {

    // Ler cabecalho do arquivo
    $cabecalho = fgetcsv($f, 0, $delimitador, $cerca);

    // Enquanto nao terminar o arquivo
    while (!feof($f)) {

        // Ler uma linha do arquivo
        $linha = fgetcsv($f, 0, $delimitador, $cerca);
        if (!$linha) {
            continue;
        }

        // Montar registro com valores indexados pelo cabecalho
        $registro = array_combine($cabecalho, $linha);

        // Obtendo campos do CSV
   // Olhar no Sseu CSV como estão os NOMES CABEÇALHO dos campos e colocar ['NOME_CAMPO']
        $nome_x = $registro['nome'];
   $endereco_x = $registro['endereco'];
   $numero_x = $registro['numero'];
   /*$QT_PESSOA_SERVICO_x = $registro['QT_PESSOA_SERVICO'];
   $VL_PESSOA_SERVICO_x = $registro['VL_PESSOA_SERVICO'];
   $DS_OBSERVACAO_x = $registro['DS_OBSERVACAO'];
   $DS_CONVENIO_x = $registro['DS_CONVENIO'];
   $DT_CADASTRO_x = $registro['DT_CADASTRO'];
   $CD_USUARIO_CADASTRO_x = $registro['CD_USUARIO_CADASTRO'];
   $DT_ATUALIZACAO_x = $registro['DT_ATUALIZACAO'];
   $CD_USUARIO_ATUALIZACAO_x = $registro['CD_USUARIO_ATUALIZACAO'];*/

      $insert_table  = 'testetab';  // Nome da Tabela
      $insert_fields = array(
         'nome'               => "'$nome_x'",
         'endereco'             => "'$endereco_x'",
         'numero'      => "$numero_x",
         /*'QT_PESSOA_SERVICO'      => "$QT_PESSOA_SERVICO_x",
         'VL_PESSOA_SERVICO'      => "$VL_PESSOA_SERVICO_x",
         'DS_OBSERVACAO'          => "'$DS_OBSERVACAO_x'",
         'DS_CONVENIO'            => "'$DS_CONVENIO_x'",
         'DT_CADASTRO'            => "'$DT_CADASTRO_x'",
         'CD_USUARIO_CADASTRO'    => "$CD_USUARIO_CADASTRO_x",
         'DS_CONVENIO'            => "'$DS_CONVENIO_x'",
         'DT_ATUALIZACAO'         => "'$DT_ATUALIZACAO_x'",
         'CD_USUARIO_ATUALIZACAO' => "$CD_USUARIO_ATUALIZACAO_x"*/
      );

      // Inserir registro
      $insert_sql = 'INSERT INTO ' . $insert_table
         . ' (' . implode(', ', array_keys($insert_fields)) . ')'
         . ' VALUES (' . implode(', ', array_values($insert_fields)) . ')';

      sc_exec_sql($insert_sql);

      $cadastrados++;

    }
    fclose($f);
}

if ($cadastrados==0) {
    sc_error_message("Não há registros a atualizar, verifique");
} else {
    sc_error_message("Lojas cadastradas: " . $cadastrados);
}




Jailton

  • Expert
  • *****
  • Mensagens: 2038
Re:IMPORTAR CSV
« Responder #1 Online: Julho 12, 2016, 04:40:51 pm »
Usa o sc_lookup para checar antes de inserir os registros ai você direciona o que vai acontecer, ignorar ou gravar.
http://www.scriptcase.com.br/docs/pt_br/v81/manual_mp.htm#macros-scriptcase/macros-scriptcase

/* Macro sc_lookup */

$sql ="
SELECT
    CodigoClienteID,
    NomeCliente,
    CPF
FROM
    clientes
WHERE
    CodigoID = {CodigoID}

";

sc_lookup(cli, $sql)

/* Erro no lookup */
if (FALSE === {cli}) {
   sc_error_message("Ocorreu um erro no acesso ao banco de dados.<BR>");
}
elseif (empty({cli})) { /* EOF */

   sc_error_message("Nenhum valor foi retornado pelo banco.<BR>");
}
else {

   /* Inclua aqui sua rotina de processamento */

         $CodigoClienteID_x = {cli[$j][0]};
         $NomeCliente_x = {cli[$j][1]};
         $CPF_x = {cli[$j][2]};      
   
}
O Princípio da Vibração. "Nada está parado, tudo se move, tudo vibra". Caibalion.

gabrielemerich

  • Iniciante
  • **
  • Mensagens: 76
Re:IMPORTAR CSV
« Responder #2 Online: Julho 13, 2016, 08:39:20 am »
Agradeço a resposta, devo verificar linha a linha do da planilha e comparar se cada linha possui dados iguais ao que já estão gravados no banco, caso todos forem iguais, ele não grava nada, caso algum seja diferente, ele grava na ultima linha do banco de dados.
Essa é a lógica que preciso desenvolver.

Kleyber

  • Expert
  • *****
  • Mensagens: 2237
    • Email
Re:IMPORTAR CSV
« Responder #3 Online: Julho 13, 2016, 08:45:41 am »
Gabriel,

Eu já desenvolvi uma rotina assim e o que fiz foi pegar uma coluna do CSV que sei que não se repete e com essa coluna faço a verificação na tabela pra ver se já existe. Se não existir, a rotina continua. Vou buscar essa rotina e posto pra você entender como fiz. Só que só poderei enviar à noite.
Kleyber Derick

ITIL® V3 Foundation Certified
Analista de Sistemas
São Luís - Maranhão
www.tkinformidia.net

gabrielemerich

  • Iniciante
  • **
  • Mensagens: 76
Re:IMPORTAR CSV
« Responder #4 Online: Julho 13, 2016, 09:15:20 am »
Kleyber ficarei no aguardo, um abraço cara e valeu a força.

gabrielemerich

  • Iniciante
  • **
  • Mensagens: 76
Re:IMPORTAR CSV
« Responder #5 Online: Julho 13, 2016, 01:06:27 pm »
Consegui desenvolver uma lógica aqui, porém agora o meu objetivo é usar o mesmo código porém para importar arquivos do tipo xls.
Será possível?

Jailton

  • Expert
  • *****
  • Mensagens: 2038
Re:IMPORTAR CSV
« Responder #6 Online: Julho 13, 2016, 01:12:07 pm »
Você vai usar a lib PHPExcel:
https://suporte.scriptcase.com.br/index.php?/Knowledgebase/Article/View/688/0/aplicacao-com-importacao-excel

Veja o vídeo que tem no link também.

A lógica na hora de gravar é a mesma coisa com sc_lookup caso não quiser gravar duplicados.
« Última modificação: Julho 13, 2016, 01:16:33 pm por Jailton »
O Princípio da Vibração. "Nada está parado, tudo se move, tudo vibra". Caibalion.

gabrielemerich

  • Iniciante
  • **
  • Mensagens: 76
Re:IMPORTAR CSV
« Responder #7 Online: Julho 15, 2016, 07:54:04 am »
Bom dia, creio eu que terei dificuldades pois meu objetivo é desenvolver um recurso de importação semelhante ao nativo do scriptcase, que no mínimo proporcione ao usuário a opção de escolha de quais tabelas ele quer importar.