Ir para conteúdo

POWERED BY:

Arquivado

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

orc

com while

Recommended Posts

estou rodando um while dentro do while da um erro tem como fazer o sistema passar esse erro e reiniciar o while ???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pode ser que um

try

except

ou

try

finally

resolva, mas qual o erro ? As vezes se consegue tratar o erro para que não aconteça mais...

mais é um erro ja esperado é quando baixo o xml da internet e existem arquivos não dão erro ai gostaria de voltar para o inicio do while

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu faço a verificação pra ver se fez o download do arquivo mais como eu faço pra tirar a mensagem que ele vai dar e passar lotado e voltar para o topo dowhile sem passar pelo fim dando next ??

tentei o try mais ele da o erro ainda

Compartilhar este post


Link para o post
Compartilhar em outros sites

talvez mostrando o código fique mais fácil apontar a solução...

o código é este :

While Not SQLSiteXML.Eof do
  begin
	 // Local onde será armazenado o arquivo XML
	 ADPLocalFile  := IncludeTrailingPathDelimiter( ExtractFilePath( Application.ExeName ) ) + 'temp.adpheadlines.xml';
	 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; // fim do if
	   // 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; // fim do if
	 //
	 XMLDoc.Active   := False;		  // fecha o componente
	 XMLDoc.FileName := ADPLocalFile;   // Atribui o arquivo a ser processado
	 XMLDoc.Active   := True;		   // Abre o componente
	 //
	 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;
	   //
	   SqlTestaSql( STitle, sLink, sDesc ); // procedimento onde se localiza o tratamento
	   //								   // para inserção das noticias no banco de dados.
	   ANode  := ANode.NextSibling;
	 until ANode = nil;
	 //
	 finally
		DeleteFile( ADPLocalFile );
		Screen.Cursor := crDefault;
	 end; // fim do Finally
	 //
	 SqlSiteXml.Next;
   end;  // Fim While
   SQLAtualizaGrid.Close;
   SQLAtualizaGrid.Open;
   SQLAtualizaGrid.Last;
end;

ali aonde tem os raise eu gostaria de pular os dois quando fosse confirmado o erro eu voltasse ao while sem ir para o fim da instrução , ou seja não quero passar pelo next

Compartilhar este post


Link para o post
Compartilhar em outros sites

No caso você teria de trocar o raise por um Application.MessageBox, se não me engano o raise aborta o procedimento, onde que poderia ter um variável somente para controlar se ocorreu o erro, caso ocorreu o while não avança, algo como:

 

var
	tentarNovamente: boolean;
begin
while Not SQLSiteXML.Eof do
	begin
	tentarNovamente:=False;
	// Local onde será armazenado o arquivo XML
	ADPLocalFile  := IncludeTrailingPathDelimiter( ExtractFilePath( Application.ExeName ) ) + 'temp.adpheadlines.xml';
	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;
			Application.MessageBox('Unable to connect to the Internet, make sure you are connected!','Erro',MB_OK or MB_APPLMODAL or MB_ICONERROR);
			tentarNovamente:=True;
			end; // fim do if
		// Verifica se o arquivo existe
		if not FileExists( ADPLocalFile ) then
			begin
			Screen.Cursor := crDefault;
			Application.MessageBox('Can''t locate the *headlines* file?!','Erro',MB_OK or MB_APPLMODAL or MB_ICONERROR);
			tentarNovamente:=True;
			end; // fim do if
		//
		XMLDoc.Active   := False;		  // fecha o componente
		XMLDoc.FileName := ADPLocalFile;   // Atribui o arquivo a ser processado
		XMLDoc.Active   := True;		   // Abre o componente
		//
		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;
			//
			SqlTestaSql( STitle, sLink, sDesc ); // procedimento onde se localiza o tratamento
			//								   // para inserção das noticias no banco de dados.
			ANode  := ANode.NextSibling;
		until ANode = nil;
		//
	finally
		DeleteFile( ADPLocalFile );
		Screen.Cursor := crDefault;
		end; // fim do Finally
	//
	if not tentarNovamente then
		SqlSiteXml.Next;
	end;  // Fim While
SQLAtualizaGrid.Close;
SQLAtualizaGrid.Open;
SQLAtualizaGrid.Last;
end;

Não testei, teria ver se não ocorre nenhum erro até mesmo na hora de compilar...

Somente teria de criar mais um controle para o n° de tentativas, pois desta forma ele vai ficar tentando até conseguir, mas vai que esta sem internet ou o site fora do ar, então teria de criar algo que tente um certo n° de vezes, caso não consiga vai para o próximo.

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.