Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Migrar un DBF a MySQL bajo ciertos criterios

Estas en el tema de Migrar un DBF a MySQL bajo ciertos criterios en el foro de PHP en Foros del Web. Buenas noches ante todo. Mi problema es el siguiente: En mi trabajo existe un sistema antiguo hecho en entorno DOS y que utiliza tablas DBF. ...
  #1 (permalink)  
Antiguo 23/07/2014, 22:59
 
Fecha de Ingreso: enero-2014
Mensajes: 10
Antigüedad: 10 años, 11 meses
Puntos: 0
Migrar un DBF a MySQL bajo ciertos criterios

Buenas noches ante todo. Mi problema es el siguiente:
En mi trabajo existe un sistema antiguo hecho en entorno DOS y que utiliza tablas DBF. Me encargaron hacer varias aplicaciones web para cada área y que utilice estas tablas como fuente de datos. Cuando empecé con las primeras aplicaciones no tenía ningún inconveniente con exportarlas a CSV y cargar los datos de manera manual, pero cada vez son más las aplicaciones web implementadas que ya no puedo usar la migración manual, así que ahora uso el script PHP que figura en la documentación de PHP y que creo que la mayoría usa para este caso. Todo iba bien hasta que me topé con una tabla que tiene más de 2 millones de registros. El script funciona igual para 1 registro o para muchísimos registros, pero la eficiencia de la aplicación decae debido al tiempo que consume. Otro problema es que durante la migración de DBF a MySQL el script no distingue entre registros válidos y los marcados como eliminados lo que hace que importe todos los registros sin excepción.
Mi consulta es, alguien puede darme una idea de cómo hacer una consulta previa a la tabla DBF y sólo lo que genere esa consulta pasarla a MySQL??
Este es el script que uso para migrar de DBF a MySQL:

Código:
<?php
ini_set('max_execution_time', 300);
require_once('conexion.php'); 

// Abrir en modo lectura y escritura porque se va a realizar todos los días
$ruta = './tmp/casos.dbf';
$db   = dbase_open($ruta, 2);

// Vaciamos la tabla fm_medic
$sql_p = "TRUNCATE TABLE su_karde";
$res_p = mysql_query($sql_p) or die(mysql_error());
$sql_q = "TRUNCATE TABLE tab_consumo";
$res_q = mysql_query($sql_q) or die(mysql_error());

if ($db) 
{ 
	$numero_registros = dbase_numrecords($db); 
	// procesar cada uno de los registros 
	for ($i = 1; $i <= $numero_registros; $i++) 
	{ 
		$fila = dbase_get_record_with_names($db, $i); 
		//asignar cada variable del arreglo fila a una variable individual; 
		$KA_CMATERI  = $fila['KA_CMATERI'];
		$KA_TIPO = $fila['KA_TIPO'];
		$KA_CANTID  = $fila['KA_CANTID'];
		$KA_FECHA  = $fila['KA_FECHA'];
		$KA_PREVEN   = $fila['KA_PREVEN'];
		$KA_CSER   = $fila['KA_CSER'];

		$sql = "INSERT INTO su_karde VALUES ('".$KA_CMATERI."','".$KA_TIPO."','".$KA_CANTID."','".$KA_FECHA."','".$KA_PREVEN."','".$KA_CSER."')";
		$res = mysql_query($sql) or die(mysql_error());
	}

	$sql_t = "SELECT *,(KA_CANTID*KA_PREVEN) AS precio,MONTH(KA_FECHA) AS mes,YEAR(KA_FECHA) AS anno FROM su_karde WHERE KA_CMATERI is NOT null AND YEAR(KA_FECHA)=2014 AND KA_CSER='ARC' GROUP BY KA_CMATERI,mes";
	$res_t = mysql_query($sql_t) or die(mysql_error());
	while ($fila_t = mysql_fetch_array($res_t))
		{
			$sql_f = "INSERT INTO tab_consumo VALUES (null,'".$fila_t['KA_CMATERI']."','".$fila_t['KA_CANTID']."','".$fila_t['precio']."','".$fila_t['mes']."','".$fila_t['anno']."')";
			$res_f = mysql_query($sql_f) or die(mysql_error());
		}
}
else 
{ 
	echo 'No se pudo abrir la tabla'; 
}
?>
  #2 (permalink)  
Antiguo 24/07/2014, 04:39
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 9 meses
Puntos: 574
Respuesta: Migrar un DBF a MySQL bajo ciertos criterios

Antes que nada debo decirte que lo que tienes que hacer es convencer a la empresa que migre todo el sistema.

Supongamos que solo quieres migrar los registros donde "KA_TIPO" sea igual a 1



Código PHP:
Ver original
  1. $fila = dbase_get_record_with_names($db, $i);
  2. if($fila['KA_TIPO']==1){
  3.         //asignar cada variable del arreglo fila a una variable individual;
  4.         $KA_CMATERI  = $fila['KA_CMATERI'];
  5.         $KA_TIPO = $fila['KA_TIPO'];
  6.         $KA_CANTID  = $fila['KA_CANTID'];
  7.         $KA_FECHA  = $fila['KA_FECHA'];
  8.         $KA_PREVEN   = $fila['KA_PREVEN'];
  9.         $KA_CSER   = $fila['KA_CSER'];
  10.  
  11.         $sql = "INSERT INTO su_karde VALUES ('".$KA_CMATERI."','".$KA_TIPO."','".$KA_CANTID."','".$KA_FECHA."','".$KA_PREVEN."','".$KA_CSER."')";
  12.         $res = mysql_query($sql) or die(mysql_error());
  13. }

Como lo ves?

El problema con la tabla de los 2Mk lo tendrás igual, puesto que aun que no los insertes en la tabla MySQL los tienes que leer ... de ahi la importancia de migrar.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 24/07/2014, 11:18
 
Fecha de Ingreso: enero-2014
Mensajes: 10
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: Migrar un DBF a MySQL bajo ciertos criterios

Gracias por tu ayuda quimfv, tu solución me ayudó muchísimo, aunque no sé si se podrá usar más de un criterio (en tu ejemplo usas KA_TIPO=1),es decir, si deseo q al mismo tiempo las fechas (KA_FECHA) sean sólo de este año, se podrá usar algún operador como el AND??
  #4 (permalink)  
Antiguo 25/07/2014, 00:44
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 9 meses
Puntos: 574
Respuesta: Migrar un DBF a MySQL bajo ciertos criterios

Si claro lo que va dentro del parentesis del if () es una expresión que con la sintaxis de php puede ser tan complicada como un WHERE de sql. Lee te el manual te lo explicara mejor que yo.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #5 (permalink)  
Antiguo 25/07/2014, 11:19
 
Fecha de Ingreso: enero-2014
Mensajes: 10
Antigüedad: 10 años, 11 meses
Puntos: 0
Respuesta: Migrar un DBF a MySQL bajo ciertos criterios

Tienes razón, no sé en qué estaba pensando, si el if usado es una expresión de PHP y no del manejo de los DBF. Gracias por tu ayuda, con tu respuesta he solucionado el problema.

Etiquetas: dbf, php+mysql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:13.