Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Se pierden datos en Insercion Masiva (https://www.clubdelphi.com/foros/showthread.php?t=54653)

caifan_0883 26-03-2008 16:08:33

Se pierden datos en Insercion Masiva
 
Hola compañeros foreros.
Me surgio un problemilla, estoy insertando unos 2500 registros de excel a un BD en Firebird 2.0. Todo funciona "bien". No salta error alguno.
Pero al momento de checar los datos hay algunos de ellos que no aparecen cierto dato que necesito.
Estoy insertando en una Tabla llamada ARTICULOS y en otra CODIGOS.
Me aparece el articulo pero el codigo, el cual hace referencia.

Aqui les dejo la parte de mi codigo para ver si me podrian ayudar donde esta mi error. Gracias y Saludos.

Código:

procedure TForm1.BtnArticulosClick(Sender: TObject);
Var
  Excel:Variant;
  DescCorta,DescNormal,CodigoB1,CodigoB2,CodigCateg,Categ:String;
  I,J,Aux,IdCateg,IdArt:Integer;
begin
  Aux:=0;
  IBQuery1.Active:=False;
 
  Excel:=CreateOleObject('Excel.Application');
  Excel.WorkBooks.Open(Ruta+'\NARTE.xls');
  For I:=1 to 2552 Do
    Begin
        IBQuery1.SQL.Clear;
        IBQuery2.SQL.Clear;
        CodigCateg:=Copy(Excel.Cells[I,1].Value,0,3);
        CodigoB2:=Excel.Cells[I,1].Value;
        DescNormal:=Trim(Copy(Excel.Cells[I,2].Value,0,44));
        DescCorta:=Trim(Copy(Excel.Cells[I,2].Value,0,19));
        CodigoB1:=Copy(Excel.Cells[I,3].value,0,13);
        For J:=0 to LBCategorias.Items.Count-1 Do
          Begin
              If CodigCateg = Copy(LbCategorias.Items[J],0,3) then
                Begin
                Aux:=J;
                Break;
                End;
          End;
 
        Categ:=Trim(Copy(LbCategorias.Items[Aux],4,15));
        IBQueryAux.SQL.Clear;
        IBQueryAux.SQL.Text:='Select CLAVE From CATEGORIAS Where Nombre=:IdNombre';
        IBQueryAux.ParamByName('IdNombre').AsString:=Categ;
        IBqueryAux.Open;
        IdCateg:=IBQueryAux.FieldByname('Clave').AsInteger;
 
        With IBQuery1 Do
            Begin
              SQL.Text:='Insert into ARTICULOS (DESC_CORTA,DESC_LARGA,PRECIO1,PRECIO2,';
              SQL.Add('PRECIO3,PRECIO4,ULT_COSTO,COSTOPROM,DESC_AUTO,');
              SQL.Add('EXISTENCIA,MINIMO,MAXIMO,CATEGORIA,DEPARTAMENTO,TIPO,');
              SQL.Add('UNIDADE,CANTIDAD_CNT,PROVEEDOR1,PROVEEDOR2,IVA,');
              SQL.Add('FECHA_CAP,FECHA_UMOV,ESTATUS,ULTVENTA,ULTCOMPRA,UTILIDAD)');
              SQL.Add(' Values (:Vari2,:Vari3,:Vari4,:Vari5,:Vari6,:Vari7,');
              SQL.Add(':Vari8,:Vari9,:Vari10,:Vari11,:Vari12,:Vari13,');
              SQL.Add(':Vari14,:Vari15,:Vari16,:Vari17,:Vari18,:Vari19,');
              SQL.Add(':Vari20,:Vari21,:Vari22,:Vari23,:Vari24,:Vari25,');
              SQL.Add(':Vari26,:Vari27)');
              //ParamByName('Vari1').AsInteger:=I;
              ParamByName('Vari2').AsString:=DescCorta;
              ParamByName('Vari3').AsString:=DescNormal;
              ParamByName('Vari4').AsFloat:=1.00;
              ParamByName('Vari5').AsFloat:=0.00;
              ParamByName('Vari6').AsFloat:=0.00;
              ParamByName('Vari7').AsFloat:=0.00;
              ParamByName('Vari8').AsFloat:=1.00;
              ParamByName('Vari9').AsFloat:=1.00;
              ParamByName('Vari10').AsString:='N';
              ParamByName('Vari11').AsFloat:=0.00;
              ParamByName('Vari12').AsFloat:=0.00;
              ParamByName('Vari13').AsFloat:=0.00;
              ParamByName('Vari14').AsInteger:=IdCateg;
              ParamByName('Vari15').AsString:='';
              ParamByName('Vari16').AsInteger:=3;
              ParamByName('Vari17').AsInteger:=1;
              ParamByName('Vari18').AsString:='N';
              ParamByName('Vari19').AsString:='';
              ParamByName('Vari20').AsString:='';
              ParamByName('Vari21').AsFloat:=0.00;
              ParamByName('Vari22').AsDateTime:=Date;
              ParamByName('Vari23').AsDateTime:=Date;
              ParamByName('Vari24').AsString:='A';
              ParamByName('Vari25').AsString:='';
              ParamByName('Vari26').AsString:='';
              ParamByName('Vari27').AsString:='';
              ExecSQL;
              Transaction.Commit;
            End;
        IBQuery1.SQL.Clear;
        IBQuery1.SQL.Text:='Select CLAVE From ARTICULOS Where Desc_Corta=:Descrip';
        IBQuery1.ParamByName('Descrip').AsString:=DescCorta;
        IBQuery1.Open;
        IdArt:=IBQuery1.FieldByName('Clave').AsInteger;
 
With IBQuery1 Do
            Begin
                SQL.Text:='Insert into CODIGOS (ARTICULO,CODIGO,TIPO) Values (:IdArt,:IdCod,:IdTip)';
                ParamByName('IdArt').AsInteger:=IdArt;
                ParamByName('IdCod').AsString:=CodigoB1;
                ParamByName('IdTip').AsString:='P';
                ExecSQL;
                Transaction.Commit;
            End;
End;

Como datos, manejo los componentes de la Pestaña Interbase, Delphi 7 y FireBird 2.0 Saludos.

Los datos de articulos se insertan correctamente y los de codigos de barra algunos no. Cuando habla de algunos son unos 400 registros que no pone el codigo, y el los demas estan correctamente los datos.

Saludos y Gracias de Nuevo

gmontes 26-03-2008 17:42:51

tengo el mismo problema y esto es lo que me respondieron

http://www.clubdelphi.com/foros/showthread.php?t=54468

reinstale firebird con la ultima version y donde ya estaba instalado

lo desinstale y busque eliminar los archivos fbclient.dll y gds32.dll en <system32> y reinstale de nuevo. fue la ultima sugerencia.


suerte

caifan_0883 26-03-2008 18:12:29

Cita:

Empezado por gmontes (Mensaje 275393)
tengo el mismo problema y esto es lo que me respondieron

http://www.clubdelphi.com/foros/showthread.php?t=54468

reinstale firebird con la ultima version y donde ya estaba instalado

lo desinstale y busque eliminar los archivos fbclient.dll y gds32.dll en <system32> y reinstale de nuevo. fue la ultima sugerencia.


suerte

Gracias GMontes (Paisa). Ya habia checado tu post, pero habia descartado reinstalar otro motor de Firebird, pensando que era error mio en el codigo o habia descartado alguna otra cosa.
Pero en estos momento voy a buscar la version de firebird que te proponen en el otro post.

Gracias por la ayuda y gracias.

caifan_0883 26-03-2008 18:24:33

Igual
 
Bueno desistale el Firebird version 2.0.0.12748 y me baje e instale la version recomendada 2.0.3.12981.

Hice la pruebas de insercion.

Y nada todo sigue igual como con la version anterior. A lo mejor es algo en mi codigo o algun dato que se me paso.

Saludos y gracias.

cloayza 26-03-2008 23:12:06

Analisando un poco el codigo, lo unico que se me ocurre es que se este produciendo un error en la insercion de los codigos.

La sospecha es que la seleccion de registros este dando 0 registros, esto debido a la comparacion de 2 strings que estas haciendo Desc_Corta=:Descrip';

Supongamos que:
Desc_Corta='Azucar'
:Descrip='AZUCAr'

Al realizar la seleccion con Where Desc_Corta=:Descrip';, esta dara cero registros.

Código Delphi [-]
IBQuery1.SQL.Clear;
         IBQuery1.SQL.Text:='Select CLAVE From ARTICULOS Where Desc_Corta=:Descrip'; //Sugiero Upper->(Desc_Corta)=Upper(:Descrip)       IBQuery1.ParamByName('Descrip').AsString:=DescCorta;
         IBQuery1.Open;

         If IBQuery1.RecordCount=0 Then
            //No se encontro ningun registro que cumpla la condicion Where;
        
         
         IdArt:=IBQuery1.FieldByName('Clave').AsInteger;
         //Si no se encontraron registros IdArt=0;

Espero que sirva en algo...

Saludos desde
Concepcion-Chile

caifan_0883 27-03-2008 00:58:47

Cita:

Empezado por cloayza (Mensaje 275512)
Analisando un poco el codigo, lo unico que se me ocurre es que se este produciendo un error en la insercion de los codigos.

La sospecha es que la seleccion de registros este dando 0 registros, esto debido a la comparacion de 2 strings que estas haciendo Desc_Corta=:Descrip';

Supongamos que:
Desc_Corta='Azucar'
:Descrip='AZUCAr'

Al realizar la seleccion con Where Desc_Corta=:Descrip';, esta dara cero registros.


Código Delphi [-]IBQuery1.SQL.Clear;
IBQuery1.SQL.Text:='Select CLAVE From ARTICULOS Where Desc_Corta=:Descrip'; //Sugiero Upper->(Desc_Corta)=Upper(:Descrip) IBQuery1.ParamByName('Descrip').AsString:=DescCorta;
IBQuery1.Open;

If IBQuery1.RecordCount=0 Then
//No se encontro ningun registro que cumpla la condicion Where;


IdArt:=IBQuery1.FieldByName('Clave').AsInteger;
//Si no se encontraron registros IdArt=0;





Espero que sirva en algo...

Saludos desde
Concepcion-Chile


Gracias por contestar Cloayza.

Conforme a lo que me sugieres sobre el Upper, todo el catalogo que quiero manejar esta en mayusculas por eso descarto esa posibilidad.

Y donde pongo el codigo para la seleccion de la CLAVE de la tabla ARTICULOS, es un valor autoincrementable y ademas primaria, entonces lo guardo en una variable lo que me lanza el Query.

De todos modos voy a realizar eso del UPPER por si las malditas moscas.

Muchas Gracias por contestar y Saludos desde Los Mochis, Sinaloa, México.


La franja horaria es GMT +2. Ahora son las 16:28:06.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi