Estimados amigos, queria hacerles una consulta dado que tengo un problema con la base de datos que importe desde fox. Resulta que tengo los siguientes campos:
COD_PRESUPUESTO(int), COD_LINEAPRESUP(int), CANT (int) Y DESCRIP (char 40). El problema surge con los registros anteriores al nuevo sistema q estamos implementando (cerca de 20000 registrso) cuando la descripcion es demasiado extensa , por lo que su continuación prosigue en el registro siguiente, duplicandome los dos primeros campos mencionados y colocando en cero la cantidad.
Ejemplo.
COD_PRESUPUESTO LINEAPRESUP CANT DESCRIP
1001 1 3 placares con tres puertas
1001 1 0 centrales y dos cajones
1001 1 0 en la parte inferior
1001 2 1 cama de dos plazas
1002 1 2 puertas macizas
Como veran necesito de algunas sentencias para concatenar el campo descripcion y eliminar los registros duplicados.
Desde ya muchas gracias.
Publicado:
Mar Dic 26, 2006 4:41 pm
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: depurar registros duplicados
Anuncios
ceci_jjy escribió:
Estimados amigos, queria hacerles una consulta dado que tengo un problema con la base de datos que importe desde fox. Resulta que tengo los siguientes campos:
COD_PRESUPUESTO(int), COD_LINEAPRESUP(int), CANT (int) Y DESCRIP (char 40). El problema surge con los registros anteriores al nuevo sistema q estamos implementando (cerca de 20000 registrso) cuando la descripcion es demasiado extensa , por lo que su continuación prosigue en el registro siguiente, du....
Entendemos el problema, aunque lo más sencillo es que realices una miniaplicación con el lenguaje de programación que hayas utilizado para realizar el programa. Con la miniaplicación puedes realizar una consulta SQL (sin ordenar, para que el orden sea el de inserción) e ir concatenando el campo "DESCRIP" mientras el campo COD_PRESUPUESTO sea igual. Y cogerás el valor del campo CANT del primer registro.
El hecho de que no puedas ordenar por COD_PRESUPUESTO y por CANT (descendente) que sería lo ideal es porque no hay ningún campo que te garantice que si tienes tres registros con el mismo COD_PRESUPUESTO no te garantizará que se contatene el valor del campo DESCRIP de forma correcta, te podría quedar:
"placares con tres puertas en la parte inferior centrales y dos cajones"
en vez de
"placares con tres puertas centrales y dos cajones en la parte inferior"
Podrías utilizar una tabla temporal para ir insertando los registros.
El código fuente en Borland Delphi podría ser algo así:
Código:
procedure TForm1.bActualizarTablaClick(Sender: TObject);
var
descripcionCompleta : string;
cantidad : Integer;
begin
//consulta SQL para obtener las líneas con COD_PRESUPUESTO sin duplicidad
tConsulta.Close;
tConsulta.SQL.Clear;
tConsulta.SQL.Add('select distinct (COD_PRESUPUESTO)');
tConsulta.SQL.Add('from nombre_tabla');
tConsulta.Open;
while not tConsulta.Eof do
begin
//consulta SQL para mostrar las líneas duplicadas de cada COD_PRESUPUESTO
tConsulta2.Close;
tConsulta2.SQL.Clear;
tConsulta2.SQL.Add('select COD_PRESUPUESTO, COD_LINEAPRESUP, CANT, DESCRIP');
tConsulta2.SQL.Add('from nombre_tabla');
tConsulta2.SQL.Add('where COD_PRESUPUESTO = :pCodPres');
tConsulta2.ParamByName('pCodPres').DataType := ftInteger;
tConsulta2.ParamByName('pCodPres').AsInteger :=
tConsulta.fieldbyname('COD_PRESUPUESTO').AsInteger;
tConsulta2.Open;
descripcionCompleta := '';
cantidad := tConsulta2.fieldbyname('CANT').AsInteger;
while not tConsulta2.Eof do
begin
if descripcionCompleta = '' then
descripcionCompleta := tConsulta2.fieldbyname('DESCRIP').AsString
else
descripcionCompleta := descripcionCompleta + ' ' +
tConsulta2.fieldbyname('DESCRIP').AsString;
tConsulta2.Next;
end;
//consulta SQL para insertar el registro correcto en una tabla temporal
tConsultaInsercion.Close;
tConsultaInsercion.SQL.Clear;
tConsultaInsercion.SQL.Add('insert into nombre_tabla (');
tConsultaInsercion.SQL.Add(' COD_PRESUPUESTO, COD_LINEAPRESUP, CANT, DESCRIP)');
tConsultaInsercion.SQL.Add(' values (:pCodPres, :pCodLinea, :pCantidad, :pDescripcion)');
tConsultaInsercion.ParamByName('pCodPres').DataType := ftInteger;
tConsultaInsercion.ParamByName('pCodPres').AsInteger :=
tConsulta2.fieldbyname('COD_PRESUPUESTO').asInteger;
tConsultaInsercion.ParamByName('pCodLinea').DataType := ftInteger;
tConsultaInsercion.ParamByName('pCodLinea').AsInteger :=
tConsulta2.fieldbyname('COD_LINEAPRESUP').asInteger;
tConsultaInsercion.ParamByName('pCantidad').DataType := ftInteger;
tConsultaInsercion.ParamByName('pCantidad').AsInteger := cantidad;
tConsultaInsercion.ParamByName('pDescripcion').DataType := ftInteger;
tConsultaInsercion.ParamByName('pDescripcion').AsString := descripcionCompleta;
tConsultaInsercion.ExecSQL;
tConsulta.Next;
end;
tConsulta.Close;
tConsulta2.Close;
tConsultaInsercion.Close;
end;
Donde tConsulta, tConsulta2, tConsultaInsercion son componentes de tipo TQuery, que estarán enlazados con la base de datos SQL Server, mediante un ODBC previamente creado.
Puede publicar nuevos temas en este foro No puede responder a temas en este foro No puede editar sus mensajes en este foro No puede borrar sus mensajes en este foro No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A