예제 #1
0
 public function getDatos(OrigenDatos $origenDato)
 {
     $datos = array();
     $nombre_campos = array();
     if ($origenDato->getSentenciaSql() != '') {
         $conexion = $origenDato->getConexion();
         $conn = $this->getEntityManager()->getRepository('IndicadoresBundle:Conexion')->getConexionGenerica($conexion);
         try {
             $query = $conn->query($origenDato->getSentenciaSql());
             if ($query->rowCount() > 0) {
                 $datos = $query->fetchAll();
                 $nombre_campos = array_keys($datos[0]);
             }
         } catch (\PDOException $e) {
             return false;
         } catch (DBAL\DBALException $e) {
             return false;
         }
     } else {
         $reader = new Excel();
         try {
             $reader->loadFile($origenDato->getAbsolutePath());
             $datos_aux = $reader->getSheet()->toArray(null, false, false, false);
             $nombre_campos = array_values(array_shift($datos_aux));
             // Buscar por columnas que tengan null en el título
             $primer_null = array_search(null, $nombre_campos);
             if ($primer_null == false) {
                 foreach ($datos_aux as $fila) {
                     $datos[] = $fila;
                 }
             } else {
                 $nombre_campos = array_slice($nombre_campos, 0, $primer_null, true);
                 foreach ($datos_aux as $fila) {
                     $datos[] = array_slice($fila, 0, $primer_null, true);
                 }
             }
             $fix_datos = array();
             foreach ($datos as $k => $f) {
                 foreach ($f as $indice => $campo) {
                     $fix_datos[$k][$nombre_campos[$indice]] = trim($campo);
                 }
             }
         } catch (\Exception $e) {
             return false;
         }
         $datos = $fix_datos;
     }
     return $datos;
 }
 public function getDatos($sql, $conexion, $ruta_archivo = null)
 {
     $datos = array();
     $nombre_campos = array();
     if ($ruta_archivo == null) {
         //$conexion = $origenDato->getConexion();
         $conn = $this->getEntityManager()->getRepository('IndicadoresBundle:Conexion')->getConexionGenerica($conexion);
         try {
             if ($conexion->getIdMotor()->getCodigo() == 'pdo_dblib') {
                 $query = mssql_query($sql, $conn);
                 if (mssql_num_rows($query) > 0) {
                     while ($row = mssql_fetch_assoc($query)) {
                         $datos[] = $row;
                     }
                     $nombre_campos = array_keys($datos[0]);
                 }
             } else {
                 $query = $conn->query($sql);
                 while ($row = $query->fetch()) {
                     $datos[] = $row;
                 }
                 $nombre_campos = array_keys($datos[0]);
             }
         } catch (\PDOException $e) {
             return false;
         } catch (\Exception $e) {
             return false;
         } catch (DBAL\DBALException $e) {
             return false;
         }
     } else {
         $reader = new Excel();
         try {
             $reader->loadFile($ruta_archivo);
             $datos_aux = $reader->getSheet()->toArray($nullValue = null, $calculateFormulas = true, $formatData = false, $returnCellRef = false);
             $nombre_campos = array_values(array_shift($datos_aux));
             // Buscar por columnas que tengan null en el título
             $primer_null = array_search(null, $nombre_campos);
             if ($primer_null == false) {
                 foreach ($datos_aux as $fila) {
                     $datos[] = $fila;
                 }
             } else {
                 $nombre_campos = array_slice($nombre_campos, 0, $primer_null, true);
                 foreach ($datos_aux as $fila) {
                     $datos[] = array_slice($fila, 0, $primer_null, true);
                 }
             }
             $fix_datos = array();
             foreach ($datos as $k => $f) {
                 // determinar que datos tienen todos sus campos nulos
                 $todosNULL = true;
                 foreach ($f as $indice => $campo) {
                     $fix_datos[$k][$nombre_campos[$indice]] = trim($campo);
                     if (!empty($fix_datos[$k][$nombre_campos[$indice]])) {
                         $todosNULL = false;
                     }
                 }
                 if ($todosNULL) {
                     unset($fix_datos[$k]);
                 }
             }
         } catch (\Exception $e) {
             return false;
         }
         $datos = $fix_datos;
     }
     return $datos;
 }
예제 #3
0
 /**
  * @Route("/origen_dato/{id}/leer", name="origen_dato_leer", options={"expose"=true})
  */
 public function leerOrigenAction(OrigenDatos $origenDato)
 {
     $resultado = array('estado' => 'ok', 'mensaje' => '', 'tipo_origen' => '', 'es_catalogo' => '', 'nombre_campos' => array(), 'datos' => array());
     $recargar = $this->getRequest()->get('recargar') == 'false' ? false : true;
     $em = $this->getDoctrine()->getManager();
     $resultado['es_catalogo'] = $origenDato->getEsCatalogo() ? true : false;
     $sql = "SELECT tp\n                    FROM IndicadoresBundle:TipoCampo tp\n                    ORDER BY tp.descripcion";
     $resultado['tipos_datos'] = $em->createQuery($sql)->getArrayResult();
     $sql = "SELECT dic\n                    FROM IndicadoresBundle:Diccionario dic\n                    ORDER BY dic.descripcion";
     $resultado['diccionarios'] = $em->createQuery($sql)->getArrayResult();
     $sql = "SELECT sv\n                    FROM IndicadoresBundle:SignificadoCampo sv\n                    WHERE sv.usoEnCatalogo = :uso_en_catalogo\n                    ORDER BY sv.descripcion";
     $resultado['significados'] = $em->createQuery($sql)->setParameter('uso_en_catalogo', $resultado['es_catalogo'] ? 'true' : 'false')->getArrayResult();
     //recuperar los campos ya existentes en el origen de datos
     $campos_existentes = $em->getRepository('IndicadoresBundle:Campo')->findBy(array('origenDato' => $origenDato));
     $campos = array();
     foreach ($campos_existentes as $campo) {
         $campos[$campo->getNombre()]['id'] = $campo->getId();
     }
     $resultado['campos'] = $campos;
     if (count($campos_existentes) == 0 or $recargar == true) {
         if ($origenDato->getSentenciaSql() != '') {
             $resultado['tipo_origen'] = 'sql';
             $sentenciaSQL = $origenDato->getSentenciaSql();
             $conexiones = $origenDato->getConexiones();
             if ($conexiones[0] == null) {
                 $resultado['mensaje'] = $this->get('translator')->trans('sentencia_error') . ': ' . $this->get('translator')->trans('_no_conexion_configurada_');
                 $resultado['estado'] = 'error';
             } else {
                 $conn = $this->getConexionGenerica('consulta_sql', $conexiones[0]);
                 try {
                     if ($this->driver == 'pdo_dblib') {
                         $sentenciaSQL = str_ireplace('SELECT', 'SELECT TOP 20 ', $sentenciaSQL);
                         $query = mssql_query($sentenciaSQL, $conn);
                         if (mssql_num_rows($query) > 0) {
                             while ($row = mssql_fetch_assoc($query)) {
                                 $resultado['datos'][] = $row;
                             }
                             $resultado['nombre_campos'] = array_keys($resultado['datos'][0]);
                         }
                     } else {
                         $query = $conn->query($sentenciaSQL . ' LIMIT 20');
                         if ($query->rowCount() > 0) {
                             $resultado['datos'] = $query->fetchAll();
                             $resultado['nombre_campos'] = array_keys($resultado['datos'][0]);
                         }
                     }
                     $resultado['estado'] = 'ok';
                     $resultado['mensaje'] = '<span style="color: green">' . $this->get('translator')->trans('sentencia_success');
                 } catch (\PDOException $e) {
                     $resultado['mensaje'] = $this->get('translator')->trans('sentencia_error') . ' 1: ' . $e->getMessage();
                 } catch (DBAL\DBALException $e) {
                     $resultado['mensaje'] = $this->get('translator')->trans('sentencia_error') . ' 2: ' . $e->getMessage();
                 } catch (\Exception $e) {
                     $resultado['mensaje'] = $this->get('translator')->trans('sentencia_error') . ' 3: ' . $e->getMessage();
                 }
             }
         } else {
             $resultado['tipo_origen'] = 'archivo';
             $reader = new Excel();
             try {
                 $reader->loadFile($origenDato->getAbsolutePath());
                 $datos = $reader->getSheet()->toArray($nullValue = null, $calculateFormulas = true, $formatData = false, $returnCellRef = false);
                 $resultado['nombre_campos'] = array_values(array_shift($datos));
                 // Buscar por columnas que tengan null en el título
                 $primer_null = array_search(null, $resultado['nombre_campos']);
                 if ($primer_null == false) {
                     foreach ($datos as $fila) {
                         $resultado['datos'][] = $fila;
                     }
                 } else {
                     $resultado['nombre_campos'] = array_slice($resultado['nombre_campos'], 0, $primer_null, true);
                     foreach ($datos as $fila) {
                         $resultado['datos'][] = array_slice($fila, 0, $primer_null, true);
                     }
                 }
                 $resultado['estado'] = 'ok';
                 // Poner el nombre de la columna como indice del arreglo
                 $aux = array();
                 foreach ($resultado['datos'] as $fila) {
                     $aux[] = array_combine($resultado['nombre_campos'], $fila);
                 }
                 $resultado['datos'] = $aux;
             } catch (\Exception $e) {
                 $resultado['estado'] = 'error';
                 $resultado['mensaje'] = $e->getMessage();
             }
         }
         // Guardar los campos
         if ($resultado['estado'] == 'ok') {
             $nombres_id = array();
             $campo = array();
             //Por defecto poner tipo entero
             $tipoCampo = $em->getRepository("IndicadoresBundle:TipoCampo")->findOneByCodigo('integer');
             $util = new \MINSAL\IndicadoresBundle\Util\Util();
             foreach ($resultado['nombre_campos'] as $k => $nombre) {
                 // si existe no guardarlo
                 $nombre_campo = $util->slug($nombre);
                 if (!array_key_exists($nombre_campo, $campos)) {
                     $campo[$k] = new Campo();
                     $campo[$k]->setNombre($nombre_campo);
                     $campo[$k]->setOrigenDato($origenDato);
                     $campo[$k]->setTipoCampo($tipoCampo);
                     $em->persist($campo[$k]);
                     $nombres_id[$campo[$k]->getId()] = $nombre_campo;
                 } else {
                     $nombres_id[$campos[$nombre_campo]['id']] = $nombre_campo;
                 }
             }
             //Borrar algún campo que ya no se use
             foreach ($campos_existentes as $campo) {
                 if (!in_array($campo->getNombre(), $nombres_id)) {
                     $em->remove($campo);
                 }
             }
             try {
                 $em->flush();
             } catch (\Exception $e) {
                 $resultado = array('estado' => 'error', 'mensaje' => '<div class="alert alert-danger"> ' . $this->get('translator')->trans('camio_no_realizado') . '</div>');
             }
             $resultado['nombre_campos'] = $nombres_id;
         }
         $campos_existentes = $em->getRepository('IndicadoresBundle:Campo')->findBy(array('origenDato' => $origenDato));
     } else {
         foreach ($campos_existentes as $campo) {
             $nombre_campos[$campo->getId()] = $campo->getNombre();
         }
         $resultado['nombre_campos'] = $nombre_campos;
     }
     $campos = array();
     foreach ($campos_existentes as $campo) {
         $campos[$campo->getNombre()]['id'] = $campo->getId();
         $campos[$campo->getNombre()]['significado'] = $campo->getSignificado() ? $campo->getSignificado()->getId() : null;
         $campos[$campo->getNombre()]['significado_codigo'] = $campo->getSignificado() ? $campo->getSignificado()->getCodigo() : null;
         $campos[$campo->getNombre()]['diccionario'] = $campo->getDiccionario() ? $campo->getDiccionario()->getId() : null;
         $campos[$campo->getNombre()]['tipo'] = $campo->getTipoCampo() ? $campo->getTipoCampo()->getId() : null;
     }
     $resultado['campos'] = $campos;
     //Cambiar la estructura
     $aux = array();
     foreach ($resultado['nombre_campos'] as $n) {
         $aux[$n] = '';
     }
     foreach (array_slice($resultado['datos'], 0, 10) as $fila) {
         foreach ($fila as $k => $v) {
             $aux[$util->slug($k)] .= trim(mb_check_encoding($v, 'UTF-8') ? $v : utf8_encode($v)) . ', ';
         }
     }
     $resultado['datos'] = $aux;
     return new Response(json_encode($resultado));
 }
예제 #4
0
 /**
  * @Route("/{id}/leer", name="origen_dato_leer", options={"expose"=true})
  */
 public function leerOrigenAction($id)
 {
     $resultado = array('estado' => 'error', 'mensaje' => '', 'tipos_datos' => array(), 'tipo_origen' => '', 'es_catalogo' => '', 'significados' => array(), 'nombre_campos' => array(), 'datos' => array());
     $em = $this->getDoctrine()->getEntityManager();
     $origenDato = $em->find("IndicadoresBundle:OrigenDatos", $id);
     $resultado['es_catalogo'] = $origenDato->getEsCatalogo() ? true : false;
     $sql = "SELECT tp \n                    FROM IndicadoresBundle:TipoCampo tp \n                    ORDER BY tp.descripcion";
     $resultado['tipos_datos'] = $em->createQuery($sql)->getArrayResult();
     $sql = "SELECT sv \n                    FROM IndicadoresBundle:SignificadoCampo sv                      \n                    WHERE sv.usoEnCatalogo = :uso_en_catalogo \n                    ORDER BY sv.descripcion";
     $resultado['significados'] = $em->createQuery($sql)->setParameter('uso_en_catalogo', $resultado['es_catalogo'] ? 'true' : 'false')->getArrayResult();
     //recuperar los campos ya existentes en el origen de datos
     $campos_existentes = $em->getRepository('IndicadoresBundle:Campo')->findBy(array('origenDato' => $origenDato));
     $campos = array();
     foreach ($campos_existentes as $campo) {
         $campos[$campo->getNombre()]['id'] = $campo->getId();
     }
     $resultado['campos'] = $campos;
     if ($origenDato->getSentenciaSql() != '') {
         $resultado['tipo_origen'] = 'sql';
         $sentenciaSQL = $origenDato->getSentenciaSql();
         $idConexion = $origenDato->getConexion()->getId();
         $conn = $this->getConexionGenerica('consulta_sql', $idConexion);
         try {
             $query = $conn->query($sentenciaSQL . ' LIMIT 20');
             if ($query->rowCount() > 0) {
                 $resultado['datos'] = $query->fetchAll();
                 $resultado['nombre_campos'] = array_keys($resultado['datos'][0]);
             }
             $resultado['estado'] = 'ok';
             $resultado['mensaje'] = '<span style="color: green">' . $this->get('translator')->trans('sentencia_success') . '</span>';
         } catch (\PDOException $e) {
             $resultado['mensaje'] = '<span style="color: red">' . $this->get('translator')->trans('sentencia_error') . ': ' . $e->getMessage() . '</span>';
         } catch (DBAL\DBALException $e) {
             $resultado['mensaje'] = '<span style="color: red">' . $this->get('translator')->trans('sentencia_error') . ': ' . $e->getMessage() . '</span>';
         }
     } else {
         $resultado['tipo_origen'] = 'archivo';
         $reader = new Excel();
         try {
             $reader->loadFile($origenDato->getAbsolutePath());
             $datos = $reader->getSheet()->toArray($nullValue = null, $calculateFormulas = false, $formatData = false, $returnCellRef = false);
             $resultado['nombre_campos'] = array_values(array_shift($datos));
             // Buscar por columnas que tengan null en el título
             $primer_null = array_search(null, $resultado['nombre_campos']);
             if ($primer_null == false) {
                 foreach ($datos as $fila) {
                     $resultado['datos'][] = $fila;
                 }
             } else {
                 $resultado['nombre_campos'] = array_slice($resultado['nombre_campos'], 0, $primer_null, true);
                 foreach ($datos as $fila) {
                     $resultado['datos'][] = array_slice($fila, 0, $primer_null, true);
                 }
             }
             $resultado['estado'] = 'ok';
             // Poner el nombre de la columna como indice del arreglo
             $aux = array();
             foreach ($resultado['datos'] as $fila) {
                 $aux[] = array_combine($resultado['nombre_campos'], $fila);
             }
             $resultado['datos'] = $aux;
         } catch (\Exception $e) {
             $resultado['mensaje'] = '<span style="color: red">' . $e->getMessage() . '</span>';
         }
     }
     // Guardar los campos
     if ($resultado['estado'] == 'ok') {
         $nombres_id = array();
         $campo = array();
         //Por defecto poner tipo texto
         $tipo_campo = $em->getRepository("IndicadoresBundle:TipoCampo")->findOneByCodigo('integer');
         $util = new \MINSAL\IndicadoresBundle\Util\Util();
         foreach ($resultado['nombre_campos'] as $k => $nombre) {
             // si existe no guardarlo
             $nombre_campo = $util->slug($nombre);
             if (!array_key_exists($nombre_campo, $campos)) {
                 $campo[$k] = new Campo();
                 $campo[$k]->setNombre($nombre_campo);
                 $campo[$k]->setOrigenDato($origenDato);
                 $campo[$k]->setTipoCampo($tipo_campo);
                 $em->persist($campo[$k]);
                 $nombres_id[$campo[$k]->getId()] = $nombre_campo;
             } else {
                 $nombres_id[$campos[$nombre_campo]['id']] = $nombre_campo;
             }
         }
         try {
             $em->flush();
         } catch (\Exception $e) {
             $resultado = array('estado' => 'error', 'mensaje' => '<div class="alert alert-error"> ' . $this->get('translator')->trans('camio_no_realizado') . '</div>');
         }
         $resultado['nombre_campos'] = $nombres_id;
     }
     $campos_existentes = $em->getRepository('IndicadoresBundle:Campo')->findBy(array('origenDato' => $origenDato));
     $campos = array();
     foreach ($campos_existentes as $campo) {
         $campos[$campo->getNombre()]['id'] = $campo->getId();
         $campos[$campo->getNombre()]['significado'] = $campo->getSignificado() ? $campo->getSignificado()->getId() : null;
         $campos[$campo->getNombre()]['significado_codigo'] = $campo->getSignificado() ? $campo->getSignificado()->getCodigo() : null;
         $campos[$campo->getNombre()]['tipo'] = $campo->getTipoCampo() ? $campo->getTipoCampo()->getId() : null;
     }
     $resultado['campos'] = $campos;
     //Cambiar la estructura
     $aux = array();
     foreach ($resultado['nombre_campos'] as $n) {
         $aux[$n] = '';
     }
     foreach (array_slice($resultado['datos'], 0, 10) as $fila) {
         foreach ($fila as $k => $v) {
             $aux[$k] .= $v . ', ';
         }
     }
     $resultado['datos'] = $aux;
     return new Response(json_encode($resultado));
 }