Autor Tópico: Importar registros de uma planilha excel  (Lida 1131 vezes)

aldir

  • Novato
  • *
  • Mensagens: 29
Importar registros de uma planilha excel
« Online: Abril 07, 2016, 09:09:58 am »
Bom dia Pessoal,
Cria um Controle para importar dados de uma planilha Excel, no evento OnValidate inclui o cdigo. SC na verso 8.1
Aps selecionar o arquivo excel e importar apresenta a mensagem de erro com caracteres estranhos, onde deveria trazer os dados da planilha.

ERRO:
SELECT * FROM TB_BI_PESSOA_SERVICO WHERE CPF_CNPJ = " O   /c)wڇb PK ! x` m xl/workbook.xmlRAN0 # w$mBTB Pڳ7 Uǎlg( g^N"` 4:$ tnԇo_8ϵhH ]e71G ڥ^0 *& ؊{\m W J( Vq 0E!sx2yS =w ͖T &"xO ҃Hiдc6c# v 2 ox: ͢(] ;   >ArK-L = (A D Ӱ" AND CD_SERVICO = AND DT_PESSOA_SERVICO = ""2SELECT * FROM TB_BI_PESSOA_SERVICO WHERE CPF_CNPJ = "Pq'ή~% n hh k Xص ; 芌 E^ '*ǘ0 ?% PK !dd xl/theme/theme1.xmlYMo E # F{oc' Guر hF[xw;jf7 qA ZK9S EP ޙ]ě&) h wy? ٫ !)O:^rC$y@ .{H* t9޵w߹7TDb> EJ ++҇e" AND CD_SERVICO = /$nE <p% leVkĘ& Jp lG@ nO&'fξ@F^ j$K_PSA! u sc `@\ G RW3 1u mn`2 " BFvߘZ^^3`ե̳1Xws% ̻Wk . mIvm3] AND DT_PESSOA_SERVICO = "S ? KZ KFwk9x ~pjx MKh ^@&T ^ dCbZĄ'    \ + 5O = Z" 2 SELECT * FROM TB_BI_PESSOA_SERVICO WHERE CPF_CNPJ = " .riI D:SO1Tǂ߫߾z z᳣? =zt{!IX&|' |!W/ V e/} V


***************
CDIGO (OnValidate) :

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

// Processando a leitura
$fp = fopen($arq,'r');

// Pegando a primeira linha (cabealho)
$linha = fgets($fp);

// Pegando o caracter separador na coluna 12
$caracter = substr($linha,12,1);

// Processando arquivo
while ($dados = fgetcsv($fp, filesize($arq), $caracter)) 
    $tabela[] = $dados;
 
fclose($fp);

$insert_sql = 'INSERT INTO TB_BI_PESSOA_SERVICO ('
             .'CPF_CNPJ,CD_SERVICO,DT_PESSOA_SERVICO,QT_PESSOA_SERVICO,'
             .'VL_PESSOA_SERVICO,DS_OBSERVACAO,DS_CONVENIO,DT_CADASTRO,'
         .'CD_USUARIO_CADASTRO,DT_ATUALIZACAO,CD_USUARIO_ATUALIZACAO) VALUES';
foreach ($tabela as $campo)
{
  if (empty($campo[1])) {
     break;
  }
   
  $check_sql = 'SELECT * FROM TB_BI_PESSOA_SERVICO '
             .' WHERE CPF_CNPJ = "'.$campo[0].'"   AND CD_SERVICO = '.$campo[1]
            .' AND DT_PESSOA_SERVICO = "'.$campo[2].'"';
  echo $check_sql;
    
  sc_select(dataset, $check_sql);
  if (false == {dataset})     // Error while accessing database
  {
     sc_error_message('Erro durante acesso ao PESSOA SERVICO.');
  }
  elseif (!{dataset}->EOF)   // Existe na tabela
  {
     continue;
  }

elseif ({dataset}->EOF)   // No existe na tabela
  {
     $CPF_CNPJ = $campo[0];
     $CD_SERVICO = $campo[1];
     $DT_PESSOA_SERVICO = $campo[2];
     $QT_PESSOA_SERVICO = $campo[3];
     $VL_PESSOA_SERVICO = $campo[4];
     $DS_OBSERVACAO     = $campo[5];
     $DS_CONVENIO       = $campo[6];
     $DT_CADASTRO       = '01/01/2000';
     $CD_USUARIO_CADASTRO = [gloLogin];
     $DT_ATUALIZACAO      =  '01/01/2000';
     $CD_USUARIO_ATUALIZACAO = [gloLogin];   
   
       // Monta a parte de insero dos campos
   
        $insert_sql2 = " ('".$CPF_CNPJ."',".$CD_SERVICO.",'".$DT_PESSOA_SERVICO."',".$QT_PESSOA_SERVICO.",";
     $insert_sql2 .= "".$VL_PESSOA_SERVICO.",'".$DS_OBSERVACAO."','".$DS_CONVENIO."','".$DT_CADASTRO."',";
     $insert_sql2 .=
       "'".$CD_USUARIO_CADASTRO."','".$DT_ATUALIZACAO."','".$CD_USUARIO_ATUALIZACAO."'),";
     $insert_sql .= $insert_sql2;
   
  }   
 
}   
if (empty($insert_sql2)) {
   sc_error_message("No h registros a atualizar, verifique");
}
else {
// Tira o ltimo caractere (vrgula extra)
//   $insert_sql = substr($insert_sql, 0, -1);

// Inserir registros
   sc_exec_sql($insert_sql);

// Pega o nmero de registros inseridos
   $cadastrados = mysql_affected_rows();
   sc_error_message("Lojas cadastradas: " . $cadastrados);
   }

Kleyber

  • Expert
  • *****
  • Mensagens: 2235
    • Email
Re:Importar registros de uma planilha excel
« Responder #1 Online: Abril 07, 2016, 09:16:22 am »
Aldir bom dia,

A montagem do teu INSERT est errada. Tens que separar cada campo por vrgula, mas usando aspas para poder aparecer corretamente no comando. Faa o seguinte: d um ECHO $insert_sql pra voc ir vendo como est ficando o comando e assim vais debugando, antes de mandar executar o comando SQL.
Kleyber Derick

ITIL V3 Foundation Certified
Analista de Sistemas
So Lus - Maranho
www.tkinformidia.net

Jailton

  • Expert
  • *****
  • Mensagens: 2034
Re:Importar registros de uma planilha excel
« Responder #2 Online: Abril 07, 2016, 09:18:25 am »
Verifica, e salva novamente este arquivo do EXCEL em extenso CSV, se no vai dar esse erro mesmo, o EXCEL codificado/criptografado no padro dele.

O Princpio da Vibrao. "Nada est parado, tudo se move, tudo vibra". Caibalion.

aldir

  • Novato
  • *
  • Mensagens: 29
Re:Importar registros de uma planilha excel
« Responder #3 Online: Abril 07, 2016, 11:30:06 am »
Kleyber, bom dia.
Agradeo pela dica.

Mas acho que o erro est dando um pouco antes do insert, no camando select
$check_sql = 'SELECT * FROM TB_BI_PESSOA_SERVICO '
             .' WHERE CPF_CNPJ = "'.$campo[0].'"   AND CD_SERVICO = '.$campo[1]
            .' AND DT_PESSOA_SERVICO = "'.$campo[2].'"';

Cleidson dos Santos

  • Intermedirio
  • ***
  • Mensagens: 173
    • Sistema para controle e Gerenciamento de Manuteno
    • Email
Re:Importar registros de uma planilha excel
« Responder #4 Online: Abril 07, 2016, 04:12:44 pm »
No seminrio desse link e mostrado como fazer a importao.
https://youtu.be/SwSi3-v84UU
Cleidson dos Santos
cleidsoncarneirodossantos@gmail.com
Skype: cleidson_santos1
WhatsApp: (15) 99635-4862

aldir

  • Novato
  • *
  • Mensagens: 29
Re:Importar registros de uma planilha excel
« Responder #5 Online: Abril 08, 2016, 09:19:02 am »
Jailton, bom dia.
a dica funcionou, obrigado.

Mas me deparei com outro problema. Ao recuperar a linha retorna o valor : coluna1;coluna2;coluna3;coluna4;coluna5.

Preciso separar as colunas, porque as colunas : coluna1 e coluna3 so caracteres. Portanto, preciso incluir as aspas antes do insert na tabela.

Desde j agradeo.


Jailton

  • Expert
  • *****
  • Mensagens: 2034
Re:Importar registros de uma planilha excel
« Responder #6 Online: Abril 08, 2016, 09:45:26 am »
Jailton, bom dia.
a dica funcionou, obrigado.

Mas me deparei com outro problema. Ao recuperar a linha retorna o valor : coluna1;coluna2;coluna3;coluna4;coluna5.

Preciso separar as colunas, porque as colunas : coluna1 e coluna3 so caracteres. Portanto, preciso incluir as aspas antes do insert na tabela.

Desde j agradeo.



Arranca toda a parte do seu INSERT e ADAPTA esse meu cdigo, olha como fica fcil fazer INSERT.

INSERT (METDO NOVO DO SC, Melhor para facilitar incluso)

Código: [Selecionar]
$insert_table  = 'TBLMOV';  // Nome da Tabela
$insert_fields = array(   
'CODINFENTRADA'    => "[glo_codientrada]", 
'DESCRINFENTRADA'  => "[glo_descrientrada]",
'qtdmov'           => "[glo_qtdentrada]",
'OBSNFENTRADA'     => "$Obs_Entrada_x",
'datamov'          => "'{Data}'",
'DATAEMISSAO'      => "'2016-01-06'",
'customov'         => "[glo_vlrentrada]",
'coditem'          => "0"
);

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

sc_exec_sql($insert_sql);
O Princpio da Vibrao. "Nada est parado, tudo se move, tudo vibra". Caibalion.

aldir

  • Novato
  • *
  • Mensagens: 29
Re:Importar registros de uma planilha excel
« Responder #7 Online: Abril 08, 2016, 11:43:30 am »
Jailton, bom dia.
Vou seguir a dica.

Mas como vou recuperar os valores campo a campo para atribuir no "$insert_fields", porque o retorno do arquivo CSV uma string "coluna1;coluna2;coluna3;coluna4;coluna5" com dados variveis?  Exemplo : "MARIA;1;10/05/2015;1212;121213"

Existe uma funo substring, onde o valor da "coluna1" vai at encontrar o caracter ";" (Exemplo : coluna1 = MARIA) ?    E assim por diante at recuperar o valor da ltima coluna.

$insert_fields = array( 
'CODINFENTRADA'    => "coluna1", 
   'DESCRINFENTRADA'  => "coluna2",
   'qtdmov'           => "coluna3",
   'OBSNFENTRADA'     => "coluna4",
   'datamov'          => "'coluna5'"
);


Desde j agradeo.

Jailton

  • Expert
  • *****
  • Mensagens: 2034
Re:Importar registros de uma planilha excel
« Responder #8 Online: Abril 08, 2016, 11:51:04 am »
Jailton, bom dia.
Vou seguir a dica.

Mas como vou recuperar os valores campo a campo para atribuir no "$insert_fields", porque o retorno do arquivo CSV uma string "coluna1;coluna2;coluna3;coluna4;coluna5" com dados variveis?  Exemplo : "MARIA;1;10/05/2015;1212;121213"

Existe uma funo substring, onde o valor da "coluna1" vai at encontrar o caracter ";" (Exemplo : coluna1 = MARIA) ?    E assim por diante at recuperar o valor da ltima coluna.

$insert_fields = array( 
'CODINFENTRADA'    => "coluna1", 
   'DESCRINFENTRADA'  => "coluna2",
   'qtdmov'           => "coluna3",
   'OBSNFENTRADA'     => "coluna4",
   'datamov'          => "'coluna5'"
);


Desde j agradeo.


Essa parte onde voc coloca os valores nas variveis voc mantem, s na hora de gerar o INSERT que vai usar a outra parte.
$CPF_CNPJ = $campo[0];
$CD_SERVICO = $campo[1];
$DT_PESSOA_SERVICO = $campo[2];
$QT_PESSOA_SERVICO = $campo[3];
$VL_PESSOA_SERVICO = $campo[4];
$DS_OBSERVACAO     = $campo[5];
$DS_CONVENIO       = $campo[6];
$DT_CADASTRO       = '01/01/2000';
$CD_USUARIO_CADASTRO = [gloLogin];
$DT_ATUALIZACAO      =  '01/01/2000';
$CD_USUARIO_ATUALIZACAO = [gloLogin];   
O Princpio da Vibrao. "Nada est parado, tudo se move, tudo vibra". Caibalion.

aldir

  • Novato
  • *
  • Mensagens: 29
Re:Importar registros de uma planilha excel
« Responder #9 Online: Abril 08, 2016, 03:32:01 pm »
Jailton,
aps converter o arquivo excel para CSV.

O valor do "$campo[0]"   retorna a string toda  "coluna1;coluna2;coluna3;coluna4;coluna5" ( "MARIA;1;10/05/2015;1212;121213") e no somente o valor "coluna1", neste caso MARIA.

Por isso, questionei sobre uma funo substring para quebrar o valor dos campos.

Jailton

  • Expert
  • *****
  • Mensagens: 2034
Re:Importar registros de uma planilha excel
« Responder #10 Online: Abril 08, 2016, 04:50:16 pm »
Jailton,
aps converter o arquivo excel para CSV.

O valor do "$campo[0]"   retorna a string toda  "coluna1;coluna2;coluna3;coluna4;coluna5" ( "MARIA;1;10/05/2015;1212;121213") e no somente o valor "coluna1", neste caso MARIA.

Por isso, questionei sobre uma funo substring para quebrar o valor dos campos.

Refiz seu cdigo agora s adaptar os nome dos campos e ver se so nmeros ou alfanumricos, como no tenho o CSV e nem a BASE aqui chutei alguns, ai s colocar ' ou tirar no $insert_fields
Código: [Selecionar]
<?php

// Exemplo de scrip para exibir os nomes obtidos no arquivo CSV de exemplo

// CDIGO (OnValidate) :

// Pegando o arquivo com caminho
$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($f0$delimitador$cerca);

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

        
// Ler uma linha do arquivo
        
$linha fgetcsv($f0$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 esto os NOMES CABEALHO dos campos e colocar ['NOME_CAMPO']
        
$CPF_CNPJ_x $registro['CPF_CNPJ'];
$CD_SERVICO_x $registro['CD_SERVICO'];
$DT_PESSOA_SERVICO_x $registro['DT_PESSOA_SERVICO'];
$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  'TB_BI_PESSOA_SERVICO';  // Nome da Tabela
$insert_fields = array(
'CPF_CNPJ'               => "'$CPF_CNPJ_x'",
'CD_SERVICO'             => "$CD_SERVICO_x",
'DT_PESSOA_SERVICO'      => "'$DT_PESSOA_SERVICO_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("No h registros a atualizar, verifique");
} else {
    
sc_error_message("Lojas cadastradas: " $cadastrados);
}


?>


http://www.melhorweb.com.br/artigo/704-Abrindo-arquivos-CSV-com-PHP.htm
« Última modificação: Abril 08, 2016, 04:53:30 pm por Jailton »
O Princpio da Vibrao. "Nada est parado, tudo se move, tudo vibra". Caibalion.

aldir

  • Novato
  • *
  • Mensagens: 29
Re:Importar registros de uma planilha excel
« Responder #11 Online: Abril 13, 2016, 08:45:30 am »
Jailton, bom dia.
Agradeo por escrever o cdigo.

Somente ontem consegui realizar os testes e surgiu a situao :

Quando seleciono o arquivo e clico no OK, comea a leitura do arquivo e no "anda", ou seja, fica processando e trata o sistema. Tenho que iniciar o SC.

O problema deve estar na parte do While, ser que no est faltando algum comando ou funo?

*********************
CDIGO :
********
// Exemplo de scrip para exibir os nomes obtidos no arquivo CSV de exemplo
// CDIGO (OnValidate) :

// Pegando o arquivo com caminho
$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 esto os NOMES CABEALHO dos campos e colocar ['NOME_CAMPO']
        $CPF_CNPJ_x = $registro['CPF_CNPJ'];
       $CD_SERVICO_x = $registro['CD_SERVICO'];
       $DT_PESSOA_SERVICO_x = $registro['DT_PESSOA_SERVICO'];
       $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  = 'TB_BI_PESSOA_SERVICO';  // Nome da Tabela
      $insert_fields = array(
         'CPF_CNPJ'               => "'$CPF_CNPJ_x'",
         'CD_SERVICO'             => "$CD_SERVICO_x",
         'DT_PESSOA_SERVICO'      => "'$DT_PESSOA_SERVICO_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'",
         '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("No h registros a atualizar, verifique");
} else {
    sc_error_message("Pessoas Servio cadastrados: " . $cadastrados);
}

******************
 ARQUIVO CSV
****
['CPF_CNPJ']   ['CD_SERVICO']   ['DT_PESSOA_SERVICO']   ['QT_PESSOA_SERVICO']   ['VL_PESSOA_SERVICO']   ['DS_OBSERVACAO']   ['DS_CONVENIO']   ['DT_CADASTRO']   ['CD_USUARIO_CADASTRO']   ['DT_ATUALIZACAO']   ['CD_USUARIO_ATUALIZACAO']      
1   1   05/04/2016   1   50   a   d   01/01/2010   [gloLogin]   01/01/2010   [gloLogin]      
1   2   05/04/2016   1   70   a   d   01/01/2010   [gloLogin]   01/01/2010   [gloLogin]      



Desde j agradeo.

 

Jailton

  • Expert
  • *****
  • Mensagens: 2034
Re:Importar registros de uma planilha excel
« Responder #12 Online: Abril 13, 2016, 09:47:27 am »
Veja se os delimitador do seu cabealho do seu csv so esses:
$delimitador = ';';
$cerca = '';

Tem gente que usa: , e aspa dupla entre os campos.
$delimitador = ',';
$cerca = '"';

Um exemplo da funo:
http://www.melhorweb.com.br/artigo/704-Abrindo-arquivos-CSV-com-PHP.htm

Essa parte: // Olhar no seu CSV como esto os NOMES CABEALHO dos campos e colocar ['NOME_CAMPO'] no pra vc fazer no CSV pra fazer no cdigo era s pra olhar,
o nome do cabealho no CSV e ajustar o cdigo
Se tava:
NOME;ENDERECO;CIDADE ai no cdigo do php ali naquela parte arruma de acordo com o nome do campo que t no .csv
« Última modificação: Abril 13, 2016, 09:51:10 am por Jailton »
O Princpio da Vibrao. "Nada est parado, tudo se move, tudo vibra". Caibalion.

Kleyber

  • Expert
  • *****
  • Mensagens: 2235
    • Email
Re:Importar registros de uma planilha excel
« Responder #13 Online: Abril 13, 2016, 11:06:46 am »
Pelo visto, no tem delimitador no CSV... da tem que usar brancos mesmo do tipo ' '
Kleyber Derick

ITIL V3 Foundation Certified
Analista de Sistemas
So Lus - Maranho
www.tkinformidia.net

aldir

  • Novato
  • *
  • Mensagens: 29
Re:Importar registros de uma planilha excel
« Responder #14 Online: Abril 14, 2016, 09:05:41 am »
Amigos, bom dia.
Funcionou utilizando os limitadores :
$delimitador = ';';
$cerca = '"';

Agradeo pela ajuda.