Welder 0 Denunciar post Postado Abril 30, 2009 Estou importando um txt para fdb usando dbexpress e clientdataset, uso o código procedure TfrmPrincipal.BitBtn1Click(Sender: TObject); var Txt: Textfile; Terceiro, Ano, Mes, Dia: string; begin BitBtn1.Enabled:= false; if OpenDialog1.Execute then begin dmImportar.cdsTerceiros.Open; AssignFile(Txt,(OpenDialog1.FileName));//{ NOME do arquivo texto} Animate1.Visible:= true; Animate1.Active:= true; Reset(Txt); While not Eoln(Txt) do begin Readln(Txt,Terceiro); dmImportar.cdsTerceiros.Insert; dmImportar.cdsTerceiros.FieldByName('TIPO').Value:= Copy(Terceiro,1,3); dmImportar.cdsTerceiros.FieldByName('ORDEM').Value:= Copy(Terceiro,4,5); dmImportar.cdsTerceiros.FieldByName('FILLER1').Value:= Copy(Terceiro,09,2); dmImportar.cdsTerceiros.FieldByName('PERSONALIDADE').Value:= StrToInt(Copy(Terceiro,11,1)); dmImportar.cdsTerceiros.FieldByName('CNPJCPF').Value:= Copy(Terceiro,12,14); dmImportar.cdsTerceiros.FieldByName('RAZAOSOCIAL').Value:= Copy(Terceiro,26,60); dmImportar.cdsTerceiros.FieldByName('APELIDO').Value:= Copy(Terceiro,86,20); dmImportar.cdsTerceiros.FieldByName('ENDERECO_TIPO').Value:= Copy(Terceiro,106,10); dmImportar.cdsTerceiros.FieldByName('ENDERECO_LOGRADOURO').Value:= Copy(Terceiro,116,60); dmImportar.cdsTerceiros.FieldByName('NUMERO').Value:= Copy(Terceiro,176,10); dmImportar.cdsTerceiros.FieldByName('CEP').Value:= Copy(Terceiro,206,09); dmImportar.cdsTerceiros.FieldByName('BAIRRO').Value:= Copy(Terceiro,215,30); dmImportar.cdsTerceiros.FieldByName('MUNICIPIO').Value:= Copy(Terceiro,245,30); dmImportar.cdsTerceiros.FieldByName('UF').Value:= Copy(Terceiro,275,2); Ano := Copy(Terceiro,277,4); Mes := Copy(Terceiro,281,2); Dia := Copy(Terceiro,283,2); dmImportar.cdsTerceiros.FieldByName('DATAINICIOATIVIDADES').Value:= dia+'/'+mes+'/'+ano; dmImportar.cdsTerceiros.FieldByName('TELEFONE_DDD').Value:= Copy(Terceiro,285,5); dmImportar.cdsTerceiros.FieldByName('TELEFONE_NUMERO').Value:= Copy(Terceiro,290,10); dmImportar.cdsTerceiros.FieldByName('TELEFAX_DDD').Value:= Copy(Terceiro,300,5); dmImportar.cdsTerceiros.FieldByName('TELEFAX_NUMERO').Value:= Copy(Terceiro,305,10); dmImportar.cdsTerceiros.FieldByName('EMAIL').Value:= Copy(Terceiro,315,50); dmImportar.cdsTerceiros.FieldByName('HOMEPAGE').Value:= Copy(Terceiro,365,60); dmImportar.cdsTerceiros.FieldByName('INSCEST').Value:= Copy(Terceiro,425,20); dmImportar.cdsTerceiros.FieldByName('INSCMUN').Value:= Copy(Terceiro,445,20); dmImportar.cdsTerceiros.FieldByName('CNAE').Value:= Copy(Terceiro,465,10); dmImportar.cdsTerceiros.FieldByName('RG_NUMERO').Value:= Copy(Terceiro,475,18); dmImportar.cdsTerceiros.FieldByName('RG_ORGAO').Value:= Copy(Terceiro,493,5); dmImportar.cdsTerceiros.FieldByName('RG_ESTADO').Value:= Copy(Terceiro,498,2); Ano := Copy(Terceiro,500,4); Mes := Copy(Terceiro,504,2); Dia := Copy(Terceiro,506,2); dmImportar.cdsTerceiros.FieldByName('RG_DT_EMISSAO').Value:= dia+'/'+mes+'/'+ano; dmImportar.cdsTerceiros.FieldByName('SEXO').Value:= StrToInt(Copy(Terceiro,508,1)); dmImportar.cdsTerceiros.FieldByName('CODIGO_PAIS').Value:= Copy(Terceiro,509,4); dmImportar.cdsTerceiros.FieldByName('CODIGO_IBGE').Value:= Copy(Terceiro,513,5); dmImportar.cdsTerceiros.FieldByName('FILLER2').Value:= Copy(Terceiro,518,86); dmImportar.cdsTerceiros.FieldByName('CODIGO_MUN_EST').Value:= Copy(Terceiro,604,10); dmImportar.cdsTerceiros.Post; lblProcessando.Caption:= 'Importando, aguarde... '+ IntToStr(dmImportar.cdsTerceiros.RecordCount); if dmImportar.cdsTerceiros.ApplyUpdates(0) <> 0 then dmImportar.cdsTerceiros.CancelUpdates; end; CloseFile(Txt); lblProcessando.Caption:= 'Importação realizado com sucesso...'; BitBtn1.Enabled:= true; BitBtn2.Visible := True; BitBtn2.Kind:= bkClose; Animate1.Visible:= true; Animate1.Active:= False; lblProcessando.Caption := 'Foi Importado um total de '+ IntToStr(dmImportar.cdsTerceiros.RecordCount)+' registros com sucesso'; end; end; Como criar e usar algo que faça uma verificação na tabela e se no arquivo de importação constar CPF/CNPF que já exista na tabela o sistema informar que já existe e não fazer a importação desta linha, mas continua com o processo. outra coisa é verificar no arquivo texto se tem mais de um CPF/CNPJ e importar só o primeiro encontrado, ignorando e informando ao ususário os repetidos. Lembrando que o CPF/CNPJ seria a chave primária. Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Abril 30, 2009 Quando se importa registros em massa como está tentando fazer, o ideal é que antes de dar um insert ou update você monte uma rotina que verifique se o dado já existe ou não no banco... o modo mais simples de testar é dar um select na base pelos campos chaves e ver se retorna valor... ser não retornar, põe os comandos que farão o insert... se retornar, os que fazem update, se for o caso. Pelo que eu vejo no seu caso, talvez o melhor fosse jogar os dados do txt em variáveis, testar e depois gravar/atualizar os valores que estão nestas variáveis dentro do seu while. []'s Compartilhar este post Link para o post Compartilhar em outros sites
Welder 0 Denunciar post Postado Abril 30, 2009 Quando se importa registros em massa como está tentando fazer, o ideal é que antes de dar um insert ou update você monte uma rotina que verifique se o dado já existe ou não no banco... o modo mais simples de testar é dar um select na base pelos campos chaves e ver se retorna valor... ser não retornar, põe os comandos que farão o insert... se retornar, os que fazem update, se for o caso. Pelo que eu vejo no seu caso, talvez o melhor fosse jogar os dados do txt em variáveis, testar e depois gravar/atualizar os valores que estão nestas variáveis dentro do seu while. []'s entendi a lógica. mas não sei se vou conseguir colocar na prática. Exemplo: Faço um select na tabela pelo CNPJFPF se existir algum que já exista no arquivo eu faço um update ou ignoro, se não eu faço um insert. na prática complicou minha vida.rsrs. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Abril 30, 2009 É só bolar uma function que pegue o retorno de um count por exemplo... algo do tipo: function Tform1.TestaExistenciaRegistro(cpf : string) : boolean; begin Query.Close; Query.Sql.Clear; Query.Sql.Add('Select count(*) as total from tabela where cpf = ' + QuotedStr(cpf)); Query.Open; if not Query.IsEmpty then if Query.FieldByName('total').AsInteger > 0 then result := true else result := false else result := false; end; E ai é só chamar isso num teste no código.... If not TestaExistenciaRegistro(cpf) then begin insert... end else begin update... end; []'s Compartilhar este post Link para o post Compartilhar em outros sites
Welder 0 Denunciar post Postado Abril 30, 2009 É só bolar uma function que pegue o retorno de um count por exemplo... algo do tipo: function Tform1.TestaExistenciaRegistro(cpf : string) : boolean; begin Query.Close; Query.Sql.Clear; Query.Sql.Add('Select count(*) as total from tabela where cpf = ' + QuotedStr(cpf)); Query.Open; if not Query.IsEmpty then if Query.FieldByName('total').AsInteger > 0 then result := true else result := false else result := false; end; E ai é só chamar isso num teste no código.... If not TestaExistenciaRegistro(cpf) then begin insert... end else begin update... end; []'s Não consegui fazer o teste. Estou tentando. unit ufrmPrincipal; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ComCtrls, FileCtrl, FMTBcd, DB, SqlExpr; type TfrmPrincipal = class(TForm) btnProcessar: TBitBtn; OpenDialog1: TOpenDialog; Animate1: TAnimate; BitBtn2: TBitBtn; lblProcessando: TLabel; Label5: TLabel; procedure Label5Click(Sender: TObject); procedure btnProcessarClick(Sender: TObject); private { Private declarations } public { Public declarations } procedure ExtraiValoresTxt(); function TestaExistenciaRegistro(CnpjCpf : string) : boolean; end; var frmPrincipal: TfrmPrincipal; implementation uses udmImportar, DiretoImpressora; {$R *.dfm} procedure TfrmPrincipal.ExtraiValoresTxt(); var Txt: Textfile; Terceiro: string; Tipo, Ordem, Filler1, Personalidade, CnpjCpf, RazaoSocial, Apelido, EnderecoTipo, EnderecoLogradouro, Numero, Cep, Bairro, Municipio, Uf, DataInicioAtividades, TelefoneDDD, TelefoneNumero, TelefaxDDD, TelefaxNumero, Email, HomePage, InscMun, InscEst, Cnae, RgNumero, RgOrgao, RgUf, RgDataEmissao, Sexo, CodigoPais, CodigoIbge, Filler2, CodigoMunEst: string; begin if OpenDialog1.Execute then begin AssignFile(Txt,(OpenDialog1.FileName));//{ NOME do arquivo texto} Animate1.Visible:= true; Animate1.Active:= true; Reset(Txt); While not Eoln(Txt) do begin Readln(Txt,Terceiro); Tipo := Copy(Terceiro,1,3); Ordem := Copy(Terceiro,4,5); Filler1 := Copy(Terceiro,09,2); Personalidade := Copy(Terceiro,11,1); CnpjCpf := Copy(Terceiro,12,14); RazaoSocial := Copy(Terceiro,26,60); Apelido := Copy(Terceiro,86,20); EnderecoTipo := Copy(Terceiro,106,10); EnderecoLogradouro := Copy(Terceiro,116,60); Numero := Copy(Terceiro,176,10); Cep := Copy(Terceiro,206,09); Bairro := Copy(Terceiro,215,30); Municipio := Copy(Terceiro,245,30); Uf := Copy(Terceiro,275,2); DataInicioAtividades := Copy(Terceiro,277,8); TelefoneDDD := Copy(Terceiro,285,5); TelefoneNumero := Copy(Terceiro,290,10); TelefaxDDD := Copy(Terceiro,300,5); TelefaxNumero := Copy(Terceiro,305,10); Email := Copy(Terceiro,315,50); HomePage := Copy(Terceiro,365,60); InscEst := Copy(Terceiro,425,20); InscMun := Copy(Terceiro,445,20); Cnae := Copy(Terceiro,465,10); RgNumero := Copy(Terceiro,475,18); RgOrgao := Copy(Terceiro,493,5); RgUf := Copy(Terceiro,498,2); RgDataEmissao := Copy(Terceiro,500,8); Sexo := Copy(Terceiro,508,1); CodigoPais := Copy(Terceiro,509,4); CodigoIbge := Copy(Terceiro,513,5); Filler2 := Copy(Terceiro,518,86); CodigoMunEst := Copy(Terceiro,604,10); end; CloseFile(Txt); end; end; procedure TfrmPrincipal.Label5Click(Sender: TObject); begin frmDiretoImpressora.Showmodal; end; function TfrmPrincipal.TestaExistenciaRegistro(CnpjCpf: string): boolean; begin dmImportar.qryTestaExiste.Close; dmImportar.qryTestaExiste.Sql.Clear; dmImportar.qryTestaExiste.Sql.Add('Select count(*) as total from CLIFOR where CNPJCPF = ' + QuotedStr(CnpjCpf)); dmImportar.qryTestaExiste.Open; if not dmImportar.qryTestaExiste.IsEmpty then if dmImportar.qryTestaExiste.FieldByName('total').AsInteger > 0 then result := true else result := false else result := false; end; procedure TfrmPrincipal.btnProcessarClick(Sender: TObject); begin ExtraiValoresTxt(); If not TestaExistenciaRegistro(CnpjCpf) then begin dmImportar.cdsTerceiros.Insert; dmImportar.cdsTerceiros.FieldByName('TIPO').Value := Tipo; dmImportar.cdsTerceiros.FieldByName('ORDEM').Value := Ordem; dmImportar.cdsTerceiros.FieldByName('FILLER1').Value := Filler1; dmImportar.cdsTerceiros.FieldByName('PERSONALIDADE').Value := StrToInt(Personalidade); dmImportar.cdsTerceiros.FieldByName('CNPJCPF').Value := CnpjCpf; dmImportar.cdsTerceiros.FieldByName('RAZAOSOCIAL').Value := RazaoSocial; dmImportar.cdsTerceiros.FieldByName('APELIDO').Value:= Copy(Terceiro,86,20); dmImportar.cdsTerceiros.FieldByName('ENDERECO_TIPO').Value:= Copy(Terceiro,106,10); dmImportar.cdsTerceiros.FieldByName('ENDERECO_LOGRADOURO').Value:= Copy(Terceiro,116,60); dmImportar.cdsTerceiros.FieldByName('NUMERO').Value:= Copy(Terceiro,176,10); dmImportar.cdsTerceiros.FieldByName('CEP').Value:= Copy(Terceiro,206,09); dmImportar.cdsTerceiros.FieldByName('BAIRRO').Value:= Copy(Terceiro,215,30); dmImportar.cdsTerceiros.FieldByName('MUNICIPIO').Value:= Copy(Terceiro,245,30); dmImportar.cdsTerceiros.FieldByName('UF').Value:= Copy(Terceiro,275,2); Ano := Copy(Terceiro,277,4); Mes := Copy(Terceiro,281,2); Dia := Copy(Terceiro,283,2); dmImportar.cdsTerceiros.FieldByName('DATAINICIOATIVIDADES').Value:= dia+'/'+mes+'/'+ano; dmImportar.cdsTerceiros.FieldByName('TELEFONE_DDD').Value:= Copy(Terceiro,285,5); dmImportar.cdsTerceiros.FieldByName('TELEFONE_NUMERO').Value:= Copy(Terceiro,290,10); dmImportar.cdsTerceiros.FieldByName('TELEFAX_DDD').Value:= Copy(Terceiro,300,5); dmImportar.cdsTerceiros.FieldByName('TELEFAX_NUMERO').Value:= Copy(Terceiro,305,10); dmImportar.cdsTerceiros.FieldByName('EMAIL').Value:= Copy(Terceiro,315,50); dmImportar.cdsTerceiros.FieldByName('HOMEPAGE').Value:= Copy(Terceiro,365,60); dmImportar.cdsTerceiros.FieldByName('INSCEST').Value:= Copy(Terceiro,425,20); dmImportar.cdsTerceiros.FieldByName('INSCMUN').Value:= Copy(Terceiro,445,20); dmImportar.cdsTerceiros.FieldByName('CNAE').Value:= Copy(Terceiro,465,10); dmImportar.cdsTerceiros.FieldByName('RG_NUMERO').Value:= Copy(Terceiro,475,18); dmImportar.cdsTerceiros.FieldByName('RG_ORGAO').Value:= Copy(Terceiro,493,5); dmImportar.cdsTerceiros.FieldByName('RG_ESTADO').Value:= Copy(Terceiro,498,2); Ano := Copy(Terceiro,500,4); Mes := Copy(Terceiro,504,2); Dia := Copy(Terceiro,506,2); dmImportar.cdsTerceiros.FieldByName('RG_DT_EMISSAO').Value:= dia+'/'+mes+'/'+ano; dmImportar.cdsTerceiros.FieldByName('SEXO').Value:= StrToInt(Copy(Terceiro,508,1)); dmImportar.cdsTerceiros.FieldByName('CODIGO_PAIS').Value:= Copy(Terceiro,509,4); dmImportar.cdsTerceiros.FieldByName('CODIGO_IBGE').Value:= Copy(Terceiro,513,5); dmImportar.cdsTerceiros.FieldByName('FILLER2').Value:= Copy(Terceiro,518,86); dmImportar.cdsTerceiros.FieldByName('CODIGO_MUN_EST').Value:= Copy(Terceiro,604,10); dmImportar.cdsTerceiros.Post; lblProcessando.Caption:= 'Importando, aguarde... '+ IntToStr(dmImportar.cdsTerceiros.RecordCount); if dmImportar.cdsTerceiros.ApplyUpdates(0) <> 0 then dmImportar.cdsTerceiros.CancelUpdates; end else begin // update... end; end; lblProcessando.Caption:= 'Importação realizado com sucesso...'; BitBtn1.Enabled:= true; BitBtn2.Visible := True; BitBtn2.Kind:= bkClose; Animate1.Visible:= true; Animate1.Active:= False; lblProcessando.Caption := 'Foi Importado um total de '+ IntToStr(dmImportar.cdsTerceiros.RecordCount)+' registros com sucesso'; end; end; end. Compartilhar este post Link para o post Compartilhar em outros sites
Welder 0 Denunciar post Postado Abril 30, 2009 Assim esta incluindo apenas a ultimo linha do arquivo. Compartilhar este post Link para o post Compartilhar em outros sites
Welder 0 Denunciar post Postado Abril 30, 2009 o novo código. faz a verificação, mas importa apenas a ultima linha do arquivo. unit ufrmPrincipal; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ComCtrls, FileCtrl, FMTBcd, DB, SqlExpr; type TfrmPrincipal = class(TForm) btnProcessar: TBitBtn; OpenDialog1: TOpenDialog; Animate1: TAnimate; BitBtn2: TBitBtn; lblProcessando: TLabel; Label5: TLabel; procedure Label5Click(Sender: TObject); procedure btnProcessarClick(Sender: TObject); private { Private declarations } public { Public declarations } procedure ExtraiValoresTxt(); function TestaExistenciaRegistro(CnpjCpf : string) : boolean; end; var frmPrincipal: TfrmPrincipal; implementation uses udmImportar, DiretoImpressora; {$R *.dfm} procedure TfrmPrincipal.ExtraiValoresTxt(); var Txt: Textfile; Terceiro: string; Tipo, Ordem, Filler1, Personalidade, CnpjCpf, RazaoSocial, Apelido, EnderecoTipo, EnderecoLogradouro, Numero, Cep, Bairro, Municipio, Uf, DataInicioAtividades, TelefoneDDD, TelefoneNumero, TelefaxDDD, TelefaxNumero, Email, HomePage, InscMun, InscEst, Cnae, RgNumero, RgOrgao, RgUf, RgDataEmissao, Sexo, CodigoPais, CodigoIbge, Filler2, CodigoMunEst: string; begin if OpenDialog1.Execute then begin dmImportar.cdsTerceiros.Open; AssignFile(Txt,(OpenDialog1.FileName));//{ NOME do arquivo texto} Animate1.Visible:= true; Animate1.Active:= true; Reset(Txt); While not Eoln(Txt) do begin Readln(Txt,Terceiro); Tipo := Copy(Terceiro,1,3); Ordem := Copy(Terceiro,4,5); Filler1 := Copy(Terceiro,09,2); Personalidade := Copy(Terceiro,11,1); CnpjCpf := Copy(Terceiro,12,14); RazaoSocial := Copy(Terceiro,26,60); Apelido := Copy(Terceiro,86,20); EnderecoTipo := Copy(Terceiro,106,10); EnderecoLogradouro := Copy(Terceiro,116,60); Numero := Copy(Terceiro,176,10); Cep := Copy(Terceiro,206,09); Bairro := Copy(Terceiro,215,30); Municipio := Copy(Terceiro,245,30); Uf := Copy(Terceiro,275,2); DataInicioAtividades := Copy(Terceiro,277,8); TelefoneDDD := Copy(Terceiro,285,5); TelefoneNumero := Copy(Terceiro,290,10); TelefaxDDD := Copy(Terceiro,300,5); TelefaxNumero := Copy(Terceiro,305,10); Email := Copy(Terceiro,315,50); HomePage := Copy(Terceiro,365,60); InscEst := Copy(Terceiro,425,20); InscMun := Copy(Terceiro,445,20); Cnae := Copy(Terceiro,465,10); RgNumero := Copy(Terceiro,475,18); RgOrgao := Copy(Terceiro,493,5); RgUf := Copy(Terceiro,498,2); RgDataEmissao := Copy(Terceiro,500,8); Sexo := Copy(Terceiro,508,1); CodigoPais := Copy(Terceiro,509,4); CodigoIbge := Copy(Terceiro,513,5); Filler2 := Copy(Terceiro,518,86); CodigoMunEst := Copy(Terceiro,604,10); end; CloseFile(Txt); If not TestaExistenciaRegistro(CnpjCpf) then begin dmImportar.cdsTerceiros.Insert; dmImportar.cdsTerceiros.FieldByName('TIPO').Value := Tipo; dmImportar.cdsTerceiros.FieldByName('ORDEM').Value := Ordem; dmImportar.cdsTerceiros.FieldByName('FILLER1').Value := Filler1; dmImportar.cdsTerceiros.FieldByName('PERSONALIDADE').Value := StrToInt(Personalidade); dmImportar.cdsTerceiros.FieldByName('CNPJCPF').Value := CnpjCpf; dmImportar.cdsTerceiros.FieldByName('RAZAOSOCIAL').Value := RazaoSocial; dmImportar.cdsTerceiros.FieldByName('APELIDO').Value := Apelido; dmImportar.cdsTerceiros.FieldByName('ENDERECO_TIPO').Value := EnderecoTipo; dmImportar.cdsTerceiros.FieldByName('ENDERECO_LOGRADOURO').Value := EnderecoLogradouro; dmImportar.cdsTerceiros.FieldByName('NUMERO').Value := Numero; dmImportar.cdsTerceiros.FieldByName('CEP').Value := Cep; dmImportar.cdsTerceiros.FieldByName('BAIRRO').Value := Bairro; dmImportar.cdsTerceiros.FieldByName('MUNICIPIO').Value := Municipio; dmImportar.cdsTerceiros.FieldByName('UF').Value := Uf; //Ano := Copy(Terceiro,277,4); //Mes := Copy(Terceiro,281,2); //Dia := Copy(Terceiro,283,2); //dmImportar.cdsTerceiros.FieldByName('DATAINICIOATIVIDADES').Value := DataInicioAtividades; dmImportar.cdsTerceiros.FieldByName('TELEFONE_DDD').Value := TelefoneDDD; dmImportar.cdsTerceiros.FieldByName('TELEFONE_NUMERO').Value := TelefoneNumero; dmImportar.cdsTerceiros.FieldByName('TELEFAX_DDD').Value := TelefaxDDD; dmImportar.cdsTerceiros.FieldByName('TELEFAX_NUMERO').Value := TelefaxNumero; dmImportar.cdsTerceiros.FieldByName('EMAIL').Value := Email; dmImportar.cdsTerceiros.FieldByName('HOMEPAGE').Value := HomePage; dmImportar.cdsTerceiros.FieldByName('INSCEST').Value := InscEst; dmImportar.cdsTerceiros.FieldByName('INSCMUN').Value := InscMun; dmImportar.cdsTerceiros.FieldByName('CNAE').Value := Cnae; dmImportar.cdsTerceiros.FieldByName('RG_NUMERO').Value := RgNumero; dmImportar.cdsTerceiros.FieldByName('RG_ORGAO').Value := RgOrgao; dmImportar.cdsTerceiros.FieldByName('RG_ESTADO').Value := RgUf; //Ano := Copy(Terceiro,500,4); //Mes := Copy(Terceiro,504,2); //Dia := Copy(Terceiro,506,2); //dmImportar.cdsTerceiros.FieldByName('RG_DT_EMISSAO').Value := RgDataEmissao; dmImportar.cdsTerceiros.FieldByName('SEXO').Value := StrToInt(Sexo); dmImportar.cdsTerceiros.FieldByName('CODIGO_PAIS').Value := CodigoPais; dmImportar.cdsTerceiros.FieldByName('CODIGO_IBGE').Value := CodigoIbge; dmImportar.cdsTerceiros.FieldByName('FILLER2').Value := Filler2; dmImportar.cdsTerceiros.FieldByName('CODIGO_MUN_EST').Value := CodigoMunEst; dmImportar.cdsTerceiros.Post; lblProcessando.Caption:= 'Importando, aguarde... '+ IntToStr(dmImportar.cdsTerceiros.RecordCount); if dmImportar.cdsTerceiros.ApplyUpdates(0) <> 0 then dmImportar.cdsTerceiros.CancelUpdates; end else begin // update... ShowMessage('Registro existente!'); end; end; end; function TfrmPrincipal.TestaExistenciaRegistro(CnpjCpf: string): boolean; begin dmImportar.qryTestaExiste.Close; dmImportar.qryTestaExiste.Sql.Clear; dmImportar.qryTestaExiste.Sql.Add('Select count(*) as total from CLIFOR where CNPJCPF = ' + QuotedStr(CnpjCpf)); dmImportar.qryTestaExiste.Open; if not dmImportar.qryTestaExiste.IsEmpty then if dmImportar.qryTestaExiste.FieldByName('total').AsInteger > 0 then result := true else result := false else result := false; end; procedure TfrmPrincipal.btnProcessarClick(Sender: TObject); begin ExtraiValoresTxt(); lblProcessando.Caption:= 'Importação realizado com sucesso...'; btnProcessar.Enabled:= true; BitBtn2.Visible := True; BitBtn2.Kind:= bkClose; Animate1.Visible:= true; Animate1.Active:= False; lblProcessando.Caption := 'Foi Importado um total de '+ IntToStr(dmImportar.cdsTerceiros.RecordCount)+' registros com sucesso'; end; end. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Abril 30, 2009 Isso não ocorre porque você testa só depois de executar o seu while todo? []'s Compartilhar este post Link para o post Compartilhar em outros sites
Welder 0 Denunciar post Postado Maio 5, 2009 Isso não ocorre porque você testa só depois de executar o seu while todo? []'s fiz confusão no meu código. eu consigo importar se não verificar se já existe um registro na tabela. se verificar tem como eu mostrar em um grid o que foi feito somente o update. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Maio 5, 2009 Teste assim a sua rotina de gravação: procedure TfrmPrincipal.ExtraiValoresTxt(); var Txt: Textfile; Terceiro: string; //Contadores TotalImportado, TotalAtualizado : Integer; Tipo, Ordem, Filler1, Personalidade, CnpjCpf, RazaoSocial, Apelido, EnderecoTipo, EnderecoLogradouro, Numero, Cep, Bairro, Municipio, Uf, DataInicioAtividades, TelefoneDDD, TelefoneNumero, TelefaxDDD, TelefaxNumero, Email, HomePage, InscMun, InscEst, Cnae, RgNumero, RgOrgao, RgUf, RgDataEmissao, Sexo, CodigoPais, CodigoIbge, Filler2, CodigoMunEst: string; begin //Contadores TotalImportado := 0; TotalAtualizado := 0; if OpenDialog1.Execute then begin dmImportar.cdsTerceiros.Open; AssignFile(Txt,(OpenDialog1.FileName));//{ NOME do arquivo texto} Animate1.Visible:= true; Animate1.Active:= true; Reset(Txt); While not Eoln(Txt) do begin Readln(Txt,Terceiro); Tipo := Copy(Terceiro,1,3); Ordem := Copy(Terceiro,4,5); Filler1 := Copy(Terceiro,09,2); Personalidade := Copy(Terceiro,11,1); CnpjCpf := Copy(Terceiro,12,14); RazaoSocial := Copy(Terceiro,26,60); Apelido := Copy(Terceiro,86,20); EnderecoTipo := Copy(Terceiro,106,10); EnderecoLogradouro := Copy(Terceiro,116,60); Numero := Copy(Terceiro,176,10); Cep := Copy(Terceiro,206,09); Bairro := Copy(Terceiro,215,30); Municipio := Copy(Terceiro,245,30); Uf := Copy(Terceiro,275,2); DataInicioAtividades := Copy(Terceiro,277,8); TelefoneDDD := Copy(Terceiro,285,5); TelefoneNumero := Copy(Terceiro,290,10); TelefaxDDD := Copy(Terceiro,300,5); TelefaxNumero := Copy(Terceiro,305,10); Email := Copy(Terceiro,315,50); HomePage := Copy(Terceiro,365,60); InscEst := Copy(Terceiro,425,20); InscMun := Copy(Terceiro,445,20); Cnae := Copy(Terceiro,465,10); RgNumero := Copy(Terceiro,475,18); RgOrgao := Copy(Terceiro,493,5); RgUf := Copy(Terceiro,498,2); RgDataEmissao := Copy(Terceiro,500,8); Sexo := Copy(Terceiro,508,1); CodigoPais := Copy(Terceiro,509,4); CodigoIbge := Copy(Terceiro,513,5); Filler2 := Copy(Terceiro,518,86); CodigoMunEst := Copy(Terceiro,604,10); If not TestaExistenciaRegistro(CnpjCpf) then begin dmImportar.cdsTerceiros.Insert; dmImportar.cdsTerceiros.FieldByName('TIPO').Value := Tipo; dmImportar.cdsTerceiros.FieldByName('ORDEM').Value := Ordem; dmImportar.cdsTerceiros.FieldByName('FILLER1').Value := Filler1; dmImportar.cdsTerceiros.FieldByName('PERSONALIDADE').Value := StrToInt(Personalidade); dmImportar.cdsTerceiros.FieldByName('CNPJCPF').Value := CnpjCpf; dmImportar.cdsTerceiros.FieldByName('RAZAOSOCIAL').Value := RazaoSocial; dmImportar.cdsTerceiros.FieldByName('APELIDO').Value := Apelido; dmImportar.cdsTerceiros.FieldByName('ENDERECO_TIPO').Value := EnderecoTipo; dmImportar.cdsTerceiros.FieldByName('ENDERECO_LOGRADOURO').Value := EnderecoLogradouro; dmImportar.cdsTerceiros.FieldByName('NUMERO').Value := Numero; dmImportar.cdsTerceiros.FieldByName('CEP').Value := Cep; dmImportar.cdsTerceiros.FieldByName('BAIRRO').Value := Bairro; dmImportar.cdsTerceiros.FieldByName('MUNICIPIO').Value := Municipio; dmImportar.cdsTerceiros.FieldByName('UF').Value := Uf; //Ano := Copy(Terceiro,277,4); //Mes := Copy(Terceiro,281,2); //Dia := Copy(Terceiro,283,2); //dmImportar.cdsTerceiros.FieldByName('DATAINICIOATIVIDADES').Value := DataInicioAtividades; dmImportar.cdsTerceiros.FieldByName('TELEFONE_DDD').Value := TelefoneDDD; dmImportar.cdsTerceiros.FieldByName('TELEFONE_NUMERO').Value := TelefoneNumero; dmImportar.cdsTerceiros.FieldByName('TELEFAX_DDD').Value := TelefaxDDD; dmImportar.cdsTerceiros.FieldByName('TELEFAX_NUMERO').Value := TelefaxNumero; dmImportar.cdsTerceiros.FieldByName('EMAIL').Value := Email; dmImportar.cdsTerceiros.FieldByName('HOMEPAGE').Value := HomePage; dmImportar.cdsTerceiros.FieldByName('INSCEST').Value := InscEst; dmImportar.cdsTerceiros.FieldByName('INSCMUN').Value := InscMun; dmImportar.cdsTerceiros.FieldByName('CNAE').Value := Cnae; dmImportar.cdsTerceiros.FieldByName('RG_NUMERO').Value := RgNumero; dmImportar.cdsTerceiros.FieldByName('RG_ORGAO').Value := RgOrgao; dmImportar.cdsTerceiros.FieldByName('RG_ESTADO').Value := RgUf; //Ano := Copy(Terceiro,500,4); //Mes := Copy(Terceiro,504,2); //Dia := Copy(Terceiro,506,2); //dmImportar.cdsTerceiros.FieldByName('RG_DT_EMISSAO').Value := RgDataEmissao; dmImportar.cdsTerceiros.FieldByName('SEXO').Value := StrToInt(Sexo); dmImportar.cdsTerceiros.FieldByName('CODIGO_PAIS').Value := CodigoPais; dmImportar.cdsTerceiros.FieldByName('CODIGO_IBGE').Value := CodigoIbge; dmImportar.cdsTerceiros.FieldByName('FILLER2').Value := Filler2; dmImportar.cdsTerceiros.FieldByName('CODIGO_MUN_EST').Value := CodigoMunEst; dmImportar.cdsTerceiros.Post; lblProcessando.Caption:= 'Importando, aguarde... '+ IntToStr(dmImportar.cdsTerceiros.RecordCount); if dmImportar.cdsTerceiros.ApplyUpdates(0) <> 0 then dmImportar.cdsTerceiros.CancelUpdates; end else begin // update... ShowMessage('Registro existente!'); end; end; end; CloseFile(Txt); end; Apesar de que eu usaria uma Query em vez de um dataset pra fazer os inserts... em todo caso, seria algo assim que precisa pro seu teste. []'s Compartilhar este post Link para o post Compartilhar em outros sites
Welder 0 Denunciar post Postado Maio 6, 2009 Teste assim a sua rotina de gravação: procedure TfrmPrincipal.ExtraiValoresTxt(); var Txt: Textfile; Terceiro: string; //Contadores TotalImportado, TotalAtualizado : Integer; Tipo, Ordem, Filler1, Personalidade, CnpjCpf, RazaoSocial, Apelido, EnderecoTipo, EnderecoLogradouro, Numero, Cep, Bairro, Municipio, Uf, DataInicioAtividades, TelefoneDDD, TelefoneNumero, TelefaxDDD, TelefaxNumero, Email, HomePage, InscMun, InscEst, Cnae, RgNumero, RgOrgao, RgUf, RgDataEmissao, Sexo, CodigoPais, CodigoIbge, Filler2, CodigoMunEst: string; begin //Contadores TotalImportado := 0; TotalAtualizado := 0; if OpenDialog1.Execute then begin dmImportar.cdsTerceiros.Open; AssignFile(Txt,(OpenDialog1.FileName));//{ NOME do arquivo texto} Animate1.Visible:= true; Animate1.Active:= true; Reset(Txt); While not Eoln(Txt) do begin Readln(Txt,Terceiro); Tipo := Copy(Terceiro,1,3); Ordem := Copy(Terceiro,4,5); Filler1 := Copy(Terceiro,09,2); Personalidade := Copy(Terceiro,11,1); CnpjCpf := Copy(Terceiro,12,14); RazaoSocial := Copy(Terceiro,26,60); Apelido := Copy(Terceiro,86,20); EnderecoTipo := Copy(Terceiro,106,10); EnderecoLogradouro := Copy(Terceiro,116,60); Numero := Copy(Terceiro,176,10); Cep := Copy(Terceiro,206,09); Bairro := Copy(Terceiro,215,30); Municipio := Copy(Terceiro,245,30); Uf := Copy(Terceiro,275,2); DataInicioAtividades := Copy(Terceiro,277,8); TelefoneDDD := Copy(Terceiro,285,5); TelefoneNumero := Copy(Terceiro,290,10); TelefaxDDD := Copy(Terceiro,300,5); TelefaxNumero := Copy(Terceiro,305,10); Email := Copy(Terceiro,315,50); HomePage := Copy(Terceiro,365,60); InscEst := Copy(Terceiro,425,20); InscMun := Copy(Terceiro,445,20); Cnae := Copy(Terceiro,465,10); RgNumero := Copy(Terceiro,475,18); RgOrgao := Copy(Terceiro,493,5); RgUf := Copy(Terceiro,498,2); RgDataEmissao := Copy(Terceiro,500,8); Sexo := Copy(Terceiro,508,1); CodigoPais := Copy(Terceiro,509,4); CodigoIbge := Copy(Terceiro,513,5); Filler2 := Copy(Terceiro,518,86); CodigoMunEst := Copy(Terceiro,604,10); If not TestaExistenciaRegistro(CnpjCpf) then begin dmImportar.cdsTerceiros.Insert; dmImportar.cdsTerceiros.FieldByName('TIPO').Value := Tipo; dmImportar.cdsTerceiros.FieldByName('ORDEM').Value := Ordem; dmImportar.cdsTerceiros.FieldByName('FILLER1').Value := Filler1; dmImportar.cdsTerceiros.FieldByName('PERSONALIDADE').Value := StrToInt(Personalidade); dmImportar.cdsTerceiros.FieldByName('CNPJCPF').Value := CnpjCpf; dmImportar.cdsTerceiros.FieldByName('RAZAOSOCIAL').Value := RazaoSocial; dmImportar.cdsTerceiros.FieldByName('APELIDO').Value := Apelido; dmImportar.cdsTerceiros.FieldByName('ENDERECO_TIPO').Value := EnderecoTipo; dmImportar.cdsTerceiros.FieldByName('ENDERECO_LOGRADOURO').Value := EnderecoLogradouro; dmImportar.cdsTerceiros.FieldByName('NUMERO').Value := Numero; dmImportar.cdsTerceiros.FieldByName('CEP').Value := Cep; dmImportar.cdsTerceiros.FieldByName('BAIRRO').Value := Bairro; dmImportar.cdsTerceiros.FieldByName('MUNICIPIO').Value := Municipio; dmImportar.cdsTerceiros.FieldByName('UF').Value := Uf; //Ano := Copy(Terceiro,277,4); //Mes := Copy(Terceiro,281,2); //Dia := Copy(Terceiro,283,2); //dmImportar.cdsTerceiros.FieldByName('DATAINICIOATIVIDADES').Value := DataInicioAtividades; dmImportar.cdsTerceiros.FieldByName('TELEFONE_DDD').Value := TelefoneDDD; dmImportar.cdsTerceiros.FieldByName('TELEFONE_NUMERO').Value := TelefoneNumero; dmImportar.cdsTerceiros.FieldByName('TELEFAX_DDD').Value := TelefaxDDD; dmImportar.cdsTerceiros.FieldByName('TELEFAX_NUMERO').Value := TelefaxNumero; dmImportar.cdsTerceiros.FieldByName('EMAIL').Value := Email; dmImportar.cdsTerceiros.FieldByName('HOMEPAGE').Value := HomePage; dmImportar.cdsTerceiros.FieldByName('INSCEST').Value := InscEst; dmImportar.cdsTerceiros.FieldByName('INSCMUN').Value := InscMun; dmImportar.cdsTerceiros.FieldByName('CNAE').Value := Cnae; dmImportar.cdsTerceiros.FieldByName('RG_NUMERO').Value := RgNumero; dmImportar.cdsTerceiros.FieldByName('RG_ORGAO').Value := RgOrgao; dmImportar.cdsTerceiros.FieldByName('RG_ESTADO').Value := RgUf; //Ano := Copy(Terceiro,500,4); //Mes := Copy(Terceiro,504,2); //Dia := Copy(Terceiro,506,2); //dmImportar.cdsTerceiros.FieldByName('RG_DT_EMISSAO').Value := RgDataEmissao; dmImportar.cdsTerceiros.FieldByName('SEXO').Value := StrToInt(Sexo); dmImportar.cdsTerceiros.FieldByName('CODIGO_PAIS').Value := CodigoPais; dmImportar.cdsTerceiros.FieldByName('CODIGO_IBGE').Value := CodigoIbge; dmImportar.cdsTerceiros.FieldByName('FILLER2').Value := Filler2; dmImportar.cdsTerceiros.FieldByName('CODIGO_MUN_EST').Value := CodigoMunEst; dmImportar.cdsTerceiros.Post; lblProcessando.Caption:= 'Importando, aguarde... '+ IntToStr(dmImportar.cdsTerceiros.RecordCount); if dmImportar.cdsTerceiros.ApplyUpdates(0) <> 0 then dmImportar.cdsTerceiros.CancelUpdates; end else begin // update... ShowMessage('Registro existente!'); end; end; end; CloseFile(Txt); end; Apesar de que eu usaria uma Query em vez de um dataset pra fazer os inserts... em todo caso, seria algo assim que precisa pro seu teste. []'s então faço o uso das variaveis contadores para saber o que foi inserido e o que foi atualizado. é posso usar query mesmo, estou usando dbexpress (unidirecional), mas aqui não tem loop na query, só no arquivo texto. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Maio 6, 2009 Você faz um loop no arquivo para ler linha a linha os registros, estou certo? Sendo assim, seu while vai ler um arquivo e jogar os dados da linha nas variáveis correto? Com base nisto, a cada linha lida o código que montei pra você chama sua rotina de teste se o registro já está gravado e, se não estiver, manda gravar o registro... mas não entendi o que você quis dizer com não ter loop na query.... Agora é com você adaptar seu código... eu coloquei duas variáveis do tipo integer para servir como seus contadores de quantos registros foram inseridos e quantos foram atualizados, só não programei isso por ser simples de fazer. []'s Compartilhar este post Link para o post Compartilhar em outros sites
Welder 0 Denunciar post Postado Maio 6, 2009 Você faz um loop no arquivo para ler linha a linha os registros, estou certo? Sendo assim, seu while vai ler um arquivo e jogar os dados da linha nas variáveis correto? Com base nisto, a cada linha lida o código que montei pra você chama sua rotina de teste se o registro já está gravado e, se não estiver, manda gravar o registro... mas não entendi o que você quis dizer com não ter loop na query.... Agora é com você adaptar seu código... eu coloquei duas variáveis do tipo integer para servir como seus contadores de quantos registros foram inseridos e quantos foram atualizados, só não programei isso por ser simples de fazer. []'s certo o loop é no arquivo. tudo bem, eu quis dizer com não tem loop na query TSQLQuery da dbexpress, que é unidirecional, ai a necessidade de um clientdataset, mas neste caso, estamos indo só em uma diração. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Maio 6, 2009 Certo... mas não estou entendendo onde quer chegar com a sua colocação... pense um pouco: um arquivo possui 30 registros em 30 linhas... a única forma de você gravar os dados é usar o loop que lê o arquivo para isso correto? Não há como guardar os 30 registros do loop para inserir depois no modo que está usando seu código, a menos que você crie uma lista e jogue todos os registros nela, e depois varra a lista num loop e grava os registros que ainda não foram gravados... contudo, nesta hipótese, você faria 2 loops pra gravar quando no primeiro você já mata tudo. Se usar um TQuery para inserir, tudo o que precisa é montar a query em runtime com os valores atualizados (pode até usar uma query com parâmetros se facilitar pra você), e a cada loop você testa antes se o arquivo existe e se não existe fecha o TQuery, carrega a sql gerada com os registros que vai gravar e executa. Não sei qual é a sua dificuldade no momento para fazer isso... []'s Compartilhar este post Link para o post Compartilhar em outros sites
Welder 0 Denunciar post Postado Maio 6, 2009 Certo... mas não estou entendendo onde quer chegar com a sua colocação... pense um pouco: um arquivo possui 30 registros em 30 linhas... a única forma de você gravar os dados é usar o loop que lê o arquivo para isso correto? []'s Quanto a isso tudo correto. Não há como guardar os 30 registros do loop para inserir depois no modo que está usando seu código, a menos que você crie uma lista e jogue todos os registros nela, e depois varra a lista num loop e grava os registros que ainda não foram gravados... contudo, nesta hipótese, você faria 2 loops pra gravar quando no primeiro você já mata tudo. []'s desta forma não quero fazer. Se usar um TQuery para inserir, tudo o que precisa é montar a query em runtime com os valores atualizados (pode até usar uma query com parâmetros se facilitar pra você), e a cada loop você testa antes se o arquivo existe e se não existe fecha o TQuery, carrega a sql gerada com os registros que vai gravar e executa. []'s não é desta forma que esta sendo feito? Só que usando ClientDataSet... desculpa a dificuldade é que meu tempo ta pouco e quando montar este de importação tenho que montar o de exportação. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Maio 6, 2009 não é desta forma que esta sendo feito? Só que usando ClientDataSet... desculpa a dificuldade é que meu tempo ta pouco e quando montar este de importação tenho que montar o de exportação. Até onde sei é isto... mas não estou conseguindo ver no que você tá empacado ai pra poder lhe ajudar... saca? Usando o código que já montamos, o que está acontecendo? Está dando erro, não está inserindo os registros... o que está acontecendo ai? Acho que você concorda comigo que não tem como eu adivinhar o que você pensa e o que está acontecendo ai na sua máquina amigo... Seja um pouco mais claro e coloque exemplos do que ocorre se possível. []'s Compartilhar este post Link para o post Compartilhar em outros sites
Welder 0 Denunciar post Postado Maio 6, 2009 não é desta forma que esta sendo feito? Só que usando ClientDataSet... desculpa a dificuldade é que meu tempo ta pouco e quando montar este de importação tenho que montar o de exportação. Até onde sei é isto... mas não estou conseguindo ver no que você tá empacado ai pra poder lhe ajudar... saca? Usando o código que já montamos, o que está acontecendo? Está dando erro, não está inserindo os registros... o que está acontecendo ai? Acho que você concorda comigo que não tem como eu adivinhar o que você pensa e o que está acontecendo ai na sua máquina amigo... Seja um pouco mais claro e coloque exemplos do que ocorre se possível. []'s Claro concordo com você. Vou passar uma posição de como esta aqui. Esta importando todos registros sem erros. Os duplicados eu não estou fazendo nada com eles, só não deixo ir para o banco e emito o showmessage. O interessante era criar um checkbox ou radiobox para o cliente informar se faz o upgrade ou não importa os repetidos. ai vem outra dificuldade é fazer o upgrade utilizando a linha do arquivo. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Maio 6, 2009 Isso é até simples de resolver... use o MessageDialog para questionar o cliente quanto ao que ele quer fazer (no lugar que está o showmessage do Registro Existente) ... ai dependendo da resposta dele você faz ou não o update. //Se confirmar, atualiza, senão não faz nada if MessageDlg('Deseja atualizar o registro do cliente ' + RazaoSocial + '?',mtConfirmation,[mbYes,mbNo],0) = mrYes then begin <comandos para atualizar> end; []'s Compartilhar este post Link para o post Compartilhar em outros sites
Welder 0 Denunciar post Postado Maio 6, 2009 Isso é até simples de resolver... use o MessageDialog para questionar o cliente quanto ao que ele quer fazer (no lugar que está o showmessage do Registro Existente) ... ai dependendo da resposta dele você faz ou não o update. //Se confirmar, atualiza, senão não faz nada if MessageDlg('Deseja atualizar o registro do cliente ' + RazaoSocial + '?',mtConfirmation,[mbYes,mbNo],0) = mrYes then begin <comandos para atualizar> end; []'s tudo bem. eu pensei em criar um GrupoBox com RadioButtons ao invés do MessagDialog, com as opções: Grava somente arquivos novos; Atualiza Arquivos existentes; até ai tudo bem, mas o <comandos para atualizar> é que não consigo montar. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Maio 6, 2009 Por isso eu sugeri usar uma query... numa query você só montaria o comando update de acordo com a sua tabela em runtime... seria algo do tipo: Query.Close; Query.SQL.Clear; Query.SQL.ADD('Update tabela set campo = :valor, campo2 =:valor2 where campoX = :campoX'); Query.Params.ParamByName('valor').AsString := valor; Query.Params.ParamByName('valor2').AsString := valor2; Query.Params.ParamByName('campoX').AsString := valorX; Query.Execute; Ps.: O código acima montei de cabeça, mas não testei se a sintaxe está correta (teria que montar de acordo com o componente escolhido mesmo. []'s Compartilhar este post Link para o post Compartilhar em outros sites