| 
		
			| Ошибка с разбором IHTMLDocument2 [сообщение #2480] | Tue, 06 June 2023 07:48  |  
			| 
				
				
					|  harvest Сообщений: 6
 Зарегистрирован: June 2023
 | Junior Member |  |  |  
	| Добрый день, т.к. sql.ru больше нет, надеюсь на новом сайте получится найти ответ. Имеется небольшой кусочек кода, который работал до того как сайт обновил протоколы. Заменена компонента IdHTTP на NetHTTPClient, однако в строке  не происходит полной загрузки строки в вариантный массив, хотя раньше все работало. Из-за этого коллекция элементов
 пустая.DocTR:=Doc.all.tags('TR') as IHTMLElementCollection;Код процедуры:
 
 
ACurCodeN:=682;
CDate:=01.01.2022;
RDate:=28.02.2022;
URL:='https://www.cbr.ru/hd_base/seldomc/sc_dynamic/?UniDbQuery.Posted=True&UniDbQuery.From='+DateToStr(CDate)+'&UniDbQuery.To='+DateToStr(RDate)+'&UniDbQuery.ValID='+ACurCodeN;
try
  //FDataModule.IdHTTP1.HandleRedirects:=true;
  //AHTML:=FDataModule.IdHTTP1.Get(URL); //не работает из-за сайта
  AHTML:=FdataModule.NetHTTPClient1.Get(URL).ContentAsString;
  Doc:=coHTMLDocument.Create as IHTMLDocument2;
  v:=VarArrayCreate([0, 0], varVariant);
  v[0]:=AHTML;
  Doc.write(PSafeArray(System.TVarData(v).VArray));
  DocTR:=Doc.all.tags('TR') as IHTMLElementCollection;
  for i:=1 to DocTR.length-1 do
  begin
    TRElement:= DocTR.Item(i,0) as IHtmlElement;
    DocTD:=TRElement.children as IHTMLElementCollection;
    if (DocTD.length>2) then
    begin
      ADate:=StrToDate((DocTD.Item(0, 0) as IHtmlElement).innerText);
      AValue:=StrToCurr((DocTD.Item(2, 0) as IHtmlElement).innerText);
    end
  end
finally
  Doc:=nil;
 |  
	|  |  | 
	|  | 
	|  | 
	|  | 
	|  | 
	|  | 
	|  | 
	|  | 
	| 
		
			| Re: Ошибка с разбором IHTMLDocument2 [сообщение #2494 является ответом на сообщение #2493] | Thu, 08 June 2023 10:06  |  
			| 
				
				
					|  harvest Сообщений: 6
 Зарегистрирован: June 2023
 | Junior Member |  |  |  
	| Такие команды тоже не работают при первом запуске программы. Хотя запись заносится в таблицу. Я ХЗ что не так... почему не выполняется последовательно код. 
 
  procedure TFUpdate.sButton1Click(Sender: TObject);
  begin
  FDataModule.FDQueryRead.Close;
  FDataModule.FDQueryRead.SQL.Clear;
  FDataModule.FDQueryRead.SQL.Text:='select max(CLD_DATE) from CALENDAR';
  FDataModule.FDQueryRead.Open;
  LastDate:=FDataModule.FDQueryRead.FieldByName('MAX').AsDateTime;
  begin
    while LastDate<=Date do
    begin
      FDataModule.FDTransactionWrite.StartTransaction;
      try
        FDataModule.FDQueryWrite.Close;
        FDataModule.FDQueryWrite.SQL.Clear;
        FDataModule.FDQueryWrite.SQL.Text:='update or insert into CALENDAR (CLD_DATE) values (:CldDate) matching(CLD_DATE)';
        FDataModule.FDQueryWrite.Params.ParamByName('CldDate').AsDate:=LastDate;
        FDataModule.FDQueryWrite.ExecSQL;
        FDataModule.FDTransactionWrite.Commit;
      except
        FDataModule.FDTransactionWrite.Rollback;
      raise;
      end;
    LastDate:=LastDate+1;
    end;
  end;
  LastDate:=Date;
  FDataModule.FDQueryRead.Close;
  FDataModule.FDQueryRead.SQL.Clear;
  FDataModule.FDQueryRead.SQL.Text:='select CLD_DATE from CALENDAR where CLD_DATE=:CurDate';
  FDataModule.FDQueryRead.Params.ParamByName('CurDate').AsDate:=LastDate;
  FDataModule.FDQueryRead.Open;
  sMemo1.Text:=DateToStr(FDataModule.FDQueryRead.FieldByName('CLD_DATE').AsDateTime);
  end;
 |  
	|  |  |