Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

orc

[Resolvido] Código com Erro

Recommended Posts

tenho este código aqui e não esta fazendo o que eu quero, pq ele funciona assim tenho uma tabela com os sites cadastrados ai eu dou um while nessa tabela pra percorrer todos os sites xml baixalos e depois eu trato pra extrair o que tem dentro deles só que preciso compararo que tem dentro do xml com o que tenho no banco de dados assim eu comparo os titulos se estiver ja no banco eu não gravo se não estiverem eu gravo , s´oque tem um problema ali se eu tiro o SQLVerifica ele pega e grava todos os registros mais le toda a tabela de sites mais se eu coloco o SQL verifica ele filtra mais so passa pelo primeiro site ja varri esse codigo todo alguem pode dar uma força ai ????

 

procedure TForm1.ProcessarSites1Click(Sender: TObject);var  ADPLocalFile  : TFileName;  t			 : integer;  StartItemNode : IXMLNode;  ANode		 : IXMLNode;  STitle, sDesc, sLink : widestring;  ADPXMLBLOG	: string;begin  sqlsiteXml.Close;  // Fecha a Tabela  sqlsiteXml.Open;   // Abre a Tabela  sqlSiteXml.First;  // Coloca o ponteiro da tabela no primeiro Registro  ADPLocalFile  := IncludeTrailingPathDelimiter( ExtractFilePath( Application.ExeName ) ) + 'temp.adpheadlines.xml';  While Not SqlSiteXml.Eof do  begin	ADPXMLBLOG := SqlSiteXml.Fields[1].AsString;  // Atribui o link do site a Variável	Screen.Cursor := crHourglass;				 // muda o cursor	try	// download do arquivo	if not DownloadURLFile(ADPXMLBLOG, ADPLocalFile)  then	begin	  Screen.Cursor := crDefault;	  Raise Exception.CreateFmt('Unable to connect to the Internet, make sure you are connected!',[]);	  Exit;	end;	// Verifica se o arquivo existe	if not FileExists(ADPLocalFile) then	begin	  Screen.Cursor := crDefault;	  raise exception.Create('Can''t locate the *headlines* file?!');	  Exit;	end;	XMLDoc.FileName := ADPLocalFile;	XMLDoc.Active   := True;	StartItemNode := XMLDoc.DocumentElement.ChildNodes.First.ChildNodes.FindNode('item');	ANode := StartItemNode;	repeat	  STitle := ANode.ChildNodes[ 'title'	   ].Text;	  sLink  := ANode.ChildNodes[ 'link'		].Text;	  sDesc  := ANode.ChildNodes[ 'description' ].Text;	  with SQLVerifica do	  begin		// Verifica se o titulo que estou inserindo agora existe na tabela		// se não existe el não adiciona se existir ele manda para a tabela		Close;		SQL.Clear;		SQL.Add('SELECT TITULO FROM NOTICIAS');		SQL.Add('WHERE TITULO = :TITULO');		ParamByName('TITULO').AsString := Trim( STitle );		Open;	  end;	  //	  with SQLInsercao do	  begin		if SQLVerifica.IsEmpty then		begin		Close;		SQL.Clear;		SQL.Add('INSERT INTO NOTICIAS ( COD_FONTE, DATA_INSERCAO, TITULO, LINK, DESCRICAO )');		SQL.Add('VALUES ( :COD_FONTE, :DATA_INSERCAO, :TITULO, :LINK, :DESCRICAO )');		Parambyname('COD_FONTE'	).AsInteger  := SqlSiteXml.Fields[0].Asinteger;		Parambyname('DATA_INSERCAO').AsDateTime := Date;		Parambyname('TITULO'	   ).Asstring   := Trim( sTitle );		Parambyname('LINK'		 ).Asstring   := Trim( sLink  );		Parambyname('DESCRICAO'	).Asstring   := Trim( sDesc  );		ExecSql;		end;	  end;	  ANode  := ANode.NextSibling;	until ANode = nil;  finally	DeleteFile(ADPLocalFile);	Screen.Cursor:=crDefault;  end; // fim do Finally	SqlSiteXml.Next;  end; //fim do whileend;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Será que não esta acontecendo um exception que caí diretamente no finally ? Tente marcar um brakpoint na primeira linha e ir rodando passo-a-passo o programa, vendo assim se ocorre uma exceção...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Será que não esta acontecendo um exception que caí diretamente no finally ? Tente marcar um brakpoint na primeira linha e ir rodando passo-a-passo o programa, vendo assim se ocorre uma exceção...

acabei de correr com o breake point e nada, só consgui ver que se tirar o Sql verifica ele gravatudo e percorre todos os registros da tabela dos links xml, e com com o sql verifica ele só le o primeiro registro da tabela de links xml , ou seja ele não esta passando pelo next do while mais não ta atualizando os regitros quando entra no repeat percebi que ele não pega os registros do outro site mais sim continua com os mesmos e ao passar na verificação fica como se ele tivesse lido somente o primeiro registro da tabela de links XML

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estranho...

Pode tentar o seguinte também, onde você tem os parâmetros declarados, você esta colocar ele do mesmo nome do campo, tente colocar um nome diferente, exemplo:

 

with SQLVerifica do				begin				// Verifica se o titulo que estou inserindo agora existe na tabela				// se não existe el não adiciona se existir ele manda para a tabela				Close;				SQL.Clear;				SQL.Add('SELECT TITULO FROM NOTICIAS');				SQL.Add('WHERE TITULO = :TITULO');				ParamByName('TITULO').AsString := Trim( STitle );				Open;				end;
Coloque:

 

with SQLVerifica do				begin				// Verifica se o titulo que estou inserindo agora existe na tabela				// se não existe el não adiciona se existir ele manda para a tabela				Close;				SQL.Clear;				SQL.Add('SELECT TITULO FROM NOTICIAS');				SQL.Add('WHERE TITULO = :TITULOXML');				ParamByName('TITULOXML').AsString := Trim( STitle );				Open;				end;

E assim onde estiver outros parâmetros sendo usados...

Compartilhar este post


Link para o post
Compartilhar em outros sites

é mudei mais num é isso não continua a mesma coisa

Estranho...Pode tentar o seguinte também, onde você tem os parâmetros declarados, você esta colocar ele do mesmo nome do campo, tente colocar um nome diferente, exemplo:

with SQLVerifica do				begin				// Verifica se o titulo que estou inserindo agora existe na tabela				// se não existe el não adiciona se existir ele manda para a tabela				Close;				SQL.Clear;				SQL.Add('SELECT TITULO FROM NOTICIAS');				SQL.Add('WHERE TITULO = :TITULO');				ParamByName('TITULO').AsString := Trim( STitle );				Open;				end;
Coloque:
with SQLVerifica do				begin				// Verifica se o titulo que estou inserindo agora existe na tabela				// se não existe el não adiciona se existir ele manda para a tabela				Close;				SQL.Clear;				SQL.Add('SELECT TITULO FROM NOTICIAS');				SQL.Add('WHERE TITULO = :TITULOXML');				ParamByName('TITULOXML').AsString := Trim( STitle );				Open;				end;
E assim onde estiver outros parâmetros sendo usados...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bruno:Para conseguir entender o teu código, eu senti falta de dois itens:1. Declaração da classe do objeto SQLVerifica2. Inicialização do objeto SQLVerificaVeja lá se você consegue acrescentar esta informação aos teus posts. Só uma perguntinha: - Você está usando variáveis globais? tsc, tsc, tsc...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bruno:Para conseguir entender o teu código, eu senti falta de dois itens:1. Declaração da classe do objeto SQLVerifica2. Inicialização do objeto SQLVerificaVeja lá se você consegue acrescentar esta informação aos teus posts. Só uma perguntinha: - Você está usando variáveis globais? tsc, tsc, tsc...

Paulão, esse SQLVerifica é um componente TMDOQuery onde ali eu insiro o sql nele pra fazer a verificação no banco, e não estou usando Variáveis Globais, as variáveis que estou usando estão somente no procedimento

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvido, Ufa, por causa de um Active = false, quando damos um While, o ponteiro volta para o começo então é necessário reiniciar o componente para que ele receba o novo valor, porque se deixa-lo aberto ele vai continuar com o valor anterior , pronto faltou somente um XMLDoc.Active := False; Obrigado a Todos pela Ajuda

tenho este código aqui e não esta fazendo o que eu quero, pq ele funciona assim tenho uma tabela com os sites cadastrados ai eu dou um while nessa tabela pra percorrer todos os sites xml baixalos e depois eu trato pra extrair o que tem dentro deles só que preciso compararo que tem dentro do xml com o que tenho no banco de dados assim eu comparo os titulos se estiver ja no banco eu não gravo se não estiverem eu gravo , s´oque tem um problema ali se eu tiro o SQLVerifica ele pega e grava todos os registros mais le toda a tabela de sites mais se eu coloco o SQL verifica ele filtra mais so passa pelo primeiro site ja varri esse codigo todo alguem pode dar uma força ai ????

procedure TForm1.ProcessarSites1Click(Sender: TObject);var  ADPLocalFile  : TFileName;  t			 : integer;  StartItemNode : IXMLNode;  ANode		 : IXMLNode;  STitle, sDesc, sLink : widestring;  ADPXMLBLOG	: string;begin  sqlsiteXml.Close;  // Fecha a Tabela  sqlsiteXml.Open;   // Abre a Tabela  sqlSiteXml.First;  // Coloca o ponteiro da tabela no primeiro Registro  ADPLocalFile  := IncludeTrailingPathDelimiter( ExtractFilePath( Application.ExeName ) ) + 'temp.adpheadlines.xml';  While Not SqlSiteXml.Eof do  begin	ADPXMLBLOG := SqlSiteXml.Fields[1].AsString;  // Atribui o link do site a Variável	Screen.Cursor := crHourglass;				 // muda o cursor	try	// download do arquivo	if not DownloadURLFile(ADPXMLBLOG, ADPLocalFile)  then	begin	  Screen.Cursor := crDefault;	  Raise Exception.CreateFmt('Unable to connect to the Internet, make sure you are connected!',[]);	  Exit;	end;	// Verifica se o arquivo existe	if not FileExists(ADPLocalFile) then	begin	  Screen.Cursor := crDefault;	  raise exception.Create('Can''t locate the *headlines* file?!');	  Exit;	end;	XMLDoc.FileName := ADPLocalFile;	XMLDoc.Active   := True;	StartItemNode := XMLDoc.DocumentElement.ChildNodes.First.ChildNodes.FindNode('item');	ANode := StartItemNode;	repeat	  STitle := ANode.ChildNodes[ 'title'	   ].Text;	  sLink  := ANode.ChildNodes[ 'link'		].Text;	  sDesc  := ANode.ChildNodes[ 'description' ].Text;	  with SQLVerifica do	  begin		// Verifica se o titulo que estou inserindo agora existe na tabela		// se não existe el não adiciona se existir ele manda para a tabela		Close;		SQL.Clear;		SQL.Add('SELECT TITULO FROM NOTICIAS');		SQL.Add('WHERE TITULO = :TITULO');		ParamByName('TITULO').AsString := Trim( STitle );		Open;	  end;	  //	  with SQLInsercao do	  begin		if SQLVerifica.IsEmpty then		begin		Close;		SQL.Clear;		SQL.Add('INSERT INTO NOTICIAS ( COD_FONTE, DATA_INSERCAO, TITULO, LINK, DESCRICAO )');		SQL.Add('VALUES ( :COD_FONTE, :DATA_INSERCAO, :TITULO, :LINK, :DESCRICAO )');		Parambyname('COD_FONTE'	).AsInteger  := SqlSiteXml.Fields[0].Asinteger;		Parambyname('DATA_INSERCAO').AsDateTime := Date;		Parambyname('TITULO'	   ).Asstring   := Trim( sTitle );		Parambyname('LINK'		 ).Asstring   := Trim( sLink  );		Parambyname('DESCRICAO'	).Asstring   := Trim( sDesc  );		ExecSql;		end;	  end;	  ANode  := ANode.NextSibling;	until ANode = nil;  finally	DeleteFile(ADPLocalFile);	Screen.Cursor:=crDefault;  end; // fim do Finally	SqlSiteXml.Next;  end; //fim do whileend;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.