orc 0 Denunciar post Postado Outubro 17, 2007 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
marcio.theis 3 Denunciar post Postado Outubro 17, 2007 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
orc 0 Denunciar post Postado Outubro 17, 2007 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
marcio.theis 3 Denunciar post Postado Outubro 17, 2007 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
orc 0 Denunciar post Postado Outubro 17, 2007 é 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
Paulo F. Sarli 0 Denunciar post Postado Outubro 17, 2007 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
orc 0 Denunciar post Postado Outubro 17, 2007 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
orc 0 Denunciar post Postado Outubro 18, 2007 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
marcio.theis 3 Denunciar post Postado Outubro 18, 2007 beleza, as vezes os erros é chato de se achar mesmo, e outras vezes somente quem tem o aplicativo e consegue rodar consegue detectar... mas bom que conseguiu resolver... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites