PDA

Ver la Versión Completa : Migrar Registros


feliz-58
26-12-2018, 01:22:48
Saludos, una pregunta,
Tengo una tabla en access que tiene 3,155,602 registros, cuando intento importarlo a SQL server 2018, solo importa 65,534.

Alguna idea para migrarlos todos? o es mejor, utilizarlos desde ahi? (utilizar ambas bases de datos)

Que contiene la base de datos? la lista de RNC de mi Pais.

Casimiro Notevi
26-12-2018, 11:21:40
Creo que lo más fácil es que lo leas directamente del fichero original, que es un texto normal.

Ñuño Martínez
26-12-2018, 13:59:38
Fíjate que exporta justo 65.534, es decir, casi el máximo que permite direccionar con 16 bits (63.535). Me hace sospechar que hay un campo con la ID que debería ser de, al menos, 32 bit pero que se ha definido como 16. Revisa la definición de los campos.

feliz-58
26-12-2018, 18:48:31
Creo que lo más fácil es que lo leas directamente del fichero original, que es un texto normal.

Esta en este formato.

Como esta dividido por | Solo me interesa obtener la primera, segunda y cuarta al momento de hacer una consulta.
Imagen (https://ibb.co/k0kvpFk)



Fíjate que exporta justo 65.534, es decir, casi el máximo que permite direccionar con 16 bits (63.535). Me hace sospechar que hay un campo con la ID que debería ser de, al menos, 32 bit pero que se ha definido como 16. Revisa la definición de los campos.

Si mal no recuerdo en una de las pruebas puse todos los campos VarcharMax y hacia lo mismo...

Casimiro Notevi
26-12-2018, 18:52:30
No somos adivinos y no vemos tu ordenador/computadora.

feliz-58
26-12-2018, 19:32:11
No somos adivinos y no vemos tu ordenador/computadora.

Puse la imagen, no entiendo el porqué de tu sarcasmo, por si acaso, uso delphi 7.

Casimiro Notevi
26-12-2018, 19:54:42
Puse la imagen, no entiendo el porqué de tu sarcasmo, por si acaso, uso delphi 7.
No es sarcasmo :confused:
Digo que no somos adivinos porque dices que tan solo puedes traspasar una cantidad determinada de registros, pues necesitamos ver el código fuente que estás usando y la estructura de la base de datos destino.

feliz-58
26-12-2018, 20:33:28
No es sarcasmo :confused:
Digo que no somos adivinos porque dices que tan solo puedes traspasar una cantidad determinada de registros, pues necesitamos ver el código fuente que estás usando y la estructura de la base de datos destino.

El migrado no lo hice a través de delphi, lo hice desde el mismo SQL Server importando el fichero de base de datos Access.

En su defecto, si hay alguna forma en Delphi, de buscar dentro del fichero txt y Seleccionar la información necesitada, seria un éxito.

Casimiro Notevi
26-12-2018, 23:33:08
El migrado no lo hice a través de delphi, lo hice desde el mismo SQL Server importando el fichero de base de datos Access.
En su defecto, si hay alguna forma en Delphi, de buscar dentro del fichero txt y Seleccionar la información necesitada, seria un éxito.
Lo tienes fácil si los campos están separados por un carácter |

feliz-58
27-12-2018, 04:17:02
Lo tienes fácil si los campos están separados por un carácter |

He estado buscando, pero solo he visto lecturas de TXT y comprobar si existen palabras...

Casimiro Notevi
27-12-2018, 09:40:13
Pues eso es, un fichero TXT y encontrar palabras, en este caso una palabra de longitud 1.
Ya sabes, abres el TextFile y la conexión a la BD.
Lees línea a línea hasta eof del fichero.
Primer campo hasta el primer |
Segundo campo hasta el segundo |
Saltas un |
Tercer campo hasta el siguiente |
Guardas en la BD los campos
Finalmente, cierras el fichero.Y listo.

Casimiro Notevi
28-12-2018, 00:04:19
¿Has conseguido hacerlo?
¿Necesitas alguna ayuda?

feliz-58
28-12-2018, 00:52:20
Pues eso es, un fichero TXT y encontrar palabras, en este caso una palabra de longitud 1.
Ya sabes, abres el TextFile y la conexión a la BD.
Lees línea a línea hasta eof del fichero.
Primer campo hasta el primer |
Segundo campo hasta el segundo |
Saltas un |
Tercer campo hasta el siguiente |
Guardas en la BD los campos
Finalmente, cierras el fichero.Y listo.

Hasta ahora buscando solo tengo esto, que es para leer caracter por caracter, pero no se como hacer que haga lo que quiero.


var
Lista: TStringList;
cadena ,Registro,cadena2:string;
I, k, j: Integer;
begin
Lista:= TStringList.Create;
try
Lista.LoadFromFile('c:\RNC.txt');
for I := 0 to Lista.Count - 1 do
begin
cadena:= Lista.Strings[I];
k:=Length(cadena);
for j := 0 to k do
begin
cadena2:=Copy(cadena,j,1);
if cadena2='|' then
begin
ShowMessage(Registro);
Registro:='';
end

else
begin
Registro:=Registro + cadena2;
end

end;

end;

finally
Lista.Free;
end;

end;


Si supiera como hacerlo no estaría aquí...
Mi fuerte es la reparación de laptops, Lcd, plasmas, y alguna que otra cosa dentro de la electronica, no la elaboración de código, la elaboración de código lo hago porque me gusta aprender programación.

Casimiro Notevi
28-12-2018, 11:45:32
Crea un proyecto nuevo.
Añade un botón, 3 labels y un memo, por ejemplo.
En el click del botón pega esto:
procedure TForm1.bt1Click(Sender: TObject);
const
crlf = chr(13)+chr(10);
var
F : TextFile;
cLin : string;
iPos : Integer;
cCampo1, cCampo2, cCampo3 : string;
begin
// Aquí deberías conectar con tu base de datos y preparar el insert, etc.
//
// Ahora empezamos a leer el fichero línea a línea y vamos insertando en la BD.
AssignFile(F,'c:\DGII_RNC.TXT');
Reset(F);
ReadLn(F,cLin);
while not eof(F) do
begin
// primer dato, hasta el primer |
iPos := Pos('|',cLin);
cCampo1 := Copy(cLin,0,iPos-1);
// Cortamos de la línea el primer dato que hemos usado
cLin := copy(clin,iPos+1,length(cLin));
// leemos hasta el siguiente |
iPos := Pos('|',cLin);
cCampo2 := Copy(cLin,0,iPos-1);
// Cortamos de la línea ese dato que hemos usado
cLin := copy(clin,iPos+1,length(cLin));
// buscamos el siguiente |
iPos := Pos('|',cLin);
// Cortamos de la línea porque no nos sirve
cLin := copy(clin,iPos+1,length(cLin));
// buscamos el siguiente |
iPos := Pos('|',cLin);
cCampo3 := Copy(cLin,0,iPos-1);
// lo mostramos en pantalla, si queremos
lb1.Caption := ccampo1;
lb2.Caption := ccampo2;
lb3.Caption := ccampo3;
// lo añado a un memo, tú deberías guardar los datos en tu base de datos
mmo1.Lines.Add(ccampo1+crlf+ccampo2+crlf+ccampo3+crlf);
// y pasamos a leer la siguiente línea
ReadLn(F,cLin);
end;
CloseFile(F);
end;

Los labels los he nombrado: lb1, lb2 y lb3
El botón lo he nombrado: bt1
El memo lo he nombrado: mmo1

feliz-58
29-12-2018, 02:28:59
Wow, funciona excelente Maestro, Gracias por compartir, que delphi usas?

Casimiro Notevi
29-12-2018, 11:00:55
Es un delphi 2007, pero es un código estandar, funcionará en todos los delphi.

feliz-58
29-12-2018, 15:19:06
Es un delphi 2007, pero es un código estandar, funcionará en todos los delphi.

No lo pregunto por el código, una vez tenia un delphi que era el 2007 pero una versión mas "didactica", cuando comenzabas a escribir código te salia como una ayuda predictiva. y me acorde de ellos porque en esa versión los componentes cuando los ponías en el formulario aparecían con otro nombre, en la versión normal salen como: Label1, en esa que te menciono salen lb1.

Referente al código, ya hice la importación, y le agregue dos campos mas, en total, se importaron 3,203,126

Casimiro Notevi
29-12-2018, 17:13:06
Lo del renombrado es porque lo tengo configurado así con el asistente cnpack (http://www.cnpack.org/index.php?lang=en) instalado.

feliz-58
29-12-2018, 17:41:30
Lo del renombrado es porque lo tengo configurado así con el asistente cnpack (http://www.cnpack.org/index.php?lang=en) instalado.

Ya lo instale, lo que mencione era algo parecido, gracias.